Benjamin Otte
2008-Jan-21 22:14 UTC
[Swfdec] 70 commits - configure.ac libswfdec-gtk/Makefile.am libswfdec-gtk/swfdec-gtk.h libswfdec-gtk/swfdec_gtk_loader.c libswfdec-gtk/swfdec_gtk_player.c libswfdec-gtk/swfdec_gtk_socket.c libswfdec-gtk/swfdec_gtk_socket.h libswfdec-gtk/swfdec_playback_alsa.c libswfdec-gtk/swfdec_playback_oss.c libswfdec-gtk/swfdec_playback_pa.c libswfdec/Makefile.am libswfdec/swfdec_amf.c libswfdec/swfdec_as_context.c libswfdec/swfdec_as_context.h libswfdec/swfdec_as_frame.c libswfdec/swfdec_as_frame_internal.h libswfdec/swfdec_as_function.c libswfdec/swfdec_as_function.h libswfdec/swfdec_as_internal.h libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_object.c libswfdec/swfdec_as_strings.c libswfdec/swfdec_event.c libswfdec/swfdec_event.h libswfdec/swfdec_file_loader.c libswfdec/swfdec_flash_security.c libswfdec/swfdec_flash_security.h libswfdec/swfdec_function_list.c libswfdec/swfdec_function_list.h libswfdec/swfdec.h libswfdec/swfdec_initialize.as libswfdec/swfdec_initialize.h libswfdec/swfdec_internal.h libswfdec/swfdec_interval.c libswfdec/swfdec_interval.h libswfdec/swfdec_loader.c libswfdec/swfdec_loader.h libswfdec/swfdec_loader_internal.h libswfdec/swfdec_loadertarget.c libswfdec/swfdec_loadertarget.h libswfdec/swfdec_load_object_as.c libswfdec/swfdec_load_object.c libswfdec/swfdec_load_object.h libswfdec/swfdec_movie.c libswfdec/swfdec_movie_clip_loader.c libswfdec/swfdec_movie.h libswfdec/swfdec_net_stream_as.c libswfdec/swfdec_net_stream.c libswfdec/swfdec_net_stream.h libswfdec/swfdec_player_as.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_policy_file.c libswfdec/swfdec_policy_file.h libswfdec/swfdec_policy_loader.c libswfdec/swfdec_policy_loader.h libswfdec/swfdec_resource.c libswfdec/swfdec_resource.h libswfdec/swfdec_resource_request.c libswfdec/swfdec_resource_request.h libswfdec/swfdec_ringbuffer.c libswfdec/swfdec_ringbuffer.h libswfdec/swfdec_sandbox.c libswfdec/swfdec_sandbox.h libswfdec/swfdec_security_allow.c libswfdec/swfdec_security_allow.h libswfdec/swfdec_security.c libswfdec/swfdec_security.h libswfdec/swfdec_socket.c libswfdec/swfdec_socket.h libswfdec/swfdec_sprite_movie_as.c libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_stream.c libswfdec/swfdec_stream.h libswfdec/swfdec_stream_target.c libswfdec/swfdec_stream_target.h libswfdec/swfdec_system_security.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_url.c libswfdec/swfdec_url.h libswfdec/swfdec_video_movie_as.c libswfdec/swfdec_video_movie.c libswfdec/swfdec_xml_socket.c libswfdec/swfdec_xml_socket.h player/Makefile.am player/swfdec_slow_loader.c player/swfdec_slow_loader.h player/swfplay.c test/custom test/rtmp test/sound test/swfdec_test.c test/trace tools/crashfinder.c tools/dump.c vivified/core
configure.ac | 29 dev/null |binary libswfdec-gtk/Makefile.am | 6 libswfdec-gtk/swfdec-gtk.h | 1 libswfdec-gtk/swfdec_gtk_loader.c | 45 libswfdec-gtk/swfdec_gtk_player.c | 5 libswfdec-gtk/swfdec_gtk_socket.c | 220 ++ libswfdec-gtk/swfdec_gtk_socket.h | 42 libswfdec-gtk/swfdec_playback_alsa.c | 28 libswfdec-gtk/swfdec_playback_oss.c | 12 libswfdec-gtk/swfdec_playback_pa.c | 16 libswfdec/Makefile.am | 31 libswfdec/swfdec.h | 2 libswfdec/swfdec_amf.c | 2 libswfdec/swfdec_as_context.c | 47 libswfdec/swfdec_as_context.h | 6 libswfdec/swfdec_as_frame.c | 29 libswfdec/swfdec_as_frame_internal.h | 4 libswfdec/swfdec_as_function.c | 28 libswfdec/swfdec_as_function.h | 2 libswfdec/swfdec_as_internal.h | 20 libswfdec/swfdec_as_interpret.c | 35 libswfdec/swfdec_as_object.c | 100 - libswfdec/swfdec_as_strings.c | 2 libswfdec/swfdec_event.c | 5 libswfdec/swfdec_event.h | 2 libswfdec/swfdec_file_loader.c | 29 libswfdec/swfdec_flash_security.c | 313 --- libswfdec/swfdec_flash_security.h | 74 libswfdec/swfdec_function_list.c | 132 + libswfdec/swfdec_function_list.h | 50 libswfdec/swfdec_initialize.as | 5 libswfdec/swfdec_initialize.h | 3266 ++++++++++++++++----------------- libswfdec/swfdec_internal.h | 12 libswfdec/swfdec_interval.c | 11 libswfdec/swfdec_interval.h | 2 libswfdec/swfdec_load_object.c | 224 +- libswfdec/swfdec_load_object.h | 24 libswfdec/swfdec_load_object_as.c | 53 libswfdec/swfdec_loader.c | 322 --- libswfdec/swfdec_loader.h | 24 libswfdec/swfdec_loader_internal.h | 30 libswfdec/swfdec_loadertarget.c | 137 - libswfdec/swfdec_loadertarget.h | 66 libswfdec/swfdec_movie.c | 65 libswfdec/swfdec_movie.h | 4 libswfdec/swfdec_movie_clip_loader.c | 7 libswfdec/swfdec_net_stream.c | 160 + libswfdec/swfdec_net_stream.h | 3 libswfdec/swfdec_net_stream_as.c | 4 libswfdec/swfdec_player.c | 159 - libswfdec/swfdec_player_as.c | 2 libswfdec/swfdec_player_internal.h | 42 libswfdec/swfdec_policy_file.c | 350 +++ libswfdec/swfdec_policy_file.h | 65 libswfdec/swfdec_policy_loader.c | 255 -- libswfdec/swfdec_policy_loader.h | 63 libswfdec/swfdec_resource.c | 355 ++- libswfdec/swfdec_resource.h | 12 libswfdec/swfdec_resource_request.c | 311 --- libswfdec/swfdec_resource_request.h | 96 libswfdec/swfdec_ringbuffer.c | 18 libswfdec/swfdec_ringbuffer.h | 18 libswfdec/swfdec_sandbox.c | 303 +++ libswfdec/swfdec_sandbox.h | 83 libswfdec/swfdec_security.c | 86 libswfdec/swfdec_security.h | 68 libswfdec/swfdec_security_allow.c | 80 libswfdec/swfdec_security_allow.h | 53 libswfdec/swfdec_socket.c | 99 + libswfdec/swfdec_socket.h | 58 libswfdec/swfdec_sprite_movie.c | 15 libswfdec/swfdec_sprite_movie_as.c | 15 libswfdec/swfdec_stream.c | 399 ++++ libswfdec/swfdec_stream.h | 68 libswfdec/swfdec_stream_target.c | 136 + libswfdec/swfdec_stream_target.h | 67 libswfdec/swfdec_system_security.c | 3 libswfdec/swfdec_text_field_movie.c | 19 libswfdec/swfdec_url.c | 236 ++ libswfdec/swfdec_url.h | 13 libswfdec/swfdec_video_movie.c | 5 libswfdec/swfdec_video_movie_as.c | 13 libswfdec/swfdec_xml_socket.c | 198 +- libswfdec/swfdec_xml_socket.h | 56 player/Makefile.am | 4 player/swfdec_slow_loader.c | 153 - player/swfdec_slow_loader.h | 60 player/swfplay.c | 13 test/custom/Makefile.am | 2 test/custom/button-hittest-5.swf |binary test/custom/button-hittest-5.swf.trace | 9 test/custom/button-hittest-6.swf |binary test/custom/button-hittest-6.swf.trace | 9 test/custom/button-hittest-7.swf |binary test/custom/button-hittest-7.swf.trace | 9 test/custom/button-hittest-8.swf |binary test/custom/button-hittest-8.swf.trace | 9 test/custom/button-hittest.c | 85 test/custom/button-hittest.stas | 64 test/custom/button-hittest.sts |binary test/rtmp/.gitignore | 10 test/rtmp/Makefile.am | 8 test/rtmp/rtmp_server.c | 98 test/sound/sound.c | 6 test/swfdec_test.c | 4 test/trace/Makefile.am | 13 test/trace/button-hittest-5.swf.act | 17 test/trace/button-hittest-5.swf.trace | 9 test/trace/button-hittest-6.swf.act | 17 test/trace/button-hittest-6.swf.trace | 9 test/trace/button-hittest-7.swf.act | 17 test/trace/button-hittest-7.swf.trace | 9 test/trace/button-hittest-8.swf.act | 17 test/trace/button-hittest-8.swf.trace | 9 test/trace/button-hittest.c | 85 tools/crashfinder.c | 7 tools/dump.c | 5 vivified/core/vivi_application.c | 2 119 files changed, 5509 insertions(+), 4805 deletions(-) New commits: commit ea80c5463857eb5d4d7d4a201131637da833fecf Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 23:13:16 2008 +0100 move last mouse test into the custom dir (why wasn't it there before?) diff --git a/test/custom/Makefile.am b/test/custom/Makefile.am index 0e937d8..f596de7 100644 --- a/test/custom/Makefile.am +++ b/test/custom/Makefile.am @@ -32,6 +32,8 @@ EXTRA_DIST = \ button-hittest-8.swf \ button-hittest-8.swf.trace \ button-hittest.c \ + button-hittest.stas \ + button-hittest.sts \ definebutton-5.swf \ definebutton-5.swf.trace \ definebutton-6.swf \ diff --git a/test/custom/button-hittest-5.swf b/test/custom/button-hittest-5.swf new file mode 100644 index 0000000..18ace29 Binary files /dev/null and b/test/custom/button-hittest-5.swf differ diff --git a/test/custom/button-hittest-5.swf.trace b/test/custom/button-hittest-5.swf.trace new file mode 100644 index 0000000..c91a351 --- /dev/null +++ b/test/custom/button-hittest-5.swf.trace @@ -0,0 +1,9 @@ +button Idle => OverUp: _level0 +button OverUp => OverDown: _level0 +button OverDown => OutDown: _level0 +button OutDown => OverDown: _level0 +button OverDown => OverUp: _level0 +button OverUp => OverDown: _level0 +button OverDown => OutDown: _level0 +button OutDown => Idle: _level0 +button Idle => OverUp: _level0 diff --git a/test/custom/button-hittest-6.swf b/test/custom/button-hittest-6.swf new file mode 100644 index 0000000..b2bf0ec Binary files /dev/null and b/test/custom/button-hittest-6.swf differ diff --git a/test/custom/button-hittest-6.swf.trace b/test/custom/button-hittest-6.swf.trace new file mode 100644 index 0000000..ed871dc --- /dev/null +++ b/test/custom/button-hittest-6.swf.trace @@ -0,0 +1,9 @@ +button Idle => OverUp: _level0.instance1 +button OverUp => OverDown: _level0.instance1 +button OverDown => OutDown: _level0.instance1 +button OutDown => OverDown: _level0.instance1 +button OverDown => OverUp: _level0.instance1 +button OverUp => OverDown: _level0.instance1 +button OverDown => OutDown: _level0.instance1 +button OutDown => Idle: _level0.instance1 +button Idle => OverUp: _level0 diff --git a/test/custom/button-hittest-7.swf b/test/custom/button-hittest-7.swf new file mode 100644 index 0000000..9646812 Binary files /dev/null and b/test/custom/button-hittest-7.swf differ diff --git a/test/custom/button-hittest-7.swf.trace b/test/custom/button-hittest-7.swf.trace new file mode 100644 index 0000000..ed871dc --- /dev/null +++ b/test/custom/button-hittest-7.swf.trace @@ -0,0 +1,9 @@ +button Idle => OverUp: _level0.instance1 +button OverUp => OverDown: _level0.instance1 +button OverDown => OutDown: _level0.instance1 +button OutDown => OverDown: _level0.instance1 +button OverDown => OverUp: _level0.instance1 +button OverUp => OverDown: _level0.instance1 +button OverDown => OutDown: _level0.instance1 +button OutDown => Idle: _level0.instance1 +button Idle => OverUp: _level0 diff --git a/test/custom/button-hittest-8.swf b/test/custom/button-hittest-8.swf new file mode 100644 index 0000000..af501e5 Binary files /dev/null and b/test/custom/button-hittest-8.swf differ diff --git a/test/custom/button-hittest-8.swf.trace b/test/custom/button-hittest-8.swf.trace new file mode 100644 index 0000000..ed871dc --- /dev/null +++ b/test/custom/button-hittest-8.swf.trace @@ -0,0 +1,9 @@ +button Idle => OverUp: _level0.instance1 +button OverUp => OverDown: _level0.instance1 +button OverDown => OutDown: _level0.instance1 +button OutDown => OverDown: _level0.instance1 +button OverDown => OverUp: _level0.instance1 +button OverUp => OverDown: _level0.instance1 +button OverDown => OutDown: _level0.instance1 +button OutDown => Idle: _level0.instance1 +button Idle => OverUp: _level0 diff --git a/test/custom/button-hittest.c b/test/custom/button-hittest.c new file mode 100644 index 0000000..9cb574e --- /dev/null +++ b/test/custom/button-hittest.c @@ -0,0 +1,85 @@ +/* gcc `pkg-config --libs --cflags libming` button-hittest.c -o button-hittest && ./button-hittest + */ + +#include <ming.h> + +static const char *button_events[] = { "Idle => OverUp", "OverUp => Idle", "OverUp => OverDown", "OverDown => OverUp", "OverDown => OutDown", "OutDown => OverDown", "OutDown => Idle", "Idle => OutDown", "OverDown => Idle" }; + +static void +add_button_events (SWFButton button) +{ + char script[100]; + unsigned int i; + + for (i = 0; i < sizeof (button_events) / sizeof (button_events[0]); i++) { + sprintf (script, "trace (\"button %s: \" + this);", button_events[i]); + SWFButton_addAction (button, newSWFAction (script), (1 << i)); + } +} + +static SWFCharacter +get_rectangle (int r, int g, int b) +{ + SWFShape shape; + SWFFillStyle fill; + + shape = newSWFShape (); + fill = SWFShape_addSolidFillStyle (shape, r, g, b, 255); + SWFShape_setRightFillStyle (shape, fill); + SWFShape_drawLineTo (shape, 100, 0); + SWFShape_drawLineTo (shape, 100, 100); + SWFShape_drawLineTo (shape, 0, 100); + SWFShape_drawLineTo (shape, 0, 0); + + return (SWFCharacter) shape; +} + +static void +do_movie (int version) +{ + char name[100]; + SWFMovie movie; + SWFDisplayItem item; + SWFButton button, button2; + SWFButtonRecord rec; + + movie = newSWFMovieWithVersion (version); + SWFMovie_setRate (movie, 10); + SWFMovie_setDimension (movie, 200, 150); + + button = newSWFButton (); + add_button_events (button); + rec = SWFButton_addCharacter (button, get_rectangle (255, 0, 0), SWFBUTTON_HIT); + SWFButtonRecord_setDepth (rec, 42); + SWFButtonRecord_moveTo (rec, 40, 40); + SWFButtonRecord_scaleTo (rec, 0.5, 0.5); + + button2 = newSWFButton (); + SWFButton_setMenu (button2, 1); + add_button_events (button2); + rec = SWFButton_addCharacter (button2, get_rectangle (0, 255, 0), SWFBUTTON_HIT); + SWFButtonRecord_scaleTo (rec, 2, 1.5); + rec = SWFButton_addCharacter (button2, (SWFCharacter) button, SWFBUTTON_UP | SWFBUTTON_OVER | SWFBUTTON_DOWN); + + item = SWFMovie_add (movie, button2); + + SWFMovie_nextFrame (movie); + + sprintf (name, "button-hittest-%d.swf", version); + SWFMovie_save (movie, name); +} + +int +main (int argc, char **argv) +{ + int i; + + if (Ming_init ()) + return 1; + + for (i = 8; i >= 5; i--) { + do_movie (i); + } + + return 0; +} diff --git a/test/custom/button-hittest.stas b/test/custom/button-hittest.stas new file mode 100644 index 0000000..865329d --- /dev/null +++ b/test/custom/button-hittest.stas @@ -0,0 +1,64 @@ +/* Swfdec + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +run_test = function (t, file) { + var e; + print ("Testing " + file); + try { + t.reset (file); + t.trace (file + ".trace"); + t.advance (1000); + t.mouse_move (50, 50); + t.advance (1000); + t.mouse_press (50, 50); + t.advance (1000); + t.mouse_move (140, 140); + t.advance (1000); + t.mouse_move (50, 50); + t.advance (1000); + t.mouse_release (50, 50); + t.advance (1000); + t.mouse_press (50, 50); + t.advance (1000); + t.mouse_move (140, 140); + t.advance (1000); + t.mouse_release (140, 140); + t.advance (1000); + t.trace (); + } catch (e) { + if (e) { + error (e); + return false; + } + }; + Native.print (" OK\n"); + return true; +}; + +filenames.sort (); +t = new Test (); +fail = []; +for (var i = 0; i < filenames.length; i++) { + if (!run_test (t, filenames[i])) + fail.push (filenames[i]); +}; +if (fail.length > 0) { + error (fail.join ("\n ")); + throw (fail.length + " failures"); +} diff --git a/test/custom/button-hittest.sts b/test/custom/button-hittest.sts new file mode 100644 index 0000000..378773f Binary files /dev/null and b/test/custom/button-hittest.sts differ diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am index 84a7c48..a706bd0 100644 --- a/test/trace/Makefile.am +++ b/test/trace/Makefile.am @@ -315,19 +315,6 @@ EXTRA_DIST = \ boolean-properties-7.swf.trace \ boolean-properties-8.swf \ boolean-properties-8.swf.trace \ - button-hittest-5.swf \ - button-hittest-5.swf.act \ - button-hittest-5.swf.trace \ - button-hittest-6.swf \ - button-hittest-6.swf.act \ - button-hittest-6.swf.trace \ - button-hittest-7.swf \ - button-hittest-7.swf.act \ - button-hittest-7.swf.trace \ - button-hittest-8.swf \ - button-hittest-8.swf.act \ - button-hittest-8.swf.trace \ - button-hittest.c \ button-properties.as \ button-properties-5.swf \ button-properties-5.swf.trace \ diff --git a/test/trace/button-hittest-5.swf b/test/trace/button-hittest-5.swf deleted file mode 100644 index 18ace29..0000000 Binary files a/test/trace/button-hittest-5.swf and /dev/null differ diff --git a/test/trace/button-hittest-5.swf.act b/test/trace/button-hittest-5.swf.act deleted file mode 100644 index 352902b..0000000 --- a/test/trace/button-hittest-5.swf.act +++ /dev/null @@ -1,17 +0,0 @@ -wait 1000 -move 50, 50 -wait 1000 -down -wait 1000 -move 140, 140 -wait 1000 -move 50, 50 -wait 1000 -up -wait 1000 -down -wait 1000 -move 140, 140 -wait 1000 -up -wait 1000 diff --git a/test/trace/button-hittest-5.swf.trace b/test/trace/button-hittest-5.swf.trace deleted file mode 100644 index c91a351..0000000 --- a/test/trace/button-hittest-5.swf.trace +++ /dev/null @@ -1,9 +0,0 @@ -button Idle => OverUp: _level0 -button OverUp => OverDown: _level0 -button OverDown => OutDown: _level0 -button OutDown => OverDown: _level0 -button OverDown => OverUp: _level0 -button OverUp => OverDown: _level0 -button OverDown => OutDown: _level0 -button OutDown => Idle: _level0 -button Idle => OverUp: _level0 diff --git a/test/trace/button-hittest-6.swf b/test/trace/button-hittest-6.swf deleted file mode 100644 index b2bf0ec..0000000 Binary files a/test/trace/button-hittest-6.swf and /dev/null differ diff --git a/test/trace/button-hittest-6.swf.act b/test/trace/button-hittest-6.swf.act deleted file mode 100644 index 352902b..0000000 --- a/test/trace/button-hittest-6.swf.act +++ /dev/null @@ -1,17 +0,0 @@ -wait 1000 -move 50, 50 -wait 1000 -down -wait 1000 -move 140, 140 -wait 1000 -move 50, 50 -wait 1000 -up -wait 1000 -down -wait 1000 -move 140, 140 -wait 1000 -up -wait 1000 diff --git a/test/trace/button-hittest-6.swf.trace b/test/trace/button-hittest-6.swf.trace deleted file mode 100644 index ed871dc..0000000 --- a/test/trace/button-hittest-6.swf.trace +++ /dev/null @@ -1,9 +0,0 @@ -button Idle => OverUp: _level0.instance1 -button OverUp => OverDown: _level0.instance1 -button OverDown => OutDown: _level0.instance1 -button OutDown => OverDown: _level0.instance1 -button OverDown => OverUp: _level0.instance1 -button OverUp => OverDown: _level0.instance1 -button OverDown => OutDown: _level0.instance1 -button OutDown => Idle: _level0.instance1 -button Idle => OverUp: _level0 diff --git a/test/trace/button-hittest-7.swf b/test/trace/button-hittest-7.swf deleted file mode 100644 index 9646812..0000000 Binary files a/test/trace/button-hittest-7.swf and /dev/null differ diff --git a/test/trace/button-hittest-7.swf.act b/test/trace/button-hittest-7.swf.act deleted file mode 100644 index 352902b..0000000 --- a/test/trace/button-hittest-7.swf.act +++ /dev/null @@ -1,17 +0,0 @@ -wait 1000 -move 50, 50 -wait 1000 -down -wait 1000 -move 140, 140 -wait 1000 -move 50, 50 -wait 1000 -up -wait 1000 -down -wait 1000 -move 140, 140 -wait 1000 -up -wait 1000 diff --git a/test/trace/button-hittest-7.swf.trace b/test/trace/button-hittest-7.swf.trace deleted file mode 100644 index ed871dc..0000000 --- a/test/trace/button-hittest-7.swf.trace +++ /dev/null @@ -1,9 +0,0 @@ -button Idle => OverUp: _level0.instance1 -button OverUp => OverDown: _level0.instance1 -button OverDown => OutDown: _level0.instance1 -button OutDown => OverDown: _level0.instance1 -button OverDown => OverUp: _level0.instance1 -button OverUp => OverDown: _level0.instance1 -button OverDown => OutDown: _level0.instance1 -button OutDown => Idle: _level0.instance1 -button Idle => OverUp: _level0 diff --git a/test/trace/button-hittest-8.swf b/test/trace/button-hittest-8.swf deleted file mode 100644 index af501e5..0000000 Binary files a/test/trace/button-hittest-8.swf and /dev/null differ diff --git a/test/trace/button-hittest-8.swf.act b/test/trace/button-hittest-8.swf.act deleted file mode 100644 index 352902b..0000000 --- a/test/trace/button-hittest-8.swf.act +++ /dev/null @@ -1,17 +0,0 @@ -wait 1000 -move 50, 50 -wait 1000 -down -wait 1000 -move 140, 140 -wait 1000 -move 50, 50 -wait 1000 -up -wait 1000 -down -wait 1000 -move 140, 140 -wait 1000 -up -wait 1000 diff --git a/test/trace/button-hittest-8.swf.trace b/test/trace/button-hittest-8.swf.trace deleted file mode 100644 index ed871dc..0000000 --- a/test/trace/button-hittest-8.swf.trace +++ /dev/null @@ -1,9 +0,0 @@ -button Idle => OverUp: _level0.instance1 -button OverUp => OverDown: _level0.instance1 -button OverDown => OutDown: _level0.instance1 -button OutDown => OverDown: _level0.instance1 -button OverDown => OverUp: _level0.instance1 -button OverUp => OverDown: _level0.instance1 -button OverDown => OutDown: _level0.instance1 -button OutDown => Idle: _level0.instance1 -button Idle => OverUp: _level0 diff --git a/test/trace/button-hittest.c b/test/trace/button-hittest.c deleted file mode 100644 index 9cb574e..0000000 --- a/test/trace/button-hittest.c +++ /dev/null @@ -1,85 +0,0 @@ -/* gcc `pkg-config --libs --cflags libming` button-hittest.c -o button-hittest && ./button-hittest - */ - -#include <ming.h> - -static const char *button_events[] = { "Idle => OverUp", "OverUp => Idle", "OverUp => OverDown", "OverDown => OverUp", "OverDown => OutDown", "OutDown => OverDown", "OutDown => Idle", "Idle => OutDown", "OverDown => Idle" }; - -static void -add_button_events (SWFButton button) -{ - char script[100]; - unsigned int i; - - for (i = 0; i < sizeof (button_events) / sizeof (button_events[0]); i++) { - sprintf (script, "trace (\"button %s: \" + this);", button_events[i]); - SWFButton_addAction (button, newSWFAction (script), (1 << i)); - } -} - -static SWFCharacter -get_rectangle (int r, int g, int b) -{ - SWFShape shape; - SWFFillStyle fill; - - shape = newSWFShape (); - fill = SWFShape_addSolidFillStyle (shape, r, g, b, 255); - SWFShape_setRightFillStyle (shape, fill); - SWFShape_drawLineTo (shape, 100, 0); - SWFShape_drawLineTo (shape, 100, 100); - SWFShape_drawLineTo (shape, 0, 100); - SWFShape_drawLineTo (shape, 0, 0); - - return (SWFCharacter) shape; -} - -static void -do_movie (int version) -{ - char name[100]; - SWFMovie movie; - SWFDisplayItem item; - SWFButton button, button2; - SWFButtonRecord rec; - - movie = newSWFMovieWithVersion (version); - SWFMovie_setRate (movie, 10); - SWFMovie_setDimension (movie, 200, 150); - - button = newSWFButton (); - add_button_events (button); - rec = SWFButton_addCharacter (button, get_rectangle (255, 0, 0), SWFBUTTON_HIT); - SWFButtonRecord_setDepth (rec, 42); - SWFButtonRecord_moveTo (rec, 40, 40); - SWFButtonRecord_scaleTo (rec, 0.5, 0.5); - - button2 = newSWFButton (); - SWFButton_setMenu (button2, 1); - add_button_events (button2); - rec = SWFButton_addCharacter (button2, get_rectangle (0, 255, 0), SWFBUTTON_HIT); - SWFButtonRecord_scaleTo (rec, 2, 1.5); - rec = SWFButton_addCharacter (button2, (SWFCharacter) button, SWFBUTTON_UP | SWFBUTTON_OVER | SWFBUTTON_DOWN); - - item = SWFMovie_add (movie, button2); - - SWFMovie_nextFrame (movie); - - sprintf (name, "button-hittest-%d.swf", version); - SWFMovie_save (movie, name); -} - -int -main (int argc, char **argv) -{ - int i; - - if (Ming_init ()) - return 1; - - for (i = 8; i >= 5; i--) { - do_movie (i); - } - - return 0; -} commit 18dc0b56ffe036cc334ceeadbc124b9260b8751d Merge: 2da50c6... 235dfab... Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 22:51:32 2008 +0100 Merge branch 'master' into rtmp Conflicts: libswfdec/swfdec_as_interpret.c libswfdec/swfdec_flash_security.c libswfdec/swfdec_flash_security.h libswfdec/swfdec_load_object.c libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h libswfdec/swfdec_policy_file.c libswfdec/swfdec_policy_file.h libswfdec/swfdec_resource.c libswfdec/swfdec_resource_request.c libswfdec/swfdec_security.c libswfdec/swfdec_security.h libswfdec/swfdec_security_allow.c commit 235dfab205081dce3fb63f46f85d5479ef84f622 Author: Benjamin Otte <otte at gnome.org> Date: Wed Jan 16 16:34:23 2008 +0100 add public API functions diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 86be3a5..008924a 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -870,6 +870,9 @@ swfdec_player_dispose (GObject *object) g_hash_table_destroy (priv->registered_classes); g_hash_table_destroy (priv->scripting_callbacks); + g_list_foreach (priv->loading_policy_files, (GFunc) g_object_unref, NULL); + g_list_free (priv->loading_policy_files); + priv->loading_policy_files = NULL; g_slist_foreach (priv->policy_files, (GFunc) g_object_unref, NULL); g_slist_free (priv->policy_files); priv->policy_files = NULL; diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index 72833e2..a574a9f 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -41,6 +41,7 @@ typedef enum { typedef void (* SwfdecActionFunc) (gpointer object, gpointer data); typedef gboolean (* SwfdecAudioRemoveFunc) (SwfdecAudio *audio, gpointer data); +typedef void (* SwfdecPolicyFunc) (SwfdecPlayer *player, gboolean allow, gpointer data); typedef struct _SwfdecTimeout SwfdecTimeout; struct _SwfdecTimeout { @@ -133,7 +134,8 @@ struct _SwfdecPlayerPrivate SwfdecRingBuffer * actions[SWFDEC_PLAYER_N_ACTION_QUEUES]; /* all actions we've queued up so far */ /* security */ - GSList * policy_files; /* list of SwfdecPolicyLoader objects, most recent first */ + GList * loading_policy_files; /* list of loading SwfdecPlayerLoader - newest first */ + GSList * policy_files; /* list of SwfdecPolicyLoader that finished loading */ }; void swfdec_player_initialize (SwfdecPlayer * player, @@ -221,6 +223,15 @@ void swfdec_player_global_to_stage (SwfdecPlayer * player, double * x, double * y); void swfdec_player_update_scale (SwfdecPlayer * player); + +/* in swfdec_policy_file.c */ +gboolean swfdec_player_allow_now (SwfdecPlayer * player, + const SwfdecURL * url); +void swfdec_player_allow_or_load (SwfdecPlayer * player, + const SwfdecURL * url, + const SwfdecURL * load_url, + SwfdecPolicyFunc func, + gpointer data); /* in swfdec_as_interpret.c */ SwfdecMovie * swfdec_player_get_movie_from_value (SwfdecPlayer * player, diff --git a/libswfdec/swfdec_policy_file.c b/libswfdec/swfdec_policy_file.c index d0f3e90..e275119 100644 --- a/libswfdec/swfdec_policy_file.c +++ b/libswfdec/swfdec_policy_file.c @@ -34,6 +34,20 @@ #include "swfdec_xml.h" #include "swfdec_xml_node.h" +typedef struct _SwfdecPolicyFileRequest SwfdecPolicyFileRequest; +struct _SwfdecPolicyFileRequest { + SwfdecURL * url; /* URL we are supposed to check */ + SwfdecPolicyFunc func; /* function to call when we know if access is (not) allowed */ + gpointer data; /* data to pass to func */ +}; + +static void +swfdec_policy_file_request_free (SwfdecPolicyFileRequest *request) +{ + swfdec_url_free (request->url); + g_slice_free (SwfdecPolicyFileRequest, request); +} + /*** PARSING THE FILE ***/ static void @@ -108,13 +122,46 @@ swfdec_policy_file_target_get_player (SwfdecLoaderTarget *target) } static void +swfdec_policy_file_finished_loading (SwfdecPolicyFile *file, const char *text) +{ + SwfdecPlayerPrivate *priv; + SwfdecPolicyFile *next; + GList *link; + + swfdec_loader_set_target (file->stream, NULL); + file->stream = NULL; + + if (text) + swfdec_policy_file_parse (file, text); + + priv = file->player->priv; + link = g_list_find (priv->loading_policy_files, file); + next = link->next ? link->next->data : NULL; + priv->loading_policy_files = g_list_delete_link (priv->loading_policy_files, link); + priv->policy_files = g_slist_prepend (priv->policy_files, file); + if (next) { + next->requests = g_slist_concat (next->requests, file->requests); + } else { + GSList *walk; + + for (walk = file->requests; walk; walk = walk->next) { + SwfdecPolicyFileRequest *request = walk->data; + gboolean allow = swfdec_player_allow_now (file->player, request->url); + request->func (file->player, allow, request->data); + swfdec_policy_file_request_free (request); + } + g_slist_free (file->requests); + } + file->requests = NULL; +} + +static void swfdec_policy_file_target_error (SwfdecLoaderTarget *target, SwfdecLoader *loader) { SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (target); - swfdec_loader_set_target (loader, NULL); - file->stream = NULL; + swfdec_policy_file_finished_loading (file, NULL); } static void @@ -131,10 +178,8 @@ swfdec_policy_file_target_eof (SwfdecLoaderTarget *target, if (text == NULL) { SWFDEC_ERROR ("couldn't get text from crossdomain policy file %s", swfdec_url_get_url (file->load_url)); - return; } - - swfdec_policy_file_parse (file, text); + swfdec_policy_file_finished_loading (file, text); g_free (text); } @@ -160,6 +205,11 @@ swfdec_policy_file_dispose (GObject *object) swfdec_loader_set_target (file->stream, NULL); g_object_unref (file->stream); file->stream = NULL; + g_slist_foreach (file->requests, (GFunc) swfdec_policy_file_request_free, NULL); + g_slist_free (file->requests); + file->requests = NULL; + } else { + g_assert (file->requests == NULL); } swfdec_url_free (file->load_url); swfdec_url_free (file->url); @@ -199,7 +249,8 @@ swfdec_policy_file_new (SwfdecPlayer *player, const SwfdecURL *url) SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0); swfdec_loader_set_target (file->stream, SWFDEC_LOADER_TARGET (file)); } - player->priv->policy_files = g_slist_prepend (player->priv->policy_files, file); + player->priv->loading_policy_files = + g_list_prepend (player->priv->loading_policy_files, file); return file; } @@ -243,15 +294,53 @@ swfdec_policy_file_allow (SwfdecPolicyFile *file, const SwfdecURL *url) return FALSE; } -void -swfdec_player_load_policy_file (SwfdecPlayer *player, const SwfdecURL *url) +/*** PLAYER API ***/ + +gboolean +swfdec_player_allow_now (SwfdecPlayer *player, const SwfdecURL *url) { - SWFDEC_FIXME ("implement"); + GSList *walk; + + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE); + g_return_val_if_fail (url != NULL, FALSE); + + for (walk = player->priv->policy_files; walk; walk = walk->next) { + if (swfdec_policy_file_allow (walk->data, url)) + return TRUE; + } + return FALSE; } void -swfdec_player_check_policy_files (SwfdecPlayer *player, - SwfdecPolicyFileFunc func, gpointer data) +swfdec_player_allow_or_load (SwfdecPlayer *player, const SwfdecURL *url, + const SwfdecURL *load_url, SwfdecPolicyFunc func, gpointer data) { - SWFDEC_FIXME ("implement"); + SwfdecPlayerPrivate *priv; + SwfdecPolicyFileRequest *request; + SwfdecPolicyFile *file; + + g_return_if_fail (SWFDEC_IS_PLAYER (player)); + g_return_if_fail (url != NULL); + g_return_if_fail (func); + + if (swfdec_player_allow_now (player, url)) { + func (player, TRUE, data); + return; + } + if (load_url) + swfdec_policy_file_new (player, load_url); + + priv = player->priv; + if (priv->loading_policy_files == NULL) { + func (player, FALSE, data); + return; + } + request = g_slice_new (SwfdecPolicyFileRequest); + request->url = swfdec_url_copy (url); + request->func = func; + request->data = data; + + file = priv->loading_policy_files->data; + file->requests = g_slist_append (file->requests, request); } + diff --git a/libswfdec/swfdec_policy_file.h b/libswfdec/swfdec_policy_file.h index 5342983..9a89f81 100644 --- a/libswfdec/swfdec_policy_file.h +++ b/libswfdec/swfdec_policy_file.h @@ -28,7 +28,6 @@ G_BEGIN_DECLS typedef struct _SwfdecPolicyFile SwfdecPolicyFile; typedef struct _SwfdecPolicyFileClass SwfdecPolicyFileClass; -typedef void (* SwfdecPolicyFileFunc) (SwfdecPlayer *player, gboolean allow, gpointer data); #define SWFDEC_TYPE_POLICY_FILE (swfdec_policy_file_get_type()) #define SWFDEC_IS_POLICY_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_POLICY_FILE)) @@ -45,6 +44,8 @@ struct _SwfdecPolicyFile { SwfdecURL * url; /* parent url we check with */ SwfdecLoader * stream; /* stream we are loading or NULL if done loading */ GSList * allowed_hosts; /* list of GPatternSpec of the allowed hosts */ + + GSList * requests; /* requests waiting for this file to finish loading */ }; struct _SwfdecPolicyFileClass { @@ -59,12 +60,6 @@ gboolean swfdec_policy_file_is_loading (SwfdecPolicyFile * file); gboolean swfdec_policy_file_allow (SwfdecPolicyFile * file, const SwfdecURL * url); -void swfdec_player_load_policy_file (SwfdecPlayer * player, - const SwfdecURL * url); -void swfdec_player_check_policy_files(SwfdecPlayer * player, - SwfdecPolicyFileFunc func, - gpointer data); - G_END_DECLS #endif commit d4877028c3d5b810309fc751328bfbc33eac16af Author: Benjamin Otte <otte at gnome.org> Date: Wed Jan 16 11:10:53 2008 +0100 add initial (compiling) bunch of code that changes policy files handling Everythng compiles, nothing works diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 9320e97..985eb28 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -113,7 +113,7 @@ libswfdec_source_files = \ swfdec_player_as.c \ swfdec_player_scripting.c \ swfdec_print_job.c \ - swfdec_policy_loader.c \ + swfdec_policy_file.c \ swfdec_rect.c \ swfdec_rectangle.c \ swfdec_resource.c \ @@ -261,7 +261,7 @@ noinst_HEADERS = \ swfdec_path.h \ swfdec_pattern.h \ swfdec_player_internal.h \ - swfdec_policy_loader.h \ + swfdec_policy_file.h \ swfdec_rect.h \ swfdec_resource.h \ swfdec_resource_request.h \ diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c index 21fe688..ae7fce0 100644 --- a/libswfdec/swfdec_flash_security.c +++ b/libswfdec/swfdec_flash_security.c @@ -23,7 +23,6 @@ #include <string.h> #include "swfdec_flash_security.h" -#include "swfdec_policy_loader.h" #include "swfdec_debug.h" #include "swfdec_security_allow.h" @@ -47,227 +46,10 @@ swfdec_flash_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) } } -static gboolean -swfdec_flash_security_match_domain (const SwfdecURL *guard, const SwfdecURL *key) -{ - return g_ascii_strcasecmp (swfdec_url_get_host (guard), swfdec_url_get_host (key)) == 0; -} - -typedef struct { - SwfdecURL * url; - SwfdecURLAllowFunc callback; - gpointer user_data; -} SwfdecAllowURLPending; - -static void -swfdec_flash_security_call_pending (SwfdecFlashSecurity *sec, const char *host, - gboolean allow) -{ - GSList *iter, *prev, *next; - SwfdecAllowURLPending *pending; - - g_return_if_fail (SWFDEC_IS_FLASH_SECURITY (sec)); - g_return_if_fail (host != NULL); - - prev = NULL; - for (iter = sec->allow_url_pending; iter != NULL; iter = next) { - next = iter->next; - pending = iter->data; - - if (!g_ascii_strcasecmp (swfdec_url_get_host (pending->url), host)) { - pending->callback (pending->url, allow, pending->user_data); - swfdec_url_free (pending->url); - g_free (pending); - g_slist_free_1 (iter); - - if (prev != NULL) { - prev->next = iter->next; - iter = prev; - iter->next = next; - } else { - iter = NULL; - sec->allow_url_pending = next; - } - } - - prev = iter; - } -} - -static void -swfdec_flash_security_policy_loader_done (SwfdecPolicyLoader *policy_loader, - gboolean allow) -{ - SwfdecFlashSecurity *sec = policy_loader->sec; - char *host = g_strdup (policy_loader->host); - - if (allow) { - sec->crossdomain_allowed = g_slist_prepend (sec->crossdomain_allowed, host); - } else { - sec->crossdomain_denied = g_slist_prepend (sec->crossdomain_denied, host); - } - - sec->policy_loaders = g_slist_remove (sec->policy_loaders, policy_loader); - - swfdec_flash_security_call_pending (sec, host, allow); - - swfdec_policy_loader_free (policy_loader); -} - -static void -swfdec_flash_security_get_cross_domain_policy (SwfdecFlashSecurity *sec, - const char *host) -{ - GSList *iter; - SwfdecPolicyLoader *policy_loader; - - g_return_if_fail (SWFDEC_IS_FLASH_SECURITY (sec)); - g_return_if_fail (host != NULL); - - for (iter = sec->policy_loaders; iter != NULL; iter = iter->next) { - policy_loader = iter->data; - - if (!g_ascii_strcasecmp (policy_loader->host, host)) - return; - } - - policy_loader = swfdec_policy_loader_new (sec, host, - swfdec_flash_security_policy_loader_done); - if (policy_loader == NULL) { - sec->crossdomain_denied = g_slist_prepend (sec->crossdomain_denied, - g_strdup (host)); - swfdec_flash_security_call_pending (sec, host, FALSE); - return; - } - - sec->policy_loaders = g_slist_prepend (sec->policy_loaders, policy_loader); -} - -static void -swfdec_flash_security_allow_cross_domain (SwfdecFlashSecurity *sec, - const SwfdecURL *url, SwfdecURLAllowFunc callback, gpointer user_data) -{ - SwfdecAllowURLPending *pending; - const char *host; - - g_assert (SWFDEC_IS_FLASH_SECURITY (sec)); - g_assert (url != NULL); - g_assert (callback != NULL); - - host = swfdec_url_get_host (url); - - if (g_slist_find_custom (sec->crossdomain_allowed, host, - (GCompareFunc)g_ascii_strcasecmp)) { - callback (url, 1, user_data); - return; - } - - if (g_slist_find_custom (sec->crossdomain_denied, host, - (GCompareFunc)g_ascii_strcasecmp)) { - callback (url, 0, user_data); - return; - } - - pending = g_new (SwfdecAllowURLPending, 1); - pending->url = swfdec_url_copy (url); - pending->callback = callback; - pending->user_data = user_data; - - sec->allow_url_pending = g_slist_prepend (sec->allow_url_pending, pending); - - swfdec_flash_security_get_cross_domain_policy (sec, host); -} - -static void -swfdec_flash_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url, - SwfdecURLAllowFunc callback, gpointer user_data) -{ - SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (guard); - int status; - - switch (sec->sandbox) { - case SWFDEC_SANDBOX_NONE: - status = 0; - break; - case SWFDEC_SANDBOX_REMOTE: - if (swfdec_url_is_local (url)) { - status = 0; - } else if (swfdec_flash_security_match_domain (sec->url, url)) { - status = 1; - } else { - swfdec_flash_security_allow_cross_domain (sec, url, callback, - user_data); - return; - } - break; - case SWFDEC_SANDBOX_LOCAL_FILE: - if (swfdec_url_is_local (url)) { - status = 1; - } else { - status = 0; - } - break; - case SWFDEC_SANDBOX_LOCAL_NETWORK: - if (swfdec_url_is_local (url)) { - status = 0; - } else { - swfdec_flash_security_allow_cross_domain (sec, url, callback, - user_data); - return; - } - break; - case SWFDEC_SANDBOX_LOCAL_TRUSTED: - status = 1; - break; - default: - g_assert_not_reached (); - status = 0; - break; - } - - callback (url, status, user_data); -} - -void -swfdec_flash_security_free_pending (SwfdecFlashSecurity *sec) -{ - GSList *iter; - - for (iter = sec->allow_url_pending; iter != NULL; iter = iter->next) { - SwfdecAllowURLPending *pending = iter->data; - pending->callback (pending->url, -1, pending->user_data); - swfdec_url_free (pending->url); - g_free (pending); - } - g_slist_free (sec->allow_url_pending); - sec->allow_url_pending = NULL; -} - static void swfdec_flash_security_dispose (GObject *object) { SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (object); - GSList *iter; - - g_assert (sec->allow_url_pending == NULL); - - for (iter = sec->policy_loaders; iter != NULL; iter = iter->next) { - swfdec_policy_loader_free (iter->data); - } - g_slist_free (sec->policy_loaders); - sec->policy_loaders = NULL; - - for (iter = sec->crossdomain_allowed; iter != NULL; iter = iter->next) { - g_free (iter->data); - } - g_slist_free (sec->crossdomain_allowed); - sec->crossdomain_allowed = NULL; - - for (iter = sec->crossdomain_denied; iter != NULL; iter = iter->next) { - g_free (iter->data); - } - g_slist_free (sec->crossdomain_denied); - sec->crossdomain_denied = NULL; if (sec->url) { swfdec_url_free (sec->url); @@ -287,7 +69,6 @@ swfdec_flash_security_class_init (SwfdecFlashSecurityClass *klass) object_class->dispose = swfdec_flash_security_dispose; security_class->allow = swfdec_flash_security_allow; - security_class->allow_url = swfdec_flash_security_allow_url; } static void diff --git a/libswfdec/swfdec_flash_security.h b/libswfdec/swfdec_flash_security.h index fcb2aaf..8ee888d 100644 --- a/libswfdec/swfdec_flash_security.h +++ b/libswfdec/swfdec_flash_security.h @@ -50,12 +50,6 @@ struct _SwfdecFlashSecurity SwfdecPlayer *player; SwfdecSandboxType sandbox; /* sandbox we are operating in */ SwfdecURL * url; /* url this security was loaded from */ - - GSList * policy_loaders; - GSList * crossdomain_allowed; - GSList * crossdomain_denied; - - GSList * allow_url_pending; }; struct _SwfdecFlashSecurityClass diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 847a6fb..86be3a5 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -870,6 +870,10 @@ swfdec_player_dispose (GObject *object) g_hash_table_destroy (priv->registered_classes); g_hash_table_destroy (priv->scripting_callbacks); + g_slist_foreach (priv->policy_files, (GFunc) g_object_unref, NULL); + g_slist_free (priv->policy_files); + priv->policy_files = NULL; + while (priv->roots) swfdec_movie_destroy (priv->roots->data); if (priv->resource) { diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index 06d8eea..72833e2 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -131,6 +131,9 @@ struct _SwfdecPlayerPrivate /* iterating */ GList * movies; /* list of all movies that want to be iterated */ SwfdecRingBuffer * actions[SWFDEC_PLAYER_N_ACTION_QUEUES]; /* all actions we've queued up so far */ + + /* security */ + GSList * policy_files; /* list of SwfdecPolicyLoader objects, most recent first */ }; void swfdec_player_initialize (SwfdecPlayer * player, diff --git a/libswfdec/swfdec_policy_file.c b/libswfdec/swfdec_policy_file.c new file mode 100644 index 0000000..d0f3e90 --- /dev/null +++ b/libswfdec/swfdec_policy_file.c @@ -0,0 +1,257 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * 2007 Pekka Lampila <pekka.lampila at iki.fi> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> + +#include "swfdec_policy_file.h" +#include "swfdec_flash_security.h" +#include "swfdec_resource.h" +#include "swfdec_as_strings.h" +#include "swfdec_debug.h" +#include "swfdec_loader_internal.h" +#include "swfdec_player_internal.h" +#include "swfdec_xml.h" +#include "swfdec_xml_node.h" + +/*** PARSING THE FILE ***/ + +static void +swfdec_policy_file_parse (SwfdecPolicyFile *file, const char *text) +{ + SwfdecXml *xml; + gint32 i, j; + + g_return_if_fail (SWFDEC_IS_POLICY_FILE (file)); + g_return_if_fail (text != NULL); + + xml = swfdec_xml_new_no_properties (SWFDEC_AS_CONTEXT (file->player), text, TRUE); + + if (xml == NULL) { + SWFDEC_ERROR ("failed to create an XML object for crossdomain policy"); + return; + } + + if (SWFDEC_XML_NODE (xml)->type != SWFDEC_XML_NODE_ELEMENT) { + SWFDEC_LOG ("empty crossdomain policy file"); + return; + } + + for (i = 0; i < swfdec_xml_node_num_children (SWFDEC_XML_NODE (xml)); i++) { + SwfdecXmlNode *node_cdp + swfdec_xml_node_get_child (SWFDEC_XML_NODE (xml), i); + + if (node_cdp->type != SWFDEC_XML_NODE_ELEMENT) + continue; + + if (g_ascii_strcasecmp (node_cdp->name, "cross-domain-policy") != 0) + continue; + + for (j = 0; j < swfdec_xml_node_num_children (node_cdp); j++) { + SwfdecXmlNode *node_aaf = swfdec_xml_node_get_child (node_cdp, j); + const char *value; + GPatternSpec *pattern; + char *value_lower; + + if (node_aaf->type != SWFDEC_XML_NODE_ELEMENT) + continue; + + if (g_ascii_strcasecmp (node_aaf->name, "allow-access-from") != 0) + continue; + + // FIXME: secure attribute? + + value = swfdec_xml_node_get_attribute (node_aaf, SWFDEC_AS_STR_domain); + if (value == NULL) + continue; + + if (strchr (value, '?') != NULL) { + SWFDEC_WARNING ("'?' in allowed domain attribute for %s", value); + continue; + } + + value_lower = g_ascii_strdown (value, -1); + pattern = g_pattern_spec_new (value_lower); + g_free (value_lower); + + file->allowed_hosts = g_slist_prepend (file->allowed_hosts, pattern); + } + } +} + +/*** SWFDEC_LOADER_TARGET ***/ + +static SwfdecPlayer * +swfdec_policy_file_target_get_player (SwfdecLoaderTarget *target) +{ + return SWFDEC_POLICY_FILE (target)->player; +} + +static void +swfdec_policy_file_target_error (SwfdecLoaderTarget *target, + SwfdecLoader *loader) +{ + SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (target); + + swfdec_loader_set_target (loader, NULL); + file->stream = NULL; +} + +static void +swfdec_policy_file_target_eof (SwfdecLoaderTarget *target, + SwfdecLoader *loader) +{ + SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (target); + char *text; + + swfdec_loader_set_target (loader, NULL); + file->stream = NULL; + text = swfdec_loader_get_text (loader, 8); + + if (text == NULL) { + SWFDEC_ERROR ("couldn't get text from crossdomain policy file %s", + swfdec_url_get_url (file->load_url)); + return; + } + + swfdec_policy_file_parse (file, text); + g_free (text); +} + +static void +swfdec_policy_file_loader_target_init (SwfdecLoaderTargetInterface *iface) +{ + iface->get_player = swfdec_policy_file_target_get_player; + iface->eof = swfdec_policy_file_target_eof; + iface->error = swfdec_policy_file_target_error; +} + +/*** SWFDEC_POLICY_FILE ***/ + +G_DEFINE_TYPE_WITH_CODE (SwfdecPolicyFile, swfdec_policy_file, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_policy_file_loader_target_init)) + +static void +swfdec_policy_file_dispose (GObject *object) +{ + SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (object); + + if (file->stream) { + swfdec_loader_set_target (file->stream, NULL); + g_object_unref (file->stream); + file->stream = NULL; + } + swfdec_url_free (file->load_url); + swfdec_url_free (file->url); + + G_OBJECT_CLASS (swfdec_policy_file_parent_class)->dispose (object); +} + +static void +swfdec_policy_file_class_init (SwfdecPolicyFileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = swfdec_policy_file_dispose; +} + +static void +swfdec_policy_file_init (SwfdecPolicyFile *policy_file) +{ +} + +SwfdecPolicyFile * +swfdec_policy_file_new (SwfdecPlayer *player, const SwfdecURL *url) +{ + SwfdecPolicyFile *file; + + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); + g_return_val_if_fail (url != NULL, NULL); + + file = g_object_new (SWFDEC_TYPE_POLICY_FILE, NULL); + file->player = player; + file->load_url = swfdec_url_copy (url); + file->url = swfdec_url_new_parent (url); + if (swfdec_url_has_protocol (url, "xmlsocket")) { + SWFDEC_FIXME ("implement xmlsocket: protocol"); + } else { + file->stream = swfdec_loader_load (player->priv->resource->loader, url, + SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0); + swfdec_loader_set_target (file->stream, SWFDEC_LOADER_TARGET (file)); + } + player->priv->policy_files = g_slist_prepend (player->priv->policy_files, file); + + return file; +} + +gboolean +swfdec_policy_file_is_loading (SwfdecPolicyFile *file) +{ + g_return_val_if_fail (SWFDEC_IS_POLICY_FILE (file), FALSE); + + return file->stream != NULL; +} + +gboolean +swfdec_policy_file_allow (SwfdecPolicyFile *file, const SwfdecURL *url) +{ + GSList *walk; + gsize len; + char *emantsoh; + const char *hostname; + + g_return_val_if_fail (SWFDEC_IS_POLICY_FILE (file), FALSE); + g_return_val_if_fail (url != NULL, FALSE); + + hostname = swfdec_url_get_host (url); + /* This is a hack that simplifies the following code. As the pattern can not + * contain any ?, the only pattern that matches the string "?" is the pattern + * "*" + */ + if (hostname == NULL) + hostname = "?"; + len = strlen (hostname); + emantsoh = g_utf8_strreverse (emantsoh, len); + for (walk = file->allowed_hosts; walk; walk = walk->next) { + GPatternSpec *pattern = walk->data; + if (g_pattern_match (pattern, len, hostname, emantsoh)) { + g_free (emantsoh); + return TRUE; + } + } + g_free (emantsoh); + return FALSE; +} + +void +swfdec_player_load_policy_file (SwfdecPlayer *player, const SwfdecURL *url) +{ + SWFDEC_FIXME ("implement"); +} + +void +swfdec_player_check_policy_files (SwfdecPlayer *player, + SwfdecPolicyFileFunc func, gpointer data) +{ + SWFDEC_FIXME ("implement"); +} diff --git a/libswfdec/swfdec_policy_file.h b/libswfdec/swfdec_policy_file.h new file mode 100644 index 0000000..5342983 --- /dev/null +++ b/libswfdec/swfdec_policy_file.h @@ -0,0 +1,70 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * 2007 Pekka Lampila <pekka.lampila at iki.fi> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef _SWFDEC_FLASH_SECURITY_POLICY_H_ +#define _SWFDEC_FLASH_SECURITY_POLICY_H_ + +#include <libswfdec/swfdec.h> +#include <libswfdec/swfdec_player.h> + +G_BEGIN_DECLS + +typedef struct _SwfdecPolicyFile SwfdecPolicyFile; +typedef struct _SwfdecPolicyFileClass SwfdecPolicyFileClass; +typedef void (* SwfdecPolicyFileFunc) (SwfdecPlayer *player, gboolean allow, gpointer data); + +#define SWFDEC_TYPE_POLICY_FILE (swfdec_policy_file_get_type()) +#define SWFDEC_IS_POLICY_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_POLICY_FILE)) +#define SWFDEC_IS_POLICY_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_POLICY_FILE)) +#define SWFDEC_POLICY_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_POLICY_FILE, SwfdecPolicyFile)) +#define SWFDEC_POLICY_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_POLICY_FILE, SwfdecPolicyFileClass)) +#define SWFDEC_POLICY_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_POLICY_FILE, SwfdecPolicyFileClass)) + +struct _SwfdecPolicyFile { + GObject object; + + SwfdecPlayer * player; /* player we're loaded from */ + SwfdecURL * load_url; /* url we're loaded from */ + SwfdecURL * url; /* parent url we check with */ + SwfdecLoader * stream; /* stream we are loading or NULL if done loading */ + GSList * allowed_hosts; /* list of GPatternSpec of the allowed hosts */ +}; + +struct _SwfdecPolicyFileClass { + GObjectClass object_class; +}; + +GType swfdec_policy_file_get_type (void); + +SwfdecPolicyFile *swfdec_policy_file_new (SwfdecPlayer * player, + const SwfdecURL * url); +gboolean swfdec_policy_file_is_loading (SwfdecPolicyFile * file); +gboolean swfdec_policy_file_allow (SwfdecPolicyFile * file, + const SwfdecURL * url); + +void swfdec_player_load_policy_file (SwfdecPlayer * player, + const SwfdecURL * url); +void swfdec_player_check_policy_files(SwfdecPlayer * player, + SwfdecPolicyFileFunc func, + gpointer data); + + +G_END_DECLS +#endif diff --git a/libswfdec/swfdec_policy_loader.c b/libswfdec/swfdec_policy_loader.c deleted file mode 100644 index 6d04c75..0000000 --- a/libswfdec/swfdec_policy_loader.c +++ /dev/null @@ -1,255 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * 2007 Pekka Lampila <pekka.lampila at iki.fi> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <string.h> - -#include "swfdec_policy_loader.h" -#include "swfdec_flash_security.h" -#include "swfdec_resource.h" -#include "swfdec_as_strings.h" -#include "swfdec_debug.h" -#include "swfdec_loader_internal.h" -#include "swfdec_player_internal.h" -#include "swfdec_xml.h" -#include "swfdec_xml_node.h" - -/*** SWFDEC_LOADER_TARGET ***/ - -static SwfdecPlayer * -swfdec_policy_loader_target_get_player (SwfdecLoaderTarget *target) -{ - return SWFDEC_POLICY_LOADER (target)->sec->player; -} - -static void -swfdec_policy_loader_target_error (SwfdecLoaderTarget *target, - SwfdecLoader *loader) -{ - SwfdecPolicyLoader *policy_loader = SWFDEC_POLICY_LOADER (target); - - policy_loader->func (policy_loader, FALSE); -} - -static gboolean -swfdec_policy_loader_check (SwfdecAsContext *context, const char *text, - const char *host) -{ - SwfdecXml *xml; - gint32 i, j; - char *host_lower; - - g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), FALSE); - g_return_val_if_fail (text != NULL, FALSE); - - xml = swfdec_xml_new_no_properties (context, text, TRUE); - - if (xml == NULL) { - SWFDEC_ERROR ("failed to create an XML object for crossdomain policy"); - return FALSE; - } - - if (SWFDEC_XML_NODE (xml)->type != SWFDEC_XML_NODE_ELEMENT) { - SWFDEC_LOG ("empty crossdomain policy file"); - return FALSE; - } - - if (host != NULL) { - host_lower = g_ascii_strdown (host, -1); - } else { - host_lower = NULL; - } - - for (i = 0; i < swfdec_xml_node_num_children (SWFDEC_XML_NODE (xml)); i++) { - SwfdecXmlNode *node_cdp - swfdec_xml_node_get_child (SWFDEC_XML_NODE (xml), i); - - if (node_cdp->type != SWFDEC_XML_NODE_ELEMENT) - continue; - - if (g_ascii_strcasecmp (node_cdp->name, "cross-domain-policy") != 0) - continue; - - for (j = 0; j < swfdec_xml_node_num_children (node_cdp); j++) { - SwfdecXmlNode *node_aaf = swfdec_xml_node_get_child (node_cdp, j); - const char *value; - GPatternSpec *pattern; - char *value_lower; - - if (node_aaf->type != SWFDEC_XML_NODE_ELEMENT) - continue; - - if (g_ascii_strcasecmp (node_aaf->name, "allow-access-from") != 0) - continue; - - // FIXME: secure attribute? - - value = swfdec_xml_node_get_attribute (node_aaf, SWFDEC_AS_STR_domain); - if (value == NULL) - continue; - - if (host != NULL) { - // GPatternSpec uses ? as a wildcard character, but we won't - // And there can't be a host that has ? character - if (strchr (value, '?') != NULL) - continue; - - value_lower = g_ascii_strdown (value, -1); - pattern = g_pattern_spec_new (value_lower); - g_free (value_lower); - - if (g_pattern_match_string (pattern, host_lower)) { - g_free (host_lower); - g_pattern_spec_free (pattern); - return TRUE; - } - - g_pattern_spec_free (pattern); - } else { - // in case we don't have a host name, only match asterisks - if (value[strspn (value, "*")] == '\0') - return TRUE; - } - } - } - - g_free (host_lower); - - return FALSE; -} - -static void -swfdec_policy_loader_target_eof (SwfdecLoaderTarget *target, - SwfdecLoader *loader) -{ - SwfdecPolicyLoader *policy_loader = SWFDEC_POLICY_LOADER (target); - gboolean allow; - char *text; - - text = swfdec_loader_get_text (policy_loader->loader, 8); - - if (text == NULL) { - SWFDEC_ERROR ("couldn't get text from crossdomain policy"); - allow = FALSE; - } else { - allow = swfdec_policy_loader_check ( - SWFDEC_AS_CONTEXT (policy_loader->sec->player), text, - swfdec_url_get_host (policy_loader->sec->url)); - } - - g_free (text); - - SWFDEC_LOG ("crossdomain policy %s access from %s to %s", - (allow ? "allows" : "doesn't allow"), - swfdec_url_get_host (policy_loader->sec->url), policy_loader->host); - - policy_loader->func (policy_loader, allow); -} - -static void -swfdec_policy_loader_loader_target_init (SwfdecLoaderTargetInterface *iface) -{ - iface->get_player = swfdec_policy_loader_target_get_player; - iface->eof = swfdec_policy_loader_target_eof; - iface->error = swfdec_policy_loader_target_error; -} - -/*** SWFDEC_POLICY_LOADER ***/ - -G_DEFINE_TYPE_WITH_CODE (SwfdecPolicyLoader, swfdec_policy_loader, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_policy_loader_loader_target_init)) - -static void -swfdec_policy_loader_dispose (GObject *object) -{ - SwfdecPolicyLoader *policy_loader = SWFDEC_POLICY_LOADER (object); - - g_assert (policy_loader->loader); - swfdec_loader_set_target (policy_loader->loader, NULL); - g_object_unref (policy_loader->loader); - policy_loader->loader = NULL; - - g_assert (policy_loader->host); - g_free (policy_loader->host); - - G_OBJECT_CLASS (swfdec_policy_loader_parent_class)->dispose (object); -} - -static void -swfdec_policy_loader_class_init (SwfdecPolicyLoaderClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = swfdec_policy_loader_dispose; -} - -static void -swfdec_policy_loader_init (SwfdecPolicyLoader *policy_loader) -{ -} - -SwfdecPolicyLoader * -swfdec_policy_loader_new (SwfdecFlashSecurity *sec, const char *host, - SwfdecPolicyLoaderFunc func) -{ - SwfdecPolicyLoader *policy_loader; - SwfdecURL *url; - char *url_str; - - g_return_val_if_fail (SWFDEC_IS_FLASH_SECURITY (sec), NULL); - g_return_val_if_fail (host != NULL, NULL); - g_return_val_if_fail (func != NULL, NULL); - - policy_loader = SWFDEC_POLICY_LOADER (g_object_new ( - SWFDEC_TYPE_POLICY_LOADER, NULL)); - - url_str = g_strdup_printf ("http://%s/crossdomain.xml", host); - url = swfdec_url_new (url_str); - g_free (url_str); - policy_loader->loader = swfdec_loader_load (sec->player->priv->resource->loader, - url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0); - swfdec_url_free (url); - - if (!policy_loader->loader) { - g_free (policy_loader); - return NULL; - } - - policy_loader->sec = sec; - policy_loader->host = g_strdup (host); - policy_loader->func = func; - - swfdec_loader_set_target (policy_loader->loader, - SWFDEC_LOADER_TARGET (policy_loader)); - swfdec_loader_set_data_type (policy_loader->loader, SWFDEC_LOADER_DATA_TEXT); - - return policy_loader; -} - -void -swfdec_policy_loader_free (SwfdecPolicyLoader *policy_loader) -{ - g_return_if_fail (SWFDEC_IS_POLICY_LOADER (policy_loader)); - - g_object_unref (policy_loader); -} diff --git a/libswfdec/swfdec_policy_loader.h b/libswfdec/swfdec_policy_loader.h deleted file mode 100644 index 525f48e..0000000 --- a/libswfdec/swfdec_policy_loader.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * 2007 Pekka Lampila <pekka.lampila at iki.fi> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef _SWFDEC_FLASH_SECURITY_POLICY_H_ -#define _SWFDEC_FLASH_SECURITY_POLICY_H_ - -#include <libswfdec/swfdec.h> -#include <libswfdec/swfdec_as_object.h> -#include <libswfdec/swfdec_flash_security.h> - -G_BEGIN_DECLS - -typedef struct _SwfdecPolicyLoader SwfdecPolicyLoader; -typedef struct _SwfdecPolicyLoaderClass SwfdecPolicyLoaderClass; -typedef void (* SwfdecPolicyLoaderFunc) (SwfdecPolicyLoader *policy_loader, gboolean allow); - -#define SWFDEC_TYPE_POLICY_LOADER (swfdec_policy_loader_get_type()) -#define SWFDEC_IS_POLICY_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_POLICY_LOADER)) -#define SWFDEC_IS_POLICY_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_POLICY_LOADER)) -#define SWFDEC_POLICY_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_POLICY_LOADER, SwfdecPolicyLoader)) -#define SWFDEC_POLICY_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_POLICY_LOADER, SwfdecPolicyLoaderClass)) -#define SWFDEC_POLICY_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_POLICY_LOADER, SwfdecPolicyLoaderClass)) - -struct _SwfdecPolicyLoader { - GObject object; - - SwfdecLoader * loader; - - SwfdecFlashSecurity * sec; - char * host; - SwfdecPolicyLoaderFunc func; -}; - -struct _SwfdecPolicyLoaderClass { - GObjectClass object_class; -}; - -GType swfdec_policy_loader_get_type (void); - -SwfdecPolicyLoader *swfdec_policy_loader_new (SwfdecFlashSecurity * sec, - const char * host, - SwfdecPolicyLoaderFunc func); -void swfdec_policy_loader_free (SwfdecPolicyLoader * policy_loader); - -G_END_DECLS -#endif diff --git a/libswfdec/swfdec_resource_request.c b/libswfdec/swfdec_resource_request.c index 8c3ddbf..e367993 100644 --- a/libswfdec/swfdec_resource_request.c +++ b/libswfdec/swfdec_resource_request.c @@ -114,8 +114,7 @@ swfdec_player_request_resource_now (SwfdecPlayer *player, /* create absolute url first */ absolute = swfdec_url_new_relative (swfdec_loader_get_url (player->priv->resource->loader), url); - swfdec_security_allow_url (security, absolute, - swfdec_player_request_resource_allow_callback, data); + swfdec_player_request_resource_allow_callback (absolute, TRUE, data); swfdec_url_free (absolute); } diff --git a/libswfdec/swfdec_security.c b/libswfdec/swfdec_security.c index a41f510..ae431a0 100644 --- a/libswfdec/swfdec_security.c +++ b/libswfdec/swfdec_security.c @@ -61,26 +61,3 @@ swfdec_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) return klass->allow (guard, key); } -/** - * swfdec_security_allow_url: - * @guard: security that is in effect - * @url: URL that should be accessed - * - * Asks @guard to check if the given @url may be accessed. - * - * Returns: %TRUE if @url may be accessed. - **/ -void -swfdec_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url, - SwfdecURLAllowFunc callback, gpointer user_data) -{ - SwfdecSecurityClass *klass; - - g_assert (SWFDEC_IS_SECURITY (guard)); - g_assert (url != NULL); - - klass = SWFDEC_SECURITY_GET_CLASS (guard); - g_assert (klass->allow_url); - klass->allow_url (guard, url, callback, user_data); -} - diff --git a/libswfdec/swfdec_security.h b/libswfdec/swfdec_security.h index 2933b44..cdc0717 100644 --- a/libswfdec/swfdec_security.h +++ b/libswfdec/swfdec_security.h @@ -47,21 +47,13 @@ struct _SwfdecSecurityClass GObjectClass object_class; gboolean (* allow) (SwfdecSecurity * guard, - SwfdecSecurity * from); - void (* allow_url) (SwfdecSecurity * guard, - const SwfdecURL * url, - SwfdecURLAllowFunc callback, - gpointer user_data); + SwfdecSecurity * key); }; GType swfdec_security_get_type (void); gboolean swfdec_security_allow (SwfdecSecurity * guard, SwfdecSecurity * key); -void swfdec_security_allow_url (SwfdecSecurity * guard, - const SwfdecURL * url, - SwfdecURLAllowFunc callback, - gpointer user_data); G_END_DECLS diff --git a/libswfdec/swfdec_security_allow.c b/libswfdec/swfdec_security_allow.c index e60a949..fb678b4 100644 --- a/libswfdec/swfdec_security_allow.c +++ b/libswfdec/swfdec_security_allow.c @@ -35,19 +35,11 @@ swfdec_security_allow_allow (SwfdecSecurity *guard, SwfdecSecurity *key) } static void -swfdec_security_allow_allow_url (SwfdecSecurity *guard, const SwfdecURL *url, - SwfdecURLAllowFunc callback, gpointer user_data) -{ - callback (url, TRUE, user_data); -} - -static void swfdec_security_allow_class_init (SwfdecSecurityAllowClass *klass) { SwfdecSecurityClass *security_class = SWFDEC_SECURITY_CLASS (klass); security_class->allow = swfdec_security_allow_allow; - security_class->allow_url = swfdec_security_allow_allow_url; } static void commit 3970e970c31adc781eb40cd5499b5b592dd1e390 Author: Benjamin Otte <otte at gnome.org> Date: Tue Jan 15 10:52:03 2008 +0100 add more functions to SwfdecURL (untested) These functions are needed by policy file handling diff --git a/libswfdec/swfdec_url.c b/libswfdec/swfdec_url.c index 3d57c54..6cdb54f 100644 --- a/libswfdec/swfdec_url.c +++ b/libswfdec/swfdec_url.c @@ -50,9 +50,9 @@ struct _SwfdecURL { char * url; /* the complete url */ - char * protocol; /* http, file, rtmp, ... */ - char * host; /* can be NULL for files */ - guint port; /* can be NULL */ + char * protocol; /* lowercase, http, file, rtmp, ... */ + char * host; /* lowercase, can be NULL for files */ + guint port; /* can be 0 */ char * path; /* can be NULL for root path */ char * query; /* can be NULL */ }; @@ -111,16 +111,16 @@ swfdec_url_new (const char *string) string = s + 3; s = strchr (string, '/'); if (s == NULL) { - url->host = g_strdup (string); + url->host = g_ascii_strdown (string, -1); return url; } if (s != string) { char *colon = swfdec_memrchr (string, ':', s - string); if (colon) { url->port = strtoul (colon + 1, &colon, 10); - url->host = g_strndup (string, colon - string); + url->host = g_ascii_strdown (string, colon - string); } else { - url->host = g_strndup (string, s - string); + url->host = g_ascii_strdown (string, s - string); } } string = s + 1; @@ -137,6 +137,63 @@ swfdec_url_new (const char *string) } /** + * swfdec_url_new_components: + * @protocol: protocol to use + * @hostname: hostname or IP address or %NULL + * @port: port number or 0. Must be 0 if no hostname is given + * @path: a path or %NULL + * @query: the query string or %NULL + * + * Creates a new URL from the given components. + * + * Returns: a new url pointing to the url from the given components + **/ +SwfdecURL * +swfdec_url_new_components (const char *protocol, const char *hostname, + guint port, const char *path, const char *query) +{ + GString *url; + SwfdecURL *result; + + g_return_val_if_fail (protocol != NULL, NULL); + g_return_val_if_fail (hostname != NULL || port == 0, NULL); + g_return_val_if_fail (port < 65536, NULL); + + url = g_string_new (protocol); + g_string_append (url, "://"); + if (hostname) { + g_string_append (url, hostname); + if (port) { + g_string_append_printf (url, ":%u", port); + } + } + g_string_append (url, "/"); + if (path) + g_string_append (url, path); + if (query) { + g_string_append (url, "?"); + g_string_append (url, query); + } + result = swfdec_url_new (url->str); + g_string_free (url, TRUE); + return result; +} + +/** + * swfdec_url_new_parent: + * @url: a #SwfdecURL + * + * Creates a new url that is the parent of @url. + * + * Returns: a new url pointing to the parent of @url. + **/ +SwfdecURL * +swfdec_url_new_parent (const SwfdecURL *url) +{ + return swfdec_url_new_relative (url, ""); +} + +/** * swfdec_url_new_relative: * @url: a #SwfdecURL * @string: a relative or absolute URL path @@ -206,6 +263,7 @@ swfdec_url_copy (const SwfdecURL *url) copy->url = g_strdup (url->url); copy->protocol = g_strdup (url->protocol); copy->host = g_strdup (url->host); + copy->port = url->port; copy->path = g_strdup (url->path); copy->query = g_strdup (url->query); @@ -288,7 +346,7 @@ swfdec_url_has_protocol (const SwfdecURL *url, const char *protocol) * swfdec_url_get_host: * @url: a #SwfdecURL * - * Gets the host for @url. + * Gets the host for @url as a lower case string. * * Returns: the host or %NULL if none (typically for file URLs). **/ @@ -354,6 +412,47 @@ swfdec_url_get_query (const SwfdecURL *url) } /** + * swfdec_url_is_parent: + * @parent: the supposed parent url + * @child: the supposed child url + * + * Checks if the given @parent url is a parent url of the given @child url. The + * algorithm used is the same as checking policy files if hey apply. If @parent + * equals @child, %TRUE is returned. This function does not compare query + * strings. + * + * Returns: %TRUE if @parent is a parent of @child, %FALSE otherwise. + **/ +gboolean +swfdec_url_is_parent (const SwfdecURL *parent, const SwfdecURL *child) +{ + gsize len; + + g_return_val_if_fail (parent != NULL, FALSE); + g_return_val_if_fail (child != NULL, FALSE); + + if (!g_str_equal (parent->protocol, child->protocol)) + return FALSE; + if (parent->host == NULL) { + if (child->host != NULL) + return FALSE; + } else { + if (child->host == NULL || !g_str_equal (parent->host, child->host)) + return FALSE; + } + if (parent->port != child->port) + return FALSE; + if (parent->path == NULL) + return TRUE; + if (child->path == NULL) + return TRUE; + len = strlen (parent->path); + if (strncmp (parent->path, child->path, len) != 0) + return FALSE; + return child->path[len] == '\0' || child->path[len] == '/'; +} + +/** * swfdec_url_is_local: * @url: the url to check * diff --git a/libswfdec/swfdec_url.h b/libswfdec/swfdec_url.h index 3ac0b88..5eaa306 100644 --- a/libswfdec/swfdec_url.h +++ b/libswfdec/swfdec_url.h @@ -30,6 +30,12 @@ typedef struct _SwfdecURL SwfdecURL; GType swfdec_url_get_type (void) G_GNUC_CONST; SwfdecURL * swfdec_url_new (const char * string); +SwfdecURL * swfdec_url_new_components (const char * protocol, + const char * hostname, + guint port, + const char * path, + const char * query); +SwfdecURL * swfdec_url_new_parent (const SwfdecURL * url); SwfdecURL * swfdec_url_new_relative (const SwfdecURL * url, const char * string); SwfdecURL * swfdec_url_copy (const SwfdecURL * url); @@ -45,6 +51,8 @@ const char * swfdec_url_get_query (const SwfdecURL * url); gboolean swfdec_url_has_protocol (const SwfdecURL * url, const char * protocol); +gboolean swfdec_url_is_parent (const SwfdecURL * parent, + const SwfdecURL * child); gboolean swfdec_url_is_local (const SwfdecURL * url); commit f27d3aa9ac4b7ed3c9803cb71e98fe41cc56526b Author: Benjamin Otte <otte at gnome.org> Date: Tue Jan 15 10:51:40 2008 +0100 g_object_notify next-event after a call to advance() diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index f60b7e8..847a6fb 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1392,6 +1392,7 @@ swfdec_player_do_advance (SwfdecPlayer *player, gulong msecs, guint audio_sample } g_assert (audio_samples == 0); + g_object_notify (G_OBJECT (player), "next-event"); swfdec_player_unlock (player); } @@ -1571,7 +1572,7 @@ swfdec_player_class_init (SwfdecPlayerClass *klass) g_param_spec_enum ("mouse-cursor", "mouse cursor", "how the mouse pointer should be presented", SWFDEC_TYPE_MOUSE_CURSOR, SWFDEC_MOUSE_CURSOR_NONE, G_PARAM_READABLE)); g_object_class_install_property (object_class, PROP_NEXT_EVENT, - g_param_spec_long ("next-event", "next event", "how many milliseconds until the next event or 0 when no event pending", + g_param_spec_long ("next-event", "next event", "how many milliseconds until the next event or -1 when no event pending", -1, G_MAXLONG, -1, G_PARAM_READABLE)); g_object_class_install_property (object_class, PROP_CACHE_SIZE, g_param_spec_uint ("cache-size", "cache size", "maximum cache size in bytes", commit 1438104e4de0a19f29eed726da5aceea172abfba Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 12 00:23:51 2008 +0100 parse ports seperately diff --git a/libswfdec/swfdec_url.c b/libswfdec/swfdec_url.c index fe9ca0a..3d57c54 100644 --- a/libswfdec/swfdec_url.c +++ b/libswfdec/swfdec_url.c @@ -20,7 +20,10 @@ #ifdef HAVE_CONFIG_H #include "config.h" #endif + +#include <stdlib.h> #include <string.h> + #include "swfdec_url.h" #include "swfdec_debug.h" @@ -49,6 +52,7 @@ struct _SwfdecURL { char * url; /* the complete url */ char * protocol; /* http, file, rtmp, ... */ char * host; /* can be NULL for files */ + guint port; /* can be NULL */ char * path; /* can be NULL for root path */ char * query; /* can be NULL */ }; @@ -65,6 +69,19 @@ swfdec_url_get_type (void) return type; } +static void * +swfdec_memrchr (const void *s, int c, size_t n) +{ + void *cur, *next; + + cur = memchr (s, c, n); + if (cur == NULL) + return NULL; + while ((next = memchr (cur, c, n))) + cur = next; + return cur; +} + /** * swfdec_url_new: * @string: a full-qualified URL encoded in UTF-8 @@ -81,6 +98,7 @@ swfdec_url_new (const char *string) g_return_val_if_fail (string != NULL, NULL); + /* FIXME: error checking? */ SWFDEC_DEBUG ("new url: %s", string); url = g_slice_new0 (SwfdecURL); url->url = g_strdup (string); @@ -96,8 +114,15 @@ swfdec_url_new (const char *string) url->host = g_strdup (string); return url; } - if (s != string) - url->host = g_strndup (string, s - string); + if (s != string) { + char *colon = swfdec_memrchr (string, ':', s - string); + if (colon) { + url->port = strtoul (colon + 1, &colon, 10); + url->host = g_strndup (string, colon - string); + } else { + url->host = g_strndup (string, s - string); + } + } string = s + 1; s = strchr (string, '?'); if (s == NULL) { @@ -263,8 +288,7 @@ swfdec_url_has_protocol (const SwfdecURL *url, const char *protocol) * swfdec_url_get_host: * @url: a #SwfdecURL * - * Gets the host for @url. If the host includes a portnumber, it will be present - * in the returned string. + * Gets the host for @url. * * Returns: the host or %NULL if none (typically for file URLs). **/ @@ -277,6 +301,23 @@ swfdec_url_get_host (const SwfdecURL *url) } /** + * swfdec_url_get_port: + * @url: a #SwfdecURL + * + * Gets the port number specified by the given @url. If the @url does not + * specify a port number, 0 will be returned. + * + * Returns: the specified port or 0 if none was given. + **/ +guint +swfdec_url_get_port (const SwfdecURL *url) +{ + g_return_val_if_fail (url != NULL, 0); + + return url->port; +} + +/** * swfdec_url_get_path: * @url: a #SwfdecURL * diff --git a/libswfdec/swfdec_url.h b/libswfdec/swfdec_url.h index 7a94039..3ac0b88 100644 --- a/libswfdec/swfdec_url.h +++ b/libswfdec/swfdec_url.h @@ -38,6 +38,7 @@ void swfdec_url_free (SwfdecURL * url); const char * swfdec_url_get_url (const SwfdecURL * url); const char * swfdec_url_get_protocol (const SwfdecURL * url); const char * swfdec_url_get_host (const SwfdecURL * url); +guint swfdec_url_get_port (const SwfdecURL * url); const char * swfdec_url_get_path (const SwfdecURL * url); const char * swfdec_url_get_query (const SwfdecURL * url); commit b94436fdcfb7954e66a90593e8d631a5e4cb3c73 Author: Benjamin Otte <otte at gnome.org> Date: Fri Jan 11 13:56:38 2008 +0100 get rid of swfdec_movie_load_variables() API and call it directly diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 24ed902..24a822c 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -39,6 +39,7 @@ #include <math.h> #include <string.h> #include "swfdec_decoder.h" +#include "swfdec_load_object.h" #include "swfdec_movie.h" #include "swfdec_player_internal.h" #include "swfdec_sprite.h" @@ -1161,6 +1162,18 @@ swfdec_action_get_url (SwfdecAsContext *cx, guint action, const guint8 *data, gu } static void +swfdec_as_interpret_load_variables_on_finish (SwfdecAsObject *target, + const char *text) +{ + if (text != NULL) + swfdec_as_object_decode (target, text); + + // only call onData for sprite movies + // FIXME: is it called even when loading fails? + swfdec_movie_queue_script (SWFDEC_MOVIE (target), SWFDEC_EVENT_DATA); +} + +static void swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { const char *target, *url; @@ -1193,8 +1206,10 @@ swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, g SwfdecMovie *movie; movie = swfdec_player_get_movie_from_string (SWFDEC_PLAYER (cx), target); - if (movie != NULL) - swfdec_movie_load_variables (movie, url, method, NULL); + if (movie != NULL) { + swfdec_load_object_new (SWFDEC_AS_OBJECT (movie), url, method, NULL, NULL, + swfdec_as_interpret_load_variables_on_finish); + } } else if (internal) { swfdec_resource_load (SWFDEC_PLAYER (cx), target, url, method, NULL, NULL); } else { diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 547155b..90147a3 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -1724,35 +1724,6 @@ swfdec_movie_duplicate (SwfdecMovie *movie, const char *name, int depth) return copy; } -static void -swfdec_movie_load_variables_on_finish (SwfdecAsObject *target, - const char *text) -{ - if (text != NULL) - swfdec_as_object_decode (target, text); - - // only call onData for sprite movies - // FIXME: is it called even when loading fails? - if (target->context->version >= 6 && SWFDEC_IS_SPRITE_MOVIE (target)) - swfdec_as_object_call (target, SWFDEC_AS_STR_onData, 0, NULL, NULL); -} - -void -swfdec_movie_load_variables (SwfdecMovie *movie, const char *url, - SwfdecLoaderRequest request, SwfdecBuffer *data) -{ - g_return_if_fail (SWFDEC_IS_MOVIE (movie)); - g_return_if_fail (url != NULL); - - if (request != SWFDEC_LOADER_REQUEST_DEFAULT) { - SWFDEC_FIXME ("loadVariables: Different request-modes not supported"); - return; - } - - swfdec_load_object_new (SWFDEC_AS_OBJECT (movie), url, request, data, NULL, - swfdec_movie_load_variables_on_finish); -} - char * swfdec_movie_get_path (SwfdecMovie *movie, gboolean dot) { diff --git a/libswfdec/swfdec_movie.h b/libswfdec/swfdec_movie.h index 6b5b001..623707f 100644 --- a/libswfdec/swfdec_movie.h +++ b/libswfdec/swfdec_movie.h @@ -278,10 +278,6 @@ void swfdec_movie_execute (SwfdecMovie * movie, SwfdecEventType condition); void swfdec_movie_queue_script (SwfdecMovie * movie, SwfdecEventType condition); -void swfdec_movie_load_variables (SwfdecMovie * movie, - const char * url, - SwfdecLoaderRequest request, - SwfdecBuffer * data); int swfdec_movie_compare_depths (gconstpointer a, gconstpointer b); commit 5accd77d61fd2147c49b5563414876248dc89a1c Author: Benjamin Otte <otte at gnome.org> Date: Thu Jan 10 19:51:13 2008 +0100 use a function list for the player's rooted objects diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c index 5b659f2..eb72a56 100644 --- a/libswfdec/swfdec_load_object.c +++ b/libswfdec/swfdec_load_object.c @@ -67,8 +67,8 @@ swfdec_load_object_loader_target_error (SwfdecLoaderTarget *target, load_object->finish (load_object->target, NULL); /* unroot */ - swfdec_player_unroot_object (SWFDEC_PLAYER ( - SWFDEC_AS_OBJECT (load_object)->context), G_OBJECT (load_object)); + swfdec_player_unroot (SWFDEC_PLAYER ( + SWFDEC_AS_OBJECT (load_object)->context), load_object); } static void @@ -96,8 +96,8 @@ swfdec_load_object_loader_target_eof (SwfdecLoaderTarget *target, } /* unroot */ - swfdec_player_unroot_object (SWFDEC_PLAYER ( - SWFDEC_AS_OBJECT (load_object)->context), G_OBJECT (load_object)); + swfdec_player_unroot (SWFDEC_PLAYER ( + SWFDEC_AS_OBJECT (load_object)->context), load_object); } static void @@ -222,8 +222,7 @@ swfdec_load_object_new (SwfdecAsObject *target, const char *url, if (!swfdec_load_object_load (load_object, url, request, data)) return NULL; - swfdec_player_root_object (SWFDEC_PLAYER (target->context), - G_OBJECT (load_object)); + swfdec_player_root (SWFDEC_PLAYER (target->context), load_object, (GFunc) swfdec_as_object_mark); return SWFDEC_AS_OBJECT (load_object); } diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 215d604..f60b7e8 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -878,9 +878,8 @@ swfdec_player_dispose (GObject *object) g_object_unref (priv->resource); priv->resource = NULL; } - while (priv->rooted_objects) - swfdec_player_unroot_object (player, priv->rooted_objects->data); + swfdec_function_list_clear (&priv->rooted); /* we do this here so references to GC'd objects get freed */ G_OBJECT_CLASS (swfdec_player_parent_class)->dispose (object); @@ -1508,16 +1507,6 @@ swfdec_player_mark_string_object (gpointer key, gpointer value, gpointer data) } static void -swfdec_player_mark_rooted_object (gpointer object, gpointer unused) -{ - if (SWFDEC_IS_RESOURCE (object)) { - swfdec_resource_mark (object); - } else if (SWFDEC_IS_AS_OBJECT (object)) { - swfdec_as_object_mark (object); - } -} - -static void swfdec_player_mark (SwfdecAsContext *context) { SwfdecPlayer *player = SWFDEC_PLAYER (context); @@ -1529,7 +1518,7 @@ swfdec_player_mark (SwfdecAsContext *context) swfdec_as_object_mark (priv->Video); g_list_foreach (priv->roots, (GFunc) swfdec_as_object_mark, NULL); g_list_foreach (priv->intervals, (GFunc) swfdec_as_object_mark, NULL); - g_list_foreach (priv->rooted_objects, swfdec_player_mark_rooted_object, NULL); + swfdec_function_list_execute (&priv->rooted, player); SWFDEC_AS_CONTEXT_CLASS (swfdec_player_parent_class)->mark (context); } @@ -2090,38 +2079,6 @@ swfdec_player_set_export_class (SwfdecPlayer *player, const char *name, SwfdecAs } } -/* FIXME: - * I don't like the idea of rooting arbitrary objects very much. And so far, - * this API is only necessary for the objects used for loading data. So it seems - * like a good idea to revisit the refcounting and GCing of resources. - */ -void -swfdec_player_root_object (SwfdecPlayer *player, GObject *object) -{ - SwfdecPlayerPrivate *priv; - - g_return_if_fail (SWFDEC_IS_PLAYER (player)); - g_return_if_fail (G_IS_OBJECT (object)); - - priv = player->priv; - g_object_ref (object); - priv->rooted_objects = g_list_prepend (priv->rooted_objects, object); -} - -void -swfdec_player_unroot_object (SwfdecPlayer *player, GObject *object) -{ - SwfdecPlayerPrivate *priv = player->priv; - GList *entry; - - g_return_if_fail (SWFDEC_IS_PLAYER (player)); - g_return_if_fail (G_IS_OBJECT (object)); - entry = g_list_find (priv->rooted_objects, object); - g_return_if_fail (entry != NULL); - g_object_unref (object); - priv->rooted_objects = g_list_delete_link (priv->rooted_objects, entry); -} - /** PUBLIC API ***/ /** diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index f3fbb60..06d8eea 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -23,6 +23,7 @@ #include <libswfdec/swfdec_player.h> #include <libswfdec/swfdec_audio.h> #include <libswfdec/swfdec_event.h> +#include <libswfdec/swfdec_function_list.h> #include <libswfdec/swfdec_player_scripting.h> #include <libswfdec/swfdec_rect.h> #include <libswfdec/swfdec_ringbuffer.h> @@ -61,7 +62,6 @@ struct _SwfdecPlayerPrivate guint width; /* width of movie */ guint height; /* height of movie */ GList * roots; /* all the root movies */ - GList * rooted_objects; /* all the objects we keep track of */ GSList * resource_requests; /* all external requested URIs - see swfdec_resource_request.[ch] */ SwfdecCache * cache; /* player cache */ gboolean bgcolor_set; /* TRUE if the background color has been set */ @@ -86,6 +86,7 @@ struct _SwfdecPlayerPrivate guint unnamed_count; /* variable used for naming unnamed movies */ /* ActionScript */ + SwfdecFunctionList rooted; /* all the objects we keep track of */ guint interval_id; /* id returned from setInterval call */ GList * intervals; /* all currently running intervals */ GHashTable * registered_classes; /* name => SwfdecAsObject constructor */ @@ -149,10 +150,10 @@ void swfdec_player_unlock (SwfdecPlayer * player); void swfdec_player_unlock_soft (SwfdecPlayer * player); void swfdec_player_perform_actions (SwfdecPlayer * player); -void swfdec_player_root_object (SwfdecPlayer * player, - GObject * object); -void swfdec_player_unroot_object (SwfdecPlayer * player, - GObject * object); +#define swfdec_player_root(player, data, mark_func) \ + swfdec_function_list_add (&(player)->priv->rooted, (mark_func), (data), NULL) +#define swfdec_player_unroot(player, data) \ + swfdec_function_list_remove (&(player)->priv->rooted, (data)) SwfdecAsObject *swfdec_player_get_export_class (SwfdecPlayer * player, const char * name); void swfdec_player_set_export_class (SwfdecPlayer * player, diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index cac371a..f4fcf3c 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -210,7 +210,7 @@ swfdec_resource_create_movie (SwfdecResource *resource) SWFDEC_WARNING ("%s does not reference a movie, not loading %s", resource->target, swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); swfdec_loader_close (resource->loader); - swfdec_player_unroot_object (player, G_OBJECT (resource)); + swfdec_player_unroot (player, resource); return FALSE; } movie = swfdec_player_get_movie_at_level (player, level); @@ -220,7 +220,7 @@ swfdec_resource_create_movie (SwfdecResource *resource) } else { movie = swfdec_resource_replace_movie (movie, resource); } - swfdec_player_unroot_object (player, G_OBJECT (resource)); + swfdec_player_unroot (player, resource); return TRUE; } @@ -544,7 +544,7 @@ swfdec_resource_load (SwfdecPlayer *player, const char *target, const char *url, resource->target = path; if (loader) resource->clip_loader = g_object_ref (loader); - swfdec_player_root_object (player, G_OBJECT (resource)); + swfdec_player_root (player, resource, (GFunc) swfdec_resource_mark); swfdec_player_request_resource (player, SWFDEC_AS_CONTEXT (player)->frame->security, url, request, buffer, swfdec_resource_do_load, resource, g_object_unref); } commit d9e056c222d464336c6925a87d7510c9f4a65375 Author: Benjamin Otte <otte at gnome.org> Date: Thu Jan 10 19:41:36 2008 +0100 add a SwfdecFunctionList struct This is supposed to make collecting callbacks easier, as there's a lot of those around. I'm not sure this API works out, but we can at least try it. diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 4f2d438..9320e97 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -80,6 +80,7 @@ libswfdec_source_files = \ swfdec_flash_security.c \ swfdec_flv_decoder.c \ swfdec_font.c \ + swfdec_function_list.c \ swfdec_glow_filter.c \ swfdec_gradient_filter.c \ swfdec_gradient_pattern.c \ @@ -238,6 +239,7 @@ noinst_HEADERS = \ swfdec_flash_security.h \ swfdec_flv_decoder.h \ swfdec_font.h \ + swfdec_function_list.h \ swfdec_gradient_pattern.h \ swfdec_graphic.h \ swfdec_graphic_movie.h \ diff --git a/libswfdec/swfdec_function_list.c b/libswfdec/swfdec_function_list.c new file mode 100644 index 0000000..0b29b59 --- /dev/null +++ b/libswfdec/swfdec_function_list.c @@ -0,0 +1,132 @@ +/* Swfdec + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> +#include "swfdec_function_list.h" + +typedef struct _SwfdecFunctionListEntry SwfdecFunctionListEntry; +struct _SwfdecFunctionListEntry { + GFunc func; + gpointer data; + GDestroyNotify destroy; +}; + +void +swfdec_function_list_clear (SwfdecFunctionList *list) +{ + GList *walk; + + g_return_if_fail (list != NULL); + + for (walk = list->list; walk; walk = walk->next) { + SwfdecFunctionListEntry *entry = walk->data; + if (entry->destroy) + entry->destroy (entry->data); + g_slice_free (SwfdecFunctionListEntry, entry); + } + g_list_free (list->list); + list->list = NULL; +} + +void +swfdec_function_list_add (SwfdecFunctionList *list, GFunc func, + gpointer data, GDestroyNotify destroy) +{ + SwfdecFunctionListEntry *entry; + + g_return_if_fail (list != NULL); + g_return_if_fail (func); + + entry = g_slice_new (SwfdecFunctionListEntry); + entry->func = func; + entry->data = data; + entry->destroy = destroy; + + list->list = g_list_append (list->list, entry); +} + +static int +swfdec_function_list_entry_compare (gconstpointer a, gconstpointer b) +{ + a = ((const SwfdecFunctionListEntry *) a)->data; + b = ((const SwfdecFunctionListEntry *) b)->data; + + if (a < b) + return -1; + if (a > b) + return 1; + return 0; +} + +void +swfdec_function_list_remove (SwfdecFunctionList *list, gpointer data) +{ + SwfdecFunctionListEntry entry = { NULL, data, NULL }; + SwfdecFunctionListEntry *e; + GList *node; + + g_return_if_fail (list != NULL); + + node = g_list_find_custom (list->list, &entry, + swfdec_function_list_entry_compare); + e = node->data; + if (e->destroy) + e->destroy (data); + g_slice_free (SwfdecFunctionListEntry, e); + list->list = g_list_delete_link (list->list, node); +} + +void +swfdec_function_list_execute (SwfdecFunctionList *list, gpointer data) +{ + SwfdecFunctionListEntry *entry; + GList *walk; + + g_return_if_fail (list != NULL); + + for (walk = list->list; walk; walk = walk->next) { + entry = walk->data; + entry->func (entry->data, data); + } +} + +void +swfdec_function_list_execute_and_clear (SwfdecFunctionList *list, gpointer data) +{ + SwfdecFunctionListEntry *entry; + GList *old, *walk; + + g_return_if_fail (list != NULL); + + old = list->list; + list->list = NULL; + for (walk = old; walk; walk = walk->next) { + entry = walk->data; + entry->func (entry->data, data); + if (entry->destroy) + entry->destroy (entry->data); + g_slice_free (SwfdecFunctionListEntry, entry); + } + g_list_free (old); +} + diff --git a/libswfdec/swfdec_function_list.h b/libswfdec/swfdec_function_list.h new file mode 100644 index 0000000..f7e8691 --- /dev/null +++ b/libswfdec/swfdec_function_list.h @@ -0,0 +1,50 @@ +/* Swfdec + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef __SWFDEC_FUNCTION_LIST_H__ +#define __SWFDEC_FUNCTION_LIST_H__ + +#include <glib.h> + +G_BEGIN_DECLS + + +typedef struct _SwfdecFunctionList SwfdecFunctionList; +struct _SwfdecFunctionList { + GList * list; +}; + +void swfdec_function_list_clear (SwfdecFunctionList * list); + +void swfdec_function_list_add (SwfdecFunctionList * list, + GFunc func, + gpointer data, + GDestroyNotify destroy); +void swfdec_function_list_remove (SwfdecFunctionList * list, + gpointer data); + +void swfdec_function_list_execute (SwfdecFunctionList * list, + gpointer data); +void swfdec_function_list_execute_and_clear + (SwfdecFunctionList * list, + gpointer data); + +G_END_DECLS + +#endif commit 5803c29fe96a360fdc31678c5a325a58a1926da0 Author: Benjamin Otte <otte at gnome.org> Date: Thu Jan 10 18:33:44 2008 +0100 add copyright headers diff --git a/libswfdec/swfdec_ringbuffer.c b/libswfdec/swfdec_ringbuffer.c index acc8ba1..6d3dd04 100644 --- a/libswfdec/swfdec_ringbuffer.c +++ b/libswfdec/swfdec_ringbuffer.c @@ -1,3 +1,21 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/libswfdec/swfdec_ringbuffer.h b/libswfdec/swfdec_ringbuffer.h index d7aad1b..3f02851 100644 --- a/libswfdec/swfdec_ringbuffer.h +++ b/libswfdec/swfdec_ringbuffer.h @@ -1,3 +1,21 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ #ifndef __SWFDEC_RING_BUFFER_H__ #define __SWFDEC_RING_BUFFER_H__ commit 2da50c68beb947d61ac817961db4ca7923ed6f75 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 22:41:16 2008 +0100 This file has been missing all the time diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 4990956..dc62604 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -284,7 +284,8 @@ noinst_HEADERS = \ swfdec_video.h \ swfdec_video_movie.h \ swfdec_xml_node.h \ - swfdec_xml.h + swfdec_xml.h \ + swfdec_xml_socket.h EXTRA_DIST = \ compiler.c \ diff --git a/libswfdec/swfdec_xml_socket.h b/libswfdec/swfdec_xml_socket.h new file mode 100644 index 0000000..95f19c2 --- /dev/null +++ b/libswfdec/swfdec_xml_socket.h @@ -0,0 +1,56 @@ +/* Swfdec + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef _SWFDEC_XML_SOCKET_H_ +#define _SWFDEC_XML_SOCKET_H_ + +#include <libswfdec/swfdec.h> +#include <libswfdec/swfdec_as_object.h> + +G_BEGIN_DECLS + + +typedef struct _SwfdecXmlSocket SwfdecXmlSocket; +typedef struct _SwfdecXmlSocketClass SwfdecXmlSocketClass; + +#define SWFDEC_TYPE_XML_SOCKET (swfdec_xml_socket_get_type()) +#define SWFDEC_IS_XML_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_XML_SOCKET)) +#define SWFDEC_IS_XML_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_XML_SOCKET)) +#define SWFDEC_XML_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_XML_SOCKET, SwfdecXmlSocket)) +#define SWFDEC_XML_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_XML_SOCKET, SwfdecXmlSocketClass)) +#define SWFDEC_XML_SOCKET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_XML_SOCKET, SwfdecXmlSocketClass)) + +struct _SwfdecXmlSocket { + SwfdecAsObject object; + + SwfdecSocket * socket; /* the socket in use */ + gboolean open; /* the socket has been opened already */ + SwfdecBufferQueue * queue; /* everything that belongs to the same string */ + SwfdecAsObject * target; /* target object we call out to */ +}; + +struct _SwfdecXmlSocketClass { + SwfdecAsObjectClass object_class; +}; + +GType swfdec_xml_socket_get_type (void); + + +G_END_DECLS +#endif commit 1f66627e35c49d677b036e8efb0fe1dba09bb7e0 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 22:40:01 2008 +0100 emit player events in every sandbox FIXME: figure out correct order diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 12ec552..b41c3e6 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -936,17 +936,22 @@ swfdec_player_dispose (GObject *object) static void swfdec_player_broadcast (SwfdecPlayer *player, const char *object_name, const char *signal) { + GSList *walk; SwfdecAsValue val; SwfdecAsObject *obj; SWFDEC_DEBUG ("broadcasting message %s.%s", object_name, signal); - obj = SWFDEC_AS_CONTEXT (player)->global; - swfdec_as_object_get_variable (obj, object_name, &val); - if (!SWFDEC_AS_VALUE_IS_OBJECT (&val)) - return; - obj = SWFDEC_AS_VALUE_GET_OBJECT (&val); - SWFDEC_AS_VALUE_SET_STRING (&val, signal); - swfdec_as_object_call (obj, SWFDEC_AS_STR_broadcastMessage, 1, &val, NULL); + for (walk = player->priv->sandboxes; walk; walk = walk->next) { + SwfdecSandbox *sandbox = walk->data; + swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (sandbox), object_name, &val); + if (!SWFDEC_AS_VALUE_IS_OBJECT (&val)) + return; + obj = SWFDEC_AS_VALUE_GET_OBJECT (&val); + SWFDEC_AS_VALUE_SET_STRING (&val, signal); + swfdec_sandbox_use (sandbox); + swfdec_as_object_call (obj, SWFDEC_AS_STR_broadcastMessage, 1, &val, NULL); + swfdec_sandbox_unuse (sandbox); + } } static void commit ae135374042a5e5a53c6533324b7e389da92b13d Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 22:32:18 2008 +0100 make sandbox lookup work with as versions and make sandboxes not leak diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index d5345ac..12ec552 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -911,8 +911,7 @@ swfdec_player_dispose (GObject *object) } g_assert (priv->movies == NULL); g_assert (priv->audio == NULL); - g_assert (g_hash_table_size (priv->sandboxes) == 0); - g_hash_table_destroy (priv->sandboxes); + g_slist_free (priv->sandboxes); if (priv->external_timeout.callback) swfdec_player_remove_timeout (player, &priv->external_timeout); if (priv->rate) { @@ -1524,6 +1523,7 @@ swfdec_player_mark (SwfdecAsContext *context) g_hash_table_foreach (priv->scripting_callbacks, swfdec_player_mark_string_object, NULL); g_list_foreach (priv->roots, (GFunc) swfdec_as_object_mark, NULL); g_list_foreach (priv->intervals, (GFunc) swfdec_as_object_mark, NULL); + g_slist_foreach (priv->sandboxes, (GFunc) swfdec_as_object_mark, NULL); swfdec_function_list_execute (&priv->rooted, player); swfdec_as_object_mark (SWFDEC_AS_OBJECT (priv->resource)); @@ -1791,8 +1791,6 @@ swfdec_player_init (SwfdecPlayer *player) priv->iterate_timeout.callback = swfdec_player_iterate; priv->stage_width = -1; priv->stage_height = -1; - - priv->sandboxes = g_hash_table_new (swfdec_url_hash, swfdec_url_equal); } void diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index 8c9e819..889a1ee 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -133,7 +133,7 @@ struct _SwfdecPlayerPrivate SwfdecRingBuffer * actions[SWFDEC_PLAYER_N_ACTION_QUEUES]; /* all actions we've queued up so far */ /* security */ - GHashTable * sandboxes; /* SwfdecURL => SwfdecSandbox mapping */ + GSList * sandboxes; /* all existing sandboxes */ GList * loading_policy_files; /* list of loading SwfdecPlayerLoader - newest first */ GSList * policy_files; /* list of SwfdecPolicyLoader that finished loading */ }; diff --git a/libswfdec/swfdec_sandbox.c b/libswfdec/swfdec_sandbox.c index f10b102..e3c967f 100644 --- a/libswfdec/swfdec_sandbox.c +++ b/libswfdec/swfdec_sandbox.c @@ -62,10 +62,23 @@ swfdec_sandbox_mark (SwfdecAsObject *object) } static void +swfdec_sandbox_dispose (GObject *object) +{ + SwfdecSandbox *sandbox = SWFDEC_SANDBOX (object); + + swfdec_url_free (sandbox->url); + + G_OBJECT_CLASS (swfdec_sandbox_parent_class)->dispose (object); +} + +static void swfdec_sandbox_class_init (SwfdecSandboxClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass); + object_class->dispose = swfdec_sandbox_dispose; + asobject_class->mark = swfdec_sandbox_mark; } @@ -168,6 +181,7 @@ swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url, SwfdecSandbox *sandbox; SwfdecURL *real; guint as_version; + GSList *walk; g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); g_return_val_if_fail (url != NULL, NULL); @@ -175,11 +189,16 @@ swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url, priv = player->priv; real = swfdec_url_new_components (swfdec_url_get_protocol (url), swfdec_url_get_host (url), swfdec_url_get_port (url), NULL, NULL); - as_version = flash_version < 7 ? 1 : 2; - /* FIXME: look up by as version */ - sandbox = g_hash_table_lookup (priv->sandboxes, real); - if (sandbox) { + + for (walk = priv->sandboxes; walk; walk = walk->next) { + sandbox = walk->data; + if (sandbox->as_version == as_version && + swfdec_url_equal (sandbox->url, real)) + break; + } + + if (walk) { swfdec_url_free (real); if (!swfdec_sandbox_set_allow_network (sandbox, allow_network)) @@ -194,6 +213,7 @@ swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url, swfdec_as_object_add (SWFDEC_AS_OBJECT (sandbox), context, size); sandbox->url = real; sandbox->as_version = as_version; + priv->sandboxes = g_slist_prepend (priv->sandboxes, sandbox); if (!swfdec_sandbox_set_allow_network (sandbox, allow_network)) return NULL; commit 5a6e7a8c1729771557e24638bb44ad318a3ee5e0 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 21:54:45 2008 +0100 save the movie before running user code diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 231b27a..d5345ac 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -473,9 +473,10 @@ swfdec_player_do_action (SwfdecPlayer *player) } while (action->movie == NULL); /* skip removed actions */ if (action) { if (action->script) { - swfdec_sandbox_use (action->movie->resource->sandbox); + SwfdecSandbox *sandbox = action->movie->resource->sandbox; + swfdec_sandbox_use (sandbox); swfdec_as_object_run (SWFDEC_AS_OBJECT (action->movie), action->script); - swfdec_sandbox_unuse (action->movie->resource->sandbox); + swfdec_sandbox_unuse (sandbox); } else { swfdec_movie_execute (action->movie, action->event); } commit fc3baf5a0b0031ea9f62e320d3b3106f00d66702 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 21:54:22 2008 +0100 set the sandbox before parsing the amf stream and when emitting the signal diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 1502a28..9df71e0 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -151,6 +151,7 @@ swfdec_net_stream_video_goto (SwfdecNetStream *stream, guint timestamp) SWFDEC_LOG ("processing event from timestamp %u", process_events_from); process_events_from++; /* increase so we get the next event next time */ swfdec_bits_init (&bits, event); + swfdec_sandbox_use (stream->sandbox); if (swfdec_amf_parse (SWFDEC_AS_OBJECT (stream)->context, &bits, 2, SWFDEC_AMF_STRING, &name, SWFDEC_AMF_MIXED_ARRAY, &value) != 2) { SWFDEC_ERROR ("could not parse data tag"); @@ -158,6 +159,7 @@ swfdec_net_stream_video_goto (SwfdecNetStream *stream, guint timestamp) swfdec_as_object_call (SWFDEC_AS_OBJECT (stream), SWFDEC_AS_VALUE_GET_STRING (&name), 1, &value, NULL); } + swfdec_sandbox_unuse (stream->sandbox); } } } commit 25711468e585af3ae35a22e7ca495f096124ac49 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 21:54:04 2008 +0100 add check that requires context (currently necessary) diff --git a/libswfdec/swfdec_amf.c b/libswfdec/swfdec_amf.c index 4baab41..688df0a 100644 --- a/libswfdec/swfdec_amf.c +++ b/libswfdec/swfdec_amf.c @@ -183,6 +183,7 @@ swfdec_amf_parse_one (SwfdecAsContext *context, SwfdecBits *bits, guint type; g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), 0); + g_return_val_if_fail (context->global != NULL, 0); g_return_val_if_fail (bits != NULL, FALSE); g_return_val_if_fail (rval != NULL, FALSE); g_return_val_if_fail (expected_type < SWFDEC_AMF_N_TYPES, FALSE); @@ -208,6 +209,7 @@ swfdec_amf_parse (SwfdecAsContext *context, SwfdecBits *bits, guint n_items, ... guint i; g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), 0); + g_return_val_if_fail (context->global != NULL, 0); g_return_val_if_fail (bits != NULL, 0); va_start (args, n_items); commit fb9079df6b7d92e5efee09d58b0ae3d526e2a375 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 21:13:57 2008 +0100 save the version, too - we need it when parsing the data diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c index 642e256..33c4e4b 100644 --- a/libswfdec/swfdec_load_object.c +++ b/libswfdec/swfdec_load_object.c @@ -86,7 +86,7 @@ swfdec_load_object_stream_target_close (SwfdecStreamTarget *target, // get text text - swfdec_loader_get_text (loader, load_object->target->context->version); + swfdec_loader_get_text (loader, load_object->version); /* break reference to the loader */ swfdec_stream_set_target (stream, NULL); @@ -248,5 +248,6 @@ swfdec_load_object_create (SwfdecAsObject *target, const char *url, /* get the current security */ g_assert (SWFDEC_AS_CONTEXT (player)->frame); load->sandbox = SWFDEC_SANDBOX (SWFDEC_AS_CONTEXT (player)->global); + load->version = SWFDEC_AS_CONTEXT (player)->version; swfdec_player_request_resource (player, swfdec_load_object_request, load, NULL); } diff --git a/libswfdec/swfdec_load_object.h b/libswfdec/swfdec_load_object.h index 3436562..51b3baa 100644 --- a/libswfdec/swfdec_load_object.h +++ b/libswfdec/swfdec_load_object.h @@ -52,6 +52,7 @@ struct _SwfdecLoadObject { SwfdecLoader * loader; /* loader when loading or NULL */ SwfdecSandbox * sandbox; /* sandbox that inited the loading */ + guint version; /* version used when initiating the load - for parsing the data */ SwfdecAsObject * target; /* target object */ SwfdecLoadObjectProgress progress; /* progress callback */ SwfdecLoadObjectFinish finish; /* finish callback */ commit 8df2f695cb639c92dd976c3d6f43041909c090bd Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 20:42:37 2008 +0100 require the Flash version for initialization diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index e3e90a8..26b9511 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -78,7 +78,7 @@ swfdec_resource_stream_target_image (SwfdecResource *instance) SwfdecSwfDecoder *dec = SWFDEC_SWF_DECODER (instance->decoder); instance->sandbox = swfdec_sandbox_get_for_url (player, - swfdec_loader_get_url (instance->loader), + swfdec_loader_get_url (instance->loader), instance->version, SWFDEC_SWF_DECODER (instance->decoder)->use_network); if (instance->sandbox) { movie->sprite = dec->main_sprite; diff --git a/libswfdec/swfdec_sandbox.c b/libswfdec/swfdec_sandbox.c index bdc7bf1..f10b102 100644 --- a/libswfdec/swfdec_sandbox.c +++ b/libswfdec/swfdec_sandbox.c @@ -76,7 +76,7 @@ swfdec_sandbox_init (SwfdecSandbox *sandbox) } static void -swfdec_sandbox_initialize (SwfdecSandbox *sandbox) +swfdec_sandbox_initialize (SwfdecSandbox *sandbox, guint version) { SwfdecAsContext *context = SWFDEC_AS_OBJECT (sandbox)->context; SwfdecPlayer *player = SWFDEC_PLAYER (context); @@ -93,7 +93,7 @@ swfdec_sandbox_initialize (SwfdecSandbox *sandbox) swfdec_net_stream_init_context (player); swfdec_as_context_run_init_script (context, swfdec_initialize, - sizeof (swfdec_initialize), 8); + sizeof (swfdec_initialize), version); sandbox->Function = context->Function; sandbox->Function_prototype = context->Function_prototype; @@ -140,8 +140,6 @@ swfdec_sandbox_set_allow_network (SwfdecSandbox *sandbox, gboolean network) sandbox->type = SWFDEC_SANDBOX_REMOTE; } - swfdec_sandbox_initialize (sandbox); - return TRUE; } @@ -149,7 +147,7 @@ swfdec_sandbox_set_allow_network (SwfdecSandbox *sandbox, gboolean network) * swfdec_sandbox_get_for_url: * @player: a #SwfdecPlayer * @url: the URL this player refers to - * @allow_network: %TRUE to allow network access, false for local access + * @flash_version: The Flash version for looking up the sandbox * @allow_network: %TRUE to allow network access, %FALSE to only allow local * file access. See the documentation of the use_network flag * of the SWF FileAttributes tag for what that means. @@ -164,11 +162,12 @@ swfdec_sandbox_set_allow_network (SwfdecSandbox *sandbox, gboolean network) **/ SwfdecSandbox * swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url, - gboolean allow_network) + guint flash_version, gboolean allow_network) { SwfdecPlayerPrivate *priv; SwfdecSandbox *sandbox; SwfdecURL *real; + guint as_version; g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); g_return_val_if_fail (url != NULL, NULL); @@ -177,9 +176,14 @@ swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url, real = swfdec_url_new_components (swfdec_url_get_protocol (url), swfdec_url_get_host (url), swfdec_url_get_port (url), NULL, NULL); + as_version = flash_version < 7 ? 1 : 2; + /* FIXME: look up by as version */ sandbox = g_hash_table_lookup (priv->sandboxes, real); if (sandbox) { swfdec_url_free (real); + + if (!swfdec_sandbox_set_allow_network (sandbox, allow_network)) + return NULL; } else { SwfdecAsContext *context = SWFDEC_AS_CONTEXT (player); guint size = sizeof (SwfdecSandbox); @@ -189,10 +193,14 @@ swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url, sandbox = g_object_new (SWFDEC_TYPE_SANDBOX, NULL); swfdec_as_object_add (SWFDEC_AS_OBJECT (sandbox), context, size); sandbox->url = real; + sandbox->as_version = as_version; + + if (!swfdec_sandbox_set_allow_network (sandbox, allow_network)) + return NULL; + + swfdec_sandbox_initialize (sandbox, flash_version); } - if (!swfdec_sandbox_set_allow_network (sandbox, allow_network)) - return NULL; return sandbox; } diff --git a/libswfdec/swfdec_sandbox.h b/libswfdec/swfdec_sandbox.h index 1ae30fd..6fda9b7 100644 --- a/libswfdec/swfdec_sandbox.h +++ b/libswfdec/swfdec_sandbox.h @@ -50,6 +50,7 @@ struct _SwfdecSandbox SwfdecSandboxType type; /* type of this sandbox */ SwfdecURL * url; /* URL this sandbox acts for */ + guint as_version; /* Actionscript version */ /* global cached objects from context */ SwfdecAsObject * Function; /* Function */ @@ -71,6 +72,7 @@ GType swfdec_sandbox_get_type (void); SwfdecSandbox * swfdec_sandbox_get_for_url (SwfdecPlayer * player, const SwfdecURL * url, + guint flash_version, gboolean allow_network); void swfdec_sandbox_use (SwfdecSandbox * sandbox); commit 8e7acb562663dffcb6e52bb9075e19fa7f9bb532 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 14:39:49 2008 +0100 fix NEtStream to remember its sandbox diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 01566ad..1502a28 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -41,9 +41,12 @@ swfdec_net_stream_onstatus (SwfdecNetStream *stream, const char *code, const cha SwfdecAsValue val; SwfdecAsObject *object; + swfdec_sandbox_use (stream->sandbox); object = swfdec_as_object_new (SWFDEC_AS_OBJECT (stream)->context); - if (!object) + if (!object) { + swfdec_sandbox_unuse (stream->sandbox); return; + } SWFDEC_INFO ("emitting onStatus for %s %s", level, code); SWFDEC_AS_VALUE_SET_STRING (&val, code); swfdec_as_object_set_variable (object, SWFDEC_AS_STR_code, &val); @@ -52,6 +55,7 @@ swfdec_net_stream_onstatus (SwfdecNetStream *stream, const char *code, const cha SWFDEC_AS_VALUE_SET_OBJECT (&val, object); swfdec_as_object_call (SWFDEC_AS_OBJECT (stream), SWFDEC_AS_STR_onStatus, 1, &val, NULL); + swfdec_sandbox_unuse (stream->sandbox); } static cairo_surface_t * @@ -425,6 +429,8 @@ swfdec_net_stream_mark (SwfdecAsObject *object) if (stream->conn) swfdec_as_object_mark (SWFDEC_AS_OBJECT (stream->conn)); + if (stream->sandbox) + swfdec_as_object_mark (SWFDEC_AS_OBJECT (stream->sandbox)); SWFDEC_AS_OBJECT_CLASS (swfdec_net_stream_parent_class)->mark (object); } @@ -483,27 +489,29 @@ swfdec_net_stream_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean all } else { SWFDEC_WARNING ("SECURITY: no access to %s from NetStream", swfdec_url_get_url (url)); + stream->sandbox = NULL; } } void -swfdec_net_stream_set_url (SwfdecNetStream *stream, const char *url_string) +swfdec_net_stream_set_url (SwfdecNetStream *stream, SwfdecSandbox *sandbox, const char *url_string) { SwfdecPlayer *player; SwfdecAsContext *cx; SwfdecURL *url; g_return_if_fail (SWFDEC_IS_NET_STREAM (stream)); + g_return_if_fail (SWFDEC_IS_SANDBOX (sandbox)); g_return_if_fail (url != NULL); cx = SWFDEC_AS_OBJECT (stream)->context; player = SWFDEC_PLAYER (cx); - g_assert (cx->frame); url = swfdec_url_new_relative (swfdec_loader_get_url (player->priv->resource->loader), url_string); + stream->sandbox = sandbox; if (swfdec_url_is_local (url)) { swfdec_net_stream_load (player, url, TRUE, stream); } else { - switch (SWFDEC_SANDBOX (cx->global)->type) { + switch (sandbox->type) { case SWFDEC_SANDBOX_REMOTE: swfdec_net_stream_load (player, url, TRUE, stream); break; @@ -535,10 +543,11 @@ void swfdec_net_stream_set_loader (SwfdecNetStream *stream, SwfdecLoader *loader) { g_return_if_fail (SWFDEC_IS_NET_STREAM (stream)); + g_return_if_fail (loader == NULL || SWFDEC_IS_SANDBOX (stream->sandbox)); g_return_if_fail (loader == NULL || SWFDEC_IS_LOADER (loader)); if (stream->loader) { - SwfdecStream *lstream = SWFDEC_STREAM (loader); + SwfdecStream *lstream = SWFDEC_STREAM (stream->loader); swfdec_stream_close (lstream); swfdec_stream_set_target (lstream, NULL); g_object_unref (lstream); diff --git a/libswfdec/swfdec_net_stream.h b/libswfdec/swfdec_net_stream.h index 253f8ce..60a74cd 100644 --- a/libswfdec/swfdec_net_stream.h +++ b/libswfdec/swfdec_net_stream.h @@ -26,6 +26,7 @@ #include <libswfdec/swfdec_net_connection.h> #include <libswfdec/swfdec_flv_decoder.h> #include <libswfdec/swfdec_player_internal.h> +#include <libswfdec/swfdec_sandbox.h> #include <libswfdec/swfdec_video_movie.h> G_BEGIN_DECLS @@ -46,6 +47,7 @@ struct _SwfdecNetStream SwfdecNetConnection * conn; /* connection used for opening streams */ SwfdecLoader * loader; /* input stream */ + SwfdecSandbox * sandbox; /* sandbox to emit events in */ SwfdecFlvDecoder * flvdecoder; /* flv decoder */ gboolean playing; /* TRUE if this stream is playing */ gboolean buffering; /* TRUE if we're waiting for more input data */ @@ -78,6 +80,7 @@ GType swfdec_net_stream_get_type (void); SwfdecNetStream * swfdec_net_stream_new (SwfdecNetConnection * conn); void swfdec_net_stream_set_url (SwfdecNetStream * stream, + SwfdecSandbox * sandbox, const char * url); void swfdec_net_stream_set_loader (SwfdecNetStream * stream, SwfdecLoader * loader); diff --git a/libswfdec/swfdec_net_stream_as.c b/libswfdec/swfdec_net_stream_as.c index 470b035..1dce4ba 100644 --- a/libswfdec/swfdec_net_stream_as.c +++ b/libswfdec/swfdec_net_stream_as.c @@ -50,7 +50,7 @@ swfdec_net_stream_play (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc, Sw const char *url; url = swfdec_as_value_to_string (cx, &argv[0]); - swfdec_net_stream_set_url (stream, url); + swfdec_net_stream_set_url (stream, SWFDEC_SANDBOX (cx->global), url); swfdec_net_stream_set_playing (stream, TRUE); } commit ffd24a1c0e77f9d98fcbd2aa9c71f5c3cf5e8824 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 13:05:30 2008 +0100 fix SEGV diff --git a/libswfdec/swfdec_xml_socket.c b/libswfdec/swfdec_xml_socket.c index 2978a2f..886a042 100644 --- a/libswfdec/swfdec_xml_socket.c +++ b/libswfdec/swfdec_xml_socket.c @@ -219,7 +219,7 @@ swfdec_xml_socket_connect (SwfdecAsContext *cx, SwfdecAsObject *object, const char *host; int port; - SWFDEC_AS_CHECK (0, NULL, "si", host, port); + SWFDEC_AS_CHECK (0, NULL, "si", &host, &port); if (SWFDEC_IS_MOVIE (object) || object == NULL) return; commit ab84805cd92e42f3a9aff3905085cc56b04e30f7 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 12:56:13 2008 +0100 sandbox will not be NULL anymore here diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 7f6920c..e3e90a8 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -77,7 +77,6 @@ swfdec_resource_stream_target_image (SwfdecResource *instance) if (SWFDEC_IS_SWF_DECODER (instance->decoder)) { SwfdecSwfDecoder *dec = SWFDEC_SWF_DECODER (instance->decoder); - g_assert (instance->sandbox == NULL); instance->sandbox = swfdec_sandbox_get_for_url (player, swfdec_loader_get_url (instance->loader), SWFDEC_SWF_DECODER (instance->decoder)->use_network); commit 76bbefc2cd2679db09b7a1461d0289dcf53e26a7 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 12:55:28 2008 +0100 new resources inherit their parent's sandbox, until they're grown up diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 44ae483..278a067 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -469,10 +469,6 @@ swfdec_movie_execute (SwfdecMovie *movie, SwfdecEventType condition) g_return_if_fail (SWFDEC_IS_MOVIE (movie)); - /* when resource is not an SWF file */ - if (movie->resource->sandbox == NULL) - return; - if (SWFDEC_IS_BUTTON_MOVIE (movie)) { /* these conditions don't exist for buttons */ if (condition == SWFDEC_EVENT_CONSTRUCT || condition < SWFDEC_EVENT_PRESS) diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index ec2eaa1..7f6920c 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -542,6 +542,7 @@ swfdec_resource_do_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean al resource->clip_loader = load->loader; resource->clip_loader_sandbox = load->sandbox; } + resource->sandbox = load->sandbox; if (!allowed) { SWFDEC_WARNING ("SECURITY: no access to %s from %s", diff --git a/libswfdec/swfdec_resource.h b/libswfdec/swfdec_resource.h index de7409f..fba2f95 100644 --- a/libswfdec/swfdec_resource.h +++ b/libswfdec/swfdec_resource.h @@ -48,7 +48,7 @@ struct _SwfdecResource SwfdecAsObject object; guint version; /* version of this resource */ - SwfdecSandbox * sandbox; /* sandbox this resource belongs to or NULL if not initialized yet */ + SwfdecSandbox * sandbox; /* sandbox this resource belongs to (only NULL for a short time on very first loader) */ SwfdecSpriteMovie * movie; /* the movie responsible for creating this instance */ SwfdecLoader * loader; /* the loader providing data for the decoder */ commit 34887b70ad9a823a6f179564c137d685aef3886f Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 12:44:44 2008 +0100 use MAXUINT as a version identifier diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index e5778ef..ccce123 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -558,6 +558,8 @@ swfdec_as_context_init (SwfdecAsContext *context) { const char *s; + context->version = G_MAXUINT; + context->strings = g_hash_table_new (g_str_hash, g_str_equal); context->objects = g_hash_table_new (g_direct_hash, g_direct_equal); commit 74ecb9317bf463061fb5a86ffa893f8901b6745c Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 12:44:20 2008 +0100 set the prototype for all movies diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 74f6193..ec2eaa1 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -86,8 +86,8 @@ swfdec_resource_stream_target_image (SwfdecResource *instance) g_assert (movie->sprite->parse_frame > 0); movie->n_frames = movie->sprite->n_frames; swfdec_movie_invalidate_last (SWFDEC_MOVIE (movie)); + swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (movie), instance->sandbox->MovieClip); if (swfdec_resource_is_root (instance)) { - swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (movie), instance->sandbox->MovieClip); swfdec_movie_initialize (SWFDEC_MOVIE (movie)); swfdec_player_perform_actions (player); } commit 41bca6f2ebc547a0550353e4989294300a8cf7cf Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 12:43:40 2008 +0100 track the sandbox for MovieClipLoader events diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 8a9e92e..74f6193 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -148,8 +148,11 @@ swfdec_resource_emit_signal (SwfdecResource *resource, const char *name, gboolea } if (n_args) memcpy (&vals[skip], args, sizeof (SwfdecAsValue) * n_args); + /* FIXME: what's the correct sandbox here? */ + swfdec_sandbox_use (resource->clip_loader_sandbox); swfdec_as_object_call (SWFDEC_AS_OBJECT (resource->clip_loader), SWFDEC_AS_STR_broadcastMessage, n_args + skip, vals, NULL); + swfdec_sandbox_unuse (resource->clip_loader_sandbox); } static void @@ -372,10 +375,14 @@ swfdec_resource_mark (SwfdecAsObject *object) { SwfdecResource *resource = SWFDEC_RESOURCE (object); - if (resource->clip_loader) + if (resource->clip_loader) { swfdec_as_object_mark (SWFDEC_AS_OBJECT (resource->clip_loader)); + swfdec_as_object_mark (SWFDEC_AS_OBJECT (resource->clip_loader_sandbox)); + } if (resource->sandbox) swfdec_as_object_mark (SWFDEC_AS_OBJECT (resource->sandbox)); + + SWFDEC_AS_OBJECT_CLASS (swfdec_resource_parent_class)->mark (object); } static void @@ -392,10 +399,6 @@ swfdec_resource_dispose (GObject *object) g_object_unref (resource->decoder); resource->decoder = NULL; } - if (resource->clip_loader) { - g_object_unref (resource->clip_loader); - resource->clip_loader = NULL; - } g_free (resource->target); g_free (resource->variables); g_hash_table_destroy (resource->exports); @@ -535,9 +538,10 @@ swfdec_resource_do_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean al swfdec_as_object_add (SWFDEC_AS_OBJECT (resource), SWFDEC_AS_CONTEXT (player), sizeof (SwfdecResource)); resource->version = 8; resource->target = g_strdup (load->target); - if (load->loader) - resource->clip_loader = g_object_ref (load->loader); - swfdec_player_root (player, resource, (GFunc) swfdec_as_object_mark); + if (load->loader) { + resource->clip_loader = load->loader; + resource->clip_loader_sandbox = load->sandbox; + } if (!allowed) { SWFDEC_WARNING ("SECURITY: no access to %s from %s", @@ -547,6 +551,7 @@ swfdec_resource_do_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean al return; } + swfdec_player_root (player, resource, (GFunc) swfdec_as_object_mark); loader = swfdec_loader_load (player->priv->resource->loader, url, load->request, load->buffer); swfdec_resource_set_loader (resource, loader); @@ -673,9 +678,7 @@ swfdec_resource_emit_on_load_init (SwfdecResource *resource) swfdec_resource_emit_signal (resource, SWFDEC_AS_STR_onLoadInit, FALSE, NULL, 0); resource->state = SWFDEC_RESOURCE_DONE; /* free now unneeded resources */ - if (resource->clip_loader) { - g_object_unref (resource->clip_loader); - resource->clip_loader = NULL; - } + resource->clip_loader = NULL; + resource->clip_loader_sandbox = NULL; return TRUE; } diff --git a/libswfdec/swfdec_resource.h b/libswfdec/swfdec_resource.h index f72da77..de7409f 100644 --- a/libswfdec/swfdec_resource.h +++ b/libswfdec/swfdec_resource.h @@ -62,6 +62,7 @@ struct _SwfdecResource SwfdecResourceState state; /* state we're in (for determining callbacks */ char * target; /* target path we use for signalling */ SwfdecMovieClipLoader *clip_loader; /* loader that gets notified about load events */ + SwfdecSandbox * clip_loader_sandbox; /* sandbox used for events on the clip loader */ }; struct _SwfdecResourceClass commit 839304eb0c7977ebbc153986b3c945f898b5f5e2 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 10:15:56 2008 +0100 use a sandbox when emitting onScroller diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index 214b345..8f8af44 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -1198,11 +1198,15 @@ swfdec_text_field_movie_iterate (SwfdecMovie *movie) if (text->scroll_changed) { SwfdecAsValue argv[2]; + SWFDEC_FIXME ("I'm pretty sure this is swfdec_player_add_action()'d"); SWFDEC_AS_VALUE_SET_STRING (&argv[0], SWFDEC_AS_STR_onScroller); SWFDEC_AS_VALUE_SET_OBJECT (&argv[1], SWFDEC_AS_OBJECT (movie)); + swfdec_sandbox_use (movie->resource->sandbox); swfdec_as_object_call (SWFDEC_AS_OBJECT (movie), SWFDEC_AS_STR_broadcastMessage, 2, argv, NULL); + swfdec_sandbox_unuse (movie->resource->sandbox); + /* FIXME: unset this before or after emitting the event? */ text->scroll_changed = FALSE; } } commit 742745f38bb27b173dee7a0bbbbdd96a4f784d46 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 10:15:39 2008 +0100 don't execute events for movies without sandbox This happens for movies that have loaded images diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 278a067..44ae483 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -469,6 +469,10 @@ swfdec_movie_execute (SwfdecMovie *movie, SwfdecEventType condition) g_return_if_fail (SWFDEC_IS_MOVIE (movie)); + /* when resource is not an SWF file */ + if (movie->resource->sandbox == NULL) + return; + if (SWFDEC_IS_BUTTON_MOVIE (movie)) { /* these conditions don't exist for buttons */ if (condition == SWFDEC_EVENT_CONSTRUCT || condition < SWFDEC_EVENT_PRESS) commit 1abaa70c4a2f39d46d6c121c9db6e72d97830e1e Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 09:44:17 2008 +0100 add extra check to catch a common error case diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 4b8ae76..3004f63 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -1230,6 +1230,7 @@ swfdec_as_object_call (SwfdecAsObject *object, const char *name, guint argc, g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); g_return_if_fail (name != NULL); g_return_if_fail (argc == 0 || argv != NULL); + g_return_if_fail (object->context->global != NULL); /* for SwfdecPlayer */ if (return_value) SWFDEC_AS_VALUE_SET_UNDEFINED (return_value); commit e8a740b5dea82de346194e110a7b94bc5792e65d Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 09:38:56 2008 +0100 we're not a SwfdecAsObject anymore diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c index f9acafe..642e256 100644 --- a/libswfdec/swfdec_load_object.c +++ b/libswfdec/swfdec_load_object.c @@ -36,7 +36,7 @@ static SwfdecPlayer * swfdec_load_object_stream_target_get_player (SwfdecStreamTarget *target) { - return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (target)->context); + return SWFDEC_PLAYER (SWFDEC_LOAD_OBJECT (target)->target->context); } static void @@ -47,8 +47,10 @@ swfdec_load_object_stream_target_parse (SwfdecStreamTarget *target, SwfdecLoadObject *load_object = SWFDEC_LOAD_OBJECT (target); if (load_object->progress != NULL) { + swfdec_sandbox_use (load_object->sandbox); load_object->progress (load_object->target, swfdec_loader_get_loaded (loader), swfdec_loader_get_size (loader)); + swfdec_sandbox_unuse (load_object->sandbox); } } @@ -65,11 +67,13 @@ swfdec_load_object_stream_target_error (SwfdecStreamTarget *target, g_object_unref (loader); /* call finish */ + swfdec_sandbox_use (load_object->sandbox); load_object->finish (load_object->target, NULL); + swfdec_sandbox_unuse (load_object->sandbox); /* unroot */ swfdec_player_unroot (SWFDEC_PLAYER ( - SWFDEC_AS_OBJECT (load_object)->context), load_object); + SWFDEC_AS_OBJECT (load_object->sandbox)->context), load_object); } static void @@ -90,16 +94,18 @@ swfdec_load_object_stream_target_close (SwfdecStreamTarget *target, g_object_unref (loader); /* call finish */ + swfdec_sandbox_use (load_object->sandbox); if (text != NULL) { load_object->finish (load_object->target, swfdec_as_context_give_string (load_object->target->context, text)); } else { load_object->finish (load_object->target, SWFDEC_AS_STR_EMPTY); } + swfdec_sandbox_unuse (load_object->sandbox); /* unroot */ swfdec_player_unroot (SWFDEC_PLAYER ( - SWFDEC_AS_OBJECT (load_object)->context), load_object); + SWFDEC_AS_OBJECT (load_object->sandbox)->context), load_object); } static void commit 2a5f9385c6a93a583d7f7a15d109fc44ffb7b161 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 09:38:46 2008 +0100 replace the movie with the right resource diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index d5a1856..8a9e92e 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -216,7 +216,7 @@ swfdec_resource_create_movie (SwfdecResource *resource) movie = swfdec_player_create_movie_at_level (player, resource, level); } else { /* FIXME: is this correct? */ - movie = swfdec_resource_replace_movie (movie, SWFDEC_MOVIE (movie)->resource); + movie = swfdec_resource_replace_movie (movie, resource); } swfdec_player_unroot (player, resource); return TRUE; commit 9d3d043fd6a007b52bed48f754c357221ba45ce0 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 09:28:49 2008 +0100 add swfdc_sandbox_try_use() and use it diff --git a/libswfdec/swfdec_sandbox.c b/libswfdec/swfdec_sandbox.c index 4802fa9..bdc7bf1 100644 --- a/libswfdec/swfdec_sandbox.c +++ b/libswfdec/swfdec_sandbox.c @@ -226,6 +226,32 @@ swfdec_sandbox_use (SwfdecSandbox *sandbox) } /** + * swfdec_sandbox_try_use: + * @sandbox: the sandbox to use + * + * Makes sure a sandbox is in use. If no sandbox is in use currently, use the + * given @sandbox. This function is intended for cases where code can be called + * from both inside scripts with a sandbox already set or outside with no + * sandbox in use. + * + * Returns: %TRUE if the new sandbox will be used. You need to call + * swfdec_sandbox_unuse() afterwards. %FALSE if a sandbox is already in + * use. + **/ +gboolean +swfdec_sandbox_try_use (SwfdecSandbox *sandbox) +{ + g_return_val_if_fail (SWFDEC_IS_SANDBOX (sandbox), FALSE); + g_return_val_if_fail (sandbox->type != SWFDEC_SANDBOX_NONE, FALSE); + + if (SWFDEC_AS_OBJECT (sandbox)->context->global) + return FALSE; + + swfdec_sandbox_use (sandbox); + return TRUE; +} + +/** * swfdec_sandbox_unuse: * @sandbox: a #SwfdecSandbox * diff --git a/libswfdec/swfdec_sandbox.h b/libswfdec/swfdec_sandbox.h index 3079f75..1ae30fd 100644 --- a/libswfdec/swfdec_sandbox.h +++ b/libswfdec/swfdec_sandbox.h @@ -74,6 +74,7 @@ SwfdecSandbox * swfdec_sandbox_get_for_url (SwfdecPlayer * player, gboolean allow_network); void swfdec_sandbox_use (SwfdecSandbox * sandbox); +gboolean swfdec_sandbox_try_use (SwfdecSandbox * sandbox); void swfdec_sandbox_unuse (SwfdecSandbox * sandbox); G_END_DECLS diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c index bc8cdb6..214b345 100644 --- a/libswfdec/swfdec_text_field_movie.c +++ b/libswfdec/swfdec_text_field_movie.c @@ -30,10 +30,12 @@ #include "swfdec_as_context.h" #include "swfdec_as_strings.h" #include "swfdec_as_interpret.h" -#include "swfdec_text_format.h" -#include "swfdec_xml.h" #include "swfdec_debug.h" #include "swfdec_player_internal.h" +#include "swfdec_resource.h" +#include "swfdec_sandbox.h" +#include "swfdec_text_format.h" +#include "swfdec_xml.h" G_DEFINE_TYPE (SwfdecTextFieldMovie, swfdec_text_field_movie, SWFDEC_TYPE_MOVIE) @@ -1118,6 +1120,9 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie) SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (movie); SwfdecAsContext *cx; SwfdecAsValue val; + gboolean needs_unuse; + + needs_unuse = swfdec_sandbox_try_use (movie->resource->sandbox); cx = SWFDEC_AS_OBJECT (movie)->context; @@ -1138,7 +1143,7 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie) text->format_new SWFDEC_TEXT_FORMAT (swfdec_text_format_new_no_properties (cx)); if (!text->format_new) - return; + goto out; swfdec_text_format_set_defaults (text->format_new); text->format_new->color = text->text->color; @@ -1171,6 +1176,10 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie) swfdec_text_field_movie_set_listen_variable (text, swfdec_as_context_get_string (cx, text->text->variable)); } + +out: + if (needs_unuse) + swfdec_sandbox_unuse (movie->resource->sandbox); } static void commit 7bc307ee9736b60007952628ebd475147c7196b8 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 09:28:33 2008 +0100 parse exports names with the version of their Flash file diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 2eaafe6..e014ece 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -418,12 +418,14 @@ swfdec_sprite_movie_perform_one_action (SwfdecSpriteMovie *movie, guint tag, Swf count = swfdec_bits_get_u16 (&bits); SWFDEC_LOG ("exporting %u assets", count); for (i = 0; i < count && swfdec_bits_left (&bits); i++) { + SwfdecSwfDecoder *s = SWFDEC_SWF_DECODER (resource->decoder); guint id; SwfdecCharacter *object; char *name; + id = swfdec_bits_get_u16 (&bits); - object = swfdec_swf_decoder_get_character (SWFDEC_SWF_DECODER (resource->decoder), id); - name = swfdec_bits_get_string (&bits, SWFDEC_AS_CONTEXT (player)->version); + object = swfdec_swf_decoder_get_character (s, id); + name = swfdec_bits_get_string (&bits, s->version); if (object == NULL) { SWFDEC_ERROR ("cannot export id %u as %s, id wasn't found", id, name); } else if (name == NULL) { commit b8f07a87e1ab3ee64523a62442c5b40dab460c35 Author: Benjamin Otte <otte at gnome.org> Date: Mon Jan 21 08:42:26 2008 +0100 loads of fixes to get further in the testsuite. We're at letter "C" now. diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index f572239..e5778ef 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -362,12 +362,16 @@ swfdec_as_context_mark_roots (gpointer key, gpointer value, gpointer data) static void swfdec_as_context_do_mark (SwfdecAsContext *context) { - swfdec_as_object_mark (context->global); - swfdec_as_value_mark (&context->exception_value); - swfdec_as_object_mark (context->Function); - swfdec_as_object_mark (context->Function_prototype); - swfdec_as_object_mark (context->Object); - swfdec_as_object_mark (context->Object_prototype); + /* This if is needed for SwfdecPlayer */ + if (context->global) { + swfdec_as_object_mark (context->global); + swfdec_as_object_mark (context->Function); + swfdec_as_object_mark (context->Function_prototype); + swfdec_as_object_mark (context->Object); + swfdec_as_object_mark (context->Object_prototype); + } + if (context->exception) + swfdec_as_value_mark (&context->exception_value); g_hash_table_foreach (context->objects, swfdec_as_context_mark_roots, NULL); } @@ -1388,7 +1392,8 @@ swfdec_as_context_startup (SwfdecAsContext *context) g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context)); g_return_if_fail (context->state == SWFDEC_AS_CONTEXT_NEW); - if (!swfdec_as_stack_push_segment (context)) + if (context->cur == NULL && + !swfdec_as_stack_push_segment (context)) return; if (context->global == NULL) context->global = swfdec_as_object_new_empty (context); diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index babcd27..4b8ae76 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -1339,25 +1339,23 @@ void swfdec_as_object_set_constructor (SwfdecAsObject *object, SwfdecAsObject *construct) { SwfdecAsValue val; - SwfdecAsObject *proto; g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); g_return_if_fail (SWFDEC_IS_AS_OBJECT (construct)); + SWFDEC_AS_VALUE_SET_OBJECT (&val, construct); + swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR_constructor, + &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); swfdec_as_object_get_variable (SWFDEC_AS_OBJECT (construct), SWFDEC_AS_STR_prototype, &val); if (SWFDEC_AS_VALUE_IS_OBJECT (&val)) { - proto = SWFDEC_AS_VALUE_GET_OBJECT (&val); + SwfdecAsObject *proto = SWFDEC_AS_VALUE_GET_OBJECT (&val); + SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); + swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR___proto__, + &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); } else { - SWFDEC_WARNING ("constructor has no prototype, using Object.prototype"); - proto = object->context->Object_prototype; + SWFDEC_WARNING ("constructor has no prototype, not setting any"); } - SWFDEC_AS_VALUE_SET_OBJECT (&val, construct); - swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR_constructor, - &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); - SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); - swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR___proto__, - &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); } /** diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 2f45345..278a067 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -423,7 +423,7 @@ swfdec_movie_set_constructor (SwfdecSpriteMovie *movie) } } if (constructor == NULL) - constructor = SWFDEC_PLAYER (context)->priv->MovieClip; + constructor = mov->resource->sandbox->MovieClip; swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (movie), constructor); } @@ -498,14 +498,14 @@ swfdec_movie_execute (SwfdecMovie *movie, SwfdecEventType condition) swfdec_event_list_execute (movie->events, thisp, condition, 0); } /* FIXME: how do we compute the version correctly here? */ - if (swfdec_movie_get_version (movie) <= 5) - return; - name = swfdec_event_type_get_name (condition); - if (name != NULL) { - swfdec_as_object_call (SWFDEC_AS_OBJECT (movie), name, 0, NULL, NULL); + if (swfdec_movie_get_version (movie) > 5) { + name = swfdec_event_type_get_name (condition); + if (name != NULL) { + swfdec_as_object_call (SWFDEC_AS_OBJECT (movie), name, 0, NULL, NULL); + } + if (condition == SWFDEC_EVENT_CONSTRUCT) + swfdec_as_object_call (thisp, SWFDEC_AS_STR_constructor, 0, NULL, NULL); } - if (condition == SWFDEC_EVENT_CONSTRUCT) - swfdec_as_object_call (thisp, SWFDEC_AS_STR_constructor, 0, NULL, NULL); swfdec_sandbox_unuse (movie->resource->sandbox); } @@ -1014,10 +1014,6 @@ swfdec_movie_dispose (GObject *object) g_assert (movie->list == NULL); SWFDEC_LOG ("disposing movie %s (depth %d)", movie->name, movie->depth); - if (movie->resource) { - g_object_unref (movie->resource); - movie->resource = NULL; - } if (movie->events) { swfdec_event_list_free (movie->events); movie->events = NULL; @@ -1579,7 +1575,7 @@ swfdec_movie_new (SwfdecPlayer *player, int depth, SwfdecMovie *parent, SwfdecRe g_object_ref (movie); /* set essential properties */ movie->parent = parent; - movie->resource = g_object_ref (resource); + movie->resource = resource; if (parent) { parent->list = g_list_insert_sorted (parent->list, movie, swfdec_movie_compare_depths); SWFDEC_DEBUG ("inserting %s %s (depth %d) into %s %p", G_OBJECT_TYPE_NAME (movie), movie->name, @@ -1686,6 +1682,7 @@ swfdec_movie_set_static_properties (SwfdecMovie *movie, const cairo_matrix_t *tr * Creates a duplicate of @movie. The duplicate will not be initialized or * queued up for any events. You have to do this manually. In particular calling * swfdec_movie_initialize() on the returned movie must be done. + * This function must be called from within a script. * * Returns: a newly created movie or %NULL on error **/ @@ -1693,6 +1690,7 @@ SwfdecMovie * swfdec_movie_duplicate (SwfdecMovie *movie, const char *name, int depth) { SwfdecMovie *parent, *copy; + SwfdecSandbox *sandbox; g_return_val_if_fail (SWFDEC_IS_MOVIE (movie), NULL); g_return_val_if_fail (name != NULL, NULL); @@ -1714,12 +1712,15 @@ swfdec_movie_duplicate (SwfdecMovie *movie, const char *name, int depth) swfdec_movie_set_static_properties (copy, &movie->original_transform, &movie->original_ctrans, movie->original_ratio, movie->clip_depth, movie->blend_mode, movie->events); + sandbox = SWFDEC_SANDBOX (SWFDEC_AS_OBJECT (movie)->context->global); + swfdec_sandbox_unuse (sandbox); if (SWFDEC_IS_SPRITE_MOVIE (copy)) { swfdec_movie_queue_script (copy, SWFDEC_EVENT_INITIALIZE); swfdec_movie_queue_script (copy, SWFDEC_EVENT_LOAD); swfdec_movie_execute (copy, SWFDEC_EVENT_CONSTRUCT); } swfdec_movie_initialize (copy); + swfdec_sandbox_use (sandbox); return copy; } diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 3393514..231b27a 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -882,10 +882,6 @@ swfdec_player_dispose (GObject *object) while (priv->roots) swfdec_movie_destroy (priv->roots->data); - if (priv->resource) { - g_object_unref (priv->resource); - priv->resource = NULL; - } swfdec_function_list_clear (&priv->rooted); /* we do this here so references to GC'd objects get freed */ @@ -1525,11 +1521,10 @@ swfdec_player_mark (SwfdecAsContext *context) g_hash_table_foreach (priv->registered_classes, swfdec_player_mark_string_object, NULL); g_hash_table_foreach (priv->scripting_callbacks, swfdec_player_mark_string_object, NULL); - swfdec_as_object_mark (priv->MovieClip); - swfdec_as_object_mark (priv->Video); g_list_foreach (priv->roots, (GFunc) swfdec_as_object_mark, NULL); g_list_foreach (priv->intervals, (GFunc) swfdec_as_object_mark, NULL); swfdec_function_list_execute (&priv->rooted, player); + swfdec_as_object_mark (SWFDEC_AS_OBJECT (priv->resource)); SWFDEC_AS_CONTEXT_CLASS (swfdec_player_parent_class)->mark (context); } @@ -2046,7 +2041,7 @@ swfdec_player_get_export_class (SwfdecPlayer *player, const char *name) SWFDEC_LOG ("found registered class %p for %s", ret, name); return ret; } - return priv->MovieClip; + return NULL; } /** diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index fe08454..8c9e819 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -92,8 +92,6 @@ struct _SwfdecPlayerPrivate guint interval_id; /* id returned from setInterval call */ GList * intervals; /* all currently running intervals */ GHashTable * registered_classes; /* name => SwfdecAsObject constructor */ - SwfdecAsObject * MovieClip; /* MovieClip object */ - SwfdecAsObject * Video; /* Video object */ /* rendering */ SwfdecRectangle invalid_extents; /* extents of area that needs a redraw in global coordinates */ diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 30baaa4..d5a1856 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -68,6 +68,7 @@ swfdec_resource_stream_target_get_player (SwfdecStreamTarget *target) static void swfdec_resource_stream_target_image (SwfdecResource *instance) { + SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (instance)->context); SwfdecSpriteMovie *movie = instance->movie; if (movie->sprite != NULL) @@ -76,15 +77,17 @@ swfdec_resource_stream_target_image (SwfdecResource *instance) if (SWFDEC_IS_SWF_DECODER (instance->decoder)) { SwfdecSwfDecoder *dec = SWFDEC_SWF_DECODER (instance->decoder); - if (swfdec_sandbox_set_allow_network (instance->sandbox, - SWFDEC_SWF_DECODER (instance->decoder)->use_network)) { + g_assert (instance->sandbox == NULL); + instance->sandbox = swfdec_sandbox_get_for_url (player, + swfdec_loader_get_url (instance->loader), + SWFDEC_SWF_DECODER (instance->decoder)->use_network); + if (instance->sandbox) { movie->sprite = dec->main_sprite; g_assert (movie->sprite->parse_frame > 0); movie->n_frames = movie->sprite->n_frames; swfdec_movie_invalidate_last (SWFDEC_MOVIE (movie)); if (swfdec_resource_is_root (instance)) { - SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (instance)->context); - swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (movie), player->priv->MovieClip); + swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (movie), instance->sandbox->MovieClip); swfdec_movie_initialize (SWFDEC_MOVIE (movie)); swfdec_player_perform_actions (player); } @@ -371,7 +374,8 @@ swfdec_resource_mark (SwfdecAsObject *object) if (resource->clip_loader) swfdec_as_object_mark (SWFDEC_AS_OBJECT (resource->clip_loader)); - swfdec_as_object_mark (SWFDEC_AS_OBJECT (resource->sandbox)); + if (resource->sandbox) + swfdec_as_object_mark (SWFDEC_AS_OBJECT (resource->sandbox)); } static void @@ -540,11 +544,10 @@ swfdec_resource_do_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean al load->url, swfdec_url_get_url (load->sandbox->url)); /* FIXME: is replacing correct? */ swfdec_resource_emit_error (resource, SWFDEC_AS_STR_IllegalRequest); - g_object_unref (resource); return; } - loader = swfdec_loader_load (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (load->sandbox))->priv->resource->loader, + loader = swfdec_loader_load (player->priv->resource->loader, url, load->request, load->buffer); swfdec_resource_set_loader (resource, loader); g_object_unref (loader); diff --git a/libswfdec/swfdec_resource.h b/libswfdec/swfdec_resource.h index c7d9544..f72da77 100644 --- a/libswfdec/swfdec_resource.h +++ b/libswfdec/swfdec_resource.h @@ -48,7 +48,7 @@ struct _SwfdecResource SwfdecAsObject object; guint version; /* version of this resource */ - SwfdecSandbox * sandbox; /* sandbox this resource belongs to */ + SwfdecSandbox * sandbox; /* sandbox this resource belongs to or NULL if not initialized yet */ SwfdecSpriteMovie * movie; /* the movie responsible for creating this instance */ SwfdecLoader * loader; /* the loader providing data for the decoder */ diff --git a/libswfdec/swfdec_sandbox.c b/libswfdec/swfdec_sandbox.c index 41b4301..4802fa9 100644 --- a/libswfdec/swfdec_sandbox.c +++ b/libswfdec/swfdec_sandbox.c @@ -44,58 +44,35 @@ * it as the global object. */ -G_DEFINE_TYPE (SwfdecSandbox, swfdec_sandbox, G_TYPE_OBJECT) +G_DEFINE_TYPE (SwfdecSandbox, swfdec_sandbox, SWFDEC_TYPE_AS_OBJECT) static void -swfdec_sandbox_class_init (SwfdecSandboxClass *klass) +swfdec_sandbox_mark (SwfdecAsObject *object) { + SwfdecSandbox *sandbox = SWFDEC_SANDBOX (object); + + swfdec_as_object_mark (sandbox->Function); + swfdec_as_object_mark (sandbox->Function_prototype); + swfdec_as_object_mark (sandbox->Object); + swfdec_as_object_mark (sandbox->Object_prototype); + swfdec_as_object_mark (sandbox->MovieClip); + swfdec_as_object_mark (sandbox->Video); + + SWFDEC_AS_OBJECT_CLASS (swfdec_sandbox_parent_class)->mark (object); } static void -swfdec_sandbox_init (SwfdecSandbox *sandbox) +swfdec_sandbox_class_init (SwfdecSandboxClass *klass) { - sandbox->type = SWFDEC_SANDBOX_NONE; + SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass); + + asobject_class->mark = swfdec_sandbox_mark; } -/** - * swfdec_sandbox_get_for_url: - * @player: a #SwfdecPlayer - * @url: the URL this player refers to - * - * Checks if a sandbox is already in use for a given URL and if so, returns it. - * Otherwise a new sandbox is created, initialized and returned. - * Note that the given url must be a HTTP, HTTPS or a FILE url. - * - * Returns: the sandbox corresponding to the given URL. - **/ -SwfdecSandbox * -swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url) +static void +swfdec_sandbox_init (SwfdecSandbox *sandbox) { - SwfdecPlayerPrivate *priv; - SwfdecSandbox *sandbox; - SwfdecURL *real; - - g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); - g_return_val_if_fail (url != NULL, NULL); - - priv = player->priv; - real = swfdec_url_new_components (swfdec_url_get_protocol (url), - swfdec_url_get_host (url), swfdec_url_get_port (url), NULL, NULL); - - sandbox = g_hash_table_lookup (priv->sandboxes, real); - if (sandbox) { - swfdec_url_free (real); - } else { - SwfdecAsContext *context = SWFDEC_AS_CONTEXT (player); - guint size = sizeof (SwfdecSandbox); - if (!swfdec_as_context_use_mem (context, size)) - size = 0; - - sandbox = g_object_new (SWFDEC_TYPE_SANDBOX, NULL); - swfdec_as_object_add (SWFDEC_AS_OBJECT (sandbox), context, size); - sandbox->url = real; - } - return sandbox; + sandbox->type = SWFDEC_SANDBOX_NONE; } static void @@ -118,6 +95,11 @@ swfdec_sandbox_initialize (SwfdecSandbox *sandbox) swfdec_as_context_run_init_script (context, swfdec_initialize, sizeof (swfdec_initialize), 8); + sandbox->Function = context->Function; + sandbox->Function_prototype = context->Function_prototype; + sandbox->Object = context->Object; + sandbox->Object_prototype = context->Object_prototype; + if (context->state == SWFDEC_AS_CONTEXT_NEW) context->state = SWFDEC_AS_CONTEXT_RUNNING; swfdec_sandbox_unuse (sandbox); @@ -125,18 +107,13 @@ swfdec_sandbox_initialize (SwfdecSandbox *sandbox) /** * swfdec_sandbox_set_allow_network: * @sandbox: a #SwfdecSandbox - * @network: %TRUE to allow network access, %FALSE to only allow local file - * access. See the documentation of the use_network flag of the SWF - * FileAttributes tag for what that means. - * - * This function finishes initialization of the @sandbox, if it is not yet * finished, by giving the sandbox network or local file access. This function * should be called on all return values of swfdec_sandbox_get_for_url(). * * Returns: %TRUE if the sandbox initialization could be finished as requested, * %FALSE if not and it shouldn't be used. **/ -gboolean +static gboolean swfdec_sandbox_set_allow_network (SwfdecSandbox *sandbox, gboolean network) { g_return_val_if_fail (SWFDEC_IS_SANDBOX (sandbox), FALSE); @@ -169,6 +146,58 @@ swfdec_sandbox_set_allow_network (SwfdecSandbox *sandbox, gboolean network) } /** + * swfdec_sandbox_get_for_url: + * @player: a #SwfdecPlayer + * @url: the URL this player refers to + * @allow_network: %TRUE to allow network access, false for local access + * @allow_network: %TRUE to allow network access, %FALSE to only allow local + * file access. See the documentation of the use_network flag + * of the SWF FileAttributes tag for what that means. + * + * + * Checks if a sandbox is already in use for a given URL and if so, returns it. + * Otherwise a new sandbox is created, initialized and returned. + * Note that the given url must be a HTTP, HTTPS or a FILE url. + * + * Returns: the sandbox corresponding to the given URL or %NULL if no such + * sandbox is allowed. + **/ +SwfdecSandbox * +swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url, + gboolean allow_network) +{ + SwfdecPlayerPrivate *priv; + SwfdecSandbox *sandbox; + SwfdecURL *real; + + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); + g_return_val_if_fail (url != NULL, NULL); + + priv = player->priv; + real = swfdec_url_new_components (swfdec_url_get_protocol (url), + swfdec_url_get_host (url), swfdec_url_get_port (url), NULL, NULL); + + sandbox = g_hash_table_lookup (priv->sandboxes, real); + if (sandbox) { + swfdec_url_free (real); + } else { + SwfdecAsContext *context = SWFDEC_AS_CONTEXT (player); + guint size = sizeof (SwfdecSandbox); + if (!swfdec_as_context_use_mem (context, size)) + size = 0; + + sandbox = g_object_new (SWFDEC_TYPE_SANDBOX, NULL); + swfdec_as_object_add (SWFDEC_AS_OBJECT (sandbox), context, size); + sandbox->url = real; + } + + if (!swfdec_sandbox_set_allow_network (sandbox, allow_network)) + return NULL; + + return sandbox; +} + +/** * swfdec_sandbox_use: * @sandbox: the sandbox to use when executing scripts * @@ -179,11 +208,21 @@ swfdec_sandbox_set_allow_network (SwfdecSandbox *sandbox, gboolean network) void swfdec_sandbox_use (SwfdecSandbox *sandbox) { + SwfdecAsContext *context; + SwfdecPlayerPrivate *priv; + g_return_if_fail (SWFDEC_IS_SANDBOX (sandbox)); - g_return_if_fail (sandbox->type == SWFDEC_SANDBOX_NONE); + g_return_if_fail (sandbox->type != SWFDEC_SANDBOX_NONE); g_return_if_fail (SWFDEC_AS_OBJECT (sandbox)->context->global == NULL); - SWFDEC_AS_OBJECT (sandbox)->context->global = SWFDEC_AS_OBJECT (sandbox); + context = SWFDEC_AS_OBJECT (sandbox)->context; + priv = SWFDEC_PLAYER (context)->priv; + context->global = SWFDEC_AS_OBJECT (sandbox); + + context->Function = sandbox->Function; + context->Function_prototype = sandbox->Function_prototype; + context->Object = sandbox->Object; + context->Object_prototype = sandbox->Object_prototype; } /** @@ -195,10 +234,16 @@ swfdec_sandbox_use (SwfdecSandbox *sandbox) void swfdec_sandbox_unuse (SwfdecSandbox *sandbox) { + SwfdecAsContext *context; + g_return_if_fail (SWFDEC_IS_SANDBOX (sandbox)); - g_return_if_fail (sandbox->type == SWFDEC_SANDBOX_NONE); g_return_if_fail (SWFDEC_AS_OBJECT (sandbox)->context->global == SWFDEC_AS_OBJECT (sandbox)); - SWFDEC_AS_OBJECT (sandbox)->context->global = NULL; + context = SWFDEC_AS_OBJECT (sandbox)->context; + context->global = NULL; + context->Function = NULL; + context->Function_prototype = NULL; + context->Object = NULL; + context->Object_prototype = NULL; } diff --git a/libswfdec/swfdec_sandbox.h b/libswfdec/swfdec_sandbox.h index eaf27de..3079f75 100644 --- a/libswfdec/swfdec_sandbox.h +++ b/libswfdec/swfdec_sandbox.h @@ -48,8 +48,18 @@ struct _SwfdecSandbox { SwfdecAsObject object; - SwfdecSandboxType type; /* type of this sandbox */ - SwfdecURL * url; /* URL this sandbox acts for */ + SwfdecSandboxType type; /* type of this sandbox */ + SwfdecURL * url; /* URL this sandbox acts for */ + + /* global cached objects from context */ + SwfdecAsObject * Function; /* Function */ + SwfdecAsObject * Function_prototype; /* Function.prototype */ + SwfdecAsObject * Object; /* Object */ + SwfdecAsObject * Object_prototype; /* Object.prototype */ + + /* global player objects */ + SwfdecAsObject * MovieClip; /* MovieClip object */ + SwfdecAsObject * Video; /* Video object */ }; struct _SwfdecSandboxClass @@ -60,10 +70,8 @@ struct _SwfdecSandboxClass GType swfdec_sandbox_get_type (void); SwfdecSandbox * swfdec_sandbox_get_for_url (SwfdecPlayer * player, - const SwfdecURL * url); - -gboolean swfdec_sandbox_set_allow_network(SwfdecSandbox * sandbox, - gboolean network); + const SwfdecURL * url, + gboolean allow_network); void swfdec_sandbox_use (SwfdecSandbox * sandbox); void swfdec_sandbox_unuse (SwfdecSandbox * sandbox); diff --git a/libswfdec/swfdec_sprite_movie.c b/libswfdec/swfdec_sprite_movie.c index 791f985..2eaafe6 100644 --- a/libswfdec/swfdec_sprite_movie.c +++ b/libswfdec/swfdec_sprite_movie.c @@ -460,7 +460,8 @@ swfdec_sprite_movie_perform_one_action (SwfdecSpriteMovie *movie, guint tag, Swf return TRUE; } name = g_strdup_printf ("InitAction %u", id); - sprite->init_action = swfdec_script_new_from_bits (&bits, name, SWFDEC_AS_CONTEXT (player)->version); + sprite->init_action = swfdec_script_new_from_bits (&bits, name, + swfdec_movie_get_version (mov)); g_free (name); if (sprite->init_action) { swfdec_player_add_action_script (player, mov, sprite->init_action, 0); @@ -639,10 +640,10 @@ swfdec_sprite_movie_init_movie (SwfdecMovie *mov) static void swfdec_sprite_movie_add (SwfdecAsObject *object) { - SwfdecPlayer *player = SWFDEC_PLAYER (object->context); + SwfdecMovie *movie = SWFDEC_MOVIE (object); - if (player->priv->MovieClip) - swfdec_as_object_set_constructor (object, player->priv->MovieClip); + if (movie->resource->sandbox) + swfdec_as_object_set_constructor (object, movie->resource->sandbox->MovieClip); SWFDEC_AS_OBJECT_CLASS (swfdec_sprite_movie_parent_class)->add (object); } diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c index 987a97e..03f2a21 100644 --- a/libswfdec/swfdec_sprite_movie_as.c +++ b/libswfdec/swfdec_sprite_movie_as.c @@ -671,10 +671,13 @@ swfdec_sprite_movie_init_from_object (SwfdecMovie *movie, } if (SWFDEC_IS_SPRITE_MOVIE (movie)) { + SwfdecSandbox *sandbox = movie->resource->sandbox; swfdec_movie_queue_script (movie, SWFDEC_EVENT_INITIALIZE); swfdec_movie_queue_script (movie, SWFDEC_EVENT_LOAD); + swfdec_sandbox_unuse (sandbox); swfdec_movie_initialize (movie); swfdec_movie_execute (movie, SWFDEC_EVENT_CONSTRUCT); + swfdec_sandbox_use (sandbox); } else { swfdec_movie_initialize (movie); } @@ -869,20 +872,20 @@ swfdec_sprite_movie_setMask (SwfdecAsContext *cx, SwfdecAsObject *object, void swfdec_sprite_movie_init_context (SwfdecPlayer *player) { - SwfdecPlayerPrivate *priv = player->priv; SwfdecAsContext *context = SWFDEC_AS_CONTEXT (player); SwfdecAsValue val; - SwfdecAsObject *proto; + SwfdecAsObject *proto, *movie; - priv->MovieClip = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, + movie = SWFDEC_AS_OBJECT (swfdec_as_object_add_function (context->global, SWFDEC_AS_STR_MovieClip, 0, NULL, 0)); - if (priv->MovieClip == NULL) + if (movie == NULL) return; + SWFDEC_SANDBOX (context->global)->MovieClip = movie; proto = swfdec_as_object_new (context); if (!proto) return; SWFDEC_AS_VALUE_SET_OBJECT (&val, proto); - swfdec_as_object_set_variable_and_flags (priv->MovieClip, + swfdec_as_object_set_variable_and_flags (movie, SWFDEC_AS_STR_prototype, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); }; diff --git a/libswfdec/swfdec_video_movie.c b/libswfdec/swfdec_video_movie.c index 046befb..b77379a 100644 --- a/libswfdec/swfdec_video_movie.c +++ b/libswfdec/swfdec_video_movie.c @@ -23,6 +23,7 @@ #include "swfdec_video_movie.h" #include "swfdec_player_internal.h" +#include "swfdec_resource.h" G_DEFINE_TYPE (SwfdecVideoMovie, swfdec_video_movie, SWFDEC_TYPE_MOVIE) @@ -129,9 +130,7 @@ swfdec_video_movie_invalidate (SwfdecMovie *movie, const cairo_matrix_t *matrix, static void swfdec_video_movie_init_movie (SwfdecMovie *movie) { - SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (movie)->context); - - swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (movie), player->priv->Video); + swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (movie), movie->resource->sandbox->Video); } static void diff --git a/libswfdec/swfdec_video_movie_as.c b/libswfdec/swfdec_video_movie_as.c index 91f9c7e..ecc7a28 100644 --- a/libswfdec/swfdec_video_movie_as.c +++ b/libswfdec/swfdec_video_movie_as.c @@ -22,12 +22,13 @@ #endif #include "swfdec_video.h" +#include "swfdec_as_internal.h" #include "swfdec_as_strings.h" #include "swfdec_debug.h" #include "swfdec_internal.h" #include "swfdec_net_stream.h" #include "swfdec_player_internal.h" -#include "swfdec_as_internal.h" +#include "swfdec_sandbox.h" SWFDEC_AS_NATIVE (667, 1, swfdec_video_attach_video) void @@ -74,7 +75,7 @@ swfdec_video_movie_init_context (SwfdecPlayer *player) SWFDEC_AS_STR_Video, 0, NULL, 0)); if (video == NULL) return; - player->priv->Video = video; + SWFDEC_SANDBOX (context->global)->Video = video; proto = swfdec_as_object_new_empty (context); if (proto == NULL) return; commit 16378e17f47f0ceeca203471040abc69359a7a7b Author: Benjamin Otte <otte at gnome.org> Date: Sun Jan 20 17:13:11 2008 +0100 set dump to a default value - no uninitialized variables please diff --git a/test/swfdec_test.c b/test/swfdec_test.c index 3974f4b..957b35b 100644 --- a/test/swfdec_test.c +++ b/test/swfdec_test.c @@ -77,7 +77,7 @@ main (int argc, char **argv) SwfdecScript *script; SwfdecAsValue val; int i, ret; - gboolean dump; + gboolean dump = FALSE; GOptionEntry options[] = { { "dump", 'd', 0, G_OPTION_ARG_NONE, &dump, "dump images on failure", FALSE }, commit 1d351e5cd7105c00a2bea80671e99622c5fe7e76 Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 19 22:14:19 2008 +0100 and add the swfdec_sandbox.[ch] files diff --git a/libswfdec/swfdec_sandbox.c b/libswfdec/swfdec_sandbox.c new file mode 100644 index 0000000..41b4301 --- /dev/null +++ b/libswfdec/swfdec_sandbox.c @@ -0,0 +1,204 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "swfdec_sandbox.h" +#include "swfdec_as_internal.h" +#include "swfdec_debug.h" +#include "swfdec_initialize.h" +#include "swfdec_internal.h" +#include "swfdec_player_internal.h" + +/*** GTK-DOC ***/ + +/** + * SECTION:SwfdecSandbox + * @title: SwfdecSandbox + * @short_description: global object used for security + * + * The SwfdecSandbox object is a garbage-collected script object that does two + * things. The simple thing is its use as the global object while code is + * executed in a #SwfdecPlayer. So you can always assume that the global object + * is a #SwfdecSandbox. The second task it fulfills is acting as the security + * mechanism used by native functions to determine if a given action should be + * allowed or not. This is easy, because script functions can always refer to + * it as the global object. + */ + +G_DEFINE_TYPE (SwfdecSandbox, swfdec_sandbox, G_TYPE_OBJECT) + +static void +swfdec_sandbox_class_init (SwfdecSandboxClass *klass) +{ +} + +static void +swfdec_sandbox_init (SwfdecSandbox *sandbox) +{ + sandbox->type = SWFDEC_SANDBOX_NONE; +} + +/** + * swfdec_sandbox_get_for_url: + * @player: a #SwfdecPlayer + * @url: the URL this player refers to + * + * Checks if a sandbox is already in use for a given URL and if so, returns it. + * Otherwise a new sandbox is created, initialized and returned. + * Note that the given url must be a HTTP, HTTPS or a FILE url. + * + * Returns: the sandbox corresponding to the given URL. + **/ +SwfdecSandbox * +swfdec_sandbox_get_for_url (SwfdecPlayer *player, const SwfdecURL *url) +{ + SwfdecPlayerPrivate *priv; + SwfdecSandbox *sandbox; + SwfdecURL *real; + + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); + g_return_val_if_fail (url != NULL, NULL); + + priv = player->priv; + real = swfdec_url_new_components (swfdec_url_get_protocol (url), + swfdec_url_get_host (url), swfdec_url_get_port (url), NULL, NULL); + + sandbox = g_hash_table_lookup (priv->sandboxes, real); + if (sandbox) { + swfdec_url_free (real); + } else { + SwfdecAsContext *context = SWFDEC_AS_CONTEXT (player); + guint size = sizeof (SwfdecSandbox); + if (!swfdec_as_context_use_mem (context, size)) + size = 0; + + sandbox = g_object_new (SWFDEC_TYPE_SANDBOX, NULL); + swfdec_as_object_add (SWFDEC_AS_OBJECT (sandbox), context, size); + sandbox->url = real; + } + return sandbox; +} + +static void +swfdec_sandbox_initialize (SwfdecSandbox *sandbox) +{ + SwfdecAsContext *context = SWFDEC_AS_OBJECT (sandbox)->context; + SwfdecPlayer *player = SWFDEC_PLAYER (context); + + swfdec_sandbox_use (sandbox); + if (context->state == SWFDEC_AS_CONTEXT_RUNNING) + context->state = SWFDEC_AS_CONTEXT_NEW; + swfdec_as_context_startup (context); + /* reset state for initialization */ + /* FIXME: have a better way to do this */ + context->state = SWFDEC_AS_CONTEXT_NEW; + swfdec_sprite_movie_init_context (player); + swfdec_video_movie_init_context (player); + swfdec_net_stream_init_context (player); + + swfdec_as_context_run_init_script (context, swfdec_initialize, + sizeof (swfdec_initialize), 8); + + if (context->state == SWFDEC_AS_CONTEXT_NEW) + context->state = SWFDEC_AS_CONTEXT_RUNNING; + swfdec_sandbox_unuse (sandbox); +} +/** + * swfdec_sandbox_set_allow_network: + * @sandbox: a #SwfdecSandbox + * @network: %TRUE to allow network access, %FALSE to only allow local file + * access. See the documentation of the use_network flag of the SWF + * FileAttributes tag for what that means. + * + * This function finishes initialization of the @sandbox, if it is not yet + * finished, by giving the sandbox network or local file access. This function + * should be called on all return values of swfdec_sandbox_get_for_url(). + * + * Returns: %TRUE if the sandbox initialization could be finished as requested, + * %FALSE if not and it shouldn't be used. + **/ +gboolean +swfdec_sandbox_set_allow_network (SwfdecSandbox *sandbox, gboolean network) +{ + g_return_val_if_fail (SWFDEC_IS_SANDBOX (sandbox), FALSE); + + switch (sandbox->type) { + case SWFDEC_SANDBOX_REMOTE: + return TRUE; + case SWFDEC_SANDBOX_LOCAL_FILE: + return !network; + case SWFDEC_SANDBOX_LOCAL_NETWORK: + return network; + case SWFDEC_SANDBOX_LOCAL_TRUSTED: + return TRUE; + case SWFDEC_SANDBOX_NONE: + break; + default: + g_assert_not_reached (); + break; + } + + if (swfdec_url_is_local (sandbox->url)) { + sandbox->type = network ? SWFDEC_SANDBOX_LOCAL_NETWORK : SWFDEC_SANDBOX_LOCAL_FILE; + } else { + sandbox->type = SWFDEC_SANDBOX_REMOTE; + } + + swfdec_sandbox_initialize (sandbox); + + return TRUE; +} + +/** + * swfdec_sandbox_use: + * @sandbox: the sandbox to use when executing scripts + * + * Sets @sandbox to be used for scripts that are going to be executed next. No + * sandbox may be set yet. You must unset the sandbox with + * swfdec_sandbox_unuse() after calling your script. + **/ +void +swfdec_sandbox_use (SwfdecSandbox *sandbox) +{ + g_return_if_fail (SWFDEC_IS_SANDBOX (sandbox)); + g_return_if_fail (sandbox->type == SWFDEC_SANDBOX_NONE); + g_return_if_fail (SWFDEC_AS_OBJECT (sandbox)->context->global == NULL); + + SWFDEC_AS_OBJECT (sandbox)->context->global = SWFDEC_AS_OBJECT (sandbox); +} + +/** + * swfdec_sandbox_unuse: + * @sandbox: a #SwfdecSandbox + * + * Unsets the sandbox as the current sandbox for executing scripts. + **/ +void +swfdec_sandbox_unuse (SwfdecSandbox *sandbox) +{ + g_return_if_fail (SWFDEC_IS_SANDBOX (sandbox)); + g_return_if_fail (sandbox->type == SWFDEC_SANDBOX_NONE); + g_return_if_fail (SWFDEC_AS_OBJECT (sandbox)->context->global == SWFDEC_AS_OBJECT (sandbox)); + + SWFDEC_AS_OBJECT (sandbox)->context->global = NULL; +} + diff --git a/libswfdec/swfdec_sandbox.h b/libswfdec/swfdec_sandbox.h new file mode 100644 index 0000000..eaf27de --- /dev/null +++ b/libswfdec/swfdec_sandbox.h @@ -0,0 +1,72 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef _SWFDEC_SANDBOX_H_ +#define _SWFDEC_SANDBOX_H_ + +#include <libswfdec/swfdec_as_object.h> +#include <libswfdec/swfdec_url.h> +#include <libswfdec/swfdec_player.h> + +G_BEGIN_DECLS + +typedef struct _SwfdecSandbox SwfdecSandbox; +typedef struct _SwfdecSandboxClass SwfdecSandboxClass; + +typedef enum { + SWFDEC_SANDBOX_NONE, + SWFDEC_SANDBOX_REMOTE, + SWFDEC_SANDBOX_LOCAL_FILE, + SWFDEC_SANDBOX_LOCAL_NETWORK, + SWFDEC_SANDBOX_LOCAL_TRUSTED +} SwfdecSandboxType; + +#define SWFDEC_TYPE_SANDBOX (swfdec_sandbox_get_type()) +#define SWFDEC_IS_SANDBOX(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SANDBOX)) +#define SWFDEC_IS_SANDBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_SANDBOX)) +#define SWFDEC_SANDBOX(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_SANDBOX, SwfdecSandbox)) +#define SWFDEC_SANDBOX_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_SANDBOX, SwfdecSandboxClass)) +#define SWFDEC_SANDBOX_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_SANDBOX, SwfdecSandboxClass)) + +struct _SwfdecSandbox +{ + SwfdecAsObject object; + + SwfdecSandboxType type; /* type of this sandbox */ + SwfdecURL * url; /* URL this sandbox acts for */ +}; + +struct _SwfdecSandboxClass +{ + SwfdecAsObjectClass object_class; +}; + +GType swfdec_sandbox_get_type (void); + +SwfdecSandbox * swfdec_sandbox_get_for_url (SwfdecPlayer * player, + const SwfdecURL * url); + +gboolean swfdec_sandbox_set_allow_network(SwfdecSandbox * sandbox, + gboolean network); + +void swfdec_sandbox_use (SwfdecSandbox * sandbox); +void swfdec_sandbox_unuse (SwfdecSandbox * sandbox); + +G_END_DECLS +#endif commit 38281800817046a652cd2688d11e2933edef36a9 Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 19 22:14:02 2008 +0100 regen swfdec_initialize.h forgot that before diff --git a/libswfdec/swfdec_initialize.h b/libswfdec/swfdec_initialize.h index 466c667..ba99e38 100644 --- a/libswfdec/swfdec_initialize.h +++ b/libswfdec/swfdec_initialize.h @@ -2,7 +2,7 @@ /* compiled from swfdec_initialize.as */ static const unsigned char swfdec_initialize[] = { - 0x88, 0x35, 0x21, 0x08, 0x02, 0x41, 0x53, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6F, 0x70, 0x46, 0x6C, + 0x88, 0x4F, 0x21, 0x0A, 0x02, 0x41, 0x53, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6F, 0x70, 0x46, 0x6C, 0x61, 0x67, 0x73, 0x00, 0x41, 0x53, 0x6E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x00, 0x41, 0x53, 0x53, 0x65, 0x74, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x00, 0x41, 0x53, 0x53, 0x65, 0x74, 0x4E, 0x61, 0x74, 0x69, 0x76, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6F, 0x72, 0x00, 0x66, 0x6C, 0x61, @@ -252,1919 +252,1925 @@ static const unsigned char swfdec_initialize[] = { 0x2C, 0x37, 0x70, 0x61, 0x72, 0x73, 0x65, 0x43, 0x53, 0x53, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x6C, 0x2C, 0x37, 0x70, 0x61, 0x72, 0x73, 0x65, 0x43, 0x53, 0x53, 0x46, 0x6F, 0x6E, 0x74, 0x46, 0x61, 0x6D, 0x69, 0x6C, 0x79, 0x2C, 0x37, 0x70, 0x61, 0x72, 0x73, 0x65, 0x43, 0x6F, 0x6C, - 0x6F, 0x72, 0x00, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x79, - 0x00, 0x36, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2C, 0x36, 0x73, 0x65, 0x6E, 0x64, - 0x45, 0x76, 0x65, 0x6E, 0x74, 0x2C, 0x36, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6F, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x00, 0x43, 0x61, 0x6D, 0x65, 0x72, 0x61, 0x00, 0x67, - 0x65, 0x74, 0x5F, 0x66, 0x75, 0x6E, 0x63, 0x00, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x00, 0x36, 0x73, - 0x65, 0x74, 0x4D, 0x6F, 0x64, 0x65, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x51, 0x75, 0x61, 0x6C, 0x69, - 0x74, 0x79, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x4B, 0x65, 0x79, 0x46, 0x72, 0x61, 0x6D, 0x65, 0x49, - 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x4D, 0x6F, 0x74, 0x69, - 0x6F, 0x6E, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x4C, 0x6F, 0x6F, 0x70, - 0x62, 0x61, 0x63, 0x6B, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6F, 0x72, 0x00, - 0x6F, 0x6E, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x00, 0x63, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, - 0x6B, 0x00, 0x63, 0x75, 0x73, 0x74, 0x6F, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x00, 0x41, 0x72, - 0x72, 0x61, 0x79, 0x00, 0x62, 0x75, 0x69, 0x6C, 0x74, 0x49, 0x6E, 0x49, 0x74, 0x65, 0x6D, 0x73, - 0x00, 0x66, 0x6F, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5F, 0x62, 0x61, 0x63, 0x6B, 0x00, 0x6C, 0x6F, - 0x6F, 0x70, 0x00, 0x70, 0x6C, 0x61, 0x79, 0x00, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x00, 0x71, 0x75, - 0x61, 0x6C, 0x69, 0x74, 0x79, 0x00, 0x72, 0x65, 0x77, 0x69, 0x6E, 0x64, 0x00, 0x73, 0x61, 0x76, - 0x65, 0x00, 0x7A, 0x6F, 0x6F, 0x6D, 0x00, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x78, 0x74, 0x4D, 0x65, - 0x6E, 0x75, 0x00, 0x63, 0x6F, 0x70, 0x79, 0x00, 0x68, 0x69, 0x64, 0x65, 0x42, 0x75, 0x69, 0x6C, - 0x74, 0x49, 0x6E, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x00, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6F, 0x6E, - 0x00, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6F, 0x72, 0x42, 0x65, 0x66, 0x6F, 0x72, 0x65, - 0x00, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x00, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x78, 0x74, - 0x4D, 0x65, 0x6E, 0x75, 0x49, 0x74, 0x65, 0x6D, 0x00, 0x6E, 0x65, 0x74, 0x00, 0x46, 0x69, 0x6C, - 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, 0x00, 0x63, 0x00, 0x38, 0x62, 0x72, - 0x6F, 0x77, 0x73, 0x65, 0x2C, 0x38, 0x75, 0x70, 0x6C, 0x6F, 0x61, 0x64, 0x2C, 0x38, 0x64, 0x6F, - 0x77, 0x6E, 0x6C, 0x6F, 0x61, 0x64, 0x2C, 0x38, 0x63, 0x61, 0x6E, 0x63, 0x65, 0x6C, 0x00, 0x46, - 0x69, 0x6C, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, 0x4C, 0x69, 0x73, 0x74, - 0x00, 0x66, 0x69, 0x6C, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x00, 0x38, 0x62, 0x72, 0x6F, 0x77, 0x73, - 0x65, 0x00, 0x4C, 0x6F, 0x63, 0x61, 0x6C, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, - 0x6E, 0x00, 0x36, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x2C, 0x36, 0x73, 0x65, 0x6E, 0x64, - 0x2C, 0x36, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x2C, 0x36, 0x64, 0x6F, 0x6D, 0x61, 0x69, 0x6E, 0x00, - 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x70, 0x68, 0x6F, 0x6E, 0x65, 0x00, 0x36, 0x73, 0x65, 0x74, 0x53, - 0x69, 0x6C, 0x65, 0x6E, 0x63, 0x65, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x2C, 0x36, 0x73, 0x65, 0x74, - 0x52, 0x61, 0x74, 0x65, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x47, 0x61, 0x69, 0x6E, 0x2C, 0x36, 0x73, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x45, 0x63, 0x68, 0x6F, 0x53, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x50, 0x72, 0x69, 0x6E, 0x74, 0x4A, 0x6F, 0x62, 0x00, 0x37, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x2C, 0x37, 0x61, 0x64, 0x64, 0x50, 0x61, 0x67, 0x65, 0x2C, 0x37, 0x73, - 0x65, 0x6E, 0x64, 0x00, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x67, 0x65, - 0x74, 0x42, 0x65, 0x67, 0x69, 0x6E, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x2C, 0x67, 0x65, 0x74, 0x45, - 0x6E, 0x64, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x2C, 0x67, 0x65, 0x74, 0x43, 0x61, 0x72, 0x65, 0x74, - 0x49, 0x6E, 0x64, 0x65, 0x78, 0x2C, 0x67, 0x65, 0x74, 0x46, 0x6F, 0x63, 0x75, 0x73, 0x2C, 0x73, - 0x65, 0x74, 0x46, 0x6F, 0x63, 0x75, 0x73, 0x2C, 0x73, 0x65, 0x74, 0x53, 0x65, 0x6C, 0x65, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x74, 0x65, 0x78, 0x74, 0x00, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, - 0x6E, 0x64, 0x65, 0x72, 0x65, 0x72, 0x00, 0x38, 0x73, 0x65, 0x74, 0x41, 0x64, 0x76, 0x61, 0x6E, - 0x63, 0x65, 0x64, 0x41, 0x6E, 0x74, 0x69, 0x61, 0x6C, 0x69, 0x61, 0x73, 0x69, 0x6E, 0x67, 0x54, - 0x61, 0x62, 0x6C, 0x65, 0x00, 0x38, 0x6D, 0x61, 0x78, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x00, 0x38, - 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x00, 0x74, 0x65, 0x78, 0x74, - 0x52, 0x65, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x72, 0x00, 0x58, 0x4D, 0x4C, 0x53, 0x6F, 0x63, 0x6B, - 0x65, 0x74, 0x00, 0x6F, 0x6E, 0x58, 0x4D, 0x4C, 0x00, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, - 0x2C, 0x73, 0x65, 0x6E, 0x64, 0x2C, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x00, 0x67, 0x65, 0x6F, 0x6D, - 0x00, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x73, - 0x00, 0x79, 0x00, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x00, 0x61, 0x00, 0x62, 0x00, - 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x00, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x70, 0x6F, - 0x6C, 0x61, 0x74, 0x65, 0x00, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x00, 0x70, 0x6F, 0x6C, 0x61, 0x72, - 0x00, 0x4D, 0x61, 0x74, 0x68, 0x00, 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x00, 0x63, 0x6F, 0x73, 0x00, - 0x73, 0x69, 0x6E, 0x00, 0x73, 0x71, 0x72, 0x74, 0x00, 0x61, 0x64, 0x64, 0x00, 0x6F, 0x74, 0x68, - 0x65, 0x72, 0x00, 0x63, 0x6C, 0x6F, 0x6E, 0x65, 0x00, 0x65, 0x71, 0x75, 0x61, 0x6C, 0x73, 0x00, - 0x6E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, 0x69, 0x7A, 0x65, 0x00, 0x66, 0x61, 0x63, 0x74, 0x6F, 0x72, - 0x00, 0x6F, 0x66, 0x66, 0x73, 0x65, 0x74, 0x00, 0x28, 0x78, 0x3D, 0x00, 0x2C, 0x20, 0x79, 0x3D, - 0x00, 0x29, 0x00, 0x52, 0x65, 0x63, 0x74, 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x00, 0x73, 0x65, 0x74, - 0x45, 0x6D, 0x70, 0x74, 0x79, 0x00, 0x77, 0x69, 0x64, 0x74, 0x68, 0x00, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x00, 0x2C, 0x20, 0x77, 0x3D, 0x00, 0x2C, 0x20, 0x68, 0x3D, 0x00, 0x72, 0x65, 0x63, - 0x74, 0x00, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x00, 0x63, 0x6F, 0x6E, 0x74, 0x61, - 0x69, 0x6E, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x70, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x63, - 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x52, 0x65, 0x63, 0x74, 0x61, 0x6E, 0x67, 0x6C, 0x65, - 0x00, 0x74, 0x72, 0x00, 0x74, 0x62, 0x00, 0x72, 0x72, 0x00, 0x72, 0x62, 0x00, 0x69, 0x73, 0x45, - 0x6D, 0x70, 0x74, 0x79, 0x00, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, - 0x6E, 0x00, 0x69, 0x6E, 0x74, 0x73, 0x00, 0x6D, 0x61, 0x78, 0x00, 0x6D, 0x69, 0x6E, 0x00, 0x69, - 0x6E, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x73, 0x00, 0x75, 0x6E, 0x69, 0x6F, 0x6E, 0x00, - 0x64, 0x78, 0x00, 0x64, 0x79, 0x00, 0x6F, 0x66, 0x66, 0x73, 0x65, 0x74, 0x50, 0x6F, 0x69, 0x6E, - 0x74, 0x00, 0x64, 0x00, 0x69, 0x6E, 0x66, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x69, 0x6E, 0x66, 0x6C, - 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x6C, 0x65, 0x66, 0x74, 0x00, 0x72, 0x69, - 0x67, 0x68, 0x74, 0x00, 0x74, 0x6F, 0x70, 0x00, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x00, 0x74, - 0x6F, 0x70, 0x4C, 0x65, 0x66, 0x74, 0x00, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x52, 0x69, 0x67, - 0x68, 0x74, 0x00, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, - 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x63, 0x6C, 0x6F, 0x6E, - 0x65, 0x00, 0x63, 0x6F, 0x6E, 0x63, 0x61, 0x74, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, - 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x63, 0x6F, 0x6E, 0x63, 0x61, 0x74, - 0x00, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6F, 0x78, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, - 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x42, 0x6F, 0x78, 0x00, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x61, 0x64, - 0x69, 0x65, 0x6E, 0x74, 0x42, 0x6F, 0x78, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, - 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, - 0x72, 0x61, 0x64, 0x69, 0x65, 0x6E, 0x74, 0x42, 0x6F, 0x78, 0x00, 0x64, 0x65, 0x6C, 0x74, 0x61, - 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x49, - 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, - 0x64, 0x65, 0x6C, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x50, 0x6F, - 0x69, 0x6E, 0x74, 0x00, 0x69, 0x64, 0x65, 0x6E, 0x74, 0x69, 0x74, 0x79, 0x00, 0x49, 0x6D, 0x70, - 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x69, 0x64, - 0x65, 0x6E, 0x74, 0x69, 0x74, 0x79, 0x00, 0x69, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x00, 0x49, 0x6D, - 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x69, - 0x6E, 0x76, 0x65, 0x72, 0x74, 0x00, 0x72, 0x6F, 0x74, 0x61, 0x74, 0x65, 0x00, 0x49, 0x6D, 0x70, - 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x72, 0x6F, - 0x74, 0x61, 0x74, 0x65, 0x00, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, - 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x73, 0x63, 0x61, 0x6C, - 0x65, 0x00, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x50, 0x6F, 0x69, 0x6E, 0x74, - 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, - 0x78, 0x2E, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x50, 0x6F, 0x69, 0x6E, 0x74, - 0x00, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, + 0x6F, 0x72, 0x00, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x00, 0x36, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x56, 0x69, 0x64, 0x65, 0x6F, 0x2C, 0x36, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x00, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x69, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x79, 0x00, 0x36, 0x69, 0x73, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x2C, 0x36, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x2C, + 0x36, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x00, 0x43, 0x61, 0x6D, 0x65, 0x72, 0x61, 0x00, 0x67, 0x65, 0x74, 0x5F, 0x66, 0x75, 0x6E, + 0x63, 0x00, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x00, 0x36, 0x73, 0x65, 0x74, 0x4D, 0x6F, 0x64, 0x65, + 0x2C, 0x36, 0x73, 0x65, 0x74, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x2C, 0x36, 0x73, 0x65, + 0x74, 0x4B, 0x65, 0x79, 0x46, 0x72, 0x61, 0x6D, 0x65, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6C, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x4D, 0x6F, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x65, 0x76, 0x65, + 0x6C, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x4C, 0x6F, 0x6F, 0x70, 0x62, 0x61, 0x63, 0x6B, 0x2C, 0x36, + 0x73, 0x65, 0x74, 0x43, 0x75, 0x72, 0x73, 0x6F, 0x72, 0x00, 0x6F, 0x6E, 0x53, 0x65, 0x6C, 0x65, + 0x63, 0x74, 0x00, 0x63, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x00, 0x63, 0x75, 0x73, 0x74, + 0x6F, 0x6D, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x00, 0x41, 0x72, 0x72, 0x61, 0x79, 0x00, 0x62, 0x75, + 0x69, 0x6C, 0x74, 0x49, 0x6E, 0x49, 0x74, 0x65, 0x6D, 0x73, 0x00, 0x66, 0x6F, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x5F, 0x62, 0x61, 0x63, 0x6B, 0x00, 0x6C, 0x6F, 0x6F, 0x70, 0x00, 0x70, 0x6C, 0x61, + 0x79, 0x00, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x00, 0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x00, + 0x72, 0x65, 0x77, 0x69, 0x6E, 0x64, 0x00, 0x73, 0x61, 0x76, 0x65, 0x00, 0x7A, 0x6F, 0x6F, 0x6D, + 0x00, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x78, 0x74, 0x4D, 0x65, 0x6E, 0x75, 0x00, 0x63, 0x6F, 0x70, + 0x79, 0x00, 0x68, 0x69, 0x64, 0x65, 0x42, 0x75, 0x69, 0x6C, 0x74, 0x49, 0x6E, 0x49, 0x74, 0x65, + 0x6D, 0x73, 0x00, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x73, 0x65, 0x70, 0x61, 0x72, + 0x61, 0x74, 0x6F, 0x72, 0x42, 0x65, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6C, 0x65, 0x00, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x78, 0x74, 0x4D, 0x65, 0x6E, 0x75, 0x49, 0x74, + 0x65, 0x6D, 0x00, 0x6E, 0x65, 0x74, 0x00, 0x46, 0x69, 0x6C, 0x65, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6E, 0x63, 0x65, 0x00, 0x63, 0x00, 0x38, 0x62, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x2C, 0x38, + 0x75, 0x70, 0x6C, 0x6F, 0x61, 0x64, 0x2C, 0x38, 0x64, 0x6F, 0x77, 0x6E, 0x6C, 0x6F, 0x61, 0x64, + 0x2C, 0x38, 0x63, 0x61, 0x6E, 0x63, 0x65, 0x6C, 0x00, 0x46, 0x69, 0x6C, 0x65, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6E, 0x63, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x00, 0x66, 0x69, 0x6C, 0x65, 0x4C, + 0x69, 0x73, 0x74, 0x00, 0x38, 0x62, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x00, 0x4C, 0x6F, 0x63, 0x61, + 0x6C, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x36, 0x63, 0x6F, 0x6E, + 0x6E, 0x65, 0x63, 0x74, 0x2C, 0x36, 0x73, 0x65, 0x6E, 0x64, 0x2C, 0x36, 0x63, 0x6C, 0x6F, 0x73, + 0x65, 0x2C, 0x36, 0x64, 0x6F, 0x6D, 0x61, 0x69, 0x6E, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x70, + 0x68, 0x6F, 0x6E, 0x65, 0x00, 0x36, 0x73, 0x65, 0x74, 0x53, 0x69, 0x6C, 0x65, 0x6E, 0x63, 0x65, + 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x52, 0x61, 0x74, 0x65, 0x2C, 0x36, + 0x73, 0x65, 0x74, 0x47, 0x61, 0x69, 0x6E, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x55, 0x73, 0x65, 0x45, + 0x63, 0x68, 0x6F, 0x53, 0x75, 0x70, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x50, + 0x72, 0x69, 0x6E, 0x74, 0x4A, 0x6F, 0x62, 0x00, 0x37, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2C, 0x37, + 0x61, 0x64, 0x64, 0x50, 0x61, 0x67, 0x65, 0x2C, 0x37, 0x73, 0x65, 0x6E, 0x64, 0x00, 0x53, 0x65, + 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x67, 0x65, 0x74, 0x42, 0x65, 0x67, 0x69, 0x6E, + 0x49, 0x6E, 0x64, 0x65, 0x78, 0x2C, 0x67, 0x65, 0x74, 0x45, 0x6E, 0x64, 0x49, 0x6E, 0x64, 0x65, + 0x78, 0x2C, 0x67, 0x65, 0x74, 0x43, 0x61, 0x72, 0x65, 0x74, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x2C, + 0x67, 0x65, 0x74, 0x46, 0x6F, 0x63, 0x75, 0x73, 0x2C, 0x73, 0x65, 0x74, 0x46, 0x6F, 0x63, 0x75, + 0x73, 0x2C, 0x73, 0x65, 0x74, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x74, + 0x65, 0x78, 0x74, 0x00, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x6E, 0x64, 0x65, 0x72, 0x65, 0x72, + 0x00, 0x38, 0x73, 0x65, 0x74, 0x41, 0x64, 0x76, 0x61, 0x6E, 0x63, 0x65, 0x64, 0x41, 0x6E, 0x74, + 0x69, 0x61, 0x6C, 0x69, 0x61, 0x73, 0x69, 0x6E, 0x67, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x38, + 0x6D, 0x61, 0x78, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x00, 0x38, 0x64, 0x69, 0x73, 0x70, 0x6C, 0x61, + 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x00, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x6E, 0x64, 0x65, 0x72, + 0x65, 0x72, 0x00, 0x58, 0x4D, 0x4C, 0x53, 0x6F, 0x63, 0x6B, 0x65, 0x74, 0x00, 0x6F, 0x6E, 0x58, + 0x4D, 0x4C, 0x00, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x2C, 0x73, 0x65, 0x6E, 0x64, 0x2C, + 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x00, 0x67, 0x65, 0x6F, 0x6D, 0x00, 0x50, 0x6F, 0x69, 0x6E, 0x74, + 0x00, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x00, 0x79, 0x00, 0x64, 0x69, 0x73, + 0x74, 0x61, 0x6E, 0x63, 0x65, 0x00, 0x61, 0x00, 0x62, 0x00, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x00, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x70, 0x6F, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x76, + 0x61, 0x6C, 0x75, 0x65, 0x00, 0x70, 0x6F, 0x6C, 0x61, 0x72, 0x00, 0x4D, 0x61, 0x74, 0x68, 0x00, + 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x00, 0x63, 0x6F, 0x73, 0x00, 0x73, 0x69, 0x6E, 0x00, 0x73, 0x71, + 0x72, 0x74, 0x00, 0x61, 0x64, 0x64, 0x00, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x00, 0x63, 0x6C, 0x6F, + 0x6E, 0x65, 0x00, 0x65, 0x71, 0x75, 0x61, 0x6C, 0x73, 0x00, 0x6E, 0x6F, 0x72, 0x6D, 0x61, 0x6C, + 0x69, 0x7A, 0x65, 0x00, 0x66, 0x61, 0x63, 0x74, 0x6F, 0x72, 0x00, 0x6F, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x00, 0x28, 0x78, 0x3D, 0x00, 0x2C, 0x20, 0x79, 0x3D, 0x00, 0x29, 0x00, 0x52, 0x65, 0x63, + 0x74, 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x00, 0x73, 0x65, 0x74, 0x45, 0x6D, 0x70, 0x74, 0x79, 0x00, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x00, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x00, 0x2C, 0x20, 0x77, + 0x3D, 0x00, 0x2C, 0x20, 0x68, 0x3D, 0x00, 0x72, 0x65, 0x63, 0x74, 0x00, 0x63, 0x6F, 0x6E, 0x74, + 0x61, 0x69, 0x6E, 0x73, 0x00, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x50, 0x6F, 0x69, + 0x6E, 0x74, 0x00, 0x70, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, + 0x73, 0x52, 0x65, 0x63, 0x74, 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x00, 0x74, 0x72, 0x00, 0x74, 0x62, + 0x00, 0x72, 0x72, 0x00, 0x72, 0x62, 0x00, 0x69, 0x73, 0x45, 0x6D, 0x70, 0x74, 0x79, 0x00, 0x69, + 0x6E, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x69, 0x6E, 0x74, 0x73, + 0x00, 0x6D, 0x61, 0x78, 0x00, 0x6D, 0x69, 0x6E, 0x00, 0x69, 0x6E, 0x74, 0x65, 0x72, 0x73, 0x65, + 0x63, 0x74, 0x73, 0x00, 0x75, 0x6E, 0x69, 0x6F, 0x6E, 0x00, 0x64, 0x78, 0x00, 0x64, 0x79, 0x00, + 0x6F, 0x66, 0x66, 0x73, 0x65, 0x74, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x64, 0x00, 0x69, 0x6E, + 0x66, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x69, 0x6E, 0x66, 0x6C, 0x61, 0x74, 0x65, 0x50, 0x6F, 0x69, + 0x6E, 0x74, 0x00, 0x6C, 0x65, 0x66, 0x74, 0x00, 0x72, 0x69, 0x67, 0x68, 0x74, 0x00, 0x74, 0x6F, + 0x70, 0x00, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x00, 0x74, 0x6F, 0x70, 0x4C, 0x65, 0x66, 0x74, + 0x00, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x52, 0x69, 0x67, 0x68, 0x74, 0x00, 0x4D, 0x61, 0x74, + 0x72, 0x69, 0x78, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, + 0x74, 0x72, 0x69, 0x78, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, + 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x63, 0x6C, 0x6F, 0x6E, 0x65, 0x00, 0x63, 0x6F, 0x6E, 0x63, + 0x61, 0x74, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, + 0x72, 0x69, 0x78, 0x2E, 0x63, 0x6F, 0x6E, 0x63, 0x61, 0x74, 0x00, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x42, 0x6F, 0x78, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, + 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x6F, 0x78, 0x00, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6E, 0x74, 0x42, 0x6F, + 0x78, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, + 0x69, 0x78, 0x2E, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6E, + 0x74, 0x42, 0x6F, 0x78, 0x00, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, + 0x6F, 0x72, 0x6D, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, + 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x64, 0x65, 0x6C, 0x74, 0x61, 0x54, + 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x69, 0x64, + 0x65, 0x6E, 0x74, 0x69, 0x74, 0x79, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, + 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x69, 0x64, 0x65, 0x6E, 0x74, 0x69, 0x74, 0x79, + 0x00, 0x69, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, + 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x69, 0x6E, 0x76, 0x65, 0x72, 0x74, 0x00, + 0x72, 0x6F, 0x74, 0x61, 0x74, 0x65, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, + 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x72, 0x6F, 0x74, 0x61, 0x74, 0x65, 0x00, 0x73, + 0x63, 0x61, 0x6C, 0x65, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, + 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x00, 0x74, 0x72, 0x61, 0x6E, + 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x74, 0x72, 0x61, 0x6E, - 0x73, 0x6C, 0x61, 0x74, 0x65, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, - 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x74, 0x6F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x00, 0x49, - 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x72, - 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x2E, 0x74, 0x6F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, - 0x00, 0x38, 0x63, 0x6F, 0x6E, 0x63, 0x61, 0x74, 0x00, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x4D, - 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x69, 0x65, 0x72, 0x2C, 0x38, 0x72, 0x65, 0x64, 0x4D, 0x75, - 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x69, 0x65, 0x72, 0x2C, 0x38, 0x67, 0x72, 0x65, 0x65, 0x6E, 0x4D, - 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x69, 0x65, 0x72, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x65, 0x4D, - 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x69, 0x65, 0x72, 0x2C, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, - 0x4F, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2C, 0x38, 0x72, 0x65, 0x64, 0x4F, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x2C, 0x38, 0x67, 0x72, 0x65, 0x65, 0x6E, 0x4F, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2C, 0x38, - 0x62, 0x6C, 0x75, 0x65, 0x4F, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2C, 0x38, 0x72, 0x67, 0x62, 0x00, - 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x00, 0x38, 0x6D, 0x61, 0x74, 0x72, 0x69, - 0x78, 0x2C, 0x38, 0x63, 0x6F, 0x6E, 0x63, 0x61, 0x74, 0x65, 0x6E, 0x61, 0x74, 0x65, 0x64, 0x4D, - 0x61, 0x74, 0x72, 0x69, 0x78, 0x2C, 0x38, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x72, 0x61, 0x6E, - 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x2C, 0x38, 0x63, 0x6F, 0x6E, 0x63, 0x61, 0x74, 0x65, 0x6E, 0x61, - 0x74, 0x65, 0x64, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, - 0x6D, 0x2C, 0x38, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x42, 0x6F, 0x75, 0x6E, 0x64, 0x73, 0x00, 0x42, - 0x69, 0x74, 0x6D, 0x61, 0x70, 0x44, 0x61, 0x74, 0x61, 0x00, 0x52, 0x45, 0x44, 0x5F, 0x43, 0x48, - 0x41, 0x4E, 0x4E, 0x45, 0x4C, 0x00, 0x47, 0x52, 0x45, 0x45, 0x4E, 0x5F, 0x43, 0x48, 0x41, 0x4E, - 0x4E, 0x45, 0x4C, 0x00, 0x42, 0x4C, 0x55, 0x45, 0x5F, 0x43, 0x48, 0x41, 0x4E, 0x4E, 0x45, 0x4C, - 0x00, 0x41, 0x4C, 0x50, 0x48, 0x41, 0x5F, 0x43, 0x48, 0x41, 0x4E, 0x4E, 0x45, 0x4C, 0x00, 0x38, - 0x6C, 0x6F, 0x61, 0x64, 0x42, 0x69, 0x74, 0x6D, 0x61, 0x70, 0x00, 0x38, 0x67, 0x65, 0x74, 0x50, - 0x69, 0x78, 0x65, 0x6C, 0x2C, 0x38, 0x73, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x2C, 0x38, - 0x66, 0x69, 0x6C, 0x6C, 0x52, 0x65, 0x63, 0x74, 0x2C, 0x38, 0x63, 0x6F, 0x70, 0x79, 0x50, 0x69, - 0x78, 0x65, 0x6C, 0x73, 0x2C, 0x38, 0x61, 0x70, 0x70, 0x6C, 0x79, 0x46, 0x69, 0x6C, 0x74, 0x65, - 0x72, 0x2C, 0x38, 0x73, 0x63, 0x72, 0x6F, 0x6C, 0x6C, 0x2C, 0x38, 0x74, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6F, 0x6C, 0x64, 0x2C, 0x38, 0x64, 0x72, 0x61, 0x77, 0x2C, 0x38, 0x70, 0x69, 0x78, 0x65, - 0x6C, 0x44, 0x69, 0x73, 0x73, 0x6F, 0x6C, 0x76, 0x65, 0x2C, 0x38, 0x67, 0x65, 0x74, 0x50, 0x69, - 0x78, 0x65, 0x6C, 0x33, 0x32, 0x2C, 0x38, 0x73, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x33, - 0x32, 0x2C, 0x38, 0x66, 0x6C, 0x6F, 0x6F, 0x64, 0x46, 0x69, 0x6C, 0x6C, 0x2C, 0x38, 0x67, 0x65, - 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x42, 0x6F, 0x75, 0x6E, 0x64, 0x73, 0x52, 0x65, 0x63, 0x74, - 0x2C, 0x38, 0x70, 0x65, 0x72, 0x6C, 0x69, 0x6E, 0x4E, 0x6F, 0x69, 0x73, 0x65, 0x2C, 0x38, 0x63, - 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x2C, 0x38, 0x68, - 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x2C, 0x38, 0x70, 0x61, 0x6C, 0x65, 0x74, 0x74, 0x65, 0x4D, - 0x61, 0x70, 0x2C, 0x38, 0x6D, 0x65, 0x72, 0x67, 0x65, 0x2C, 0x38, 0x6E, 0x6F, 0x69, 0x73, 0x65, - 0x2C, 0x38, 0x63, 0x6F, 0x70, 0x79, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x2C, 0x38, 0x63, - 0x6C, 0x6F, 0x6E, 0x65, 0x2C, 0x38, 0x64, 0x69, 0x73, 0x70, 0x6F, 0x73, 0x65, 0x2C, 0x38, 0x67, - 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, - 0x74, 0x2C, 0x38, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x72, 0x65, 0x00, 0x38, 0x77, 0x69, 0x64, 0x74, - 0x68, 0x2C, 0x38, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2C, 0x38, 0x72, 0x65, 0x63, 0x74, 0x61, - 0x6E, 0x67, 0x6C, 0x65, 0x2C, 0x38, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6E, - 0x74, 0x00, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x6C, 0x00, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6E, 0x61, 0x6C, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x61, 0x64, 0x64, - 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x00, 0x61, 0x76, 0x61, 0x69, 0x6C, 0x61, 0x62, - 0x6C, 0x65, 0x00, 0x5F, 0x69, 0x6E, 0x69, 0x74, 0x4A, 0x53, 0x00, 0x69, 0x6E, 0x73, 0x74, 0x61, - 0x6E, 0x63, 0x65, 0x00, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x00, 0x5F, 0x63, 0x61, 0x6C, - 0x6C, 0x49, 0x6E, 0x00, 0x5F, 0x61, 0x64, 0x64, 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, - 0x00, 0x63, 0x61, 0x6C, 0x6C, 0x00, 0x74, 0x72, 0x79, 0x20, 0x7B, 0x20, 0x00, 0x5F, 0x6F, 0x62, - 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x00, 0x69, 0x64, 0x00, 0x2E, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x74, 0x75, 0x72, 0x6E, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x28, 0x00, 0x5F, 0x5F, 0x66, 0x6C, 0x61, - 0x73, 0x68, 0x5F, 0x5F, 0x74, 0x6F, 0x58, 0x4D, 0x4C, 0x20, 0x28, 0x00, 0x28, 0x00, 0x2C, 0x00, - 0x5F, 0x74, 0x6F, 0x4A, 0x53, 0x00, 0x29, 0x29, 0x20, 0x00, 0x3B, 0x20, 0x7D, 0x20, 0x63, 0x61, - 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x29, 0x20, 0x7B, 0x20, 0x00, 0x2E, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x74, 0x75, 0x72, 0x6E, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x28, 0x22, 0x3C, 0x75, 0x6E, 0x64, - 0x65, 0x66, 0x69, 0x6E, 0x65, 0x64, 0x2F, 0x3E, 0x22, 0x29, 0x3B, 0x20, 0x7D, 0x00, 0x22, 0x3C, - 0x75, 0x6E, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x64, 0x2F, 0x3E, 0x22, 0x3B, 0x20, 0x7D, 0x00, - 0x5F, 0x65, 0x76, 0x61, 0x6C, 0x4A, 0x53, 0x00, 0x3C, 0x69, 0x6E, 0x76, 0x6F, 0x6B, 0x65, 0x20, - 0x6E, 0x61, 0x6D, 0x65, 0x3D, 0x22, 0x00, 0x22, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x74, - 0x79, 0x70, 0x65, 0x3D, 0x22, 0x78, 0x6D, 0x6C, 0x22, 0x3E, 0x00, 0x5F, 0x61, 0x72, 0x67, 0x75, - 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x54, 0x6F, 0x58, 0x4D, 0x4C, 0x00, 0x3C, 0x2F, 0x69, 0x6E, 0x76, - 0x6F, 0x6B, 0x65, 0x3E, 0x00, 0x5F, 0x63, 0x61, 0x6C, 0x6C, 0x4F, 0x75, 0x74, 0x00, 0x78, 0x6D, - 0x6C, 0x00, 0x69, 0x67, 0x6E, 0x6F, 0x72, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x00, 0x66, 0x69, - 0x72, 0x73, 0x74, 0x43, 0x68, 0x69, 0x6C, 0x64, 0x00, 0x5F, 0x74, 0x6F, 0x41, 0x53, 0x00, 0x61, - 0x72, 0x67, 0x73, 0x00, 0x63, 0x68, 0x69, 0x6C, 0x64, 0x4E, 0x6F, 0x64, 0x65, 0x73, 0x00, 0x6E, - 0x6F, 0x64, 0x65, 0x4E, 0x61, 0x6D, 0x65, 0x00, 0x5F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x73, 0x54, 0x6F, 0x41, 0x53, 0x00, 0x61, 0x70, 0x70, 0x6C, 0x79, 0x00, 0x61, 0x74, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x74, 0x79, - 0x70, 0x65, 0x00, 0x6A, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x00, 0x5F, 0x74, - 0x6F, 0x58, 0x4D, 0x4C, 0x00, 0x5F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x54, 0x6F, 0x58, 0x4D, 0x4C, - 0x00, 0x3C, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x00, 0x73, 0x00, 0x61, 0x72, 0x72, 0x61, 0x79, - 0x00, 0x3C, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x69, 0x64, 0x3D, 0x22, 0x00, - 0x22, 0x3E, 0x00, 0x3C, 0x2F, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3E, 0x00, 0x3C, - 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3E, 0x00, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, - 0x74, 0x73, 0x3E, 0x00, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x3E, - 0x00, 0x5F, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x54, 0x6F, 0x58, 0x4D, 0x4C, 0x00, 0x3C, 0x6F, - 0x62, 0x6A, 0x65, 0x63, 0x74, 0x3E, 0x00, 0x6F, 0x62, 0x6A, 0x00, 0x3C, 0x2F, 0x6F, 0x62, 0x6A, - 0x65, 0x63, 0x74, 0x3E, 0x00, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x3C, 0x73, 0x74, 0x72, - 0x69, 0x6E, 0x67, 0x3E, 0x00, 0x5F, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x58, 0x4D, 0x4C, 0x00, - 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x00, 0x3C, 0x75, 0x6E, 0x64, 0x65, 0x66, - 0x69, 0x6E, 0x65, 0x64, 0x2F, 0x3E, 0x00, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x00, 0x3C, 0x6E, - 0x75, 0x6D, 0x62, 0x65, 0x72, 0x3E, 0x00, 0x3C, 0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x3E, - 0x00, 0x3C, 0x6E, 0x75, 0x6C, 0x6C, 0x2F, 0x3E, 0x00, 0x62, 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, - 0x00, 0x3C, 0x74, 0x72, 0x75, 0x65, 0x2F, 0x3E, 0x00, 0x3C, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x2F, - 0x3E, 0x00, 0x68, 0x61, 0x73, 0x4F, 0x77, 0x6E, 0x50, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, - 0x00, 0x5F, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x54, 0x6F, 0x41, 0x53, 0x00, 0x70, 0x72, 0x6F, - 0x70, 0x65, 0x72, 0x74, 0x79, 0x00, 0x5F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x54, 0x6F, 0x41, 0x53, - 0x00, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x00, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x5F, - 0x75, 0x6E, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x58, 0x4D, 0x4C, 0x00, 0x63, 0x6C, 0x61, 0x73, - 0x73, 0x00, 0x5F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x54, 0x6F, 0x4A, 0x53, 0x00, 0x5B, 0x00, 0x5F, - 0x6C, 0x31, 0x00, 0x5D, 0x00, 0x5F, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x54, 0x6F, 0x4A, 0x53, - 0x00, 0x28, 0x7B, 0x00, 0x6E, 0x65, 0x65, 0x64, 0x73, 0x5F, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x00, - 0x3A, 0x00, 0x7D, 0x29, 0x00, 0x22, 0x00, 0x5F, 0x6A, 0x73, 0x51, 0x75, 0x6F, 0x74, 0x65, 0x53, - 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x38, 0x5F, 0x69, 0x6E, 0x69, 0x74, 0x4A, 0x53, 0x2C, 0x38, - 0x5F, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x2C, 0x38, 0x5F, 0x61, 0x64, 0x64, 0x43, - 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x2C, 0x38, 0x5F, 0x65, 0x76, 0x61, 0x6C, 0x4A, 0x53, - 0x2C, 0x38, 0x5F, 0x63, 0x61, 0x6C, 0x6C, 0x4F, 0x75, 0x74, 0x2C, 0x38, 0x5F, 0x65, 0x73, 0x63, - 0x61, 0x70, 0x65, 0x58, 0x4D, 0x4C, 0x2C, 0x38, 0x5F, 0x75, 0x6E, 0x65, 0x73, 0x63, 0x61, 0x70, - 0x65, 0x58, 0x4D, 0x4C, 0x2C, 0x38, 0x5F, 0x6A, 0x73, 0x51, 0x75, 0x6F, 0x74, 0x65, 0x53, 0x74, - 0x72, 0x69, 0x6E, 0x67, 0x00, 0x38, 0x61, 0x76, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x64, 0x65, 0x6C, - 0x65, 0x74, 0x65, 0x41, 0x6C, 0x6C, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, - 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x2E, 0x64, 0x65, - 0x6C, 0x65, 0x74, 0x65, 0x41, 0x6C, 0x6C, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x29, - 0x00, 0x67, 0x65, 0x74, 0x44, 0x69, 0x73, 0x6B, 0x55, 0x73, 0x61, 0x67, 0x65, 0x00, 0x49, 0x6D, + 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0x74, 0x72, 0x61, 0x6E, 0x73, + 0x6C, 0x61, 0x74, 0x65, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, + 0x61, 0x74, 0x72, 0x69, 0x78, 0x2E, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x6C, 0x61, 0x74, 0x65, 0x00, + 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, + 0x2E, 0x74, 0x6F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, + 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, + 0x6E, 0x74, 0x20, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, + 0x6D, 0x2E, 0x74, 0x6F, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x38, 0x63, 0x6F, 0x6E, 0x63, + 0x61, 0x74, 0x00, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, + 0x69, 0x65, 0x72, 0x2C, 0x38, 0x72, 0x65, 0x64, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, 0x69, + 0x65, 0x72, 0x2C, 0x38, 0x67, 0x72, 0x65, 0x65, 0x6E, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, + 0x69, 0x65, 0x72, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x65, 0x4D, 0x75, 0x6C, 0x74, 0x69, 0x70, 0x6C, + 0x69, 0x65, 0x72, 0x2C, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x4F, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x2C, 0x38, 0x72, 0x65, 0x64, 0x4F, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2C, 0x38, 0x67, 0x72, 0x65, + 0x65, 0x6E, 0x4F, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x65, 0x4F, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x2C, 0x38, 0x72, 0x67, 0x62, 0x00, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, + 0x6F, 0x72, 0x6D, 0x00, 0x38, 0x6D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2C, 0x38, 0x63, 0x6F, 0x6E, + 0x63, 0x61, 0x74, 0x65, 0x6E, 0x61, 0x74, 0x65, 0x64, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2C, + 0x38, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x2C, + 0x38, 0x63, 0x6F, 0x6E, 0x63, 0x61, 0x74, 0x65, 0x6E, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6F, 0x6C, + 0x6F, 0x72, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x2C, 0x38, 0x70, 0x69, 0x78, + 0x65, 0x6C, 0x42, 0x6F, 0x75, 0x6E, 0x64, 0x73, 0x00, 0x42, 0x69, 0x74, 0x6D, 0x61, 0x70, 0x44, + 0x61, 0x74, 0x61, 0x00, 0x52, 0x45, 0x44, 0x5F, 0x43, 0x48, 0x41, 0x4E, 0x4E, 0x45, 0x4C, 0x00, + 0x47, 0x52, 0x45, 0x45, 0x4E, 0x5F, 0x43, 0x48, 0x41, 0x4E, 0x4E, 0x45, 0x4C, 0x00, 0x42, 0x4C, + 0x55, 0x45, 0x5F, 0x43, 0x48, 0x41, 0x4E, 0x4E, 0x45, 0x4C, 0x00, 0x41, 0x4C, 0x50, 0x48, 0x41, + 0x5F, 0x43, 0x48, 0x41, 0x4E, 0x4E, 0x45, 0x4C, 0x00, 0x38, 0x6C, 0x6F, 0x61, 0x64, 0x42, 0x69, + 0x74, 0x6D, 0x61, 0x70, 0x00, 0x38, 0x67, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x2C, 0x38, + 0x73, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x2C, 0x38, 0x66, 0x69, 0x6C, 0x6C, 0x52, 0x65, + 0x63, 0x74, 0x2C, 0x38, 0x63, 0x6F, 0x70, 0x79, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x73, 0x2C, 0x38, + 0x61, 0x70, 0x70, 0x6C, 0x79, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x2C, 0x38, 0x73, 0x63, 0x72, + 0x6F, 0x6C, 0x6C, 0x2C, 0x38, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6F, 0x6C, 0x64, 0x2C, 0x38, + 0x64, 0x72, 0x61, 0x77, 0x2C, 0x38, 0x70, 0x69, 0x78, 0x65, 0x6C, 0x44, 0x69, 0x73, 0x73, 0x6F, + 0x6C, 0x76, 0x65, 0x2C, 0x38, 0x67, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x33, 0x32, 0x2C, + 0x38, 0x73, 0x65, 0x74, 0x50, 0x69, 0x78, 0x65, 0x6C, 0x33, 0x32, 0x2C, 0x38, 0x66, 0x6C, 0x6F, + 0x6F, 0x64, 0x46, 0x69, 0x6C, 0x6C, 0x2C, 0x38, 0x67, 0x65, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, + 0x42, 0x6F, 0x75, 0x6E, 0x64, 0x73, 0x52, 0x65, 0x63, 0x74, 0x2C, 0x38, 0x70, 0x65, 0x72, 0x6C, + 0x69, 0x6E, 0x4E, 0x6F, 0x69, 0x73, 0x65, 0x2C, 0x38, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x72, + 0x61, 0x6E, 0x73, 0x66, 0x6F, 0x72, 0x6D, 0x2C, 0x38, 0x68, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, + 0x2C, 0x38, 0x70, 0x61, 0x6C, 0x65, 0x74, 0x74, 0x65, 0x4D, 0x61, 0x70, 0x2C, 0x38, 0x6D, 0x65, + 0x72, 0x67, 0x65, 0x2C, 0x38, 0x6E, 0x6F, 0x69, 0x73, 0x65, 0x2C, 0x38, 0x63, 0x6F, 0x70, 0x79, + 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x2C, 0x38, 0x63, 0x6C, 0x6F, 0x6E, 0x65, 0x2C, 0x38, + 0x64, 0x69, 0x73, 0x70, 0x6F, 0x73, 0x65, 0x2C, 0x38, 0x67, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x52, 0x65, 0x63, 0x74, 0x2C, 0x38, 0x63, 0x6F, 0x6D, + 0x70, 0x61, 0x72, 0x65, 0x00, 0x38, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2C, 0x38, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x2C, 0x38, 0x72, 0x65, 0x63, 0x74, 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x2C, 0x38, + 0x74, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6E, 0x74, 0x00, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6E, 0x61, 0x6C, 0x00, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6E, 0x61, 0x6C, 0x49, 0x6E, 0x74, + 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x00, 0x61, 0x64, 0x64, 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, + 0x63, 0x6B, 0x00, 0x61, 0x76, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x5F, 0x69, 0x6E, + 0x69, 0x74, 0x4A, 0x53, 0x00, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x00, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x00, 0x5F, 0x63, 0x61, 0x6C, 0x6C, 0x49, 0x6E, 0x00, 0x5F, 0x61, + 0x64, 0x64, 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x00, 0x63, 0x61, 0x6C, 0x6C, 0x00, + 0x74, 0x72, 0x79, 0x20, 0x7B, 0x20, 0x00, 0x5F, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, + 0x00, 0x69, 0x64, 0x00, 0x2E, 0x53, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x56, 0x61, + 0x6C, 0x75, 0x65, 0x28, 0x00, 0x5F, 0x5F, 0x66, 0x6C, 0x61, 0x73, 0x68, 0x5F, 0x5F, 0x74, 0x6F, + 0x58, 0x4D, 0x4C, 0x20, 0x28, 0x00, 0x28, 0x00, 0x2C, 0x00, 0x5F, 0x74, 0x6F, 0x4A, 0x53, 0x00, + 0x29, 0x29, 0x20, 0x00, 0x3B, 0x20, 0x7D, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, + 0x29, 0x20, 0x7B, 0x20, 0x00, 0x2E, 0x53, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x56, + 0x61, 0x6C, 0x75, 0x65, 0x28, 0x22, 0x3C, 0x75, 0x6E, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x64, + 0x2F, 0x3E, 0x22, 0x29, 0x3B, 0x20, 0x7D, 0x00, 0x22, 0x3C, 0x75, 0x6E, 0x64, 0x65, 0x66, 0x69, + 0x6E, 0x65, 0x64, 0x2F, 0x3E, 0x22, 0x3B, 0x20, 0x7D, 0x00, 0x5F, 0x65, 0x76, 0x61, 0x6C, 0x4A, + 0x53, 0x00, 0x3C, 0x69, 0x6E, 0x76, 0x6F, 0x6B, 0x65, 0x20, 0x6E, 0x61, 0x6D, 0x65, 0x3D, 0x22, + 0x00, 0x22, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x3D, 0x22, 0x78, + 0x6D, 0x6C, 0x22, 0x3E, 0x00, 0x5F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x54, + 0x6F, 0x58, 0x4D, 0x4C, 0x00, 0x3C, 0x2F, 0x69, 0x6E, 0x76, 0x6F, 0x6B, 0x65, 0x3E, 0x00, 0x5F, + 0x63, 0x61, 0x6C, 0x6C, 0x4F, 0x75, 0x74, 0x00, 0x78, 0x6D, 0x6C, 0x00, 0x69, 0x67, 0x6E, 0x6F, + 0x72, 0x65, 0x57, 0x68, 0x69, 0x74, 0x65, 0x00, 0x66, 0x69, 0x72, 0x73, 0x74, 0x43, 0x68, 0x69, + 0x6C, 0x64, 0x00, 0x5F, 0x74, 0x6F, 0x41, 0x53, 0x00, 0x61, 0x72, 0x67, 0x73, 0x00, 0x63, 0x68, + 0x69, 0x6C, 0x64, 0x4E, 0x6F, 0x64, 0x65, 0x73, 0x00, 0x6E, 0x6F, 0x64, 0x65, 0x4E, 0x61, 0x6D, + 0x65, 0x00, 0x5F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x54, 0x6F, 0x41, 0x53, + 0x00, 0x61, 0x70, 0x70, 0x6C, 0x79, 0x00, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, + 0x73, 0x00, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x74, 0x79, 0x70, 0x65, 0x00, 0x6A, 0x61, 0x76, + 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x00, 0x5F, 0x74, 0x6F, 0x58, 0x4D, 0x4C, 0x00, 0x5F, + 0x61, 0x72, 0x72, 0x61, 0x79, 0x54, 0x6F, 0x58, 0x4D, 0x4C, 0x00, 0x3C, 0x61, 0x72, 0x72, 0x61, + 0x79, 0x3E, 0x00, 0x73, 0x00, 0x61, 0x72, 0x72, 0x61, 0x79, 0x00, 0x3C, 0x70, 0x72, 0x6F, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x20, 0x69, 0x64, 0x3D, 0x22, 0x00, 0x22, 0x3E, 0x00, 0x3C, 0x2F, 0x70, + 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3E, 0x00, 0x3C, 0x2F, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x3E, 0x00, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x3E, 0x00, 0x3C, 0x2F, + 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x3E, 0x00, 0x5F, 0x6F, 0x62, 0x6A, 0x65, + 0x63, 0x74, 0x54, 0x6F, 0x58, 0x4D, 0x4C, 0x00, 0x3C, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x3E, + 0x00, 0x6F, 0x62, 0x6A, 0x00, 0x3C, 0x2F, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x3E, 0x00, 0x73, + 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x3C, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3E, 0x00, 0x5F, + 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x58, 0x4D, 0x4C, 0x00, 0x3C, 0x2F, 0x73, 0x74, 0x72, 0x69, + 0x6E, 0x67, 0x3E, 0x00, 0x3C, 0x75, 0x6E, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x64, 0x2F, 0x3E, + 0x00, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x00, 0x3C, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x3E, + 0x00, 0x3C, 0x2F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x3E, 0x00, 0x3C, 0x6E, 0x75, 0x6C, 0x6C, + 0x2F, 0x3E, 0x00, 0x62, 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x00, 0x3C, 0x74, 0x72, 0x75, 0x65, + 0x2F, 0x3E, 0x00, 0x3C, 0x66, 0x61, 0x6C, 0x73, 0x65, 0x2F, 0x3E, 0x00, 0x68, 0x61, 0x73, 0x4F, + 0x77, 0x6E, 0x50, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x00, 0x5F, 0x6F, 0x62, 0x6A, 0x65, + 0x63, 0x74, 0x54, 0x6F, 0x41, 0x53, 0x00, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x79, 0x00, + 0x5F, 0x61, 0x72, 0x72, 0x61, 0x79, 0x54, 0x6F, 0x41, 0x53, 0x00, 0x4E, 0x75, 0x6D, 0x62, 0x65, + 0x72, 0x00, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x5F, 0x75, 0x6E, 0x65, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x58, 0x4D, 0x4C, 0x00, 0x63, 0x6C, 0x61, 0x73, 0x73, 0x00, 0x5F, 0x61, 0x72, 0x72, + 0x61, 0x79, 0x54, 0x6F, 0x4A, 0x53, 0x00, 0x5B, 0x00, 0x5F, 0x6C, 0x31, 0x00, 0x5D, 0x00, 0x5F, + 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x54, 0x6F, 0x4A, 0x53, 0x00, 0x28, 0x7B, 0x00, 0x6E, 0x65, + 0x65, 0x64, 0x73, 0x5F, 0x63, 0x6F, 0x6D, 0x6D, 0x61, 0x00, 0x3A, 0x00, 0x7D, 0x29, 0x00, 0x22, + 0x00, 0x5F, 0x6A, 0x73, 0x51, 0x75, 0x6F, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, + 0x38, 0x5F, 0x69, 0x6E, 0x69, 0x74, 0x4A, 0x53, 0x2C, 0x38, 0x5F, 0x6F, 0x62, 0x6A, 0x65, 0x63, + 0x74, 0x49, 0x44, 0x2C, 0x38, 0x5F, 0x61, 0x64, 0x64, 0x43, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, + 0x6B, 0x2C, 0x38, 0x5F, 0x65, 0x76, 0x61, 0x6C, 0x4A, 0x53, 0x2C, 0x38, 0x5F, 0x63, 0x61, 0x6C, + 0x6C, 0x4F, 0x75, 0x74, 0x2C, 0x38, 0x5F, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x58, 0x4D, 0x4C, + 0x2C, 0x38, 0x5F, 0x75, 0x6E, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x58, 0x4D, 0x4C, 0x2C, 0x38, + 0x5F, 0x6A, 0x73, 0x51, 0x75, 0x6F, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x00, 0x38, + 0x61, 0x76, 0x61, 0x69, 0x6C, 0x61, 0x62, 0x6C, 0x65, 0x00, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, + 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x64, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x41, 0x6C, 0x6C, + 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x2E, 0x64, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x41, 0x6C, + 0x6C, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x29, 0x00, 0x67, 0x65, 0x74, 0x44, 0x69, + 0x73, 0x6B, 0x55, 0x73, 0x61, 0x67, 0x65, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, + 0x74, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x2E, 0x67, + 0x65, 0x74, 0x44, 0x69, 0x73, 0x6B, 0x55, 0x73, 0x61, 0x67, 0x65, 0x20, 0x28, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x63, 0x29, 0x00, 0x67, 0x65, 0x74, 0x4C, 0x6F, 0x63, 0x61, 0x6C, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4F, 0x62, - 0x6A, 0x65, 0x63, 0x74, 0x2E, 0x67, 0x65, 0x74, 0x44, 0x69, 0x73, 0x6B, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x29, 0x00, 0x67, 0x65, 0x74, 0x4C, 0x6F, - 0x63, 0x61, 0x6C, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x53, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x2E, 0x67, 0x65, 0x74, 0x4C, 0x6F, - 0x63, 0x61, 0x6C, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x29, 0x00, 0x67, 0x65, 0x74, - 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, - 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x2E, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x29, - 0x00, 0x64, 0x65, 0x6C, 0x65, 0x74, 0x65, 0x41, 0x6C, 0x6C, 0x2C, 0x67, 0x65, 0x74, 0x44, 0x69, - 0x73, 0x6B, 0x55, 0x73, 0x61, 0x67, 0x65, 0x00, 0x36, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, - 0x2C, 0x36, 0x73, 0x65, 0x6E, 0x64, 0x2C, 0x36, 0x66, 0x6C, 0x75, 0x73, 0x68, 0x2C, 0x36, 0x63, - 0x6C, 0x6F, 0x73, 0x65, 0x2C, 0x36, 0x67, 0x65, 0x74, 0x53, 0x69, 0x7A, 0x65, 0x2C, 0x36, 0x73, - 0x65, 0x74, 0x46, 0x70, 0x73, 0x2C, 0x36, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x00, 0x73, 0x70, 0x6C, - 0x69, 0x74, 0x00, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x00, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, 0x4C, - 0x53, 0x4F, 0x55, 0x73, 0x61, 0x67, 0x65, 0x00, 0x67, 0x65, 0x74, 0x55, 0x52, 0x4C, 0x50, 0x61, - 0x67, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, - 0x65, 0x6E, 0x74, 0x20, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, 0x4C, 0x53, 0x4F, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x2E, 0x67, 0x65, 0x74, 0x55, 0x52, 0x4C, 0x50, 0x61, 0x67, 0x65, 0x53, 0x75, 0x70, - 0x70, 0x6F, 0x72, 0x74, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x29, 0x00, 0x42, 0x75, - 0x74, 0x74, 0x6F, 0x6E, 0x00, 0x67, 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x00, 0x38, 0x73, - 0x63, 0x61, 0x6C, 0x65, 0x39, 0x47, 0x72, 0x69, 0x64, 0x2C, 0x38, 0x66, 0x69, 0x6C, 0x74, 0x65, - 0x72, 0x73, 0x2C, 0x38, 0x63, 0x61, 0x63, 0x68, 0x65, 0x41, 0x73, 0x42, 0x69, 0x74, 0x6D, 0x61, - 0x70, 0x2C, 0x38, 0x62, 0x6C, 0x65, 0x6E, 0x64, 0x4D, 0x6F, 0x64, 0x65, 0x00, 0x66, 0x69, 0x6C, - 0x74, 0x65, 0x72, 0x73, 0x00, 0x42, 0x69, 0x74, 0x6D, 0x61, 0x70, 0x46, 0x69, 0x6C, 0x74, 0x65, - 0x72, 0x00, 0x38, 0x63, 0x6C, 0x6F, 0x6E, 0x65, 0x00, 0x42, 0x65, 0x76, 0x65, 0x6C, 0x46, 0x69, - 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x2C, 0x38, - 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x2C, 0x38, 0x68, 0x69, 0x67, 0x68, 0x6C, 0x69, 0x67, 0x68, 0x74, - 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x38, 0x68, 0x69, 0x67, 0x68, 0x6C, 0x69, 0x67, 0x68, 0x74, - 0x41, 0x6C, 0x70, 0x68, 0x61, 0x2C, 0x38, 0x73, 0x68, 0x61, 0x64, 0x6F, 0x77, 0x43, 0x6F, 0x6C, - 0x6F, 0x72, 0x2C, 0x38, 0x73, 0x68, 0x61, 0x64, 0x6F, 0x77, 0x41, 0x6C, 0x70, 0x68, 0x61, 0x2C, - 0x38, 0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x2C, 0x38, 0x73, 0x74, 0x72, 0x65, 0x6E, 0x67, - 0x74, 0x68, 0x2C, 0x38, 0x6B, 0x6E, 0x6F, 0x63, 0x6B, 0x6F, 0x75, 0x74, 0x2C, 0x38, 0x62, 0x6C, - 0x75, 0x72, 0x58, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x59, 0x2C, 0x38, 0x74, 0x79, 0x70, 0x65, - 0x00, 0x42, 0x6C, 0x75, 0x72, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x62, 0x6C, 0x75, - 0x72, 0x58, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x59, 0x2C, 0x38, 0x71, 0x75, 0x61, 0x6C, 0x69, - 0x74, 0x79, 0x00, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x46, 0x69, - 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x6D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x00, 0x43, 0x6F, 0x6E, - 0x76, 0x6F, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, - 0x6D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x58, 0x2C, 0x38, 0x6D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, - 0x2C, 0x38, 0x6D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2C, 0x38, 0x64, 0x69, 0x76, 0x69, 0x73, 0x6F, - 0x72, 0x2C, 0x38, 0x62, 0x69, 0x61, 0x73, 0x2C, 0x38, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x41, 0x6C, 0x70, 0x68, 0x61, 0x2C, 0x38, 0x63, 0x6C, 0x61, 0x6D, 0x70, 0x2C, 0x38, 0x63, - 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x00, 0x44, 0x69, 0x73, 0x70, - 0x6C, 0x61, 0x63, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x4D, 0x61, 0x70, 0x46, 0x69, 0x6C, 0x74, 0x65, - 0x72, 0x00, 0x38, 0x6D, 0x61, 0x70, 0x42, 0x69, 0x74, 0x6D, 0x61, 0x70, 0x2C, 0x38, 0x6D, 0x61, - 0x70, 0x50, 0x6F, 0x69, 0x6E, 0x74, 0x2C, 0x38, 0x63, 0x6F, 0x6D, 0x70, 0x6F, 0x6E, 0x65, 0x6E, - 0x74, 0x58, 0x2C, 0x38, 0x63, 0x6F, 0x6D, 0x70, 0x6F, 0x6E, 0x65, 0x6E, 0x74, 0x59, 0x2C, 0x38, - 0x73, 0x63, 0x61, 0x6C, 0x65, 0x58, 0x2C, 0x38, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x59, 0x2C, 0x38, - 0x6D, 0x6F, 0x64, 0x65, 0x2C, 0x38, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x38, 0x61, 0x6C, 0x70, - 0x68, 0x61, 0x00, 0x44, 0x72, 0x6F, 0x70, 0x53, 0x68, 0x61, 0x64, 0x6F, 0x77, 0x46, 0x69, 0x6C, - 0x74, 0x65, 0x72, 0x00, 0x38, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x2C, 0x38, 0x61, - 0x6E, 0x67, 0x6C, 0x65, 0x2C, 0x38, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x38, 0x61, 0x6C, 0x70, - 0x68, 0x61, 0x2C, 0x38, 0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x2C, 0x38, 0x69, 0x6E, 0x6E, - 0x65, 0x72, 0x2C, 0x38, 0x6B, 0x6E, 0x6F, 0x63, 0x6B, 0x6F, 0x75, 0x74, 0x2C, 0x38, 0x62, 0x6C, - 0x75, 0x72, 0x58, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x59, 0x2C, 0x38, 0x73, 0x74, 0x72, 0x65, - 0x6E, 0x67, 0x74, 0x68, 0x2C, 0x38, 0x68, 0x69, 0x64, 0x65, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, - 0x00, 0x47, 0x6C, 0x6F, 0x77, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x63, 0x6F, 0x6C, - 0x6F, 0x72, 0x2C, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x2C, 0x38, 0x71, 0x75, 0x61, 0x6C, 0x69, - 0x74, 0x79, 0x2C, 0x38, 0x69, 0x6E, 0x6E, 0x65, 0x72, 0x2C, 0x38, 0x6B, 0x6E, 0x6F, 0x63, 0x6B, - 0x6F, 0x75, 0x74, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x58, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, - 0x59, 0x2C, 0x38, 0x73, 0x74, 0x72, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x00, 0x47, 0x72, 0x61, 0x64, - 0x69, 0x65, 0x6E, 0x74, 0x42, 0x65, 0x76, 0x65, 0x6C, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, - 0x38, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x2C, 0x38, 0x61, 0x6E, 0x67, 0x6C, 0x65, - 0x2C, 0x38, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x73, 0x2C, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x73, - 0x2C, 0x38, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x73, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x58, 0x2C, - 0x38, 0x62, 0x6C, 0x75, 0x72, 0x59, 0x2C, 0x38, 0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x2C, - 0x38, 0x73, 0x74, 0x72, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x2C, 0x38, 0x6B, 0x6E, 0x6F, 0x63, 0x6B, - 0x6F, 0x75, 0x74, 0x2C, 0x38, 0x74, 0x79, 0x70, 0x65, 0x00, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, - 0x6E, 0x74, 0x47, 0x6C, 0x6F, 0x77, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x73, 0x65, 0x74, - 0x49, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x00, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x49, 0x6E, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, 0x00, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x6F, 0x75, - 0x74, 0x00, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x54, 0x69, 0x6D, 0x65, 0x6F, 0x75, 0x74, 0x00, 0x73, - 0x68, 0x6F, 0x77, 0x52, 0x65, 0x64, 0x72, 0x61, 0x77, 0x52, 0x65, 0x67, 0x69, 0x6F, 0x6E, 0x73, - 0x00, 0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x00, 0x8E, 0x12, 0x00, 0x45, 0x72, 0x72, 0x6F, 0x72, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x73, 0x67, 0x00, 0x23, 0x00, 0x96, 0x02, 0x00, - 0x08, 0x08, 0x1C, 0x44, 0x96, 0x02, 0x00, 0x08, 0x09, 0x49, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x0F, - 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x0B, 0x08, 0x08, 0x1C, 0x4F, - 0x8E, 0x15, 0x00, 0x41, 0x73, 0x42, 0x72, 0x6F, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x65, 0x72, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x10, 0x00, 0x4C, 0x6F, 0x61, 0x64, 0x56, - 0x61, 0x72, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x43, 0x61, - 0x6D, 0x65, 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x1D, 0x00, 0x43, - 0x6F, 0x6E, 0x74, 0x65, 0x78, 0x74, 0x4D, 0x65, 0x6E, 0x75, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x63, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x00, 0x56, 0x00, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xF4, 0x08, 0xF5, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x09, 0x00, 0x08, 0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF7, 0x40, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x28, 0x00, 0x08, 0xF8, 0x08, 0xF9, 0x05, 0x01, 0x08, 0xFA, - 0x05, 0x01, 0x08, 0xFB, 0x05, 0x01, 0x08, 0xFC, 0x05, 0x01, 0x08, 0xFD, 0x05, 0x01, 0x08, 0xFE, - 0x05, 0x01, 0x08, 0xFF, 0x05, 0x01, 0x09, 0x00, 0x01, 0x05, 0x01, 0x07, 0x08, 0x00, 0x00, 0x00, - 0x43, 0x4F, 0x8E, 0x4D, 0x00, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x78, 0x74, 0x4D, 0x65, 0x6E, 0x75, - 0x49, 0x74, 0x65, 0x6D, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x61, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x00, 0x00, 0x63, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x00, 0x00, 0x73, 0x65, - 0x70, 0x61, 0x72, 0x61, 0x74, 0x6F, 0x72, 0x42, 0x65, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x00, 0x65, - 0x6E, 0x61, 0x62, 0x6C, 0x65, 0x64, 0x00, 0x00, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x00, - 0xBE, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x04, 0x01, 0x09, 0x04, - 0x01, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xF4, 0x08, 0xF5, - 0x1C, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x05, 0x01, 0x1C, 0x96, 0x01, 0x00, 0x03, 0x49, 0x9D, 0x02, - 0x00, 0x16, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x05, 0x01, 0x09, - 0x05, 0x01, 0x1C, 0x4F, 0x99, 0x02, 0x00, 0x0F, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, - 0x05, 0x00, 0x09, 0x05, 0x01, 0x05, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x98, 0x1C, 0x96, 0x01, - 0x00, 0x03, 0x49, 0x9D, 0x02, 0x00, 0x14, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, - 0x00, 0x08, 0x98, 0x08, 0x98, 0x1C, 0x4F, 0x99, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x98, 0x05, 0x01, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x06, 0x01, - 0x1C, 0x96, 0x01, 0x00, 0x03, 0x49, 0x9D, 0x02, 0x00, 0x16, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x06, 0x00, 0x09, 0x06, 0x01, 0x09, 0x06, 0x01, 0x1C, 0x4F, 0x99, 0x02, 0x00, 0x0F, - 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, 0x00, 0x09, 0x06, 0x01, 0x05, 0x01, 0x4F, - 0x8E, 0x17, 0x00, 0x4C, 0x6F, 0x63, 0x61, 0x6C, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, - 0x6F, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x4D, 0x69, 0x63, - 0x72, 0x6F, 0x70, 0x68, 0x6F, 0x6E, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, - 0x11, 0x00, 0x58, 0x4D, 0x4C, 0x53, 0x6F, 0x63, 0x6B, 0x65, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x8E, 0x14, 0x00, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4F, 0x62, 0x6A, 0x65, - 0x63, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x1B, 0x00, 0x41, 0x73, 0x53, - 0x65, 0x74, 0x75, 0x70, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x6E, 0x61, 0x6D, 0x65, 0x73, 0x00, 0x5F, 0x00, 0x96, 0x0D, 0x00, 0x09, 0xE6, 0x01, 0x09, 0x92, - 0x01, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xC7, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xE5, 0x01, 0x52, - 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, 0x4C, 0x1C, 0x50, 0x1D, - 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xE6, 0x01, 0x1C, 0x48, 0x12, 0x9D, - 0x02, 0x00, 0x13, 0x00, 0x96, 0x09, 0x00, 0x08, 0xC6, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0C, - 0x40, 0x3C, 0x99, 0x02, 0x00, 0xD0, 0xFF, 0x8E, 0x16, 0x00, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, - 0x4C, 0x53, 0x4F, 0x55, 0x73, 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x96, 0x13, 0x00, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x13, 0x00, 0x08, 0x02, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, - 0x96, 0x13, 0x00, 0x08, 0x03, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x07, 0x00, 0x08, 0x04, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x43, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x05, 0x1C, 0x96, 0x13, 0x00, 0x08, 0x06, 0x07, - 0x08, 0x00, 0x00, 0x00, 0x07, 0x65, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x3D, 0x4F, 0x96, 0x08, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, 0x05, 0x1C, 0x96, 0x07, - 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x80, 0x00, - 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x08, 0x05, 0x1C, 0x96, 0x07, 0x00, 0x07, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x0C, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0x0E, 0x08, 0x0C, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0x0B, 0x08, 0x0C, 0x87, 0x01, 0x00, 0x00, 0x4F, 0x96, 0x02, - 0x00, 0x04, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x0F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, - 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0B, 0x4E, 0x3E, 0x4F, 0x96, 0x02, - 0x00, 0x08, 0x10, 0x1C, 0x96, 0x13, 0x00, 0x08, 0x11, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x65, - 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x12, 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x78, 0x00, 0x3C, 0x00, 0x96, 0x02, 0x00, 0x08, 0x13, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, - 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x14, 0x52, 0x17, 0x96, 0x02, 0x00, - 0x08, 0x13, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x15, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x16, 0x52, 0x17, 0x96, 0x02, 0x00, 0x05, 0x01, - 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x14, 0x8E, 0x0B, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x8F, 0x00, 0x96, 0x04, 0x00, 0x08, 0x17, - 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x15, 0x4E, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x18, 0x41, - 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, - 0x96, 0x02, 0x00, 0x08, 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x17, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, - 0x42, 0x00, 0x96, 0x02, 0x00, 0x08, 0x17, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x13, 0x1C, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x23, 0x00, 0x96, 0x07, 0x00, 0x07, - 0x01, 0x00, 0x00, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, - 0x17, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1A, 0x52, 0x17, 0x96, 0x02, 0x00, 0x05, 0x01, 0x3E, 0x99, - 0x02, 0x00, 0x9C, 0xFF, 0x96, 0x02, 0x00, 0x05, 0x00, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x10, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x6F, 0x00, 0x73, 0x00, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x13, 0x00, 0x08, 0x11, 0x07, - 0x0C, 0x00, 0x00, 0x00, 0x07, 0x65, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, - 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x12, 0x08, 0x10, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x12, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, - 0x08, 0x14, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x14, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0x1C, 0x1C, 0x96, 0x07, 0x00, 0x08, 0x15, 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x96, 0x09, - 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x08, 0x1D, 0x08, 0x1C, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x4F, 0x96, 0x8C, 0x00, 0x08, 0x1E, 0x08, 0x1F, 0x07, - 0x12, 0x00, 0x00, 0x00, 0x08, 0x20, 0x07, 0x08, 0x00, 0x00, 0x00, 0x08, 0x21, 0x07, 0x14, 0x00, - 0x00, 0x00, 0x08, 0x22, 0x07, 0x11, 0x00, 0x00, 0x00, 0x08, 0x23, 0x07, 0x2E, 0x00, 0x00, 0x00, - 0x08, 0x24, 0x07, 0x28, 0x00, 0x00, 0x00, 0x08, 0x25, 0x07, 0x23, 0x00, 0x00, 0x00, 0x08, 0x26, - 0x07, 0x0D, 0x00, 0x00, 0x00, 0x08, 0x27, 0x07, 0x1B, 0x00, 0x00, 0x00, 0x08, 0x28, 0x07, 0x24, - 0x00, 0x00, 0x00, 0x08, 0x29, 0x07, 0x2D, 0x00, 0x00, 0x00, 0x08, 0x2A, 0x07, 0x25, 0x00, 0x00, - 0x00, 0x08, 0x2B, 0x07, 0x22, 0x00, 0x00, 0x00, 0x08, 0x2C, 0x07, 0x21, 0x00, 0x00, 0x00, 0x08, - 0x2D, 0x07, 0x27, 0x00, 0x00, 0x00, 0x08, 0x2E, 0x07, 0x10, 0x00, 0x00, 0x00, 0x08, 0x2F, 0x07, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x30, 0x07, 0x09, 0x00, 0x00, 0x00, 0x08, 0x31, 0x07, 0x26, 0x00, - 0x00, 0x00, 0x07, 0x13, 0x00, 0x00, 0x00, 0x43, 0x1D, 0x96, 0x09, 0x00, 0x08, 0x32, 0x07, 0x20, - 0x03, 0x00, 0x00, 0x08, 0x1E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, - 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x1E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x08, 0x00, 0x07, 0x07, 0x00, - 0x00, 0x00, 0x02, 0x08, 0x1E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, - 0x3D, 0x17, 0x96, 0x07, 0x00, 0x08, 0x33, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x1D, 0x96, 0x02, - 0x00, 0x08, 0x33, 0x1C, 0x96, 0x13, 0x00, 0x08, 0x34, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x05, - 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0x33, 0x1C, 0x96, 0x13, 0x00, 0x08, 0x35, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, - 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x33, 0x1C, - 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, - 0x52, 0x17, 0x96, 0x08, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, 0x33, 0x1C, 0x96, 0x07, - 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x07, 0x00, 0x08, 0x36, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x36, 0x1C, 0x96, 0x07, 0x00, 0x07, - 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x0E, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x37, 0x07, 0x9A, 0x02, 0x00, 0x00, 0x08, 0x36, 0x1C, - 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, - 0x38, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x34, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, - 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x09, 0x00, 0x08, 0x3A, 0x07, 0x34, 0x08, 0x00, 0x00, 0x08, 0x38, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, - 0x02, 0x3D, 0x17, 0x96, 0x12, 0x00, 0x02, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, 0x34, 0x08, 0x00, - 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x96, 0x09, 0x00, 0x08, 0x3B, 0x07, 0x03, + 0x6A, 0x65, 0x63, 0x74, 0x2E, 0x67, 0x65, 0x74, 0x4C, 0x6F, 0x63, 0x61, 0x6C, 0x20, 0x28, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x29, 0x00, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, + 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x53, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x2E, 0x67, 0x65, 0x74, 0x52, 0x65, 0x6D, 0x6F, 0x74, + 0x65, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x29, 0x00, 0x64, 0x65, 0x6C, 0x65, 0x74, + 0x65, 0x41, 0x6C, 0x6C, 0x2C, 0x67, 0x65, 0x74, 0x44, 0x69, 0x73, 0x6B, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x00, 0x36, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x2C, 0x36, 0x73, 0x65, 0x6E, 0x64, + 0x2C, 0x36, 0x66, 0x6C, 0x75, 0x73, 0x68, 0x2C, 0x36, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x2C, 0x36, + 0x67, 0x65, 0x74, 0x53, 0x69, 0x7A, 0x65, 0x2C, 0x36, 0x73, 0x65, 0x74, 0x46, 0x70, 0x73, 0x2C, + 0x36, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x00, 0x73, 0x70, 0x6C, 0x69, 0x74, 0x00, 0x63, 0x6F, 0x75, + 0x6E, 0x74, 0x00, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, 0x4C, 0x53, 0x4F, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x00, 0x67, 0x65, 0x74, 0x55, 0x52, 0x4C, 0x50, 0x61, 0x67, 0x65, 0x53, 0x75, 0x70, 0x70, + 0x6F, 0x72, 0x74, 0x00, 0x49, 0x6D, 0x70, 0x6C, 0x65, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x52, 0x65, + 0x6D, 0x6F, 0x74, 0x65, 0x4C, 0x53, 0x4F, 0x55, 0x73, 0x61, 0x67, 0x65, 0x2E, 0x67, 0x65, 0x74, + 0x55, 0x52, 0x4C, 0x50, 0x61, 0x67, 0x65, 0x53, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x20, 0x28, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x29, 0x00, 0x42, 0x75, 0x74, 0x74, 0x6F, 0x6E, 0x00, 0x67, + 0x65, 0x74, 0x44, 0x65, 0x70, 0x74, 0x68, 0x00, 0x38, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x39, 0x47, + 0x72, 0x69, 0x64, 0x2C, 0x38, 0x66, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x73, 0x2C, 0x38, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x41, 0x73, 0x42, 0x69, 0x74, 0x6D, 0x61, 0x70, 0x2C, 0x38, 0x62, 0x6C, 0x65, + 0x6E, 0x64, 0x4D, 0x6F, 0x64, 0x65, 0x00, 0x66, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x73, 0x00, 0x42, + 0x69, 0x74, 0x6D, 0x61, 0x70, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x63, 0x6C, 0x6F, + 0x6E, 0x65, 0x00, 0x42, 0x65, 0x76, 0x65, 0x6C, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, + 0x64, 0x69, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x2C, 0x38, 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x2C, + 0x38, 0x68, 0x69, 0x67, 0x68, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, + 0x38, 0x68, 0x69, 0x67, 0x68, 0x6C, 0x69, 0x67, 0x68, 0x74, 0x41, 0x6C, 0x70, 0x68, 0x61, 0x2C, + 0x38, 0x73, 0x68, 0x61, 0x64, 0x6F, 0x77, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x38, 0x73, 0x68, + 0x61, 0x64, 0x6F, 0x77, 0x41, 0x6C, 0x70, 0x68, 0x61, 0x2C, 0x38, 0x71, 0x75, 0x61, 0x6C, 0x69, + 0x74, 0x79, 0x2C, 0x38, 0x73, 0x74, 0x72, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x2C, 0x38, 0x6B, 0x6E, + 0x6F, 0x63, 0x6B, 0x6F, 0x75, 0x74, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x58, 0x2C, 0x38, 0x62, + 0x6C, 0x75, 0x72, 0x59, 0x2C, 0x38, 0x74, 0x79, 0x70, 0x65, 0x00, 0x42, 0x6C, 0x75, 0x72, 0x46, + 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x58, 0x2C, 0x38, 0x62, 0x6C, + 0x75, 0x72, 0x59, 0x2C, 0x38, 0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x00, 0x43, 0x6F, 0x6C, + 0x6F, 0x72, 0x4D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, + 0x6D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x00, 0x43, 0x6F, 0x6E, 0x76, 0x6F, 0x6C, 0x75, 0x74, 0x69, + 0x6F, 0x6E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x6D, 0x61, 0x74, 0x72, 0x69, 0x78, + 0x58, 0x2C, 0x38, 0x6D, 0x61, 0x74, 0x72, 0x69, 0x78, 0x59, 0x2C, 0x38, 0x6D, 0x61, 0x74, 0x72, + 0x69, 0x78, 0x2C, 0x38, 0x64, 0x69, 0x76, 0x69, 0x73, 0x6F, 0x72, 0x2C, 0x38, 0x62, 0x69, 0x61, + 0x73, 0x2C, 0x38, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x41, 0x6C, 0x70, 0x68, 0x61, + 0x2C, 0x38, 0x63, 0x6C, 0x61, 0x6D, 0x70, 0x2C, 0x38, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x38, + 0x61, 0x6C, 0x70, 0x68, 0x61, 0x00, 0x44, 0x69, 0x73, 0x70, 0x6C, 0x61, 0x63, 0x65, 0x6D, 0x65, + 0x6E, 0x74, 0x4D, 0x61, 0x70, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x6D, 0x61, 0x70, + 0x42, 0x69, 0x74, 0x6D, 0x61, 0x70, 0x2C, 0x38, 0x6D, 0x61, 0x70, 0x50, 0x6F, 0x69, 0x6E, 0x74, + 0x2C, 0x38, 0x63, 0x6F, 0x6D, 0x70, 0x6F, 0x6E, 0x65, 0x6E, 0x74, 0x58, 0x2C, 0x38, 0x63, 0x6F, + 0x6D, 0x70, 0x6F, 0x6E, 0x65, 0x6E, 0x74, 0x59, 0x2C, 0x38, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x58, + 0x2C, 0x38, 0x73, 0x63, 0x61, 0x6C, 0x65, 0x59, 0x2C, 0x38, 0x6D, 0x6F, 0x64, 0x65, 0x2C, 0x38, + 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x00, 0x44, 0x72, 0x6F, + 0x70, 0x53, 0x68, 0x61, 0x64, 0x6F, 0x77, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x64, + 0x69, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x2C, 0x38, 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x2C, 0x38, + 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x2C, 0x38, 0x71, 0x75, + 0x61, 0x6C, 0x69, 0x74, 0x79, 0x2C, 0x38, 0x69, 0x6E, 0x6E, 0x65, 0x72, 0x2C, 0x38, 0x6B, 0x6E, + 0x6F, 0x63, 0x6B, 0x6F, 0x75, 0x74, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x58, 0x2C, 0x38, 0x62, + 0x6C, 0x75, 0x72, 0x59, 0x2C, 0x38, 0x73, 0x74, 0x72, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x2C, 0x38, + 0x68, 0x69, 0x64, 0x65, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x47, 0x6C, 0x6F, 0x77, 0x46, + 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x63, 0x6F, 0x6C, 0x6F, 0x72, 0x2C, 0x38, 0x61, 0x6C, + 0x70, 0x68, 0x61, 0x2C, 0x38, 0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x2C, 0x38, 0x69, 0x6E, + 0x6E, 0x65, 0x72, 0x2C, 0x38, 0x6B, 0x6E, 0x6F, 0x63, 0x6B, 0x6F, 0x75, 0x74, 0x2C, 0x38, 0x62, + 0x6C, 0x75, 0x72, 0x58, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x59, 0x2C, 0x38, 0x73, 0x74, 0x72, + 0x65, 0x6E, 0x67, 0x74, 0x68, 0x00, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6E, 0x74, 0x42, 0x65, + 0x76, 0x65, 0x6C, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x38, 0x64, 0x69, 0x73, 0x74, 0x61, + 0x6E, 0x63, 0x65, 0x2C, 0x38, 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x2C, 0x38, 0x63, 0x6F, 0x6C, 0x6F, + 0x72, 0x73, 0x2C, 0x38, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x73, 0x2C, 0x38, 0x72, 0x61, 0x74, 0x69, + 0x6F, 0x73, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x58, 0x2C, 0x38, 0x62, 0x6C, 0x75, 0x72, 0x59, + 0x2C, 0x38, 0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x2C, 0x38, 0x73, 0x74, 0x72, 0x65, 0x6E, + 0x67, 0x74, 0x68, 0x2C, 0x38, 0x6B, 0x6E, 0x6F, 0x63, 0x6B, 0x6F, 0x75, 0x74, 0x2C, 0x38, 0x74, + 0x79, 0x70, 0x65, 0x00, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6E, 0x74, 0x47, 0x6C, 0x6F, 0x77, + 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x00, 0x73, 0x65, 0x74, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6C, 0x00, 0x63, 0x6C, 0x65, 0x61, 0x72, 0x49, 0x6E, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6C, + 0x00, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6D, 0x65, 0x6F, 0x75, 0x74, 0x00, 0x63, 0x6C, 0x65, 0x61, + 0x72, 0x54, 0x69, 0x6D, 0x65, 0x6F, 0x75, 0x74, 0x00, 0x73, 0x68, 0x6F, 0x77, 0x52, 0x65, 0x64, + 0x72, 0x61, 0x77, 0x52, 0x65, 0x67, 0x69, 0x6F, 0x6E, 0x73, 0x00, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x00, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6E, + 0x74, 0x00, 0x8E, 0x12, 0x00, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6D, 0x73, 0x67, 0x00, 0x23, 0x00, 0x96, 0x02, 0x00, 0x08, 0x08, 0x1C, 0x44, 0x96, 0x02, + 0x00, 0x08, 0x09, 0x49, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x0F, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x04, 0x00, 0x08, 0x0B, 0x08, 0x08, 0x1C, 0x4F, 0x8E, 0x15, 0x00, 0x41, 0x73, 0x42, + 0x72, 0x6F, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8E, 0x10, 0x00, 0x4C, 0x6F, 0x61, 0x64, 0x56, 0x61, 0x72, 0x73, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x0E, 0x00, 0x43, 0x61, 0x6D, 0x65, 0x72, 0x61, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x1D, 0x00, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x78, 0x74, + 0x4D, 0x65, 0x6E, 0x75, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x61, 0x6C, 0x6C, 0x62, + 0x61, 0x63, 0x6B, 0x00, 0x58, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, + 0xF6, 0x08, 0xF7, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x09, 0x00, 0x08, 0xF8, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF9, 0x40, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, + 0x2A, 0x00, 0x08, 0xFA, 0x08, 0xFB, 0x05, 0x01, 0x08, 0xFC, 0x05, 0x01, 0x08, 0xFD, 0x05, 0x01, + 0x08, 0xFE, 0x05, 0x01, 0x08, 0xFF, 0x05, 0x01, 0x09, 0x00, 0x01, 0x05, 0x01, 0x09, 0x01, 0x01, + 0x05, 0x01, 0x09, 0x02, 0x01, 0x05, 0x01, 0x07, 0x08, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x8E, 0x4D, + 0x00, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x78, 0x74, 0x4D, 0x65, 0x6E, 0x75, 0x49, 0x74, 0x65, 0x6D, + 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x61, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x00, + 0x63, 0x61, 0x6C, 0x6C, 0x62, 0x61, 0x63, 0x6B, 0x00, 0x00, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, + 0x74, 0x6F, 0x72, 0x42, 0x65, 0x66, 0x6F, 0x72, 0x65, 0x00, 0x00, 0x65, 0x6E, 0x61, 0x62, 0x6C, + 0x65, 0x64, 0x00, 0x00, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x00, 0xBE, 0x00, 0x96, 0x02, + 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x06, 0x01, 0x09, 0x06, 0x01, 0x1C, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xF6, 0x08, 0xF7, 0x1C, 0x4F, 0x96, 0x03, + 0x00, 0x09, 0x07, 0x01, 0x1C, 0x96, 0x01, 0x00, 0x03, 0x49, 0x9D, 0x02, 0x00, 0x16, 0x00, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x07, 0x01, 0x09, 0x07, 0x01, 0x1C, 0x4F, + 0x99, 0x02, 0x00, 0x0F, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, 0x00, 0x09, 0x07, + 0x01, 0x05, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x98, 0x1C, 0x96, 0x01, 0x00, 0x03, 0x49, 0x9D, + 0x02, 0x00, 0x14, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x98, 0x08, + 0x98, 0x1C, 0x4F, 0x99, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, + 0x00, 0x08, 0x98, 0x05, 0x01, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x08, 0x01, 0x1C, 0x96, 0x01, 0x00, + 0x03, 0x49, 0x9D, 0x02, 0x00, 0x16, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, + 0x09, 0x08, 0x01, 0x09, 0x08, 0x01, 0x1C, 0x4F, 0x99, 0x02, 0x00, 0x0F, 0x00, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x05, 0x00, 0x09, 0x08, 0x01, 0x05, 0x01, 0x4F, 0x8E, 0x17, 0x00, 0x4C, + 0x6F, 0x63, 0x61, 0x6C, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x12, 0x00, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x70, 0x68, + 0x6F, 0x6E, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x11, 0x00, 0x58, 0x4D, + 0x4C, 0x53, 0x6F, 0x63, 0x6B, 0x65, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, + 0x14, 0x00, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x1B, 0x00, 0x41, 0x73, 0x53, 0x65, 0x74, 0x75, 0x70, + 0x45, 0x72, 0x72, 0x6F, 0x72, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x61, 0x6D, 0x65, + 0x73, 0x00, 0x5F, 0x00, 0x96, 0x0D, 0x00, 0x09, 0xE8, 0x01, 0x09, 0x94, 0x01, 0x07, 0x01, 0x00, + 0x00, 0x00, 0x08, 0xC7, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xE7, 0x01, 0x52, 0x96, 0x02, 0x00, 0x08, + 0x19, 0x4E, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, + 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, + 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xE8, 0x01, 0x1C, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x13, 0x00, + 0x96, 0x09, 0x00, 0x08, 0xC6, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0C, 0x40, 0x3C, 0x99, 0x02, + 0x00, 0xD0, 0xFF, 0x8E, 0x16, 0x00, 0x52, 0x65, 0x6D, 0x6F, 0x74, 0x65, 0x4C, 0x53, 0x4F, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x13, 0x00, 0x08, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, + 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x13, 0x00, 0x08, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x04, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x13, 0x00, 0x08, + 0x03, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, + 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x07, 0x00, 0x08, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x1D, + 0x96, 0x02, 0x00, 0x08, 0x05, 0x1C, 0x96, 0x13, 0x00, 0x08, 0x06, 0x07, 0x08, 0x00, 0x00, 0x00, + 0x07, 0x65, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x08, + 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, 0x05, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x07, 0x08, 0x05, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x0C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x96, 0x04, 0x00, 0x08, 0x0E, 0x08, 0x0C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, + 0x00, 0x08, 0x0B, 0x08, 0x0C, 0x87, 0x01, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x04, 0x00, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x0C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x96, 0x02, 0x00, 0x08, + 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0B, 0x4E, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x10, 0x1C, + 0x96, 0x13, 0x00, 0x08, 0x11, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x65, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x12, 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x3C, + 0x00, 0x96, 0x02, 0x00, 0x08, 0x13, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, + 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x14, 0x52, 0x17, 0x96, 0x02, 0x00, 0x08, 0x13, 0x1C, 0x96, + 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x15, 0x4E, + 0x96, 0x02, 0x00, 0x08, 0x16, 0x52, 0x17, 0x96, 0x02, 0x00, 0x05, 0x01, 0x3E, 0x4F, 0x96, 0x02, + 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x14, 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x8F, 0x00, 0x96, 0x04, 0x00, 0x08, 0x17, 0x08, 0x0A, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0x15, 0x4E, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x18, 0x41, 0x96, 0x07, 0x00, 0x08, + 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, + 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x17, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x42, 0x00, 0x96, 0x02, + 0x00, 0x08, 0x17, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x13, + 0x1C, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x23, 0x00, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, + 0x08, 0x18, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x17, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x1A, 0x52, 0x17, 0x96, 0x02, 0x00, 0x05, 0x01, 0x3E, 0x99, 0x02, 0x00, 0x9C, 0xFF, + 0x96, 0x02, 0x00, 0x05, 0x00, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x1B, 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x73, 0x00, + 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x13, 0x00, 0x08, 0x11, 0x07, 0x0C, 0x00, 0x00, 0x00, + 0x07, 0x65, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, + 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x12, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x12, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x14, 0x08, 0x10, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x14, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x07, + 0x00, 0x08, 0x15, 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x96, 0x09, 0x00, 0x07, 0x83, 0x00, + 0x00, 0x00, 0x08, 0x1D, 0x08, 0x1C, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x3D, 0x17, 0x4F, 0x96, 0x8C, 0x00, 0x08, 0x1E, 0x08, 0x1F, 0x07, 0x12, 0x00, 0x00, 0x00, + 0x08, 0x20, 0x07, 0x08, 0x00, 0x00, 0x00, 0x08, 0x21, 0x07, 0x14, 0x00, 0x00, 0x00, 0x08, 0x22, + 0x07, 0x11, 0x00, 0x00, 0x00, 0x08, 0x23, 0x07, 0x2E, 0x00, 0x00, 0x00, 0x08, 0x24, 0x07, 0x28, + 0x00, 0x00, 0x00, 0x08, 0x25, 0x07, 0x23, 0x00, 0x00, 0x00, 0x08, 0x26, 0x07, 0x0D, 0x00, 0x00, + 0x00, 0x08, 0x27, 0x07, 0x1B, 0x00, 0x00, 0x00, 0x08, 0x28, 0x07, 0x24, 0x00, 0x00, 0x00, 0x08, + 0x29, 0x07, 0x2D, 0x00, 0x00, 0x00, 0x08, 0x2A, 0x07, 0x25, 0x00, 0x00, 0x00, 0x08, 0x2B, 0x07, + 0x22, 0x00, 0x00, 0x00, 0x08, 0x2C, 0x07, 0x21, 0x00, 0x00, 0x00, 0x08, 0x2D, 0x07, 0x27, 0x00, + 0x00, 0x00, 0x08, 0x2E, 0x07, 0x10, 0x00, 0x00, 0x00, 0x08, 0x2F, 0x07, 0x20, 0x00, 0x00, 0x00, + 0x08, 0x30, 0x07, 0x09, 0x00, 0x00, 0x00, 0x08, 0x31, 0x07, 0x26, 0x00, 0x00, 0x00, 0x07, 0x13, + 0x00, 0x00, 0x00, 0x43, 0x1D, 0x96, 0x09, 0x00, 0x08, 0x32, 0x07, 0x20, 0x03, 0x00, 0x00, 0x08, + 0x1E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x02, + 0x00, 0x08, 0x1E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x08, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, + 0x1E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x07, + 0x00, 0x08, 0x33, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x33, 0x1C, + 0x96, 0x13, 0x00, 0x08, 0x34, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x33, 0x1C, 0x96, 0x13, + 0x00, 0x08, 0x35, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, + 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x33, 0x1C, 0x96, 0x07, 0x00, 0x07, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x08, + 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, 0x33, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x07, 0x00, 0x08, 0x36, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x36, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, + 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x01, 0x00, + 0x00, 0x00, 0x08, 0x37, 0x07, 0x9A, 0x02, 0x00, 0x00, 0x08, 0x36, 0x1C, 0x96, 0x07, 0x00, 0x07, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, 0x38, 0x07, 0xC8, 0x00, + 0x00, 0x00, 0x07, 0x34, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, + 0x96, 0x09, 0x00, 0x08, 0x3A, 0x07, 0x34, 0x08, 0x00, 0x00, 0x08, 0x38, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, + 0x12, 0x00, 0x02, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, 0x34, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, + 0x00, 0x00, 0x08, 0x01, 0x3D, 0x96, 0x09, 0x00, 0x08, 0x3B, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x38, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x96, + 0x02, 0x00, 0x08, 0x38, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0x3C, + 0x08, 0x3D, 0x4F, 0x96, 0x12, 0x00, 0x02, 0x07, 0x05, 0x00, 0x00, 0x00, 0x07, 0x34, 0x08, 0x00, + 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x96, 0x09, 0x00, 0x08, 0x3E, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x38, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x07, 0x52, 0x17, 0x96, 0x02, 0x00, 0x08, 0x38, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x04, 0x00, 0x08, 0x3C, 0x08, 0x3D, 0x4F, 0x96, 0x12, 0x00, 0x02, 0x07, 0x05, 0x00, 0x00, 0x00, - 0x07, 0x34, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x96, 0x09, 0x00, - 0x08, 0x3E, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x38, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, - 0x08, 0x38, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x3F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, - 0x4E, 0x96, 0x02, 0x00, 0x08, 0x40, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, - 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x41, 0x52, 0x17, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x3F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x42, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6C, 0x61, 0x67, 0x00, - 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, - 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x43, 0x52, 0x17, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0x3F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, - 0x08, 0x44, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6C, 0x61, 0x67, - 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, - 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x45, 0x52, - 0x17, 0x4F, 0x96, 0x09, 0x00, 0x08, 0x46, 0x07, 0x35, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, - 0x17, 0x96, 0x0E, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x08, 0x47, 0x07, 0x35, 0x08, 0x00, 0x00, - 0x08, 0x3F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, - 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, 0x08, 0x3F, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x04, 0x00, 0x08, 0x49, 0x08, 0x4A, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, + 0x07, 0x52, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, 0x08, 0x38, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, + 0x17, 0x96, 0x02, 0x00, 0x08, 0x3F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, + 0x08, 0x40, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, + 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x41, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, + 0x3F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x42, 0x8E, 0x0E, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6C, 0x61, 0x67, 0x00, 0x1E, 0x00, 0x96, 0x07, + 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x43, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, + 0x08, 0x3F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x44, 0x8E, 0x0E, + 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x6C, 0x61, 0x67, 0x00, 0x1E, 0x00, 0x96, + 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x45, 0x52, 0x17, 0x4F, 0x96, 0x09, + 0x00, 0x08, 0x46, 0x07, 0x35, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x0E, 0x00, + 0x07, 0x05, 0x00, 0x00, 0x00, 0x08, 0x47, 0x07, 0x35, 0x08, 0x00, 0x00, 0x08, 0x3F, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, + 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, 0x08, 0x3F, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, + 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0x49, + 0x08, 0x4A, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, + 0x13, 0x00, 0x08, 0x4B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4C, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4C, 0x07, 0x01, 0x00, 0x00, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4D, 0x07, 0x02, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4D, - 0x07, 0x02, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4E, + 0x07, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x13, 0x00, 0x08, 0x4E, 0x07, 0x03, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x50, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, - 0x72, 0x63, 0x00, 0x64, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x51, - 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x52, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x9D, - 0x02, 0x00, 0x19, 0x00, 0x96, 0x09, 0x00, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x52, 0x17, 0x99, 0x02, 0x00, 0x2C, 0x00, 0x96, 0x02, 0x00, - 0x08, 0x52, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x4E, 0x52, 0x17, 0x96, 0x09, 0x00, 0x05, 0x01, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0F, 0x8E, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xB3, 0x00, 0x96, 0x03, 0x00, 0x08, 0x53, 0x02, 0x3C, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x46, 0x87, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, 0x00, 0x91, - 0x00, 0x96, 0x04, 0x00, 0x08, 0x13, 0x04, 0x00, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x53, 0x1C, 0x96, - 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, 0x00, 0x41, 0x00, 0x96, 0x02, 0x00, 0x08, 0x53, 0x4C, 0x1C, - 0x96, 0x04, 0x00, 0x08, 0x56, 0x08, 0x13, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x54, 0x3D, 0x47, 0x96, 0x02, 0x00, 0x08, 0x55, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x13, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, - 0x54, 0x3D, 0x47, 0x47, 0x1D, 0x99, 0x02, 0x00, 0x33, 0x00, 0x96, 0x04, 0x00, 0x08, 0x53, 0x08, - 0x13, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x54, 0x3D, 0x96, 0x02, 0x00, - 0x08, 0x55, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x1C, 0x4E, - 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x54, 0x3D, 0x47, 0x1D, 0x99, 0x02, 0x00, - 0x61, 0xFF, 0x96, 0x02, 0x00, 0x08, 0x53, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x57, 0x8E, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x58, 0x4E, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x59, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, - 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x5A, 0x4E, 0x3E, 0x4F, 0x96, 0x02, - 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x5B, 0x8E, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x5C, 0x52, 0x17, 0x4F, 0x96, 0x08, 0x00, 0x07, 0x83, 0x00, 0x00, - 0x00, 0x02, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, 0x5D, 0x07, 0x10, 0x00, 0x00, - 0x00, 0x07, 0xF4, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, - 0x09, 0x00, 0x08, 0x5E, 0x07, 0xF4, 0x01, 0x00, 0x00, 0x08, 0x5D, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x0E, - 0x00, 0x07, 0x12, 0x00, 0x00, 0x00, 0x08, 0x47, 0x07, 0xF4, 0x01, 0x00, 0x00, 0x08, 0x5D, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, - 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, 0x5D, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, - 0x96, 0x13, 0x00, 0x08, 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x5F, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x60, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0xFD, + 0x02, 0x00, 0x08, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x50, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x00, 0x64, + 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x51, 0x05, 0x01, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x52, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x19, 0x00, + 0x96, 0x09, 0x00, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x4F, 0x52, 0x17, 0x99, 0x02, 0x00, 0x2C, 0x00, 0x96, 0x02, 0x00, 0x08, 0x52, 0x1C, 0x96, + 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4E, 0x52, + 0x17, 0x96, 0x09, 0x00, 0x05, 0x01, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x4F, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB3, 0x00, 0x96, 0x03, 0x00, 0x08, 0x53, 0x02, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x46, 0x87, + 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, 0x00, 0x91, 0x00, 0x96, 0x04, 0x00, + 0x08, 0x13, 0x04, 0x00, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x53, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, + 0x9D, 0x02, 0x00, 0x41, 0x00, 0x96, 0x02, 0x00, 0x08, 0x53, 0x4C, 0x1C, 0x96, 0x04, 0x00, 0x08, + 0x56, 0x08, 0x13, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x54, 0x3D, 0x47, + 0x96, 0x02, 0x00, 0x08, 0x55, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x13, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x54, 0x3D, 0x47, 0x47, + 0x1D, 0x99, 0x02, 0x00, 0x33, 0x00, 0x96, 0x04, 0x00, 0x08, 0x53, 0x08, 0x13, 0x1C, 0x96, 0x07, + 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x54, 0x3D, 0x96, 0x02, 0x00, 0x08, 0x55, 0x47, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x54, 0x3D, 0x47, 0x1D, 0x99, 0x02, 0x00, 0x61, 0xFF, 0x96, 0x02, + 0x00, 0x08, 0x53, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x57, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x58, 0x4E, 0x3E, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x59, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x96, 0x02, 0x00, 0x08, + 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x5A, 0x4E, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x48, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x5B, 0x8E, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x5C, 0x52, 0x17, 0x4F, 0x96, 0x08, 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x02, 0x08, 0x48, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, 0x5D, 0x07, 0x10, 0x00, 0x00, 0x00, 0x07, 0xF4, 0x01, + 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x09, 0x00, 0x08, 0x5E, + 0x07, 0xF4, 0x01, 0x00, 0x00, 0x08, 0x5D, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, + 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x12, 0x00, + 0x00, 0x00, 0x08, 0x47, 0x07, 0xF4, 0x01, 0x00, 0x00, 0x08, 0x5D, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x08, + 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, 0x5D, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, + 0x5F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, + 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x5F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x96, 0x13, 0x00, 0x08, 0x60, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, + 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x5F, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x61, 0x07, 0x02, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0x5F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x61, 0x07, 0x02, 0x00, + 0x5F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x62, 0x07, 0x03, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x5F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, - 0x62, 0x07, 0x03, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, + 0x63, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x5F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x13, 0x00, 0x08, 0x63, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, + 0x96, 0x13, 0x00, 0x08, 0x64, 0x07, 0x05, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x5F, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x64, 0x07, 0x05, 0x00, 0x00, 0x00, 0x07, 0xFD, + 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x0F, 0x07, 0x06, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0x5F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x0F, 0x07, 0x06, 0x00, + 0x5F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x65, 0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x5F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, - 0x65, 0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x5F, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x13, 0x00, 0x08, 0x66, 0x07, 0x08, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x13, 0x00, 0x08, 0x67, 0x07, 0x09, 0x00, - 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, - 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x10, 0x00, 0x08, 0x0D, 0x08, 0x68, 0x07, 0x01, 0x00, - 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x5F, 0x40, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x09, - 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x0D, 0x08, 0x67, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, + 0x66, 0x07, 0x08, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, + 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x13, 0x00, 0x08, 0x67, 0x07, 0x09, 0x00, 0x00, 0x00, 0x07, 0xFD, + 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x02, 0x00, 0x08, + 0x67, 0x1C, 0x96, 0x10, 0x00, 0x08, 0x0D, 0x08, 0x68, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x00, 0x08, 0x5F, 0x40, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x09, 0x00, 0x07, 0x03, 0x00, + 0x00, 0x00, 0x08, 0x0D, 0x08, 0x67, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, + 0x13, 0x00, 0x08, 0x4B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4C, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4C, 0x07, 0x01, 0x00, 0x00, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4D, 0x07, 0x02, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4D, - 0x07, 0x02, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, + 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x6A, + 0x07, 0x0A, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x13, 0x00, 0x08, 0x6A, 0x07, 0x0A, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, + 0x13, 0x00, 0x08, 0x6B, 0x07, 0x0B, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x6B, 0x07, 0x0B, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x6C, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x6C, 0x07, 0x0C, 0x00, 0x00, - 0x00, 0x07, 0xFD, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x4F, - 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x50, 0x8E, 0x0D, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x00, 0x72, 0x00, 0x96, 0x02, 0x00, - 0x08, 0x52, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x27, 0x00, 0x96, 0x02, - 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x51, 0x05, 0x00, 0x4F, 0x96, 0x09, 0x00, 0x05, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x52, 0x17, - 0x99, 0x02, 0x00, 0x3A, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x51, - 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x52, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x6C, 0x52, 0x17, 0x96, 0x09, 0x00, 0x05, 0x01, - 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x52, 0x17, 0x4F, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x8E, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x50, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x00, 0x72, 0x00, 0x96, 0x02, 0x00, 0x08, 0x52, 0x1C, 0x96, + 0x01, 0x00, 0x02, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x27, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x04, 0x00, 0x08, 0x51, 0x05, 0x00, 0x4F, 0x96, 0x09, 0x00, 0x05, 0x00, 0x07, 0x01, 0x00, + 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x52, 0x17, 0x99, 0x02, 0x00, 0x3A, + 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x51, 0x05, 0x01, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x52, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x6C, 0x52, 0x17, 0x96, 0x09, 0x00, 0x05, 0x01, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, + 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x57, 0x8E, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x58, 0x4E, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x59, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x5A, 0x4E, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x57, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x58, 0x4E, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x59, 0x8E, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x5A, 0x4E, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x67, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x5B, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, + 0x5B, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, + 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x6D, 0x52, 0x17, 0x4F, 0x96, 0x07, 0x00, 0x08, 0x6E, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x07, 0x00, + 0x08, 0x6F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0x6F, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x70, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x0B, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x07, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x6F, 0x4E, 0x96, 0x02, + 0x00, 0x08, 0x70, 0x52, 0x17, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x6F, + 0x4E, 0x96, 0x02, 0x00, 0x08, 0x70, 0x3A, 0x17, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x13, + 0x00, 0x08, 0x71, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2A, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, + 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x13, 0x00, 0x08, + 0x72, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3B, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, + 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x0E, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x73, 0x07, 0x3B, + 0x08, 0x00, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, + 0x3D, 0x17, 0x96, 0x09, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x08, 0x74, 0x08, 0x6E, 0x1C, 0x96, + 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x6E, + 0x1C, 0x96, 0x09, 0x00, 0x08, 0x75, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x05, 0x40, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, + 0x3A, 0x17, 0x96, 0x09, 0x00, 0x08, 0x76, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x08, 0x6E, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0x75, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, + 0x17, 0x96, 0x0E, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x08, 0x77, 0x07, 0x0C, 0x00, 0x00, 0x00, + 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, + 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, + 0x4E, 0x96, 0x02, 0x00, 0x08, 0x78, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, + 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x79, 0x52, 0x17, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x78, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x7A, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x0F, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x78, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, + 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x7B, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x6D, 0x52, 0x17, 0x4F, 0x96, - 0x07, 0x00, 0x08, 0x6E, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x6E, - 0x1C, 0x96, 0x07, 0x00, 0x08, 0x6F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x6F, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x70, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x0B, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, - 0x4F, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x6F, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x70, 0x52, 0x17, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x6F, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x70, 0x3A, 0x17, 0x96, 0x02, 0x00, 0x08, - 0x6E, 0x1C, 0x96, 0x13, 0x00, 0x08, 0x71, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2A, 0x04, 0x00, - 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, - 0x96, 0x13, 0x00, 0x08, 0x72, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x3B, 0x08, 0x00, 0x00, 0x07, - 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x0E, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x73, 0x07, 0x3B, 0x08, 0x00, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, - 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x09, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x08, 0x74, - 0x08, 0x6E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, - 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x09, 0x00, 0x08, 0x75, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x05, 0x40, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x09, 0x00, 0x08, 0x76, 0x07, 0x0C, 0x00, 0x00, 0x00, - 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, - 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x05, 0x00, 0x00, 0x00, 0x08, 0x77, 0x07, - 0x0C, 0x00, 0x00, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, 0x4E, 0x96, 0x07, 0x00, - 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x75, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x78, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, - 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x79, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x78, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, - 0x7A, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0F, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, - 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x75, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x78, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, - 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x02, - 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7B, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7C, 0x52, 0x17, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7B, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x02, 0x00, 0x08, 0x7D, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, + 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7E, 0x52, 0x17, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7B, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x7F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x80, 0x52, 0x17, + 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7B, 0x4E, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x81, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, + 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x82, 0x52, + 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7B, 0x4E, 0x96, 0x02, + 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x83, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, - 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7C, + 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x84, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7B, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x7D, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x85, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x7E, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7B, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x7F, 0x8E, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x80, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7B, - 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x81, 0x8E, 0x08, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x82, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x7B, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x83, 0x8E, 0x08, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x84, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x7B, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x85, 0x8E, 0x08, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x86, 0x52, 0x17, 0x4F, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x7B, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, - 0x6E, 0x1C, 0x96, 0x27, 0x00, 0x08, 0x87, 0x08, 0x88, 0x08, 0x88, 0x08, 0x89, 0x08, 0x89, 0x08, - 0x8A, 0x08, 0x8A, 0x08, 0x8B, 0x08, 0x8B, 0x08, 0x8C, 0x08, 0x8C, 0x08, 0x8D, 0x08, 0x8D, 0x08, - 0x8E, 0x08, 0x8E, 0x08, 0x8F, 0x08, 0x8F, 0x07, 0x08, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, - 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x87, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, - 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x09, 0x00, 0x08, - 0x90, 0x07, 0x0D, 0x00, 0x00, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x87, 0x4E, 0x96, - 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x07, - 0x00, 0x00, 0x00, 0x02, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x87, 0x4E, 0x96, 0x07, 0x00, - 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x91, 0x8E, 0x10, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x27, - 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x92, 0x08, 0x92, 0x1C, 0x4F, - 0x96, 0x08, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x07, - 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x1D, 0x96, 0x09, 0x00, 0x08, 0x93, 0x07, 0xBC, - 0x02, 0x00, 0x00, 0x08, 0x91, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, - 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, - 0x02, 0x08, 0x91, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, 0x94, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x07, 0x2B, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x0E, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x95, 0x07, 0x2B, 0x04, 0x00, 0x00, 0x08, 0x94, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, - 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, - 0x00, 0x08, 0x97, 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0x98, 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x99, 0x8E, 0x10, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x00, 0x5B, 0x00, 0x96, 0x09, - 0x00, 0x08, 0x9C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x9A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9B, - 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x9C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9D, 0x49, 0x9D, 0x02, - 0x00, 0x2D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x9C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9E, 0x49, 0x9D, - 0x02, 0x00, 0x0E, 0x00, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x99, 0x02, 0x00, - 0x09, 0x00, 0x96, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x3E, 0x99, 0x02, 0x00, 0x09, 0x00, - 0x96, 0x05, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x9F, 0x8E, 0x1D, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x72, 0x6C, 0x00, 0x00, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x00, 0x00, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x00, 0x97, 0x00, 0x96, 0x02, 0x00, 0x08, 0x92, - 0x1C, 0x44, 0x96, 0x02, 0x00, 0x08, 0x09, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x08, 0x00, 0x96, 0x04, - 0x00, 0x08, 0x92, 0x08, 0x68, 0x1D, 0x96, 0x04, 0x00, 0x08, 0xA0, 0x08, 0x9A, 0x1C, 0x96, 0x07, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x99, 0x52, 0x3C, - 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x49, 0x9D, - 0x02, 0x00, 0x3E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x01, 0x00, - 0x00, 0x00, 0x49, 0x9D, 0x02, 0x00, 0x15, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x92, 0x1C, 0x9A, 0x01, 0x00, 0x02, 0x99, 0x02, 0x00, 0x10, 0x00, 0x96, 0x02, 0x00, - 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x92, 0x1C, 0x9A, 0x01, 0x00, 0x01, 0x99, 0x02, 0x00, - 0x10, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x92, 0x1C, 0x9A, 0x01, - 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0xA2, 0x8E, 0x15, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x72, - 0x6C, 0x00, 0x00, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x00, 0x99, 0x00, 0x96, 0x04, 0x00, 0x08, - 0xA0, 0x08, 0x9A, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x99, 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x20, 0x96, 0x02, 0x00, - 0x08, 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x49, 0x9D, 0x02, 0x00, 0x4A, - 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x49, - 0x9D, 0x02, 0x00, 0x1B, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0xC2, 0x99, 0x02, 0x00, 0x16, 0x00, - 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0xC1, 0x99, 0x02, 0x00, 0x16, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, - 0xC0, 0x8B, 0x01, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xA4, 0x8E, 0x15, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x75, 0x72, 0x6C, 0x00, 0x00, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x00, 0x99, 0x00, 0x96, - 0x04, 0x00, 0x08, 0xA0, 0x08, 0x9A, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x99, 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x20, - 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x49, 0x9D, - 0x02, 0x00, 0x4A, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x01, 0x00, - 0x00, 0x00, 0x49, 0x9D, 0x02, 0x00, 0x1B, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0x42, 0x99, 0x02, - 0x00, 0x16, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0x41, 0x99, 0x02, 0x00, 0x16, 0x00, 0x96, 0x02, - 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, - 0x9A, 0x01, 0x00, 0x40, 0x8B, 0x01, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xA5, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x1D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x20, 0x96, 0x04, 0x00, 0x08, - 0x68, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0x40, 0x8B, 0x01, - 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0xA6, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x94, 0x40, - 0x3E, 0x4F, 0x96, 0x09, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x08, 0xA6, 0x08, 0x96, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, - 0x17, 0x96, 0x09, 0x00, 0x08, 0xA7, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, - 0x96, 0x0E, 0x00, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x08, 0xA8, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, + 0x86, 0x52, 0x17, 0x4F, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, 0x08, 0x6E, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x7B, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x27, + 0x00, 0x08, 0x87, 0x08, 0x88, 0x08, 0x88, 0x08, 0x89, 0x08, 0x89, 0x08, 0x8A, 0x08, 0x8A, 0x08, + 0x8B, 0x08, 0x8B, 0x08, 0x8C, 0x08, 0x8C, 0x08, 0x8D, 0x08, 0x8D, 0x08, 0x8E, 0x08, 0x8E, 0x08, + 0x8F, 0x08, 0x8F, 0x07, 0x08, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x6E, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x87, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x09, 0x00, 0x08, 0x90, 0x07, 0x0D, 0x00, + 0x00, 0x00, 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x87, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x6E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x87, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x91, 0x8E, 0x10, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x27, 0x00, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x92, 0x08, 0x92, 0x1C, 0x4F, 0x96, 0x08, 0x00, 0x07, + 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x3D, 0x17, 0x1D, 0x96, 0x09, 0x00, 0x08, 0x93, 0x07, 0xBC, 0x02, 0x00, 0x00, 0x08, + 0x91, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, + 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x08, 0x91, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, + 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, 0x94, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2B, 0x04, 0x00, + 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x0E, 0x00, 0x07, 0x01, 0x00, + 0x00, 0x00, 0x08, 0x95, 0x07, 0x2B, 0x04, 0x00, 0x00, 0x08, 0x94, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x02, + 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0x97, 0x05, + 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, + 0x00, 0x08, 0x98, 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x99, 0x8E, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x00, 0x5B, 0x00, 0x96, 0x09, 0x00, 0x08, 0x9C, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x9A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9B, 0x52, 0x3C, 0x96, 0x02, + 0x00, 0x08, 0x9C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9D, 0x49, 0x9D, 0x02, 0x00, 0x2D, 0x00, 0x96, + 0x02, 0x00, 0x08, 0x9C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9E, 0x49, 0x9D, 0x02, 0x00, 0x0E, 0x00, + 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x05, + 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x3E, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x05, 0x00, 0x07, + 0x02, 0x00, 0x00, 0x00, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x9F, 0x8E, 0x1D, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x75, 0x72, 0x6C, 0x00, 0x00, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x00, 0x00, 0x6D, 0x65, + 0x74, 0x68, 0x6F, 0x64, 0x00, 0x97, 0x00, 0x96, 0x02, 0x00, 0x08, 0x92, 0x1C, 0x44, 0x96, 0x02, + 0x00, 0x08, 0x09, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x08, 0x00, 0x96, 0x04, 0x00, 0x08, 0x92, 0x08, + 0x68, 0x1D, 0x96, 0x04, 0x00, 0x08, 0xA0, 0x08, 0x9A, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, + 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x99, 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, + 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x49, 0x9D, 0x02, 0x00, 0x3E, 0x00, + 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x49, 0x9D, + 0x02, 0x00, 0x15, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x92, 0x1C, + 0x9A, 0x01, 0x00, 0x02, 0x99, 0x02, 0x00, 0x10, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0x92, 0x1C, 0x9A, 0x01, 0x00, 0x01, 0x99, 0x02, 0x00, 0x10, 0x00, 0x96, 0x02, + 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x92, 0x1C, 0x9A, 0x01, 0x00, 0x00, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xA2, + 0x8E, 0x15, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x72, 0x6C, 0x00, 0x00, 0x6D, + 0x65, 0x74, 0x68, 0x6F, 0x64, 0x00, 0x99, 0x00, 0x96, 0x04, 0x00, 0x08, 0xA0, 0x08, 0x9A, 0x1C, + 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x99, + 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x20, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, + 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x49, 0x9D, 0x02, 0x00, 0x4A, 0x00, 0x96, 0x02, 0x00, + 0x08, 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x49, 0x9D, 0x02, 0x00, 0x1B, + 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0xC2, 0x99, 0x02, 0x00, 0x16, 0x00, 0x96, 0x02, 0x00, 0x08, + 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, + 0x00, 0xC1, 0x99, 0x02, 0x00, 0x16, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0xC0, 0x8B, 0x01, 0x00, + 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, + 0x00, 0x08, 0xA4, 0x8E, 0x15, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x72, 0x6C, + 0x00, 0x00, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x00, 0x99, 0x00, 0x96, 0x04, 0x00, 0x08, 0xA0, + 0x08, 0x9A, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x99, 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x20, 0x96, 0x02, 0x00, 0x08, + 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x49, 0x9D, 0x02, 0x00, 0x4A, 0x00, + 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x49, 0x9D, + 0x02, 0x00, 0x1B, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0x42, 0x99, 0x02, 0x00, 0x16, 0x00, 0x96, + 0x02, 0x00, 0x08, 0xA1, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xA3, + 0x4E, 0x9A, 0x01, 0x00, 0x41, 0x99, 0x02, 0x00, 0x16, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA1, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0x40, + 0x8B, 0x01, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x02, 0x00, 0x08, 0xA5, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, + 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x20, 0x96, 0x04, 0x00, 0x08, 0x68, 0x08, 0x0A, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0xA3, 0x4E, 0x9A, 0x01, 0x00, 0x40, 0x8B, 0x01, 0x00, 0x00, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xA6, + 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x94, 0x40, 0x3E, 0x4F, 0x96, 0x09, + 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x08, 0xA6, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x09, 0x00, + 0x08, 0xA7, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, + 0xC8, 0x00, 0x00, 0x00, 0x08, 0xA8, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, + 0x96, 0x0E, 0x00, 0x07, 0x2C, 0x01, 0x00, 0x00, 0x08, 0xA9, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, - 0x08, 0x03, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x2C, 0x01, 0x00, 0x00, 0x08, 0xA9, 0x07, 0x84, + 0x08, 0x03, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x91, 0x01, 0x00, 0x00, 0x08, 0xAA, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, - 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x91, 0x01, 0x00, 0x00, - 0x08, 0xAA, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0xA1, 0x01, 0x00, 0x00, + 0x08, 0xAB, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, - 0xA1, 0x01, 0x00, 0x00, 0x08, 0xAB, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, + 0xF4, 0x01, 0x00, 0x00, 0x08, 0xAC, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, - 0x96, 0x0E, 0x00, 0x07, 0xF4, 0x01, 0x00, 0x00, 0x08, 0xAC, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, - 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, - 0x08, 0x03, 0x3D, 0x17, 0x96, 0x09, 0x00, 0x08, 0xAD, 0x07, 0x85, 0x03, 0x00, 0x00, 0x08, 0x96, + 0x96, 0x09, 0x00, 0x08, 0xAD, 0x07, 0x85, 0x03, 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, + 0x0E, 0x00, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x08, 0xAE, 0x07, 0x85, 0x03, 0x00, 0x00, 0x08, 0x96, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, + 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, + 0x13, 0x00, 0x08, 0xAF, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x68, 0x00, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, + 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, 0xB0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, + 0x70, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x0E, 0x00, + 0x07, 0x64, 0x00, 0x00, 0x00, 0x08, 0xB1, 0x07, 0x70, 0x00, 0x00, 0x00, 0x08, 0xB0, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, + 0x17, 0x96, 0x02, 0x00, 0x08, 0xB0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, + 0x08, 0x00, 0x07, 0x03, 0x04, 0x00, 0x00, 0x02, 0x08, 0xB0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x13, 0x00, + 0x08, 0xB2, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x68, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, + 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x13, 0x00, 0x08, 0xB3, + 0x07, 0xC9, 0x00, 0x00, 0x00, 0x07, 0x68, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, + 0x01, 0x3D, 0x4F, 0x96, 0x0E, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x08, 0xB4, 0x07, 0x68, 0x00, + 0x00, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, + 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x08, 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x02, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, - 0x02, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x0C, 0x00, 0x00, 0x00, 0x08, 0xAE, 0x07, 0x85, 0x03, - 0x00, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, - 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0xAF, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x68, 0x00, - 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x08, 0x00, 0x07, 0x03, - 0x00, 0x00, 0x00, 0x02, 0x08, 0x96, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, - 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, 0xB0, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x70, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, - 0x1D, 0x96, 0x0E, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x08, 0xB1, 0x07, 0x70, 0x00, 0x00, 0x00, - 0x08, 0xB0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, - 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0xB0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, - 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x1B, 0x52, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x04, 0x00, 0x00, 0x02, 0x08, 0xB0, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, - 0x17, 0x96, 0x13, 0x00, 0x08, 0xB2, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x68, 0x00, 0x00, 0x00, - 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, - 0x13, 0x00, 0x08, 0xB3, 0x07, 0xC9, 0x00, 0x00, 0x00, 0x07, 0x68, 0x00, 0x00, 0x00, 0x07, 0x02, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x0E, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x08, - 0xB4, 0x07, 0x68, 0x00, 0x00, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0xB2, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, - 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x08, 0x00, 0x07, 0x83, 0x00, 0x00, - 0x00, 0x02, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x2C, 0x01, 0x00, 0x00, 0x08, - 0xB5, 0x07, 0x68, 0x00, 0x00, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0xC8, - 0x00, 0x00, 0x00, 0x08, 0xB6, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, - 0x08, 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x02, 0x08, 0xB2, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, 0xB7, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x07, 0x6E, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, - 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x13, 0x00, 0x08, 0xB8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, - 0x71, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0xB9, 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x00, - 0x67, 0x00, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x44, 0x96, 0x02, 0x00, 0x08, 0xBA, 0x49, 0x12, - 0x12, 0x9D, 0x02, 0x00, 0x05, 0x00, 0x96, 0x01, 0x00, 0x02, 0x3E, 0x96, 0x07, 0x00, 0x08, 0xBB, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x46, 0x87, 0x01, 0x00, - 0x00, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, 0x00, 0x27, 0x00, 0x96, 0x04, 0x00, 0x08, 0xBC, - 0x04, 0x00, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xBB, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x4E, 0x4F, 0x99, 0x02, 0x00, - 0xCB, 0xFF, 0x96, 0x02, 0x00, 0x08, 0xBB, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0xBD, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0xBE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, - 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0xBF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4F, - 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC0, - 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xC1, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x25, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0E, 0x1C, 0x4E, 0x96, 0x07, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB9, 0x52, 0x3E, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xC2, 0x8E, 0x15, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x00, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x00, 0x79, 0x00, - 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x12, 0x12, 0x9D, 0x02, - 0x00, 0x12, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0xBE, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, - 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x07, 0x00, - 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB9, 0x52, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x0E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0xC4, 0x52, 0x17, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC0, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0xC5, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x96, 0x04, 0x00, 0x08, - 0xC6, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x3C, 0x96, 0x07, 0x00, 0x08, 0xC7, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xC6, 0x46, 0x87, 0x01, 0x00, - 0x00, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, 0x00, 0x25, 0x00, 0x96, 0x04, 0x00, 0x08, 0xBC, - 0x04, 0x00, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x08, 0xC7, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x16, 0x52, 0x17, 0x99, 0x02, 0x00, 0xCD, 0xFF, - 0x96, 0x02, 0x00, 0x08, 0xC7, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xC4, 0x8E, - 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x5C, 0x00, - 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBF, 0x4E, 0x12, 0x12, 0x9D, 0x02, - 0x00, 0x12, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0xBF, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBF, - 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, + 0x00, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x2C, 0x01, 0x00, 0x00, 0x08, 0xB5, 0x07, 0x68, 0x00, + 0x00, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, + 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x08, + 0xB6, 0x07, 0x84, 0x03, 0x00, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, + 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x83, + 0x00, 0x00, 0x00, 0x02, 0x08, 0xB2, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, + 0x00, 0x3D, 0x17, 0x96, 0x13, 0x00, 0x08, 0xB7, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x6E, 0x00, + 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x02, 0x00, 0x08, 0xB2, + 0x1C, 0x96, 0x13, 0x00, 0x08, 0xB8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x71, 0x00, 0x00, 0x00, + 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xB9, + 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x67, 0x00, 0x96, 0x02, + 0x00, 0x08, 0x1C, 0x1C, 0x44, 0x96, 0x02, 0x00, 0x08, 0xBA, 0x49, 0x12, 0x12, 0x9D, 0x02, 0x00, + 0x05, 0x00, 0x96, 0x01, 0x00, 0x02, 0x3E, 0x96, 0x07, 0x00, 0x08, 0xBB, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x43, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x46, 0x87, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, + 0x02, 0x49, 0x9D, 0x02, 0x00, 0x27, 0x00, 0x96, 0x04, 0x00, 0x08, 0xBC, 0x04, 0x00, 0x3C, 0x96, + 0x02, 0x00, 0x08, 0xBB, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1C, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x4E, 0x4F, 0x99, 0x02, 0x00, 0xCB, 0xFF, 0x96, 0x02, + 0x00, 0x08, 0xBB, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xBD, 0x8E, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, + 0x00, 0x08, 0xBE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x07, 0x00, 0x08, 0xBF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x07, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC0, 0x52, 0x17, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x02, 0x00, 0x08, 0xC1, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x25, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0E, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, - 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC8, 0x52, 0x4F, 0x4F, 0x96, 0x02, 0x00, + 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB9, 0x52, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0xC8, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x74, - 0x79, 0x6C, 0x65, 0x00, 0x9D, 0x03, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x01, 0x00, 0x02, - 0x49, 0x12, 0x9D, 0x02, 0x00, 0x05, 0x00, 0x96, 0x01, 0x00, 0x02, 0x3E, 0x96, 0x09, 0x00, 0x08, - 0xC9, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0xB7, 0x40, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0xCA, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x15, 0x00, 0x96, 0x02, 0x00, 0x08, - 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xCB, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xCA, 0x4E, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xCC, 0x4E, 0x96, 0x02, 0x00, - 0x08, 0xCD, 0x49, 0x9D, 0x02, 0x00, 0x2B, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0xCC, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xCE, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x0E, 0x00, - 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xCD, 0x05, 0x00, 0x4F, 0x99, 0x02, - 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xCD, 0x05, 0x01, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xCF, 0x4E, 0x12, 0x9D, 0x02, - 0x00, 0x41, 0x00, 0x96, 0x04, 0x00, 0x08, 0xC6, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xCF, - 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0xD0, 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xC6, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x12, - 0x9D, 0x02, 0x00, 0x0F, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xCF, - 0x08, 0xC6, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xD1, 0x08, - 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0xD2, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x26, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, - 0x1C, 0x96, 0x04, 0x00, 0x08, 0xD3, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD2, 0x4E, 0x96, - 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD4, 0x52, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD5, 0x4E, 0x12, 0x9D, 0x02, - 0x00, 0x20, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xD6, 0x08, 0xC3, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD5, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, - 0xD7, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD8, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0xD9, 0x49, 0x9D, 0x02, 0x00, 0x2B, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0xD8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xCE, 0x49, 0x12, 0x9D, 0x02, 0x00, - 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xD9, 0x05, 0x00, 0x4F, - 0x99, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xD9, - 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDA, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0xDB, 0x49, 0x9D, 0x02, 0x00, 0x4F, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0xDA, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xDC, 0x49, 0x9D, 0x02, 0x00, 0x25, - 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xDA, 0x08, 0xC3, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0xDA, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, - 0x4F, 0x99, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, - 0xDA, 0x05, 0x00, 0x4F, 0x99, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, - 0x04, 0x00, 0x08, 0xDA, 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0xDD, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x20, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, - 0x04, 0x00, 0x08, 0xDD, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDD, 0x4E, 0x96, 0x07, 0x00, + 0x02, 0x00, 0x08, 0xC2, 0x8E, 0x15, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x61, + 0x6D, 0x65, 0x00, 0x00, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x00, 0x79, 0x00, 0x96, 0x02, 0x00, 0x08, + 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x12, 0x00, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0xBE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, + 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x96, 0x02, 0x00, + 0x08, 0x0E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB9, 0x52, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0E, + 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xC4, 0x52, 0x17, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0xC0, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xC5, 0x8E, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x96, 0x04, 0x00, 0x08, 0xC6, 0x08, 0x0A, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x3C, 0x96, 0x07, 0x00, 0x08, 0xC7, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x42, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xC6, 0x46, 0x87, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, + 0x02, 0x49, 0x9D, 0x02, 0x00, 0x25, 0x00, 0x96, 0x04, 0x00, 0x08, 0xBC, 0x04, 0x00, 0x3C, 0x96, + 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xC7, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x16, 0x52, 0x17, 0x99, 0x02, 0x00, 0xCD, 0xFF, 0x96, 0x02, 0x00, 0x08, + 0xC7, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, + 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xC4, 0x8E, 0x0E, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x5C, 0x00, 0x96, 0x02, 0x00, 0x08, + 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBF, 0x4E, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x12, 0x00, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0xBF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, + 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBF, 0x4E, 0x96, 0x02, 0x00, + 0x08, 0x0E, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x96, + 0x02, 0x00, 0x08, 0x0E, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC8, 0x52, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xC8, + 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x74, 0x79, 0x6C, 0x65, 0x00, + 0x9D, 0x03, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x9D, 0x02, + 0x00, 0x05, 0x00, 0x96, 0x01, 0x00, 0x02, 0x3E, 0x96, 0x09, 0x00, 0x08, 0xC9, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x08, 0xB7, 0x40, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xCA, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x15, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, + 0x00, 0x08, 0xCB, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xCA, 0x4E, 0x4F, 0x96, 0x02, 0x00, + 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xCC, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xCD, 0x49, 0x9D, + 0x02, 0x00, 0x2B, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xCC, 0x4E, + 0x96, 0x02, 0x00, 0x08, 0xCE, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, + 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xCD, 0x05, 0x00, 0x4F, 0x99, 0x02, 0x00, 0x0E, 0x00, 0x96, + 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xCD, 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, + 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xCF, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x41, 0x00, 0x96, + 0x04, 0x00, 0x08, 0xC6, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xCF, 0x4E, 0x96, 0x07, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD0, 0x52, 0x3C, 0x96, + 0x02, 0x00, 0x08, 0xC6, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x0F, + 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xCF, 0x08, 0xC6, 0x1C, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xD1, 0x08, 0xC3, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0xD1, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD2, + 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x26, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, + 0x08, 0xD3, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD2, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, + 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD4, 0x52, 0x4F, 0x96, 0x02, 0x00, + 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD5, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x20, 0x00, 0x96, + 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xD6, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0xD5, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xD9, + 0x49, 0x9D, 0x02, 0x00, 0x2B, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xD8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xCE, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, + 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xD9, 0x05, 0x00, 0x4F, 0x99, 0x02, 0x00, 0x0E, + 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xD9, 0x05, 0x01, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDA, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xDB, + 0x49, 0x9D, 0x02, 0x00, 0x4F, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xDA, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xDC, 0x49, 0x9D, 0x02, 0x00, 0x25, 0x00, 0x96, 0x02, 0x00, + 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xDA, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDA, + 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, 0x4F, 0x99, 0x02, 0x00, + 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xDA, 0x05, 0x00, 0x4F, + 0x99, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xDA, + 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDD, 0x4E, 0x12, + 0x9D, 0x02, 0x00, 0x20, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xDD, + 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDD, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x08, 0xD7, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDE, + 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x20, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, + 0x08, 0xDF, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDE, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, + 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0xE0, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x20, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, + 0x04, 0x00, 0x08, 0xE0, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE0, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0xDE, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x20, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, - 0x1C, 0x96, 0x04, 0x00, 0x08, 0xDF, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDE, 0x4E, 0x96, + 0x02, 0x00, 0x08, 0xE1, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x20, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, + 0x1C, 0x96, 0x04, 0x00, 0x08, 0xE2, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE1, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE0, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x20, 0x00, 0x96, 0x02, 0x00, - 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xE0, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE0, - 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE1, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x20, 0x00, 0x96, - 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xE2, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0xE1, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE3, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x3B, - 0x00, 0x96, 0x04, 0x00, 0x08, 0xC6, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE3, 0x4E, 0x96, - 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x08, 0xC6, 0x1C, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x0F, 0x00, 0x96, 0x02, 0x00, - 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xE4, 0x08, 0xC6, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE5, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xE6, 0x49, 0x9D, 0x02, - 0x00, 0x2B, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE5, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x3D, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, - 0x1C, 0x96, 0x04, 0x00, 0x08, 0xE6, 0x05, 0x00, 0x4F, 0x99, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, - 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xE6, 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0xC9, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xE7, 0x8E, 0x0D, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x73, 0x73, 0x00, 0xDA, 0x00, 0x96, 0x04, 0x00, 0x08, 0xEA, - 0x08, 0xE8, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0xE9, 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, 0x44, 0x96, 0x02, 0x00, 0x08, - 0xEB, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x06, 0x00, 0x96, 0x02, 0x00, 0x05, 0x00, 0x3E, 0x96, 0x02, - 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x12, - 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0xBE, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x46, 0x87, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, - 0x02, 0x49, 0x9D, 0x02, 0x00, 0x56, 0x00, 0x96, 0x04, 0x00, 0x08, 0xBC, 0x04, 0x00, 0x3C, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xBC, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x4E, 0x96, 0x07, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB9, 0x52, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC4, 0x52, 0x17, 0x99, 0x02, 0x00, 0x9C, 0xFF, 0x96, 0x07, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC0, 0x52, 0x17, 0x96, - 0x02, 0x00, 0x05, 0x01, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0xEC, 0x08, 0xB2, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0xE7, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, - 0x2D, 0x01, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE3, 0x4E, 0x12, 0x9D, 0x02, 0x00, 0x3B, 0x00, 0x96, 0x04, 0x00, + 0x08, 0xC6, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE3, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, + 0x00, 0x00, 0x00, 0x08, 0xD7, 0x3D, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, + 0xC6, 0x1C, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x0F, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, + 0x04, 0x00, 0x08, 0xE4, 0x08, 0xC6, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0xE5, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xE6, 0x49, 0x9D, 0x02, 0x00, 0x2B, 0x00, 0x96, + 0x02, 0x00, 0x08, 0xC3, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE5, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x3D, + 0x49, 0x12, 0x9D, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x96, 0x04, 0x00, + 0x08, 0xE6, 0x05, 0x00, 0x4F, 0x99, 0x02, 0x00, 0x0E, 0x00, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, + 0x96, 0x04, 0x00, 0x08, 0xE6, 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xC9, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x50, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x73, 0x72, 0x63, 0x00, 0x6B, 0x00, 0x96, 0x02, 0x00, 0x08, 0x52, 0x1C, 0x96, 0x01, 0x00, - 0x02, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x19, 0x00, 0x96, 0x09, 0x00, 0x05, 0x00, 0x07, 0x01, 0x00, - 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x52, 0x17, 0x99, 0x02, 0x00, 0x41, - 0x00, 0x96, 0x04, 0x00, 0x08, 0xEA, 0x08, 0x52, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xEC, 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x04, 0x00, 0x08, 0x51, 0x08, 0xEA, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, - 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, - 0x52, 0x17, 0x4F, 0x96, 0x0E, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x08, 0xED, 0x07, 0x71, 0x00, - 0x00, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, - 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, - 0x07, 0x03, 0x04, 0x00, 0x00, 0x02, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, - 0x17, 0x96, 0x09, 0x00, 0x07, 0x03, 0x04, 0x00, 0x00, 0x08, 0xB8, 0x08, 0xB2, 0x1C, 0x96, 0x07, - 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x07, 0x00, 0x08, 0xEE, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x43, 0x1D, 0x96, 0x09, 0x00, 0x08, 0xEF, 0x07, 0xCF, 0x07, 0x00, 0x00, - 0x08, 0xEE, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, - 0x08, 0x00, 0x07, 0x06, 0x00, 0x00, 0x00, 0x02, 0x08, 0xEE, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0xF0, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x9E, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6E, 0x64, 0x65, - 0x78, 0x00, 0x2A, 0x00, 0x96, 0x13, 0x00, 0x08, 0xF1, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x36, - 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x3C, 0x96, 0x02, 0x00, 0x08, - 0xF2, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xF1, 0x3D, 0x3E, 0x4F, 0x96, - 0x12, 0x00, 0x02, 0x07, 0xC9, 0x00, 0x00, 0x00, 0x07, 0x36, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x3D, 0x96, 0x09, 0x00, 0x08, 0xC7, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, - 0xF0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x96, 0x09, 0x00, 0x08, 0xF3, 0x07, 0x36, - 0x08, 0x00, 0x00, 0x08, 0xF0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, - 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x08, 0xF0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, - 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x03, 0x00, 0x09, 0x01, 0x01, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x02, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xC8, 0x00, 0x96, 0x0A, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x01, - 0x01, 0x40, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xF4, 0x08, 0x0A, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0xF4, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x09, - 0x00, 0x08, 0xF6, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF7, 0x40, 0x4F, 0x96, 0x07, 0x00, 0x08, - 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, - 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0xF6, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, - 0x02, 0x00, 0x3C, 0x00, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, - 0x02, 0x00, 0x08, 0xF6, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x02, 0x01, 0x52, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0xF6, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x16, 0x52, 0x17, 0x99, 0x02, 0x00, 0x9C, 0xFF, - 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xF8, 0x08, 0x0A, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0xF8, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x3E, 0x4F, 0x96, 0x03, 0x00, - 0x09, 0x01, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x03, 0x01, - 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x28, 0x00, 0x08, 0xF8, 0x08, 0xF9, 0x05, 0x00, 0x08, 0xFA, 0x05, 0x00, 0x08, 0xFB, - 0x05, 0x00, 0x08, 0xFC, 0x05, 0x00, 0x08, 0xFD, 0x05, 0x00, 0x08, 0xFE, 0x05, 0x00, 0x08, 0xFF, - 0x05, 0x00, 0x09, 0x00, 0x01, 0x05, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x4F, 0x96, - 0x09, 0x00, 0x07, 0x03, 0x04, 0x00, 0x00, 0x02, 0x09, 0x01, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xE7, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x63, 0x73, 0x73, 0x00, 0xDA, 0x00, 0x96, 0x04, 0x00, 0x08, 0xEA, 0x08, 0xE8, 0x1C, 0x96, + 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xE9, 0x52, + 0x3C, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, 0x44, 0x96, 0x02, 0x00, 0x08, 0xEB, 0x49, 0x12, 0x9D, + 0x02, 0x00, 0x06, 0x00, 0x96, 0x02, 0x00, 0x05, 0x00, 0x3E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x12, 0x00, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0xBE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0xEA, 0x46, 0x87, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, + 0x00, 0x56, 0x00, 0x96, 0x04, 0x00, 0x08, 0xBC, 0x04, 0x00, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBE, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0xEA, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, + 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB9, 0x52, 0x4F, 0x96, 0x02, 0x00, 0x08, + 0xBC, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0xC4, 0x52, 0x17, 0x99, 0x02, 0x00, 0x9C, 0xFF, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xC0, 0x52, 0x17, 0x96, 0x02, 0x00, 0x05, 0x01, + 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, + 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0xEC, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0xE7, 0x4E, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x13, 0x00, 0x08, 0x4B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2D, 0x01, 0x00, 0x00, + 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xB2, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x4F, + 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, + 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, + 0x00, 0x08, 0x50, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, + 0x00, 0x6B, 0x00, 0x96, 0x02, 0x00, 0x08, 0x52, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x9D, + 0x02, 0x00, 0x19, 0x00, 0x96, 0x09, 0x00, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x52, 0x17, 0x99, 0x02, 0x00, 0x41, 0x00, 0x96, 0x04, 0x00, + 0x08, 0xEA, 0x08, 0x52, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0xEC, 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, + 0x08, 0x51, 0x08, 0xEA, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, 0x96, 0x07, 0x00, 0x07, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x4F, 0x52, 0x17, 0x4F, 0x96, + 0x0E, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x08, 0xED, 0x07, 0x71, 0x00, 0x00, 0x00, 0x08, 0xB2, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, + 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x04, 0x00, + 0x00, 0x02, 0x08, 0xB2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xB8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x09, 0x00, + 0x07, 0x03, 0x04, 0x00, 0x00, 0x08, 0xB8, 0x08, 0xB2, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, + 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x0E, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xEF, + 0x07, 0x9B, 0x02, 0x00, 0x00, 0x08, 0xEE, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, + 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, + 0x00, 0x00, 0x02, 0x08, 0xEE, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, + 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x07, 0x00, 0x08, 0xF0, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x43, 0x1D, 0x96, 0x09, 0x00, 0x08, 0xF1, 0x07, 0xCF, 0x07, 0x00, 0x00, 0x08, 0xF0, + 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, + 0x07, 0x06, 0x00, 0x00, 0x00, 0x02, 0x08, 0xF0, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0xF2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9E, + 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x00, + 0x2A, 0x00, 0x96, 0x13, 0x00, 0x08, 0xF3, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x36, 0x08, 0x00, + 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xF4, 0x1C, + 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xF3, 0x3D, 0x3E, 0x4F, 0x96, 0x12, 0x00, + 0x02, 0x07, 0xC9, 0x00, 0x00, 0x00, 0x07, 0x36, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, + 0x08, 0x01, 0x3D, 0x96, 0x09, 0x00, 0x08, 0xC7, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0xF2, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x96, 0x09, 0x00, 0x08, 0xF5, 0x07, 0x36, 0x08, 0x00, + 0x00, 0x08, 0xF2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, + 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, 0x08, + 0xF2, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x3D, 0x17, 0x96, 0x03, 0x00, 0x09, 0x03, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x04, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC8, 0x00, 0x96, 0x0A, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x03, 0x01, 0x40, + 0x3C, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xF6, 0x08, 0x0A, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0xF6, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x09, 0x00, 0x08, + 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF9, 0x40, 0x4F, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, 0x4C, + 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, + 0x02, 0x00, 0x08, 0xF8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, + 0x3C, 0x00, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0xF8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x04, 0x01, + 0x52, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xF8, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x16, 0x52, 0x17, 0x99, 0x02, 0x00, 0x9C, 0xFF, 0x96, 0x02, + 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xFA, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xFA, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x3E, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x03, + 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x05, 0x01, 0x8E, 0x08, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, + 0x2A, 0x00, 0x08, 0xFA, 0x08, 0xFB, 0x05, 0x00, 0x08, 0xFC, 0x05, 0x00, 0x08, 0xFD, 0x05, 0x00, + 0x08, 0xFE, 0x05, 0x00, 0x08, 0xFF, 0x05, 0x00, 0x09, 0x00, 0x01, 0x05, 0x00, 0x09, 0x01, 0x01, + 0x05, 0x00, 0x09, 0x02, 0x01, 0x05, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x4F, 0x96, + 0x09, 0x00, 0x07, 0x03, 0x04, 0x00, 0x00, 0x02, 0x09, 0x03, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x03, - 0x00, 0x09, 0x07, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x02, + 0x00, 0x09, 0x09, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x04, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x96, 0x0A, 0x00, 0x08, - 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x07, 0x01, 0x40, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x1C, - 0x1C, 0x96, 0x05, 0x00, 0x09, 0x04, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x04, 0x01, - 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xF4, 0x08, 0x0A, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0xF4, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x05, 0x00, - 0x09, 0x05, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x05, 0x01, 0x4E, 0x4F, 0x96, 0x02, + 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x01, 0x40, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x1C, + 0x1C, 0x96, 0x05, 0x00, 0x09, 0x06, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x06, 0x01, + 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0xF6, 0x08, 0x0A, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0xF6, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x05, 0x00, + 0x09, 0x07, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x07, 0x01, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x98, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x98, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x05, 0x00, 0x09, 0x06, 0x01, 0x08, - 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x06, 0x01, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, - 0x3E, 0x4F, 0x96, 0x09, 0x00, 0x07, 0x03, 0x04, 0x00, 0x00, 0x02, 0x09, 0x07, 0x01, 0x1C, 0x96, + 0x98, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x05, 0x00, 0x09, 0x08, 0x01, 0x08, + 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x08, 0x01, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, + 0x3E, 0x4F, 0x96, 0x09, 0x00, 0x07, 0x03, 0x04, 0x00, 0x00, 0x02, 0x09, 0x09, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, - 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x08, 0x01, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x08, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x09, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3E, 0x00, 0x96, 0x14, 0x00, 0x09, 0x0A, 0x01, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x9C, 0x08, + 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x0A, 0x01, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x0A, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x0B, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x00, 0x96, 0x14, 0x00, 0x09, 0x0C, 0x01, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x9C, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x0A, 0x01, 0x3D, 0x17, 0x96, 0x02, + 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x0C, 0x01, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0x15, 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x08, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x09, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, + 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x0A, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x0B, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x0A, 0x00, - 0x09, 0x0B, 0x01, 0x07, 0x9C, 0x08, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x08, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x09, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, + 0x09, 0x0D, 0x01, 0x07, 0x9C, 0x08, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x0A, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x0B, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, - 0x00, 0x00, 0x00, 0x02, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x08, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x09, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, + 0x00, 0x00, 0x00, 0x02, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x0A, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x0B, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x08, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x0C, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x27, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x0A, 0x00, 0x09, 0x0D, - 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF7, 0x40, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x09, 0x0A, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x0E, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x27, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x0A, 0x00, 0x09, 0x0F, + 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0xF9, 0x40, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0x15, 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x4F, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x08, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x0C, 0x01, + 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x0A, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x0E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, - 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x0A, 0x00, 0x09, 0x0E, 0x01, 0x07, - 0x9D, 0x08, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x08, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x0C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, + 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x0A, 0x00, 0x09, 0x10, 0x01, 0x07, + 0x9D, 0x08, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x0A, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x0E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, - 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x08, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x0C, 0x01, + 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x0A, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x0E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x3D, 0x17, 0x96, 0x0B, 0x00, 0x09, 0x10, 0x01, 0x07, 0x98, 0x08, 0x00, 0x00, 0x09, 0x0F, + 0x00, 0x3D, 0x17, 0x96, 0x0B, 0x00, 0x09, 0x12, 0x01, 0x07, 0x98, 0x08, 0x00, 0x00, 0x09, 0x11, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, - 0x08, 0x02, 0x3D, 0x17, 0x96, 0x09, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, 0x09, 0x0F, 0x01, + 0x08, 0x02, 0x3D, 0x17, 0x96, 0x09, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, 0x09, 0x11, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, - 0x00, 0x3D, 0x17, 0x96, 0x03, 0x00, 0x09, 0x11, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9E, 0x8E, + 0x00, 0x3D, 0x17, 0x96, 0x03, 0x00, 0x09, 0x13, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9E, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x00, 0x2A, - 0x00, 0x96, 0x13, 0x00, 0x08, 0xF1, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x38, 0x08, 0x00, 0x00, - 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xF2, 0x1C, 0x96, - 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xF1, 0x3D, 0x3E, 0x4F, 0x96, 0x12, 0x00, 0x02, + 0x00, 0x96, 0x13, 0x00, 0x08, 0xF3, 0x07, 0xC8, 0x00, 0x00, 0x00, 0x07, 0x38, 0x08, 0x00, 0x00, + 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xF4, 0x1C, 0x96, + 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0xF3, 0x3D, 0x3E, 0x4F, 0x96, 0x12, 0x00, 0x02, 0x07, 0xC9, 0x00, 0x00, 0x00, 0x07, 0x38, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, - 0x01, 0x3D, 0x96, 0x0A, 0x00, 0x08, 0xC7, 0x07, 0x03, 0x00, 0x00, 0x00, 0x09, 0x11, 0x01, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x96, 0x0B, 0x00, 0x09, 0x12, 0x01, 0x07, 0x38, 0x08, - 0x00, 0x00, 0x09, 0x11, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, + 0x01, 0x3D, 0x96, 0x0A, 0x00, 0x08, 0xC7, 0x07, 0x03, 0x00, 0x00, 0x00, 0x09, 0x13, 0x01, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x96, 0x0B, 0x00, 0x09, 0x14, 0x01, 0x07, 0x38, 0x08, + 0x00, 0x00, 0x09, 0x13, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x09, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x09, 0x11, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x14, 0x00, 0x09, 0x13, 0x01, 0x07, 0x00, 0x00, + 0x02, 0x09, 0x13, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x14, 0x00, 0x09, 0x15, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x6F, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x1D, - 0x96, 0x10, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x09, 0x14, 0x01, 0x07, 0x6F, 0x00, 0x00, 0x00, - 0x09, 0x13, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, + 0x96, 0x10, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x09, 0x16, 0x01, 0x07, 0x6F, 0x00, 0x00, 0x00, + 0x09, 0x15, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x09, 0x00, 0x07, 0x03, 0x04, 0x00, 0x00, 0x02, 0x09, - 0x13, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, - 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x09, 0x15, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x1D, 0x96, 0x0B, 0x00, 0x09, 0x16, 0x01, 0x07, 0x58, 0x02, 0x00, 0x00, 0x09, 0x15, 0x01, + 0x15, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x09, 0x17, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x1D, 0x96, 0x0B, 0x00, 0x09, 0x18, 0x01, 0x07, 0x58, 0x02, 0x00, 0x00, 0x09, 0x17, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x03, 0x00, - 0x09, 0x15, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, + 0x09, 0x17, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x10, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x1B, 0x52, 0x17, 0x96, 0x09, 0x00, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02, 0x09, - 0x15, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, - 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x17, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x17, 0x01, 0x4E, 0x96, - 0x14, 0x00, 0x09, 0x18, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x66, 0x08, 0x00, 0x00, 0x07, + 0x17, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, + 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x19, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x19, 0x01, 0x4E, 0x96, + 0x14, 0x00, 0x09, 0x1A, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x66, 0x08, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x19, 0x01, 0x07, 0x66, 0x08, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x17, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x18, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, - 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x09, 0x1A, 0x01, - 0x07, 0x66, 0x08, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x17, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x18, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, - 0x3D, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x1B, 0x01, 0x07, 0x66, 0x08, - 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x17, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x18, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, - 0x05, 0x00, 0x09, 0x1C, 0x01, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x17, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x18, 0x01, 0x4E, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x1D, 0x01, 0x1C, 0x96, 0x02, + 0x09, 0x1B, 0x01, 0x07, 0x66, 0x08, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x19, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x1A, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, + 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x09, 0x1C, 0x01, + 0x07, 0x66, 0x08, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x19, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x1A, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, + 0x3D, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x0A, 0x00, 0x00, 0x00, 0x09, 0x1D, 0x01, 0x07, 0x66, 0x08, + 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x19, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x1A, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, + 0x05, 0x00, 0x09, 0x1E, 0x01, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x19, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x1A, 0x01, 0x4E, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x1F, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x50, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x72, 0x63, 0x00, 0x24, 0x00, 0x96, 0x02, 0x00, 0x08, 0x52, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x67, 0x40, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, - 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x1E, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x0B, - 0x00, 0x09, 0x1F, 0x01, 0x07, 0x90, 0x01, 0x00, 0x00, 0x09, 0x1D, 0x01, 0x1C, 0x96, 0x02, 0x00, + 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x0B, + 0x00, 0x09, 0x21, 0x01, 0x07, 0x90, 0x01, 0x00, 0x00, 0x09, 0x1F, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, - 0x09, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, 0x09, 0x1D, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x09, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x02, 0x09, 0x1F, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x02, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x20, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x21, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x96, - 0x03, 0x00, 0x09, 0x22, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x96, 0x05, 0x00, 0x07, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x22, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, + 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x23, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x96, + 0x03, 0x00, 0x09, 0x24, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x49, 0x9D, 0x02, 0x00, 0x38, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, - 0x96, 0x05, 0x00, 0x08, 0x13, 0x09, 0x22, 0x01, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x23, 0x01, 0x09, - 0x22, 0x01, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x4E, 0x4F, 0x99, 0x02, 0x00, + 0x96, 0x05, 0x00, 0x08, 0x13, 0x09, 0x24, 0x01, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x25, 0x01, 0x09, + 0x24, 0x01, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x4E, 0x4F, 0x99, 0x02, 0x00, 0x23, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0x13, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x23, 0x01, 0x07, + 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x25, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x24, 0x01, + 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x26, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x62, 0x00, 0x21, - 0x00, 0x96, 0x03, 0x00, 0x09, 0x26, 0x01, 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x25, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x27, 0x01, 0x52, 0x96, 0x02, 0x00, 0x08, 0x19, - 0x4E, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x28, 0x01, 0x8E, 0x15, 0x00, + 0x00, 0x96, 0x03, 0x00, 0x09, 0x28, 0x01, 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, + 0x09, 0x27, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x52, 0x96, 0x02, 0x00, 0x08, 0x19, + 0x4E, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x2A, 0x01, 0x8E, 0x15, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x62, 0x00, 0x00, 0x76, 0x61, 0x6C, - 0x75, 0x65, 0x00, 0x7F, 0x00, 0x96, 0x03, 0x00, 0x09, 0x26, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x26, 0x01, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x0B, 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x26, 0x01, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x25, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x26, 0x01, + 0x75, 0x65, 0x00, 0x7F, 0x00, 0x96, 0x03, 0x00, 0x09, 0x28, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x27, 0x01, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x28, 0x01, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x0B, 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x28, 0x01, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x27, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x28, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, 0x0C, 0x47, 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x21, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x2A, 0x01, 0x8E, + 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x23, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x2C, 0x01, 0x8E, 0x17, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x00, 0x00, 0x61, 0x6E, 0x67, 0x6C, 0x65, 0x00, 0x5C, 0x00, 0x96, 0x02, 0x00, 0x08, 0x19, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x2C, 0x01, 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x2B, - 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x2E, 0x01, 0x52, 0x0C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x2C, 0x01, 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, - 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x2D, 0x01, 0x52, 0x0C, 0x96, 0x07, 0x00, 0x07, 0x02, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x21, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x01, 0x00, 0x02, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x09, 0x2E, 0x01, 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x2D, + 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x30, 0x01, 0x52, 0x0C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x2E, 0x01, 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, + 0x2D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x2F, 0x01, 0x52, 0x0C, 0x96, 0x07, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x23, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x01, 0x00, 0x02, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0C, 0x96, 0x02, - 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x0C, 0x47, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, - 0x00, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x2F, 0x01, 0x52, 0x3E, 0x96, 0x09, - 0x00, 0x08, 0x19, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, + 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x0C, 0x47, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, + 0x00, 0x00, 0x09, 0x2D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x31, 0x01, 0x52, 0x3E, 0x96, 0x09, + 0x00, 0x08, 0x19, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x30, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x32, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x00, 0x50, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x31, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x23, 0x01, 0x4E, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x31, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x47, 0x96, 0x07, - 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x32, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x33, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, + 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x33, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x25, 0x01, 0x4E, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x33, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x47, 0x96, 0x07, + 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x34, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x33, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x07, 0x00, - 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x21, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x33, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x00, 0x68, 0x00, 0x96, 0x03, 0x00, 0x09, 0x31, 0x01, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x21, 0x01, 0x4E, 0x54, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x06, 0x00, 0x96, 0x02, 0x00, - 0x05, 0x00, 0x3E, 0x96, 0x03, 0x00, 0x09, 0x31, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, + 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x23, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x35, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x00, 0x68, 0x00, 0x96, 0x03, 0x00, 0x09, 0x33, 0x01, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x23, 0x01, 0x4E, 0x54, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x06, 0x00, 0x96, 0x02, 0x00, + 0x05, 0x00, 0x3E, 0x96, 0x03, 0x00, 0x09, 0x33, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x49, 0x4C, 0x12, 0x9D, - 0x02, 0x00, 0x1D, 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x31, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, - 0x49, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x34, 0x01, 0x8E, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x65, 0x6E, + 0x02, 0x00, 0x1D, 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x33, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, + 0x49, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x36, 0x01, 0x8E, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x65, 0x6E, 0x67, 0x74, 0x68, 0x00, 0x71, 0x00, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x05, 0x00, 0x96, - 0x01, 0x00, 0x03, 0x3E, 0x96, 0x05, 0x00, 0x09, 0x35, 0x01, 0x08, 0x19, 0x1C, 0x96, 0x02, 0x00, + 0x01, 0x00, 0x03, 0x3E, 0x96, 0x05, 0x00, 0x09, 0x37, 0x01, 0x08, 0x19, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x0D, 0x3C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x13, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x35, 0x01, 0x1C, 0x0C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, - 0x00, 0x09, 0x23, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x35, 0x01, 0x1C, 0x0C, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x27, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x09, 0x37, 0x01, 0x1C, 0x0C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, + 0x00, 0x09, 0x25, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x37, 0x01, 0x1C, 0x0C, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x00, 0x50, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x31, 0x01, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x23, 0x01, 0x4E, 0x0B, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x31, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, - 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x36, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x02, + 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x33, 0x01, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x25, 0x01, 0x4E, 0x0B, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x33, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, + 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x53, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, + 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x38, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x79, 0x00, 0x39, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x13, 0x1C, 0x47, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, - 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x1C, 0x47, 0x96, 0x03, 0x00, - 0x09, 0x23, 0x01, 0x4D, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x1C, 0x47, 0x96, 0x03, 0x00, + 0x09, 0x25, 0x01, 0x4D, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, - 0x96, 0x05, 0x00, 0x09, 0x37, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x47, - 0x96, 0x03, 0x00, 0x09, 0x38, 0x01, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x23, 0x01, 0x4E, 0x47, 0x96, 0x03, 0x00, 0x09, 0x39, 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, + 0x96, 0x05, 0x00, 0x09, 0x39, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x47, + 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x25, 0x01, 0x4E, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3B, 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x8E, 0x1D, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x79, 0x00, 0x00, 0x77, 0x69, 0x64, 0x74, 0x68, 0x00, 0x00, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x00, 0x75, - 0x00, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x96, 0x05, + 0x00, 0x96, 0x03, 0x00, 0x09, 0x24, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x49, 0x9D, 0x02, 0x00, 0x47, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x04, 0x00, 0x08, 0x13, 0x08, 0x13, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x06, 0x00, 0x09, 0x23, 0x01, 0x09, 0x23, 0x01, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3C, 0x01, 0x09, 0x3C, 0x01, 0x1C, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3D, 0x01, 0x09, 0x3D, 0x01, 0x1C, 0x4F, 0x99, 0x02, + 0x1C, 0x96, 0x06, 0x00, 0x09, 0x25, 0x01, 0x09, 0x25, 0x01, 0x1C, 0x4F, 0x96, 0x02, 0x00, 0x08, + 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3E, 0x01, 0x09, 0x3E, 0x01, 0x1C, 0x4F, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3F, 0x01, 0x09, 0x3F, 0x01, 0x1C, 0x4F, 0x99, 0x02, 0x00, 0x13, 0x00, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x3B, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x32, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, + 0x00, 0x09, 0x3D, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x34, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x53, 0x3E, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0F, 0x8E, - 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x96, 0x05, 0x00, 0x09, 0x37, 0x01, - 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x47, 0x96, 0x03, 0x00, 0x09, 0x38, 0x01, - 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x47, 0x96, - 0x03, 0x00, 0x09, 0x3E, 0x01, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x3C, 0x01, 0x4E, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x96, 0x03, 0x00, 0x09, 0x39, 0x01, 0x47, - 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x33, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x65, 0x63, 0x74, - 0x00, 0xAB, 0x00, 0x96, 0x03, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x54, 0x4C, + 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x53, 0x3E, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0F, 0x8E, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x96, 0x05, 0x00, 0x09, 0x39, 0x01, + 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, + 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x47, 0x96, + 0x03, 0x00, 0x09, 0x40, 0x01, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x3E, 0x01, 0x4E, 0x47, 0x96, 0x03, 0x00, 0x09, 0x41, 0x01, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3B, 0x01, 0x47, + 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x35, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x65, 0x63, 0x74, + 0x00, 0xAB, 0x00, 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x54, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x1B, 0x00, 0x17, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, + 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x49, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x1D, 0x00, 0x17, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x23, 0x01, 0x4E, 0x49, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x1D, 0x00, 0x17, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x40, 0x01, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x49, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x1D, 0x00, - 0x17, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x49, 0x3E, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x41, 0x01, 0x8E, + 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x25, 0x01, 0x4E, 0x49, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x1D, 0x00, 0x17, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x49, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x1D, 0x00, + 0x17, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x49, 0x3E, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x43, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x79, 0x00, 0x87, 0x00, 0x96, 0x02, 0x00, 0x08, 0x13, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x17, 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, - 0x23, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, + 0x25, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x22, 0x00, 0x17, 0x96, 0x02, 0x00, 0x08, 0x13, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x47, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, - 0x24, 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x48, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x70, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0xA3, 0x00, 0x96, 0x03, 0x00, 0x09, 0x43, 0x01, + 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, + 0x24, 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x48, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x44, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x70, 0x6F, 0x69, 0x6E, 0x74, 0x00, 0xA3, 0x00, 0x96, 0x03, 0x00, 0x09, 0x45, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x1E, 0x00, 0x17, 0x96, 0x03, 0x00, - 0x09, 0x43, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x29, - 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x43, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, + 0x09, 0x45, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x29, + 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x45, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x47, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x2B, - 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x43, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x48, 0x3E, 0x4F, 0x96, 0x02, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, - 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x44, 0x01, 0x8E, 0x0E, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x2B, + 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x45, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, + 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x48, 0x3E, 0x4F, 0x96, 0x02, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, + 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x46, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x65, 0x63, 0x74, 0x00, 0x63, 0x01, 0x96, - 0x05, 0x00, 0x09, 0x45, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, - 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x47, 0x3C, 0x96, 0x05, 0x00, - 0x09, 0x46, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x3C, 0x96, 0x06, 0x00, 0x09, - 0x47, 0x01, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x47, 0x3C, 0x96, 0x06, 0x00, 0x09, - 0x48, 0x01, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x3C, 0x96, 0x03, 0x00, - 0x09, 0x40, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x05, 0x00, 0x09, 0x47, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, + 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x3C, 0x96, 0x05, 0x00, + 0x09, 0x48, 0x01, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x3C, 0x96, 0x06, 0x00, 0x09, + 0x49, 0x01, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x3C, 0x96, 0x06, 0x00, 0x09, + 0x4A, 0x01, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x3C, 0x96, 0x03, 0x00, + 0x09, 0x42, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x16, 0x00, 0x17, - 0x96, 0x03, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x45, 0x01, 0x1C, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x1E, 0x00, 0x17, 0x96, 0x03, 0x00, - 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x17, - 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x46, 0x01, 0x1C, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x15, 0x00, 0x17, + 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x47, 0x01, 0x1C, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x1E, 0x00, 0x17, 0x96, 0x03, 0x00, + 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x17, + 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x48, 0x01, 0x1C, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x15, 0x00, 0x17, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x47, 0x01, 0x1C, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x11, 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, - 0x45, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x47, 0x01, 0x1C, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, - 0x00, 0x16, 0x00, 0x17, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x48, 0x01, 0x1C, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x11, 0x00, - 0x17, 0x96, 0x03, 0x00, 0x09, 0x46, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x48, 0x01, 0x1C, 0x48, - 0x12, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x49, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x96, 0x07, - 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, + 0x49, 0x01, 0x1C, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x11, 0x00, 0x17, 0x96, 0x03, 0x00, 0x09, + 0x47, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x49, 0x01, 0x1C, 0x48, 0x12, 0x4C, 0x12, 0x9D, 0x02, + 0x00, 0x16, 0x00, 0x17, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x4A, 0x01, 0x1C, 0x48, 0x4C, 0x12, 0x9D, 0x02, 0x00, 0x11, 0x00, + 0x17, 0x96, 0x03, 0x00, 0x09, 0x48, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4A, 0x01, 0x1C, 0x48, + 0x12, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x4B, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x96, 0x07, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x48, 0x12, 0x4C, 0x9D, 0x02, 0x00, 0x15, 0x00, 0x17, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x48, 0x12, 0x3E, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3B, 0x01, 0x8E, + 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x48, 0x12, 0x3E, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x08, 0x13, 0x07, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x08, 0x00, 0x09, 0x23, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x3C, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x3D, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x4A, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x65, 0x63, 0x74, - 0x00, 0xF4, 0x01, 0x96, 0x0A, 0x00, 0x09, 0x4B, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x53, 0x3C, - 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x49, + 0x1C, 0x96, 0x08, 0x00, 0x09, 0x25, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x3E, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x3F, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x4C, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x65, 0x63, 0x74, + 0x00, 0xF4, 0x01, 0x96, 0x0A, 0x00, 0x09, 0x4D, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x53, 0x3C, + 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4B, 0x01, 0x52, 0x4C, 0x9D, 0x02, 0x00, 0x14, 0x00, 0x17, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x49, 0x01, 0x52, 0x12, 0x9D, 0x02, 0x00, - 0x1C, 0x00, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x3B, 0x01, 0x52, 0x17, 0x96, 0x03, 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x3E, 0x96, 0x03, - 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x96, 0x05, 0x00, 0x08, 0x13, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x02, + 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4B, 0x01, 0x52, 0x12, 0x9D, 0x02, 0x00, + 0x1C, 0x00, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x3D, 0x01, 0x52, 0x17, 0x96, 0x03, 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x3E, 0x96, 0x03, + 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x96, 0x05, 0x00, 0x08, 0x13, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, - 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x4C, 0x01, 0x52, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x23, - 0x01, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, - 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4C, 0x01, 0x52, 0x4F, 0x96, 0x03, 0x00, - 0x09, 0x4B, 0x01, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3C, 0x01, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, + 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x4E, 0x01, 0x52, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x25, + 0x01, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, + 0x00, 0x09, 0x2D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4E, 0x01, 0x52, 0x4F, 0x96, 0x03, 0x00, + 0x09, 0x4D, 0x01, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3E, 0x01, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x47, 0x96, 0x08, 0x00, - 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4D, 0x01, 0x52, - 0x96, 0x03, 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, 0x4F, 0x96, - 0x03, 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3D, 0x01, 0x09, 0x40, 0x01, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, - 0x47, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x4D, 0x01, 0x52, 0x96, 0x03, 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, - 0x01, 0x4E, 0x0B, 0x4F, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x01, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x48, 0x12, 0x4C, 0x9D, 0x02, 0x00, 0x16, 0x00, 0x17, - 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x3D, 0x01, 0x4E, 0x48, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x14, 0x00, 0x96, 0x08, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3B, 0x01, 0x52, 0x17, 0x96, - 0x03, 0x00, 0x09, 0x4B, 0x01, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x4E, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x96, 0x08, 0x00, + 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4F, 0x01, 0x52, + 0x96, 0x03, 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, 0x4F, 0x96, + 0x03, 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3F, 0x01, 0x09, 0x42, 0x01, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, + 0x47, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2D, 0x01, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x4F, 0x01, 0x52, 0x96, 0x03, 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, + 0x01, 0x4E, 0x0B, 0x4F, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4D, 0x01, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x48, 0x12, 0x4C, 0x9D, 0x02, 0x00, 0x16, 0x00, 0x17, + 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x3F, 0x01, 0x4E, 0x48, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x14, 0x00, 0x96, 0x08, 0x00, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x52, 0x17, 0x96, + 0x03, 0x00, 0x09, 0x4D, 0x01, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x50, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x65, 0x63, 0x74, 0x00, 0x27, 0x00, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x4A, 0x01, 0x52, 0x96, 0x03, 0x00, 0x09, 0x49, 0x01, 0x52, 0x12, 0x3E, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x4F, + 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x4C, 0x01, 0x52, 0x96, 0x03, 0x00, 0x09, 0x4B, 0x01, 0x52, 0x12, 0x3E, + 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x51, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x65, 0x63, 0x74, 0x00, 0xB3, 0x01, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x49, 0x01, 0x52, 0x12, 0x9D, 0x02, 0x00, 0x14, 0x00, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x32, 0x01, 0x52, 0x3E, 0x96, 0x08, - 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x49, 0x01, + 0x09, 0x4B, 0x01, 0x52, 0x12, 0x9D, 0x02, 0x00, 0x14, 0x00, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x34, 0x01, 0x52, 0x3E, 0x96, 0x08, + 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4B, 0x01, 0x52, 0x12, 0x9D, 0x02, 0x00, 0x13, 0x00, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x32, 0x01, 0x52, 0x3E, 0x96, 0x0A, 0x00, 0x09, 0x4F, 0x01, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x3A, 0x01, 0x53, 0x3C, 0x96, 0x03, 0x00, 0x09, 0x4F, 0x01, 0x1C, 0x96, 0x05, - 0x00, 0x08, 0x13, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, + 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x34, 0x01, 0x52, 0x3E, 0x96, 0x0A, 0x00, 0x09, 0x51, 0x01, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x3C, 0x01, 0x53, 0x3C, 0x96, 0x03, 0x00, 0x09, 0x51, 0x01, 0x1C, 0x96, 0x05, + 0x00, 0x08, 0x13, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, - 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4D, 0x01, 0x52, 0x4F, 0x96, 0x03, 0x00, - 0x09, 0x4F, 0x01, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x23, 0x01, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, - 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x4D, 0x01, 0x52, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x4F, 0x01, 0x1C, 0x96, 0x06, 0x00, - 0x09, 0x3C, 0x01, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x47, 0x96, 0x02, 0x00, 0x08, + 0x00, 0x09, 0x2D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4F, 0x01, 0x52, 0x4F, 0x96, 0x03, 0x00, + 0x09, 0x51, 0x01, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x25, 0x01, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, + 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2D, 0x01, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x4F, 0x01, 0x52, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x51, 0x01, 0x1C, 0x96, 0x06, 0x00, + 0x09, 0x3E, 0x01, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x47, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2B, - 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4C, 0x01, 0x52, 0x96, 0x03, 0x00, 0x09, 0x4F, 0x01, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x4F, 0x01, 0x1C, 0x96, - 0x06, 0x00, 0x09, 0x3D, 0x01, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x40, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, - 0x00, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4C, 0x01, 0x52, 0x96, 0x03, 0x00, - 0x09, 0x4F, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x0B, 0x4F, 0x96, 0x03, 0x00, - 0x09, 0x4F, 0x01, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x36, 0x01, 0x8E, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x2D, + 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4E, 0x01, 0x52, 0x96, 0x03, 0x00, 0x09, 0x51, 0x01, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x51, 0x01, 0x1C, 0x96, + 0x06, 0x00, 0x09, 0x3F, 0x01, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x42, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, + 0x00, 0x00, 0x09, 0x2D, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x4E, 0x01, 0x52, 0x96, 0x03, 0x00, + 0x09, 0x51, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x0B, 0x4F, 0x96, 0x03, 0x00, + 0x09, 0x51, 0x01, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x38, 0x01, 0x8E, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x78, 0x00, 0x00, 0x64, 0x79, 0x00, 0x3A, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, - 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x50, 0x01, 0x1C, 0x47, 0x96, 0x02, + 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x52, 0x01, 0x1C, 0x47, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, - 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x51, 0x01, 0x1C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x23, - 0x01, 0x4D, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x52, 0x01, 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, + 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x53, 0x01, 0x1C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x25, + 0x01, 0x4D, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x54, 0x01, 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x47, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x53, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x47, 0x96, 0x02, 0x00, - 0x08, 0x13, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x23, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x53, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, - 0x47, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4D, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, - 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x54, 0x01, 0x8E, 0x10, 0x00, 0x00, 0x02, 0x00, + 0x03, 0x00, 0x09, 0x55, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x47, 0x96, 0x02, 0x00, + 0x08, 0x13, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x25, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x55, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, + 0x47, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4D, 0x4F, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, + 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x56, 0x01, 0x8E, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x78, 0x00, 0x00, 0x64, 0x79, 0x00, 0x82, 0x00, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x50, 0x01, + 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x52, 0x01, 0x1C, 0x0B, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, - 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, - 0x50, 0x01, 0x1C, 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x51, - 0x01, 0x1C, 0x0B, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, - 0x00, 0x09, 0x51, 0x01, 0x1C, 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4D, 0x4F, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x55, 0x01, + 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, + 0x52, 0x01, 0x1C, 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x53, + 0x01, 0x1C, 0x0B, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, + 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x02, 0x00, 0x00, + 0x00, 0x09, 0x53, 0x01, 0x1C, 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4D, 0x4F, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x57, 0x01, 0x8E, 0x0B, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x9C, 0x00, 0x96, 0x02, - 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x53, + 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x55, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4D, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x08, - 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x53, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, - 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, - 0x4C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x53, 0x01, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x0B, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4D, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x96, 0x08, 0x00, - 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x53, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, - 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4D, 0x4F, 0x4F, 0x8E, 0x0E, 0x00, 0x00, 0x01, + 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x96, 0x08, + 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x55, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, + 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x4C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x55, 0x01, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x0B, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4D, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x96, 0x08, 0x00, + 0x07, 0x02, 0x00, 0x00, 0x00, 0x09, 0x55, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, + 0x0C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4D, 0x4F, 0x4F, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x65, 0x66, 0x74, 0x00, 0x3B, 0x00, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x56, 0x01, 0x1C, 0x0B, 0x47, 0x96, - 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, 0x00, - 0x08, 0x13, 0x09, 0x56, 0x01, 0x1C, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x58, 0x01, 0x1C, 0x0B, 0x47, 0x96, + 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, 0x00, + 0x08, 0x13, 0x09, 0x58, 0x01, 0x1C, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x3E, 0x96, - 0x0A, 0x00, 0x09, 0x56, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x0A, 0x00, 0x09, 0x58, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x69, 0x67, 0x68, 0x74, 0x00, 0x1E, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, - 0x96, 0x06, 0x00, 0x09, 0x3C, 0x01, 0x09, 0x57, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x06, 0x00, 0x09, 0x3E, 0x01, 0x09, 0x59, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x47, 0x3E, 0x96, 0x0A, - 0x00, 0x09, 0x57, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x3E, 0x96, 0x0A, + 0x00, 0x09, 0x59, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x6F, 0x70, 0x00, 0x3D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, - 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x58, 0x01, 0x1C, 0x0B, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3D, - 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x23, 0x01, 0x09, - 0x58, 0x01, 0x1C, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x3E, 0x96, 0x0A, 0x00, - 0x09, 0x58, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, + 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5A, 0x01, 0x1C, 0x0B, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3F, + 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x25, 0x01, 0x09, + 0x5A, 0x01, 0x1C, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x3E, 0x96, 0x0A, 0x00, + 0x09, 0x5A, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x8E, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x00, 0x1F, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, - 0x06, 0x00, 0x09, 0x3D, 0x01, 0x09, 0x59, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x0B, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x1C, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x3E, 0x96, - 0x0A, 0x00, 0x09, 0x59, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, + 0x06, 0x00, 0x09, 0x3F, 0x01, 0x09, 0x5B, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x0B, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1C, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, + 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x3E, 0x96, + 0x0A, 0x00, 0x09, 0x5B, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x8E, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x6F, 0x70, 0x4C, 0x65, 0x66, 0x74, 0x00, 0x92, 0x00, 0x96, 0x02, 0x00, 0x08, - 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5A, 0x01, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x13, 0x4E, 0x0B, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5A, 0x01, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x0B, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4D, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, 0x00, 0x08, 0x13, 0x09, 0x5A, 0x01, 0x1C, 0x96, + 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x13, 0x4E, 0x0B, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4D, 0x4F, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x4C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x0B, 0x47, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4D, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, 0x00, 0x08, 0x13, 0x09, 0x5C, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, - 0x23, 0x01, 0x09, 0x5A, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x4F, 0x8E, 0x08, + 0x25, 0x01, 0x09, 0x5C, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x53, 0x3E, 0x96, 0x0A, 0x00, 0x09, - 0x5A, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, + 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x53, 0x3E, 0x96, 0x0A, 0x00, 0x09, + 0x5C, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x8E, 0x15, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x6F, 0x74, 0x74, 0x6F, 0x6D, 0x52, 0x69, 0x67, 0x68, 0x74, 0x00, 0x4A, 0x00, 0x96, 0x02, 0x00, - 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3C, 0x01, 0x09, 0x5B, 0x01, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3E, 0x01, 0x09, 0x5D, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x0B, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3D, 0x01, 0x09, 0x5B, 0x01, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x23, 0x01, 0x4E, 0x0B, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x4F, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, 0x47, 0x96, 0x02, 0x00, + 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x06, 0x00, 0x09, 0x3F, 0x01, 0x09, 0x5D, 0x01, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x25, 0x01, 0x4E, 0x0B, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4F, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x96, + 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, 0x47, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x47, 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x21, 0x01, 0x53, - 0x3E, 0x96, 0x0A, 0x00, 0x09, 0x5B, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, 0x01, 0x4E, 0x96, 0x02, 0x00, + 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x47, 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, + 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x53, + 0x3E, 0x96, 0x0A, 0x00, 0x09, 0x5D, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x69, 0x7A, 0x65, 0x00, 0x2D, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, - 0x1C, 0x96, 0x05, 0x00, 0x09, 0x3C, 0x01, 0x08, 0xE4, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, 0x00, 0x09, 0x3D, 0x01, 0x08, 0xE4, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x23, 0x01, 0x4E, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x34, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3D, 0x01, 0x4E, - 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x07, 0x00, - 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x21, 0x01, 0x53, 0x3E, 0x96, 0x09, 0x00, 0x08, 0xE4, 0x07, 0x03, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3A, + 0x1C, 0x96, 0x05, 0x00, 0x09, 0x3E, 0x01, 0x08, 0xE4, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x13, 0x4E, + 0x4F, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x05, 0x00, 0x09, 0x3F, 0x01, 0x08, 0xE4, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, 0x4E, 0x4F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x34, 0x00, 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3F, 0x01, 0x4E, + 0x96, 0x02, 0x00, 0x08, 0x0A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x3E, 0x01, 0x4E, 0x96, 0x07, 0x00, + 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x23, 0x01, 0x53, 0x3E, 0x96, 0x09, 0x00, 0x08, 0xE4, 0x07, 0x03, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x3C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x07, 0x52, 0x17, 0x96, - 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x5C, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, + 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x5E, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x5D, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, - 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, - 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x32, 0x01, 0x8E, 0x08, 0x00, + 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x5F, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, + 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5E, 0x01, + 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x34, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x5E, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5F, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x09, 0x60, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x61, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, - 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x60, 0x01, - 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x61, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, + 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x62, 0x01, + 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x5E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x63, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x62, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, - 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x63, 0x01, 0x8E, 0x08, + 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x64, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5E, + 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x65, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x64, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x4E, 0x96, 0x02, 0x00, - 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x65, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x96, 0x03, 0x00, 0x09, 0x66, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5E, 0x01, 0x4E, 0x96, 0x02, 0x00, + 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x67, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, - 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x66, - 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x67, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, + 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x68, + 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x69, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x68, 0x01, 0x52, 0x17, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x5C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x69, 0x01, 0x8E, + 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x6A, 0x01, 0x52, 0x17, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x5E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x6B, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x6A, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x4E, 0x96, 0x02, - 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x6B, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x6C, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5E, 0x01, 0x4E, 0x96, 0x02, + 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x6D, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x6C, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x6D, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, + 0x6E, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x6F, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x6E, 0x01, 0x52, 0x17, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x5C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x6F, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x70, 0x01, 0x52, 0x17, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x5E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x71, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x70, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x4E, 0x96, - 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x71, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, + 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x72, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5E, 0x01, 0x4E, 0x96, + 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x73, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x72, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x09, 0x74, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x5E, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x73, 0x01, 0x52, 0x17, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x14, 0x00, - 0x09, 0x74, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x51, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x75, 0x01, 0x52, 0x17, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x14, 0x00, + 0x09, 0x76, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x51, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x74, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x76, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0F, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x75, 0x01, 0x52, 0x17, 0x4F, - 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x76, 0x01, 0x07, 0x51, 0x04, 0x00, 0x00, - 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x74, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x77, 0x01, 0x52, 0x17, 0x4F, + 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x78, 0x01, 0x07, 0x51, 0x04, 0x00, 0x00, + 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x76, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, - 0x02, 0x3D, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x65, 0x00, 0x00, 0x00, 0x09, 0x77, 0x01, 0x07, 0x51, - 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x74, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, + 0x02, 0x3D, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x65, 0x00, 0x00, 0x00, 0x09, 0x79, 0x01, 0x07, 0x51, + 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x76, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x20, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0x78, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x52, + 0x22, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0x7A, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x52, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x0F, 0x00, 0x07, - 0x65, 0x00, 0x00, 0x00, 0x09, 0x79, 0x01, 0x07, 0x52, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x20, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x78, 0x01, 0x4E, 0x96, 0x02, 0x00, + 0x65, 0x00, 0x00, 0x00, 0x09, 0x7B, 0x01, 0x07, 0x52, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x22, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7A, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x07, 0x00, 0x08, 0xD1, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, 0x96, 0x14, 0x00, - 0x09, 0x7A, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x4C, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, + 0x09, 0x7C, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x4C, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0xD1, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7A, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x09, 0x7B, 0x01, 0x07, + 0xD1, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7C, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x09, 0x7D, 0x01, 0x07, 0x01, 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7A, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x09, 0x7C, 0x01, 0x07, 0x02, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7C, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x09, 0x7E, 0x01, 0x07, 0x02, 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x7A, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x09, 0x7D, 0x01, 0x07, 0x04, 0x00, + 0x96, 0x03, 0x00, 0x09, 0x7C, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x09, 0x7F, 0x01, 0x07, 0x04, 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x7A, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x09, 0x7E, 0x01, 0x07, 0x08, 0x00, 0x00, - 0x00, 0x4F, 0x96, 0x0F, 0x00, 0x07, 0x28, 0x00, 0x00, 0x00, 0x09, 0x7F, 0x01, 0x07, 0x4C, 0x04, - 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7A, + 0x03, 0x00, 0x09, 0x7C, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x09, 0x80, 0x01, 0x07, 0x08, 0x00, 0x00, + 0x00, 0x4F, 0x96, 0x0F, 0x00, 0x07, 0x28, 0x00, 0x00, 0x00, 0x09, 0x81, 0x01, 0x07, 0x4C, 0x04, + 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7C, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x0F, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x80, 0x01, 0x07, 0x4C, 0x04, 0x00, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7A, 0x01, 0x4E, 0x96, 0x02, + 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x82, 0x01, 0x07, 0x4C, 0x04, 0x00, 0x00, 0x08, 0x04, + 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, - 0x96, 0x0F, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x09, 0x81, 0x01, 0x07, 0x4C, 0x04, 0x00, 0x00, - 0x08, 0x04, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7A, 0x01, 0x4E, + 0x96, 0x0F, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x09, 0x83, 0x01, 0x07, 0x4C, 0x04, 0x00, 0x00, + 0x08, 0x04, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xD1, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x7C, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, - 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x82, 0x01, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x8E, 0x20, + 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0x84, 0x01, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x86, 0x01, 0x8E, 0x20, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x61, 0x6D, 0x65, 0x00, 0x00, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x00, 0x00, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x00, 0xC7, 0x00, 0x96, 0x02, 0x00, 0x08, 0x9A, 0x1C, 0x12, 0x4C, 0x9D, 0x02, 0x00, 0x1D, 0x00, 0x17, 0x96, - 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x06, + 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x87, 0x01, 0x4E, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x06, 0x00, 0x96, 0x02, 0x00, 0x05, 0x00, 0x3E, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x86, 0x01, 0x52, 0x17, 0x8E, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, 0x52, 0x17, 0x8E, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x00, 0x35, 0x00, 0x96, 0x03, 0x00, 0x09, - 0x88, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x87, 0x01, 0x1C, - 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x89, 0x01, 0x52, + 0x8A, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x9A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x89, 0x01, 0x1C, + 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x8B, 0x01, 0x52, 0x3E, 0x96, 0x02, 0x00, 0x08, 0x0E, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x8A, 0x01, 0x52, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x8B, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x61, 0x6D, - 0x65, 0x00, 0xF6, 0x02, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x12, + 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x8C, 0x01, 0x52, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x8D, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0x61, 0x6D, + 0x65, 0x00, 0xF6, 0x02, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x87, 0x01, 0x4E, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x05, 0x00, 0x96, 0x01, 0x00, 0x02, 0x3E, 0x96, 0x07, 0x00, 0x07, 0x00, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x86, 0x01, 0x52, 0x17, 0x96, 0x06, 0x00, 0x09, - 0x88, 0x01, 0x09, 0x8C, 0x01, 0x3C, 0x96, 0x0A, 0x00, 0x09, 0x8E, 0x01, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x8D, 0x01, 0x52, 0x3C, 0x96, 0x03, 0x00, 0x09, 0x8E, 0x01, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, 0x52, 0x17, 0x96, 0x06, 0x00, 0x09, + 0x8A, 0x01, 0x09, 0x8E, 0x01, 0x3C, 0x96, 0x0A, 0x00, 0x09, 0x90, 0x01, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x8F, 0x01, 0x52, 0x3C, 0x96, 0x03, 0x00, 0x09, 0x90, 0x01, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x12, 0x9D, 0x02, 0x00, 0x18, 0x00, 0x96, 0x03, 0x00, - 0x09, 0x88, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x8E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x8F, 0x01, 0x47, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, 0x4C, 0x1C, 0x96, 0x05, 0x00, - 0x09, 0x90, 0x01, 0x08, 0x0E, 0x1C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x91, 0x01, 0x47, 0x47, 0x1D, + 0x09, 0x8A, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x90, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x91, 0x01, 0x47, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x8A, 0x01, 0x4C, 0x1C, 0x96, 0x05, 0x00, + 0x09, 0x92, 0x01, 0x08, 0x0E, 0x1C, 0x47, 0x96, 0x03, 0x00, 0x09, 0x93, 0x01, 0x47, 0x47, 0x1D, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x01, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x22, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, + 0x03, 0x00, 0x09, 0x24, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x5F, 0x00, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x18, 0x1C, 0x48, 0x12, - 0x9D, 0x02, 0x00, 0x10, 0x00, 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x92, 0x01, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x22, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x93, 0x01, 0x52, 0x47, 0x1D, 0x99, 0x02, 0x00, - 0x7E, 0xFF, 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x94, 0x01, - 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x8E, 0x01, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x12, - 0x9D, 0x02, 0x00, 0x10, 0x00, 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x39, 0x01, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x95, 0x01, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x8E, 0x01, 0x1C, 0x96, 0x01, 0x00, 0x02, - 0x49, 0x12, 0x9D, 0x02, 0x00, 0x15, 0x00, 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, 0x4C, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x97, 0x01, 0x47, 0x1D, 0x99, 0x02, 0x00, 0x18, 0x00, 0x96, 0x03, 0x00, 0x09, - 0x88, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x8E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x96, - 0x01, 0x47, 0x47, 0x1D, 0x96, 0x05, 0x00, 0x08, 0xEA, 0x09, 0x88, 0x01, 0x1C, 0x96, 0x07, 0x00, - 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x98, 0x01, 0x52, 0x3C, 0x96, 0x02, + 0x9D, 0x02, 0x00, 0x10, 0x00, 0x96, 0x03, 0x00, 0x09, 0x8A, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x94, 0x01, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x8A, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x24, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x95, 0x01, 0x52, 0x47, 0x1D, 0x99, 0x02, 0x00, + 0x7E, 0xFF, 0x96, 0x03, 0x00, 0x09, 0x8A, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x96, 0x01, + 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x90, 0x01, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x12, + 0x9D, 0x02, 0x00, 0x10, 0x00, 0x96, 0x03, 0x00, 0x09, 0x8A, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x3B, 0x01, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x8A, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x97, 0x01, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0x90, 0x01, 0x1C, 0x96, 0x01, 0x00, 0x02, + 0x49, 0x12, 0x9D, 0x02, 0x00, 0x15, 0x00, 0x96, 0x03, 0x00, 0x09, 0x8A, 0x01, 0x4C, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x99, 0x01, 0x47, 0x1D, 0x99, 0x02, 0x00, 0x18, 0x00, 0x96, 0x03, 0x00, 0x09, + 0x8A, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x90, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x98, + 0x01, 0x47, 0x47, 0x1D, 0x96, 0x05, 0x00, 0x08, 0xEA, 0x09, 0x8A, 0x01, 0x1C, 0x96, 0x07, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x9A, 0x01, 0x52, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x6E, 0x00, 0x96, - 0x08, 0x00, 0x09, 0x88, 0x01, 0x09, 0x99, 0x01, 0x08, 0x0E, 0x1C, 0x47, 0x96, 0x03, 0x00, 0x09, - 0x9A, 0x01, 0x47, 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x9B, 0x01, 0x52, 0x47, 0x96, 0x03, 0x00, 0x09, 0x9C, - 0x01, 0x47, 0x1D, 0x96, 0x05, 0x00, 0x08, 0xEA, 0x09, 0x88, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, - 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x9D, 0x01, 0x52, 0x1D, 0x96, 0x02, 0x00, + 0x08, 0x00, 0x09, 0x8A, 0x01, 0x09, 0x9B, 0x01, 0x08, 0x0E, 0x1C, 0x47, 0x96, 0x03, 0x00, 0x09, + 0x9C, 0x01, 0x47, 0x96, 0x03, 0x00, 0x09, 0x24, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, + 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x9D, 0x01, 0x52, 0x47, 0x96, 0x03, 0x00, 0x09, 0x9E, + 0x01, 0x47, 0x1D, 0x96, 0x05, 0x00, 0x08, 0xEA, 0x09, 0x8A, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x9F, 0x01, 0x52, 0x1D, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x05, 0x00, 0x96, 0x01, - 0x00, 0x02, 0x3E, 0x96, 0x0A, 0x00, 0x09, 0x9E, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x67, - 0x40, 0x3C, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x05, 0x00, 0x09, 0x9F, 0x01, 0x05, + 0x00, 0x02, 0x3E, 0x96, 0x0A, 0x00, 0x09, 0xA0, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x67, + 0x40, 0x3C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x05, 0x00, 0x09, 0xA1, 0x01, 0x05, 0x01, 0x4F, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, - 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x6C, 0x52, 0x17, 0x96, 0x03, 0x00, 0x09, 0x9E, - 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA1, 0x01, 0x52, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x89, 0x01, 0x8E, 0x23, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, + 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x6C, 0x52, 0x17, 0x96, 0x03, 0x00, 0x09, 0xA0, + 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA2, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA3, 0x01, 0x52, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x8B, 0x01, 0x8E, 0x23, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x00, 0x00, 0x6D, 0x65, 0x74, 0x68, 0x6F, 0x64, 0x00, - 0x00, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x00, 0x9A, 0x01, 0x96, 0x0A, 0x00, 0x09, 0x9E, - 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x67, 0x40, 0x3C, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, - 0x1C, 0x96, 0x05, 0x00, 0x09, 0x9F, 0x01, 0x05, 0x01, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x88, 0x01, - 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x02, 0x00, - 0x08, 0x6C, 0x52, 0x17, 0x96, 0x04, 0x00, 0x09, 0xA2, 0x01, 0x02, 0x3C, 0x96, 0x07, 0x00, 0x08, + 0x00, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x00, 0x9A, 0x01, 0x96, 0x0A, 0x00, 0x09, 0xA0, + 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x67, 0x40, 0x3C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, + 0x1C, 0x96, 0x05, 0x00, 0x09, 0xA1, 0x01, 0x05, 0x01, 0x4F, 0x96, 0x03, 0x00, 0x09, 0x8A, 0x01, + 0x1C, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x02, 0x00, + 0x08, 0x6C, 0x52, 0x17, 0x96, 0x04, 0x00, 0x09, 0xA4, 0x01, 0x02, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, - 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x9E, - 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA3, 0x01, 0x4E, + 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, + 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA2, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x5A, 0x00, 0x96, 0x03, 0x00, - 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA3, - 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA4, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x22, 0x01, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x25, 0x00, 0x96, 0x06, 0x00, - 0x09, 0xA2, 0x01, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x1D, 0x99, 0x02, 0x00, - 0x05, 0x00, 0x99, 0x02, 0x00, 0x75, 0xFF, 0x96, 0x05, 0x00, 0x08, 0xEA, 0x09, 0xA2, 0x01, 0x1C, - 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA5, 0x01, 0x52, - 0x96, 0x03, 0x00, 0x09, 0x87, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, - 0x9A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA6, 0x01, 0x52, 0x3C, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA7, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0xA8, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA9, 0x01, 0x49, 0x9D, 0x02, 0x00, + 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA2, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA5, + 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA6, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x24, 0x01, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x25, 0x00, 0x96, 0x06, 0x00, + 0x09, 0xA4, 0x01, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA2, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x1D, 0x99, 0x02, 0x00, + 0x05, 0x00, 0x99, 0x02, 0x00, 0x75, 0xFF, 0x96, 0x05, 0x00, 0x08, 0xEA, 0x09, 0xA4, 0x01, 0x1C, + 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA7, 0x01, 0x52, + 0x96, 0x03, 0x00, 0x09, 0x89, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, + 0x9A, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA8, 0x01, 0x52, 0x3C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA2, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA9, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0xAA, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAB, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x2C, 0x00, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAA, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x27, 0x00, 0x96, 0x02, + 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAC, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x27, 0x00, 0x96, 0x02, 0x00, 0x08, 0xEA, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x93, 0x01, 0x52, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAB, 0x01, + 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x95, 0x01, 0x52, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAD, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x72, 0x72, 0x61, 0x79, 0x00, - 0xA2, 0x00, 0x96, 0x06, 0x00, 0x09, 0xAD, 0x01, 0x09, 0xAC, 0x01, 0x3C, 0x96, 0x07, 0x00, 0x08, + 0xA2, 0x00, 0x96, 0x06, 0x00, 0x09, 0xAF, 0x01, 0x09, 0xAE, 0x01, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, - 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xAE, + 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xB0, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x56, 0x00, 0x96, - 0x03, 0x00, 0x09, 0xAD, 0x01, 0x4C, 0x1C, 0x96, 0x05, 0x00, 0x09, 0xAF, 0x01, 0x08, 0x18, 0x1C, - 0x47, 0x96, 0x03, 0x00, 0x09, 0xB0, 0x01, 0x47, 0x96, 0x03, 0x00, 0x09, 0xAE, 0x01, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0xAF, 0x01, 0x4C, 0x1C, 0x96, 0x05, 0x00, 0x09, 0xB1, 0x01, 0x08, 0x18, 0x1C, + 0x47, 0x96, 0x03, 0x00, 0x09, 0xB2, 0x01, 0x47, 0x96, 0x03, 0x00, 0x09, 0xB0, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0xAA, 0x01, 0x52, 0x47, 0x96, 0x03, 0x00, 0x09, 0xB1, 0x01, 0x47, 0x47, 0x1D, - 0x99, 0x02, 0x00, 0x87, 0xFF, 0x96, 0x03, 0x00, 0x09, 0xAD, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xB2, 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x9B, 0x01, 0x8E, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0xAC, 0x01, 0x52, 0x47, 0x96, 0x03, 0x00, 0x09, 0xB3, 0x01, 0x47, 0x47, 0x1D, + 0x99, 0x02, 0x00, 0x87, 0xFF, 0x96, 0x03, 0x00, 0x09, 0xAF, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0xB4, 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x9D, 0x01, 0x8E, 0x0E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x72, 0x67, 0x73, 0x00, 0x89, 0x00, - 0x96, 0x06, 0x00, 0x09, 0xAD, 0x01, 0x09, 0xB3, 0x01, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, + 0x96, 0x06, 0x00, 0x09, 0xAF, 0x01, 0x09, 0xB5, 0x01, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, 0x4C, - 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA2, 0x01, 0x1C, + 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA4, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x3D, 0x00, 0x96, 0x03, 0x00, - 0x09, 0xAD, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA2, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x09, 0xAF, 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA4, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0xAA, 0x01, 0x52, 0x47, 0x1D, 0x99, 0x02, 0x00, 0xA0, 0xFF, 0x96, 0x03, 0x00, 0x09, 0xAD, 0x01, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0xB4, 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0xB5, 0x01, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x62, - 0x6A, 0x00, 0x8C, 0x00, 0x96, 0x06, 0x00, 0x09, 0xAD, 0x01, 0x09, 0xB6, 0x01, 0x3C, 0x96, 0x03, - 0x00, 0x09, 0xB7, 0x01, 0x46, 0x87, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, - 0x00, 0x5E, 0x00, 0x96, 0x04, 0x00, 0x08, 0xBC, 0x04, 0x00, 0x3C, 0x96, 0x03, 0x00, 0x09, 0xAD, - 0x01, 0x4C, 0x1C, 0x96, 0x05, 0x00, 0x09, 0xAF, 0x01, 0x08, 0xBC, 0x1C, 0x47, 0x96, 0x03, 0x00, - 0x09, 0xB0, 0x01, 0x47, 0x96, 0x03, 0x00, 0x09, 0xB7, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBC, + 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0xAC, 0x01, 0x52, 0x47, 0x1D, 0x99, 0x02, 0x00, 0xA0, 0xFF, 0x96, 0x03, 0x00, 0x09, 0xAF, 0x01, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0xB6, 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0xB7, 0x01, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x62, + 0x6A, 0x00, 0x8C, 0x00, 0x96, 0x06, 0x00, 0x09, 0xAF, 0x01, 0x09, 0xB8, 0x01, 0x3C, 0x96, 0x03, + 0x00, 0x09, 0xB9, 0x01, 0x46, 0x87, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, + 0x00, 0x5E, 0x00, 0x96, 0x04, 0x00, 0x08, 0xBC, 0x04, 0x00, 0x3C, 0x96, 0x03, 0x00, 0x09, 0xAF, + 0x01, 0x4C, 0x1C, 0x96, 0x05, 0x00, 0x09, 0xB1, 0x01, 0x08, 0xBC, 0x1C, 0x47, 0x96, 0x03, 0x00, + 0x09, 0xB2, 0x01, 0x47, 0x96, 0x03, 0x00, 0x09, 0xB9, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAA, - 0x01, 0x52, 0x47, 0x96, 0x03, 0x00, 0x09, 0xB1, 0x01, 0x47, 0x47, 0x1D, 0x99, 0x02, 0x00, 0x94, - 0xFF, 0x96, 0x03, 0x00, 0x09, 0xAD, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xB8, 0x01, 0x47, 0x3E, - 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAA, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, + 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAC, + 0x01, 0x52, 0x47, 0x96, 0x03, 0x00, 0x09, 0xB3, 0x01, 0x47, 0x47, 0x1D, 0x99, 0x02, 0x00, 0x94, + 0xFF, 0x96, 0x03, 0x00, 0x09, 0xAF, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xBA, 0x01, 0x47, 0x3E, + 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAC, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x00, 0x7A, 0x01, 0x96, 0x05, 0x00, - 0x08, 0xA0, 0x09, 0x29, 0x01, 0x1C, 0x44, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0xB9, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x2A, 0x01, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, + 0x08, 0xA0, 0x09, 0x2B, 0x01, 0x1C, 0x44, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0xBB, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x2A, 0x01, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x09, 0x49, 0x9D, 0x02, 0x00, 0x0D, 0x01, 0x96, 0x02, 0x00, 0x08, 0xA0, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0xBE, 0x01, 0x49, 0x9D, 0x02, 0x00, 0xE3, 0x00, 0x96, 0x03, 0x00, - 0x09, 0x29, 0x01, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, 0x00, 0xC6, 0x00, 0x96, 0x02, - 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xC2, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x91, 0x00, - 0x96, 0x0A, 0x00, 0x08, 0x19, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0xC5, 0x01, 0x52, 0x9D, 0x02, 0x00, 0x4A, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, - 0x96, 0x02, 0x00, 0x08, 0xBA, 0x49, 0x9D, 0x02, 0x00, 0x0C, 0x00, 0x96, 0x03, 0x00, 0x09, 0xC1, - 0x01, 0x3E, 0x99, 0x02, 0x00, 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x07, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xB5, 0x01, 0x52, 0x3E, 0x99, - 0x02, 0x00, 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, - 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAB, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x1E, - 0x00, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x1C, 0x9D, 0x02, 0x00, 0x0B, 0x00, 0x96, 0x03, 0x00, - 0x09, 0xC4, 0x01, 0x99, 0x02, 0x00, 0x06, 0x00, 0x96, 0x03, 0x00, 0x09, 0xC3, 0x01, 0x3E, 0x99, - 0x02, 0x00, 0x07, 0x00, 0x96, 0x03, 0x00, 0x09, 0xC1, 0x01, 0x3E, 0x99, 0x02, 0x00, 0x13, 0x00, - 0x96, 0x06, 0x00, 0x09, 0xBF, 0x01, 0x09, 0x29, 0x01, 0x1C, 0x47, 0x96, 0x03, 0x00, 0x09, 0xC0, - 0x01, 0x47, 0x3E, 0x99, 0x02, 0x00, 0x07, 0x00, 0x96, 0x03, 0x00, 0x09, 0xBD, 0x01, 0x3E, 0x99, - 0x02, 0x00, 0x33, 0x00, 0x96, 0x06, 0x00, 0x09, 0xBA, 0x01, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x07, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xBB, 0x01, 0x52, 0x47, 0x96, - 0x03, 0x00, 0x09, 0xBC, 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0xC6, 0x01, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x6D, 0x6C, 0x00, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0xC0, 0x01, 0x49, 0x9D, 0x02, 0x00, 0xE3, 0x00, 0x96, 0x03, 0x00, + 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, 0x00, 0xC6, 0x00, 0x96, 0x02, + 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xC4, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x91, 0x00, + 0x96, 0x0A, 0x00, 0x08, 0x19, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0xC7, 0x01, 0x52, 0x9D, 0x02, 0x00, 0x4A, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, + 0x96, 0x02, 0x00, 0x08, 0xBA, 0x49, 0x9D, 0x02, 0x00, 0x0C, 0x00, 0x96, 0x03, 0x00, 0x09, 0xC3, + 0x01, 0x3E, 0x99, 0x02, 0x00, 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x07, + 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xB7, 0x01, 0x52, 0x3E, 0x99, + 0x02, 0x00, 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, + 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xAD, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x1E, + 0x00, 0x96, 0x03, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x9D, 0x02, 0x00, 0x0B, 0x00, 0x96, 0x03, 0x00, + 0x09, 0xC6, 0x01, 0x99, 0x02, 0x00, 0x06, 0x00, 0x96, 0x03, 0x00, 0x09, 0xC5, 0x01, 0x3E, 0x99, + 0x02, 0x00, 0x07, 0x00, 0x96, 0x03, 0x00, 0x09, 0xC3, 0x01, 0x3E, 0x99, 0x02, 0x00, 0x13, 0x00, + 0x96, 0x06, 0x00, 0x09, 0xC1, 0x01, 0x09, 0x2B, 0x01, 0x1C, 0x47, 0x96, 0x03, 0x00, 0x09, 0xC2, + 0x01, 0x47, 0x3E, 0x99, 0x02, 0x00, 0x07, 0x00, 0x96, 0x03, 0x00, 0x09, 0xBF, 0x01, 0x3E, 0x99, + 0x02, 0x00, 0x33, 0x00, 0x96, 0x06, 0x00, 0x09, 0xBC, 0x01, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x07, + 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xBD, 0x01, 0x52, 0x47, 0x96, + 0x03, 0x00, 0x09, 0xBE, 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0xC8, 0x01, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x6D, 0x6C, 0x00, 0xE1, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x19, - 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x94, 0x00, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0xA4, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xC7, 0x01, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x66, - 0x00, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0xA7, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x8E, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0xA0, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0xA1, 0x01, 0x52, 0x4F, 0x99, 0x02, 0x00, 0x42, 0xFF, 0x96, 0x02, 0x00, 0x08, - 0x1C, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xC8, 0x01, 0x8E, 0x0D, + 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x19, + 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x94, 0x00, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0xA6, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xC9, 0x01, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x66, + 0x00, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0xA9, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x90, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0xA2, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0xA3, 0x01, 0x52, 0x4F, 0x99, 0x02, 0x00, 0x42, 0xFF, 0x96, 0x02, 0x00, 0x08, + 0x1C, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xCA, 0x01, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x6D, 0x6C, 0x00, 0xE4, 0x00, 0x96, 0x08, - 0x00, 0x09, 0x25, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, + 0x00, 0x09, 0x27, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, - 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, - 0x9D, 0x02, 0x00, 0x95, 0x00, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA4, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0xC7, 0x01, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x67, 0x00, 0x96, 0x03, - 0x00, 0x09, 0x25, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA7, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x8E, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0xA0, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0xA1, 0x01, 0x52, 0x4F, 0x99, 0x02, 0x00, 0x41, 0xFF, 0x96, 0x03, 0x00, 0x09, 0x25, 0x01, - 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA1, 0x01, 0x8E, 0x0D, 0x00, + 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, + 0x9D, 0x02, 0x00, 0x95, 0x00, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA6, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0xC9, 0x01, 0x49, 0x12, 0x9D, 0x02, 0x00, 0x67, 0x00, 0x96, 0x03, + 0x00, 0x09, 0x27, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA9, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x90, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0xA2, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0xA3, 0x01, 0x52, 0x4F, 0x99, 0x02, 0x00, 0x41, 0xFF, 0x96, 0x03, 0x00, 0x09, 0x27, 0x01, + 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA3, 0x01, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x6D, 0x6C, 0x00, 0xC2, 0x01, 0x96, 0x05, 0x00, - 0x08, 0xA0, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA4, 0x01, 0x4E, 0x3C, 0x96, 0x02, - 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xBE, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x79, 0x01, - 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xB9, 0x01, 0x49, 0x9D, 0x02, 0x00, + 0x08, 0xA0, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA6, 0x01, 0x4E, 0x3C, 0x96, 0x02, + 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xC0, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x79, 0x01, + 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xBB, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x27, 0x01, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDC, 0x49, 0x9D, 0x02, 0x00, 0x0B, 0x01, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xDB, 0x49, 0x9D, 0x02, 0x00, 0xEF, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xEB, 0x49, 0x9D, 0x02, 0x00, 0xD4, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x09, 0x49, 0x9D, 0x02, 0x00, 0xB9, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBA, 0x49, 0x9D, 0x02, 0x00, 0x7B, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0xAE, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x3C, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0xCC, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x0A, 0x00, 0x96, 0x01, 0x00, 0x03, 0x3E, - 0x99, 0x02, 0x00, 0x1B, 0x00, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xA0, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xCA, 0x01, 0x3D, 0x3E, - 0x99, 0x02, 0x00, 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, - 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xC8, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, - 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xC6, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x05, 0x00, 0x96, + 0x09, 0xB0, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x3C, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, + 0x03, 0x00, 0x09, 0xCE, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x0A, 0x00, 0x96, 0x01, 0x00, 0x03, 0x3E, + 0x99, 0x02, 0x00, 0x1B, 0x00, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0xA2, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xCC, 0x01, 0x3D, 0x3E, + 0x99, 0x02, 0x00, 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xCA, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, + 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xC8, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x05, 0x00, 0x96, 0x01, 0x00, 0x03, 0x3E, 0x99, 0x02, 0x00, 0x05, 0x00, 0x96, 0x01, 0x00, 0x02, 0x3E, 0x99, 0x02, 0x00, 0x06, 0x00, 0x96, 0x02, 0x00, 0x05, 0x01, 0x3E, 0x99, 0x02, 0x00, 0x06, 0x00, 0x96, 0x02, - 0x00, 0x05, 0x00, 0x3E, 0x99, 0x02, 0x00, 0x3B, 0x00, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, - 0xCA, 0x01, 0x3D, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0xCB, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x26, 0x00, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x0F, 0x52, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xC9, 0x01, 0x3D, 0x3E, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA5, 0x01, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x78, 0x6D, 0x6C, 0x00, 0x9C, 0x00, 0x96, 0x08, 0x00, 0x09, 0xA2, 0x01, + 0x00, 0x05, 0x00, 0x3E, 0x99, 0x02, 0x00, 0x3B, 0x00, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0xA2, 0x01, 0x4E, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, + 0xCC, 0x01, 0x3D, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0xCD, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x26, 0x00, 0x96, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA2, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x0F, 0x52, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xCB, 0x01, 0x3D, 0x3E, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xA7, 0x01, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x78, 0x6D, 0x6C, 0x00, 0x9C, 0x00, 0x96, 0x08, 0x00, 0x09, 0xA4, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x42, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, 0x4C, 0x1C, 0x50, 0x1D, - 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0xA3, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x4D, - 0x00, 0x96, 0x03, 0x00, 0x09, 0x9E, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA3, 0x01, 0x4E, 0x96, + 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x4D, + 0x00, 0x96, 0x03, 0x00, 0x09, 0xA0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xA5, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0xA1, 0x01, 0x52, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xA2, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0xA3, 0x01, 0x52, 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xA4, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x16, 0x52, 0x17, 0x99, 0x02, 0x00, 0x89, 0xFF, 0x96, 0x03, - 0x00, 0x09, 0xA2, 0x01, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xCD, + 0x00, 0x09, 0xA4, 0x01, 0x1C, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xCF, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x72, 0x72, 0x61, 0x79, - 0x00, 0xB0, 0x00, 0x96, 0x06, 0x00, 0x09, 0xAD, 0x01, 0x09, 0xCE, 0x01, 0x3C, 0x96, 0x07, 0x00, + 0x00, 0xB0, 0x00, 0x96, 0x06, 0x00, 0x09, 0xAF, 0x01, 0x09, 0xD0, 0x01, 0x3C, 0x96, 0x07, 0x00, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x99, 0x02, 0x00, 0x09, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, 0x4C, 0x1C, 0x50, 0x1D, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xAE, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x64, 0x00, + 0xB0, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x19, 0x4E, 0x48, 0x12, 0x9D, 0x02, 0x00, 0x64, 0x00, 0x96, 0x02, 0x00, 0x08, 0x18, 0x1C, 0x96, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x49, 0x12, - 0x12, 0x9D, 0x02, 0x00, 0x10, 0x00, 0x96, 0x03, 0x00, 0x09, 0xAD, 0x01, 0x4C, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x92, 0x01, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0xAD, 0x01, 0x4C, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0xAE, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xCF, 0x01, 0x1C, 0x4E, 0x96, 0x07, 0x00, - 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x93, 0x01, 0x52, 0x47, 0x1D, 0x99, - 0x02, 0x00, 0x79, 0xFF, 0x96, 0x03, 0x00, 0x09, 0xAD, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xD0, - 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xD1, 0x01, 0x8E, 0x0D, + 0x12, 0x9D, 0x02, 0x00, 0x10, 0x00, 0x96, 0x03, 0x00, 0x09, 0xAF, 0x01, 0x4C, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x94, 0x01, 0x47, 0x1D, 0x96, 0x03, 0x00, 0x09, 0xAF, 0x01, 0x4C, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0xB0, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xD1, 0x01, 0x1C, 0x4E, 0x96, 0x07, 0x00, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x95, 0x01, 0x52, 0x47, 0x1D, 0x99, + 0x02, 0x00, 0x79, 0xFF, 0x96, 0x03, 0x00, 0x09, 0xAF, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xD2, + 0x01, 0x47, 0x3E, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xD3, 0x01, 0x8E, 0x0D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x62, 0x6A, 0x00, 0xB0, 0x00, 0x96, 0x06, - 0x00, 0x09, 0xAD, 0x01, 0x09, 0xD2, 0x01, 0x3C, 0x96, 0x05, 0x00, 0x09, 0xD3, 0x01, 0x05, 0x00, - 0x3C, 0x96, 0x03, 0x00, 0x09, 0xB7, 0x01, 0x46, 0x87, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x02, + 0x00, 0x09, 0xAF, 0x01, 0x09, 0xD4, 0x01, 0x3C, 0x96, 0x05, 0x00, 0x09, 0xD5, 0x01, 0x05, 0x00, + 0x3C, 0x96, 0x03, 0x00, 0x09, 0xB9, 0x01, 0x46, 0x87, 0x01, 0x00, 0x00, 0x96, 0x01, 0x00, 0x02, 0x49, 0x9D, 0x02, 0x00, 0x79, 0x00, 0x96, 0x04, 0x00, 0x08, 0xBC, 0x04, 0x00, 0x3C, 0x96, 0x03, - 0x00, 0x09, 0xD3, 0x01, 0x1C, 0x12, 0x9D, 0x02, 0x00, 0x10, 0x00, 0x96, 0x03, 0x00, 0x09, 0xAD, - 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x92, 0x01, 0x47, 0x1D, 0x96, 0x05, 0x00, 0x09, 0xD3, - 0x01, 0x05, 0x01, 0x1D, 0x96, 0x03, 0x00, 0x09, 0xAD, 0x01, 0x4C, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0xBC, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xD4, 0x01, 0x47, 0x96, 0x03, 0x00, 0x09, 0xB7, 0x01, 0x1C, + 0x00, 0x09, 0xD5, 0x01, 0x1C, 0x12, 0x9D, 0x02, 0x00, 0x10, 0x00, 0x96, 0x03, 0x00, 0x09, 0xAF, + 0x01, 0x4C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x94, 0x01, 0x47, 0x1D, 0x96, 0x05, 0x00, 0x09, 0xD5, + 0x01, 0x05, 0x01, 0x1D, 0x96, 0x03, 0x00, 0x09, 0xAF, 0x01, 0x4C, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0xBC, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xD6, 0x01, 0x47, 0x96, 0x03, 0x00, 0x09, 0xB9, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xBC, 0x1C, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x08, - 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0x93, 0x01, 0x52, 0x47, 0x47, 0x1D, 0x99, 0x02, 0x00, 0x79, 0xFF, 0x96, - 0x03, 0x00, 0x09, 0xAD, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xD5, 0x01, 0x47, 0x3E, 0x4F, 0x96, - 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x93, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, + 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0x95, 0x01, 0x52, 0x47, 0x47, 0x1D, 0x99, 0x02, 0x00, 0x79, 0xFF, 0x96, + 0x03, 0x00, 0x09, 0xAF, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xD7, 0x01, 0x47, 0x3E, 0x4F, 0x96, + 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x95, 0x01, 0x8E, 0x0F, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x00, 0x07, 0x01, 0x96, 0x05, 0x00, 0x08, 0xA0, - 0x09, 0x29, 0x01, 0x1C, 0x44, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xB9, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x97, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x02, - 0x00, 0x08, 0xBA, 0x49, 0x9D, 0x02, 0x00, 0x19, 0x00, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x1C, - 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xCA, 0x01, 0x3D, 0x3E, 0x99, 0x02, 0x00, - 0x68, 0x00, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xF7, 0x1C, 0x54, - 0x9D, 0x02, 0x00, 0x2D, 0x00, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, - 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xD1, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, - 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xCD, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x53, 0x00, 0x96, - 0x06, 0x00, 0x09, 0xD6, 0x01, 0x09, 0x29, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xCB, 0x01, 0x52, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xD7, 0x01, 0x52, 0x47, 0x96, 0x03, 0x00, 0x09, 0xD6, 0x01, - 0x47, 0x3E, 0x4F, 0x96, 0x0A, 0x00, 0x09, 0xD8, 0x01, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, + 0x09, 0x2B, 0x01, 0x1C, 0x44, 0x3C, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0xBB, 0x01, 0x49, 0x9D, 0x02, 0x00, 0x97, 0x00, 0x96, 0x02, 0x00, 0x08, 0xA0, 0x1C, 0x96, 0x02, + 0x00, 0x08, 0xBA, 0x49, 0x9D, 0x02, 0x00, 0x19, 0x00, 0x96, 0x03, 0x00, 0x09, 0x2B, 0x01, 0x1C, + 0x96, 0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xCC, 0x01, 0x3D, 0x3E, 0x99, 0x02, 0x00, + 0x68, 0x00, 0x96, 0x03, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0xF9, 0x1C, 0x54, + 0x9D, 0x02, 0x00, 0x2D, 0x00, 0x96, 0x03, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, + 0x01, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xD3, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, + 0x28, 0x00, 0x96, 0x03, 0x00, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xCF, 0x01, 0x52, 0x3E, 0x99, 0x02, 0x00, 0x53, 0x00, 0x96, + 0x06, 0x00, 0x09, 0xD8, 0x01, 0x09, 0x2B, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xCD, 0x01, 0x52, 0x96, 0x07, 0x00, 0x07, 0x01, 0x00, 0x00, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xD9, 0x01, 0x52, 0x47, 0x96, 0x03, 0x00, 0x09, 0xD8, 0x01, + 0x47, 0x3E, 0x4F, 0x96, 0x0A, 0x00, 0x09, 0xDA, 0x01, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x08, 0x04, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x64, - 0x00, 0x00, 0x00, 0x09, 0xD9, 0x01, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x09, 0xDB, 0x01, 0x07, 0x0E, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x08, 0x00, 0x07, 0x07, 0x10, 0x00, 0x00, - 0x02, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x82, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x83, + 0x02, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0x84, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x85, 0x01, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x03, - 0x00, 0x09, 0xDA, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xDB, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x09, 0xDC, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xDD, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0xDC, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x03, 0x00, 0x09, 0xDA, 0x01, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0xDD, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, + 0x09, 0xDE, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x03, 0x00, 0x09, 0xDC, 0x01, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0xDF, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xDE, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x03, - 0x00, 0x09, 0xDA, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xDF, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xE0, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x03, + 0x00, 0x09, 0xDC, 0x01, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xE1, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0xE0, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x03, 0x00, 0x09, 0xDA, 0x01, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0xE1, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, + 0x09, 0xE2, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x03, 0x00, 0x09, 0xDC, 0x01, 0x1C, 0x96, 0x03, 0x00, + 0x09, 0xE3, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xE2, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x0B, - 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xE3, 0x01, 0x09, 0xDA, 0x01, 0x1C, 0x96, 0x07, 0x00, - 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x0B, 0x00, 0x09, 0xE4, 0x01, 0x07, - 0x3A, 0x08, 0x00, 0x00, 0x09, 0xDA, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, + 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xE4, 0x01, 0x52, 0x17, 0x4F, 0x96, 0x0B, + 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xE5, 0x01, 0x09, 0xDC, 0x01, 0x1C, 0x96, 0x07, 0x00, + 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x0B, 0x00, 0x09, 0xE6, 0x01, 0x07, + 0x3A, 0x08, 0x00, 0x00, 0x09, 0xDC, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x09, 0x00, 0x07, 0x03, 0x00, - 0x00, 0x00, 0x02, 0x09, 0xDA, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, - 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x03, 0x00, 0x09, 0xE7, 0x01, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0xE8, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, + 0x00, 0x00, 0x02, 0x09, 0xDC, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, + 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x03, 0x00, 0x09, 0xE9, 0x01, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0xEA, 0x01, 0x8E, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x96, 0x07, 0x00, 0x08, 0x1C, 0x07, 0x00, 0x00, 0x00, 0x00, 0x43, 0x3C, 0x96, 0x07, 0x00, - 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xE9, 0x01, 0x52, 0x17, - 0x4F, 0x96, 0x0B, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xE8, 0x01, 0x09, 0xE7, 0x01, 0x1C, + 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1C, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEB, 0x01, 0x52, 0x17, + 0x4F, 0x96, 0x0B, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xEA, 0x01, 0x09, 0xE9, 0x01, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, 0x14, 0x00, 0x09, - 0xEA, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x69, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, - 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x03, 0x00, 0x09, 0xEA, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, - 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0x97, 0x05, 0x01, 0x4F, 0x96, 0x03, 0x00, 0x09, 0xEA, 0x01, + 0xEC, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x69, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, + 0x00, 0x08, 0x39, 0x3D, 0x1D, 0x96, 0x03, 0x00, 0x09, 0xEC, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, + 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0x97, 0x05, 0x01, 0x4F, 0x96, 0x03, 0x00, 0x09, 0xEC, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x04, 0x00, 0x08, 0x98, 0x05, 0x01, 0x4F, 0x96, - 0x03, 0x00, 0x09, 0xEA, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x14, 0x00, 0x09, - 0xEB, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x07, 0x69, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, - 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x10, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x09, 0xEC, 0x01, - 0x07, 0x69, 0x00, 0x00, 0x00, 0x09, 0xEA, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0xEC, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x14, 0x00, 0x09, + 0xED, 0x01, 0x07, 0x03, 0x00, 0x00, 0x00, 0x07, 0x69, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, + 0x00, 0x08, 0x01, 0x3D, 0x4F, 0x96, 0x10, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x09, 0xEE, 0x01, + 0x07, 0x69, 0x00, 0x00, 0x00, 0x09, 0xEC, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x0F, 0x00, 0x07, 0xC8, - 0x00, 0x00, 0x00, 0x08, 0xB6, 0x07, 0x84, 0x03, 0x00, 0x00, 0x09, 0xEA, 0x01, 0x1C, 0x96, 0x02, + 0x00, 0x00, 0x00, 0x08, 0xB6, 0x07, 0x84, 0x03, 0x00, 0x00, 0x09, 0xEC, 0x01, 0x1C, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, - 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0xED, 0x01, 0x07, 0x00, 0x00, 0x00, - 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, - 0x96, 0x14, 0x00, 0x09, 0xEE, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x58, 0x04, 0x00, 0x00, + 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x08, 0x00, 0x09, 0xEF, 0x01, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x43, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, + 0x96, 0x14, 0x00, 0x09, 0xF0, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x58, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x09, 0xEF, 0x01, 0x07, 0x58, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xEE, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x00, 0x09, 0xF1, 0x01, 0x07, 0x58, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF0, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x02, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, - 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xF0, 0x01, 0x07, + 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xF2, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x53, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, - 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0xF0, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xEE, 0x01, - 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0xF0, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, - 0x69, 0x3A, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xF1, 0x01, 0x07, 0x53, - 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0xF0, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, + 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0xF2, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF0, 0x01, + 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0xF2, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x69, 0x3A, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xF3, 0x01, 0x07, 0x53, + 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0xF2, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xED, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xF2, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x4E, + 0xEF, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xF4, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x4E, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF2, 0x01, 0x4E, + 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF4, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, - 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xEE, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, - 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF2, 0x01, 0x4E, + 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF0, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, + 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF4, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x0F, 0x00, - 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xF3, 0x01, 0x07, 0x4E, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF2, 0x01, 0x4E, 0x96, 0x02, + 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xF5, 0x01, 0x07, 0x4E, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF4, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, - 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x14, 0x00, - 0x09, 0xF4, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x56, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, + 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x14, 0x00, + 0x09, 0xF6, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x56, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF4, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, - 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, - 0x00, 0x09, 0xEE, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF4, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF6, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, + 0x00, 0x09, 0xF0, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF6, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, - 0xF5, 0x01, 0x07, 0x56, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF4, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, + 0xF7, 0x01, 0x07, 0x56, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF6, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xF6, 0x01, 0x07, 0x00, 0x00, + 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xF8, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x55, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0xF6, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, - 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xEE, 0x01, 0x53, 0x4F, - 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, - 0x09, 0xF6, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, - 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xF7, 0x01, 0x07, 0x55, 0x04, 0x00, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF6, + 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0xF8, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, + 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF0, 0x01, 0x53, 0x4F, + 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, + 0x09, 0xF8, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, + 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xF9, 0x01, 0x07, 0x55, 0x04, 0x00, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF8, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, - 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, - 0x4E, 0x96, 0x14, 0x00, 0x09, 0xF8, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x57, 0x04, 0x00, + 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, + 0x4E, 0x96, 0x14, 0x00, 0x09, 0xFA, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x57, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF8, 0x01, 0x4E, 0x96, 0x09, - 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, - 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xEE, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF8, 0x01, 0x4E, 0x96, 0x02, + 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFA, 0x01, 0x4E, 0x96, 0x09, + 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, + 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF0, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, + 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFA, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, - 0x00, 0x00, 0x00, 0x09, 0xF9, 0x01, 0x07, 0x57, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF8, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x09, 0xFB, 0x01, 0x07, 0x57, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFA, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xFA, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xFC, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x4D, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, - 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFA, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, - 0xEE, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, - 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFA, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, - 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xFB, 0x01, - 0x07, 0x4D, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0xFA, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, + 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFC, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, + 0xF0, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, + 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFC, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, + 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xFD, 0x01, + 0x07, 0x4D, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0xFC, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xFC, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0xFE, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x4F, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFC, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFE, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, - 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xEE, 0x01, 0x53, 0x4F, 0x96, 0x02, - 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFC, + 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF0, 0x01, 0x53, 0x4F, 0x96, 0x02, + 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFE, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, - 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xFD, 0x01, 0x07, 0x4F, 0x04, 0x00, 0x00, 0x08, - 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFC, 0x01, 0x4E, + 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x09, 0xFF, 0x01, 0x07, 0x4F, 0x04, 0x00, 0x00, 0x08, + 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFE, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, - 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, - 0x14, 0x00, 0x09, 0xFE, 0x01, 0x07, 0xE8, 0x03, 0x00, 0x00, 0x07, 0x54, 0x04, 0x00, 0x00, 0x07, + 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, + 0x14, 0x00, 0x09, 0x00, 0x02, 0x07, 0xE8, 0x03, 0x00, 0x00, 0x07, 0x54, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFE, 0x01, 0x4E, 0x96, 0x09, 0x00, 0x08, - 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, - 0x96, 0x03, 0x00, 0x09, 0xEE, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFE, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x00, 0x02, 0x4E, 0x96, 0x09, 0x00, 0x08, + 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, + 0x96, 0x03, 0x00, 0x09, 0xF0, 0x01, 0x53, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x00, 0x02, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, 0x00, 0x00, - 0x00, 0x09, 0xFF, 0x01, 0x07, 0x54, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, - 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xFE, 0x01, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, + 0x00, 0x09, 0x01, 0x02, 0x07, 0x54, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, + 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x00, 0x02, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x02, 0x00, 0x08, - 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0x00, 0x02, 0x07, + 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x14, 0x00, 0x09, 0x02, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x54, 0x04, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x39, - 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, - 0x03, 0x00, 0x09, 0x00, 0x02, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xEE, 0x01, + 0x3D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, + 0x03, 0x00, 0x09, 0x02, 0x02, 0x4E, 0x96, 0x09, 0x00, 0x08, 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x04, 0x1C, 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0xF0, 0x01, 0x53, 0x4C, 0x96, 0x02, 0x00, 0x08, 0x1C, 0x4D, 0x1D, 0x4F, 0x96, 0x02, 0x00, 0x08, 0x04, 0x1C, - 0x96, 0x03, 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x00, 0x02, 0x4E, 0x96, 0x02, + 0x96, 0x03, 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x02, 0x02, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x69, 0x3A, 0x17, 0x96, 0x0F, 0x00, 0x07, 0x01, - 0x00, 0x00, 0x00, 0x09, 0xFF, 0x01, 0x07, 0x54, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, - 0x00, 0x09, 0xED, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x00, 0x02, 0x4E, 0x96, 0x02, 0x00, 0x08, + 0x00, 0x00, 0x00, 0x09, 0x01, 0x02, 0x07, 0x54, 0x04, 0x00, 0x00, 0x08, 0x04, 0x1C, 0x96, 0x03, + 0x00, 0x09, 0xEF, 0x01, 0x4E, 0x96, 0x03, 0x00, 0x09, 0x02, 0x02, 0x4E, 0x96, 0x02, 0x00, 0x08, 0x0D, 0x4E, 0x96, 0x07, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x08, 0x03, 0x3D, 0x17, 0x96, 0x14, - 0x00, 0x09, 0x01, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFA, 0x00, 0x00, 0x00, 0x07, 0x02, - 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x14, 0x00, 0x09, 0x02, 0x02, 0x07, 0x01, 0x00, + 0x00, 0x09, 0x03, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFA, 0x00, 0x00, 0x00, 0x07, 0x02, + 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x14, 0x00, 0x09, 0x04, 0x02, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0xFA, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, - 0x96, 0x14, 0x00, 0x09, 0x03, 0x02, 0x07, 0x02, 0x00, 0x00, 0x00, 0x07, 0xFA, 0x00, 0x00, 0x00, - 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x06, 0x00, 0x09, 0x04, 0x02, 0x09, - 0x02, 0x02, 0x1C, 0x1D, 0x96, 0x14, 0x00, 0x09, 0x05, 0x02, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, + 0x96, 0x14, 0x00, 0x09, 0x05, 0x02, 0x07, 0x02, 0x00, 0x00, 0x00, 0x07, 0xFA, 0x00, 0x00, 0x00, + 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x06, 0x00, 0x09, 0x06, 0x02, 0x09, + 0x04, 0x02, 0x1C, 0x1D, 0x96, 0x14, 0x00, 0x09, 0x07, 0x02, 0x07, 0x01, 0x00, 0x00, 0x00, 0x07, 0xFD, 0x03, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x14, 0x00, - 0x09, 0x06, 0x02, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, - 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x14, 0x00, 0x09, 0x07, 0x02, 0x07, 0x00, 0x00, 0x00, + 0x09, 0x08, 0x02, 0x07, 0x04, 0x00, 0x00, 0x00, 0x07, 0x64, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, + 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x14, 0x00, 0x09, 0x09, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x09, 0x00, 0x00, 0x00, 0x07, 0x02, 0x00, 0x00, 0x00, 0x08, 0x01, 0x3D, 0x1D, 0x96, 0x03, 0x00, 0x08, 0x1C, 0x02, 0x1D, 0x96, 0x09, 0x00, 0x07, 0x00, 0x10, 0x00, 0x00, 0x08, 0x04, 0x08, 0x0A, 0x1C, 0x96, 0x07, 0x00, 0x07, 0x03, 0x00, 0x00, 0x00, 0x08, 0x00, 0x3D, 0x17, 0x96, commit d7e7cb68ea597415ccc5d035152f09c35dfa81e1 Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 19 22:12:38 2008 +0100 rework security architecture and initialization Every sandbox has its own _global object, so now there is a SwfdecSandbox object which gets set to the current sandbox whenever we execute code. Otherwise the _global object is NULL. Chages required: - Make it possible to swfdec_as_context_startup() multiple times - Make startup version independant - Get rid of security framework, use the global object (the current sandbox) diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index aa2c1c1..4990956 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -77,7 +77,6 @@ libswfdec_source_files = \ swfdec_file_reference_list.c \ swfdec_filter.c \ swfdec_filter_as.c \ - swfdec_flash_security.c \ swfdec_flv_decoder.c \ swfdec_font.c \ swfdec_function_list.c \ @@ -117,9 +116,8 @@ libswfdec_source_files = \ swfdec_rectangle.c \ swfdec_resource.c \ swfdec_ringbuffer.c \ + swfdec_sandbox.c \ swfdec_script.c \ - swfdec_security.c \ - swfdec_security_allow.c \ swfdec_selection.c \ swfdec_shape.c \ swfdec_shape_parser.c \ @@ -239,7 +237,6 @@ noinst_HEADERS = \ swfdec_text_field_movie.h \ swfdec_event.h \ swfdec_filter.h \ - swfdec_flash_security.h \ swfdec_flv_decoder.h \ swfdec_font.h \ swfdec_function_list.h \ @@ -267,9 +264,8 @@ noinst_HEADERS = \ swfdec_rect.h \ swfdec_resource.h \ swfdec_ringbuffer.h \ + swfdec_sandbox.h \ swfdec_script_internal.h \ - swfdec_security.h \ - swfdec_security_allow.h \ swfdec_shape.h \ swfdec_shape_parser.h \ swfdec_sound.h \ diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index 1c6b357..f572239 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -561,7 +561,6 @@ swfdec_as_context_init (SwfdecAsContext *context) g_hash_table_insert (context->strings, (char *) s + 1, (char *) s); } g_assert (*s == 0); - context->global = swfdec_as_object_new_empty (context); context->rand = g_rand_new (); g_get_current_time (&context->start_time); } @@ -779,6 +778,7 @@ swfdec_as_context_run (SwfdecAsContext *context) gboolean check_block; /* some opcodes avoid a scope check */ g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context)); + if (context->frame == NULL || context->state == SWFDEC_AS_CONTEXT_ABORTED) return; @@ -793,6 +793,7 @@ swfdec_as_context_run (SwfdecAsContext *context) context->last_frame = context->frame->next; original_version = context->version; start: + g_return_if_fail (context->global); /* check here because of swfdec_sandbox_(un)use() */ if (!swfdec_as_context_check_continue (context)) goto error; /* setup data */ @@ -804,12 +805,6 @@ start: swfdec_as_context_abort (context, "Stack overflow"); goto error; } - /* if security is NULL, the function may not be called */ - if (frame->security == NULL) { - SWFDEC_WARNING ("insufficient right to call %s", frame->function_name); - swfdec_as_frame_return (frame, NULL); - goto start; - } if (SWFDEC_IS_AS_NATIVE_FUNCTION (frame->function)) { SwfdecAsNativeFunction *native = SWFDEC_AS_NATIVE_FUNCTION (frame->function); SwfdecAsValue rval = { 0, }; @@ -1344,7 +1339,7 @@ swfdec_as_context_parseFloat (SwfdecAsContext *cx, SwfdecAsObject *object, } static void -swfdec_as_context_init_global (SwfdecAsContext *context, guint version) +swfdec_as_context_init_global (SwfdecAsContext *context) { SwfdecAsValue val; @@ -1388,25 +1383,26 @@ swfdec_as_context_run_init_script (SwfdecAsContext *context, const guint8 *data, * functions and properties are available in the context. **/ void -swfdec_as_context_startup (SwfdecAsContext *context, guint version) +swfdec_as_context_startup (SwfdecAsContext *context) { g_return_if_fail (SWFDEC_IS_AS_CONTEXT (context)); g_return_if_fail (context->state == SWFDEC_AS_CONTEXT_NEW); if (!swfdec_as_stack_push_segment (context)) return; - context->version = version; + if (context->global == NULL) + context->global = swfdec_as_object_new_empty (context); /* init the two internal functions */ /* FIXME: remove them for normal contexts? */ - swfdec_player_preinit_global (context, version); + swfdec_player_preinit_global (context); /* get the necessary objects up to define objects and functions sanely */ - swfdec_as_function_init_context (context, version); - swfdec_as_object_init_context (context, version); + swfdec_as_function_init_context (context); + swfdec_as_object_init_context (context); /* define the global object and other important ones */ - swfdec_as_context_init_global (context, version); + swfdec_as_context_init_global (context); /* run init script */ - swfdec_as_context_run_init_script (context, swfdec_as_initialize, sizeof (swfdec_as_initialize), context->version); + swfdec_as_context_run_init_script (context, swfdec_as_initialize, sizeof (swfdec_as_initialize), 8); if (context->state == SWFDEC_AS_CONTEXT_NEW) context->state = SWFDEC_AS_CONTEXT_RUNNING; diff --git a/libswfdec/swfdec_as_context.h b/libswfdec/swfdec_as_context.h index df09fa2..d5ef066 100644 --- a/libswfdec/swfdec_as_context.h +++ b/libswfdec/swfdec_as_context.h @@ -45,7 +45,8 @@ struct _SwfdecAsContext { GObject object; SwfdecAsContextState state; /* our current state */ - SwfdecAsObject * global; /* the global object */ + SwfdecAsObject * global; /* the global object or NULL if not initialized yet. + In SwfdecPlayer is NULL unless a sandbox is in use */ GRand * rand; /* random number generator */ GTimeVal start_time; /* time this movie started (for GetTime action) */ @@ -96,8 +97,7 @@ struct _SwfdecAsContextClass { GType swfdec_as_context_get_type (void); -void swfdec_as_context_startup (SwfdecAsContext * context, - guint version); +void swfdec_as_context_startup (SwfdecAsContext * context); gboolean swfdec_as_context_is_aborted (SwfdecAsContext * context); gboolean swfdec_as_context_is_constructing diff --git a/libswfdec/swfdec_as_frame.c b/libswfdec/swfdec_as_frame.c index 16546a5..39888b6 100644 --- a/libswfdec/swfdec_as_frame.c +++ b/libswfdec/swfdec_as_frame.c @@ -29,7 +29,6 @@ #include "swfdec_as_strings.h" #include "swfdec_as_super.h" #include "swfdec_debug.h" -#include "swfdec_security_allow.h" /** * SECTION:SwfdecAsFrame @@ -278,10 +277,6 @@ swfdec_as_frame_dispose (GObject *object) /* clean up */ g_slice_free1 (sizeof (SwfdecAsValue) * frame->n_registers, frame->registers); - if (frame->security) { - g_object_unref (frame->security); - frame->security = NULL; - } if (frame->constant_pool) { swfdec_constant_pool_free (frame->constant_pool); frame->constant_pool = NULL; @@ -385,11 +380,6 @@ swfdec_as_frame_load (SwfdecAsFrame *frame) { SwfdecAsContext *context = SWFDEC_AS_OBJECT (frame)->context; - if (context->frame) { - frame->security = g_object_ref (context->frame->security); - } else { - frame->security = swfdec_security_allow_new (); - } frame->stack_begin = context->cur; context->base = frame->stack_begin; frame->next = context->frame; @@ -903,22 +893,3 @@ swfdec_as_frame_get_this (SwfdecAsFrame *frame) return frame->thisp; } -/** - * swfdec_as_frame_set_security: - * @frame: the frame to be executed - * @guard: the security to be used in this frame - * - * Sets the security to be used in this frame to @guard. - **/ -void -swfdec_as_frame_set_security (SwfdecAsFrame *frame, SwfdecSecurity *guard) -{ - g_return_if_fail (SWFDEC_IS_AS_FRAME (frame)); - g_return_if_fail (SWFDEC_IS_SECURITY (guard)); - - if (frame->security) - g_object_unref (frame->security); - - frame->security = g_object_ref (guard); -} - diff --git a/libswfdec/swfdec_as_frame_internal.h b/libswfdec/swfdec_as_frame_internal.h index d50a9ce..866d1fa 100644 --- a/libswfdec/swfdec_as_frame_internal.h +++ b/libswfdec/swfdec_as_frame_internal.h @@ -22,7 +22,6 @@ #include <libswfdec/swfdec_as_types.h> #include <libswfdec/swfdec_script_internal.h> -#include <libswfdec/swfdec_security.h> G_BEGIN_DECLS @@ -39,7 +38,6 @@ struct _SwfdecAsFrame { SwfdecAsValue * return_value; /* pointer to where to store the return value */ guint argc; /* number of arguments */ const SwfdecAsValue * argv; /* arguments or %NULL if taken from stack */ - SwfdecSecurity * security; /* security for this frame or %NULL if not allowed to call */ /* debugging */ const char * function_name; /* name of function */ /* script execution */ @@ -70,8 +68,6 @@ SwfdecAsFrame * swfdec_as_frame_new_native (SwfdecAsContext * context); void swfdec_as_frame_return (SwfdecAsFrame * frame, SwfdecAsValue * return_value); -void swfdec_as_frame_set_security (SwfdecAsFrame * frame, - SwfdecSecurity * guard); void swfdec_as_frame_set_this (SwfdecAsFrame * frame, SwfdecAsObject * thisp); void swfdec_as_frame_preload (SwfdecAsFrame * frame); diff --git a/libswfdec/swfdec_as_function.c b/libswfdec/swfdec_as_function.c index 5dce988..cc0e975 100644 --- a/libswfdec/swfdec_as_function.c +++ b/libswfdec/swfdec_as_function.c @@ -121,8 +121,6 @@ swfdec_as_function_call_no_preload (SwfdecAsFunction *function, * user of that function expects success, but super may fail here */ if (frame == NULL) return NULL; - if (function->priv) - swfdec_as_frame_set_security (frame, function->priv); /* second check especially for super object */ if (thisp != NULL && frame->thisp == NULL) { swfdec_as_frame_set_this (frame, swfdec_as_object_resolve (thisp)); @@ -248,7 +246,7 @@ swfdec_as_function_apply (SwfdecAsContext *cx, SwfdecAsObject *object, } void -swfdec_as_function_init_context (SwfdecAsContext *context, guint version) +swfdec_as_function_init_context (SwfdecAsContext *context) { SwfdecAsObject *function, *proto; SwfdecAsValue val; @@ -259,11 +257,7 @@ swfdec_as_function_init_context (SwfdecAsContext *context, guint version) SWFDEC_AS_STR_Function, 0, NULL, 0)); if (!function) return; - if (version < 6) { - /* deleting it later on is easier than duplicating swfdec_as_object_add_function() */ - swfdec_as_object_unset_variable_flags (context->global, SWFDEC_AS_STR_Function, SWFDEC_AS_VARIABLE_PERMANENT); - swfdec_as_object_delete_variable (context->global, SWFDEC_AS_STR_Function); - } + swfdec_as_object_set_variable_flags (context->global, SWFDEC_AS_STR_Function, SWFDEC_AS_VARIABLE_VERSION_6_UP); context->Function = function; SWFDEC_AS_VALUE_SET_OBJECT (&val, function); swfdec_as_object_set_variable_and_flags (function, SWFDEC_AS_STR_constructor, @@ -283,21 +277,3 @@ swfdec_as_function_init_context (SwfdecAsContext *context, guint version) &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); } -/** - * swfdec_as_function_set_security: - * @fun: a #SwfdecFunction - * @sec: the security guarding calls to this function - * - * Sets the security object guarding execution of this function. This function - * may only be called once per #SwfdecAsFunction. - **/ -void -swfdec_as_function_set_security (SwfdecAsFunction *fun, SwfdecSecurity *sec) -{ - g_return_if_fail (SWFDEC_IS_AS_FUNCTION (fun)); - g_return_if_fail (SWFDEC_IS_SECURITY (sec)); - g_return_if_fail (fun->priv == NULL); - - fun->priv = g_object_ref (sec); -} - diff --git a/libswfdec/swfdec_as_function.h b/libswfdec/swfdec_as_function.h index ab2c364..534aad5 100644 --- a/libswfdec/swfdec_as_function.h +++ b/libswfdec/swfdec_as_function.h @@ -39,8 +39,6 @@ typedef struct _SwfdecAsFunctionClass SwfdecAsFunctionClass; struct _SwfdecAsFunction { /*< private >*/ SwfdecAsObject object; - - gpointer priv; /* currently only contains the security context or NULL for any */ }; struct _SwfdecAsFunctionClass { diff --git a/libswfdec/swfdec_as_internal.h b/libswfdec/swfdec_as_internal.h index 7305f92..30a556c 100644 --- a/libswfdec/swfdec_as_internal.h +++ b/libswfdec/swfdec_as_internal.h @@ -22,7 +22,6 @@ #include <libswfdec/swfdec_as_object.h> #include <libswfdec/swfdec_as_types.h> -#include <libswfdec/swfdec_security.h> G_BEGIN_DECLS @@ -36,10 +35,7 @@ G_BEGIN_DECLS #define SWFDEC_AS_OBJECT_PROTOTYPE_RECURSION_LIMIT 256 void swfdec_as_function_set_constructor (SwfdecAsFunction * fun); -void swfdec_as_function_set_security (SwfdecAsFunction * fun, - SwfdecSecurity * sec); -void swfdec_as_function_init_context (SwfdecAsContext * context, - guint version); +void swfdec_as_function_init_context (SwfdecAsContext * context); SwfdecAsFrame * swfdec_as_function_call_no_preload (SwfdecAsFunction * function, SwfdecAsObject * thisp, guint n_args, @@ -58,13 +54,6 @@ typedef SwfdecAsVariableForeach SwfdecAsVariableForeachRemove; typedef const char *(* SwfdecAsVariableForeachRename) (SwfdecAsObject *object, const char *variable, SwfdecAsValue *value, guint flags, gpointer data); -void swfdec_as_object_call_with_security - (SwfdecAsObject * object, - SwfdecSecurity * sec, - const char * name, - guint argc, - SwfdecAsValue * argv, - SwfdecAsValue * return_value); SwfdecAsValue * swfdec_as_object_peek_variable (SwfdecAsObject * object, const char * name); void swfdec_as_object_collect (SwfdecAsObject * object); @@ -75,15 +64,10 @@ void swfdec_as_object_foreach_rename (SwfdecAsObject * object, SwfdecAsVariableForeachRename func, gpointer data); -void swfdec_as_object_init_context (SwfdecAsContext * context, - guint version); +void swfdec_as_object_init_context (SwfdecAsContext * context); void swfdec_as_object_decode (SwfdecAsObject * obj, const char * str); SwfdecAsObject * swfdec_as_object_get_prototype (SwfdecAsObject * object); -void swfdec_as_object_run_with_security - (SwfdecAsObject * object, - SwfdecScript * script, - SwfdecSecurity * sec); void swfdec_as_object_add_native_variable (SwfdecAsObject * object, const char * variable, SwfdecAsNative get, diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index 854681d..babcd27 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -34,7 +34,6 @@ #include "swfdec_as_super.h" #include "swfdec_debug.h" #include "swfdec_movie.h" -#include "swfdec_security_allow.h" /** * SECTION:SwfdecAsObject @@ -1180,22 +1179,26 @@ swfdec_as_object_add_constructor (SwfdecAsObject *object, const char *name, GTyp return function; } +/** + * swfdec_as_object_run: + * @object: a #SwfdecAsObject + * @script: script to execute + * + * Executes the given @script with @object as this pointer. + **/ void -swfdec_as_object_run_with_security (SwfdecAsObject *object, SwfdecScript *script, - SwfdecSecurity *sec) +swfdec_as_object_run (SwfdecAsObject *object, SwfdecScript *script) { SwfdecAsContext *context; SwfdecAsFrame *frame; g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); g_return_if_fail (script != NULL); - g_return_if_fail (SWFDEC_IS_SECURITY (sec)); context = object->context; frame = swfdec_as_frame_new (context, script); if (frame == NULL) return; - swfdec_as_frame_set_security (frame, sec); swfdec_as_frame_set_this (frame, object); swfdec_as_frame_preload (frame); swfdec_as_context_run (context); @@ -1203,54 +1206,6 @@ swfdec_as_object_run_with_security (SwfdecAsObject *object, SwfdecScript *script } /** - * swfdec_as_object_run: - * @object: a #SwfdecAsObject - * @script: script to execute - * - * Executes the given @script with @object as this pointer. - **/ -void -swfdec_as_object_run (SwfdecAsObject *object, SwfdecScript *script) -{ - SwfdecSecurity *sec; - - g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); - g_return_if_fail (script != NULL); - - sec = swfdec_security_allow_new (); - swfdec_as_object_run_with_security (object, script, sec); - g_object_unref (sec); -} - -void -swfdec_as_object_call_with_security (SwfdecAsObject *object, SwfdecSecurity *sec, - const char *name, guint argc, SwfdecAsValue *argv, SwfdecAsValue *return_value) -{ - static SwfdecAsValue tmp; /* ignored */ - SwfdecAsFunction *fun; - - g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); - g_return_if_fail (SWFDEC_IS_SECURITY (sec)); - g_return_if_fail (name != NULL); - g_return_if_fail (argc == 0 || argv != NULL); - g_return_if_fail (argc == 0 || argv != NULL); - - if (return_value) - SWFDEC_AS_VALUE_SET_UNDEFINED (return_value); - swfdec_as_object_get_variable (object, name, &tmp); - if (!SWFDEC_AS_VALUE_IS_OBJECT (&tmp)) - return; - fun = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&tmp); - if (!SWFDEC_IS_AS_FUNCTION (fun)) - return; - swfdec_as_function_call (fun, object, argc, argv, return_value ? return_value : &tmp); - if (swfdec_as_context_is_aborted (object->context)) - return; - swfdec_as_frame_set_security (object->context->frame, sec); - swfdec_as_context_run (object->context); -} - -/** * swfdec_as_object_call: * @object: a #SwfdecAsObject * @name: garbage-collected string naming the function to call. @@ -1269,15 +1224,25 @@ void swfdec_as_object_call (SwfdecAsObject *object, const char *name, guint argc, SwfdecAsValue *argv, SwfdecAsValue *return_value) { - SwfdecSecurity *sec; + SwfdecAsValue tmp; + SwfdecAsFunction *fun; g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); g_return_if_fail (name != NULL); g_return_if_fail (argc == 0 || argv != NULL); - sec = swfdec_security_allow_new (); - swfdec_as_object_call_with_security (object, sec, name, argc, argv, return_value); - g_object_unref (sec); + if (return_value) + SWFDEC_AS_VALUE_SET_UNDEFINED (return_value); + swfdec_as_object_get_variable (object, name, &tmp); + if (!SWFDEC_AS_VALUE_IS_OBJECT (&tmp)) + return; + fun = (SwfdecAsFunction *) SWFDEC_AS_VALUE_GET_OBJECT (&tmp); + if (!SWFDEC_IS_AS_FUNCTION (fun)) + return; + swfdec_as_function_call (fun, object, argc, argv, return_value ? return_value : &tmp); + if (swfdec_as_context_is_aborted (object->context)) + return; + swfdec_as_context_run (object->context); } /** @@ -1714,7 +1679,7 @@ swfdec_as_object_decode (SwfdecAsObject *object, const char *str) } void -swfdec_as_object_init_context (SwfdecAsContext *context, guint version) +swfdec_as_object_init_context (SwfdecAsContext *context) { SwfdecAsValue val; SwfdecAsObject *object, *proto; diff --git a/libswfdec/swfdec_event.c b/libswfdec/swfdec_event.c index 585a5e0..6af665d 100644 --- a/libswfdec/swfdec_event.c +++ b/libswfdec/swfdec_event.c @@ -171,13 +171,12 @@ swfdec_event_list_parse (SwfdecEventList *list, SwfdecBits *bits, int version, void swfdec_event_list_execute (SwfdecEventList *list, SwfdecAsObject *object, - SwfdecSecurity *sec, guint condition, guint8 key) + guint condition, guint8 key) { guint i; g_return_if_fail (list != NULL); g_return_if_fail (SWFDEC_IS_AS_OBJECT (object)); - g_return_if_fail (SWFDEC_IS_SECURITY (sec)); g_return_if_fail (condition < N_CONDITIONS); condition = (1 << condition); @@ -189,7 +188,7 @@ swfdec_event_list_execute (SwfdecEventList *list, SwfdecAsObject *object, if ((event->conditions & condition) && event->key == key) { SWFDEC_LOG ("executing script for event %u on scriptable %p", condition, object); - swfdec_as_object_run_with_security (object, event->script, sec); + swfdec_as_object_run (object, event->script); } } swfdec_event_list_free (list); diff --git a/libswfdec/swfdec_event.h b/libswfdec/swfdec_event.h index 7ac6857..4b1ba40 100644 --- a/libswfdec/swfdec_event.h +++ b/libswfdec/swfdec_event.h @@ -20,7 +20,6 @@ #include <libswfdec/swfdec_bits.h> #include <libswfdec/swfdec_as_types.h> #include <libswfdec/swfdec_player.h> -#include <libswfdec/swfdec_security.h> #include <libswfdec/swfdec_types.h> #ifndef _SWFDEC_EVENT_H_ @@ -64,7 +63,6 @@ void swfdec_event_list_parse (SwfdecEventList * list, const char * description); void swfdec_event_list_execute (SwfdecEventList * list, SwfdecAsObject * object, - SwfdecSecurity * sec, guint condition, guint8 key); gboolean swfdec_event_list_has_conditions(SwfdecEventList * list, diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c deleted file mode 100644 index ae7fce0..0000000 --- a/libswfdec/swfdec_flash_security.c +++ /dev/null @@ -1,94 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <string.h> -#include "swfdec_flash_security.h" -#include "swfdec_debug.h" -#include "swfdec_security_allow.h" - - -G_DEFINE_TYPE (SwfdecFlashSecurity, swfdec_flash_security, SWFDEC_TYPE_SECURITY) - -static gboolean -swfdec_flash_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) -{ - if (guard == key) { - return TRUE; - } else if (SWFDEC_IS_SECURITY_ALLOW (key)) { - /* This only happens when calling functions (I hope) */ - return TRUE; - } else if (SWFDEC_IS_FLASH_SECURITY (key)) { - SWFDEC_FIXME ("implement security checking"); - return TRUE; - } else { - SWFDEC_ERROR ("unknown security %s, denying access", G_OBJECT_TYPE_NAME (key)); - return FALSE; - } -} - -static void -swfdec_flash_security_dispose (GObject *object) -{ - SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (object); - - if (sec->url) { - swfdec_url_free (sec->url); - sec->url = NULL; - } - sec->sandbox = SWFDEC_SANDBOX_NONE; - - G_OBJECT_CLASS (swfdec_flash_security_parent_class)->dispose (object); -} - -static void -swfdec_flash_security_class_init (SwfdecFlashSecurityClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - SwfdecSecurityClass *security_class = SWFDEC_SECURITY_CLASS (klass); - - object_class->dispose = swfdec_flash_security_dispose; - - security_class->allow = swfdec_flash_security_allow; -} - -static void -swfdec_flash_security_init (SwfdecFlashSecurity *sec) -{ -} - -void -swfdec_flash_security_set_url (SwfdecFlashSecurity *sec, const SwfdecURL *url) -{ - g_return_if_fail (SWFDEC_IS_FLASH_SECURITY (sec)); - g_return_if_fail (sec->url == NULL); - g_return_if_fail (url != NULL); - - g_assert (sec->sandbox == SWFDEC_SANDBOX_NONE); - sec->url = swfdec_url_copy (url); - if (swfdec_url_is_local (url)) { - sec->sandbox = SWFDEC_SANDBOX_LOCAL_FILE; - } else { - sec->sandbox = SWFDEC_SANDBOX_REMOTE; - } -} - diff --git a/libswfdec/swfdec_flash_security.h b/libswfdec/swfdec_flash_security.h deleted file mode 100644 index 3af3442..0000000 --- a/libswfdec/swfdec_flash_security.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef _SWFDEC_FLASH_SECURITY_H_ -#define _SWFDEC_FLASH_SECURITY_H_ - -#include <libswfdec/swfdec_security.h> -#include <libswfdec/swfdec_player.h> - -G_BEGIN_DECLS - -typedef struct _SwfdecFlashSecurity SwfdecFlashSecurity; -typedef struct _SwfdecFlashSecurityClass SwfdecFlashSecurityClass; - -typedef enum { - SWFDEC_SANDBOX_NONE, - SWFDEC_SANDBOX_REMOTE, - SWFDEC_SANDBOX_LOCAL_FILE, - SWFDEC_SANDBOX_LOCAL_NETWORK, - SWFDEC_SANDBOX_LOCAL_TRUSTED -} SwfdecSandboxType; - -#define SWFDEC_TYPE_FLASH_SECURITY (swfdec_flash_security_get_type()) -#define SWFDEC_IS_FLASH_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_FLASH_SECURITY)) -#define SWFDEC_IS_FLASH_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_FLASH_SECURITY)) -#define SWFDEC_FLASH_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_FLASH_SECURITY, SwfdecFlashSecurity)) -#define SWFDEC_FLASH_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_FLASH_SECURITY, SwfdecFlashSecurityClass)) -#define SWFDEC_FLASH_SECURITY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_FLASH_SECURITY, SwfdecFlashSecurityClass)) - -struct _SwfdecFlashSecurity -{ - SwfdecSecurity security; - - SwfdecPlayer *player; - SwfdecSandboxType sandbox; /* sandbox we are operating in */ - SwfdecURL * url; /* url this security was loaded from */ -}; - -struct _SwfdecFlashSecurityClass -{ - SwfdecSecurityClass security_class; -}; - -GType swfdec_flash_security_get_type (void); - -void swfdec_flash_security_set_url (SwfdecFlashSecurity * sec, - const SwfdecURL * url); - - -G_END_DECLS -#endif diff --git a/libswfdec/swfdec_initialize.as b/libswfdec/swfdec_initialize.as index 3302085..5444168 100644 --- a/libswfdec/swfdec_initialize.as +++ b/libswfdec/swfdec_initialize.as @@ -602,6 +602,11 @@ ASSetNative (TextField.StyleSheet.prototype, 113, "7update,7parseCSSInternal,7pa ASSetPropFlags (TextField.StyleSheet.prototype, null, 1027); ASSetPropFlags (TextField, "StyleSheet", 1027); +/* Video */ + +ASSetNative(Video.prototype, 667, "6attachVideo,6clear", 1); +ASSetPropFlags(Video.prototype, null, 3); + /* Accessibility */ Accessibility = {}; diff --git a/libswfdec/swfdec_internal.h b/libswfdec/swfdec_internal.h index a143330..79d49c1 100644 --- a/libswfdec/swfdec_internal.h +++ b/libswfdec/swfdec_internal.h @@ -59,14 +59,10 @@ SwfdecVideoDecoder * swfdec_video_decoder_gst_new (guint format); /* AS engine setup code */ -void swfdec_player_preinit_global (SwfdecAsContext * context, - guint version); -void swfdec_net_stream_init_context (SwfdecPlayer * player, - guint version); -void swfdec_sprite_movie_init_context (SwfdecPlayer * player, - guint version); -void swfdec_video_movie_init_context (SwfdecPlayer * player, - guint version); +void swfdec_player_preinit_global (SwfdecAsContext * context); +void swfdec_net_stream_init_context (SwfdecPlayer * player); +void swfdec_sprite_movie_init_context (SwfdecPlayer * player); +void swfdec_video_movie_init_context (SwfdecPlayer * player); G_END_DECLS #endif diff --git a/libswfdec/swfdec_interval.c b/libswfdec/swfdec_interval.c index c4caa21..88a2ca4 100644 --- a/libswfdec/swfdec_interval.c +++ b/libswfdec/swfdec_interval.c @@ -42,7 +42,7 @@ swfdec_interval_mark (SwfdecAsObject *object) SwfdecInterval *interval = SWFDEC_INTERVAL (object); swfdec_as_object_mark (interval->object); - swfdec_resource_mark (interval->resource); + swfdec_as_object_mark (SWFDEC_AS_OBJECT (interval->sandbox)); if (interval->fun_name) swfdec_as_string_mark (interval->fun_name); for (i = 0; i < interval->n_args; i++) { @@ -64,10 +64,6 @@ swfdec_interval_dispose (GObject *object) swfdec_player_remove_timeout (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (object)->context), &interval->timeout); interval->timeout.callback = NULL; } - if (interval->resource) { - g_object_unref (interval->resource); - interval->resource = NULL; - } G_OBJECT_CLASS (swfdec_interval_parent_class)->dispose (object); } @@ -104,14 +100,16 @@ swfdec_interval_trigger (SwfdecTimeout *timeout) player->priv->intervals = g_list_remove (player->priv->intervals, interval); interval->timeout.callback = NULL; } + swfdec_sandbox_use (interval->sandbox); if (interval->fun_name) { - swfdec_as_object_call_with_security (interval->object, SWFDEC_SECURITY (interval->resource), + swfdec_as_object_call (interval->object, interval->fun_name, interval->n_args, interval->args, &ret); } else { swfdec_as_function_call (SWFDEC_AS_FUNCTION (interval->object), NULL, interval->n_args, interval->args, &ret); swfdec_as_context_run (context); } + swfdec_sandbox_unuse (interval->sandbox); } static guint @@ -131,7 +129,7 @@ swfdec_interval_new (SwfdecPlayer *player, guint msecs, gboolean repeat, swfdec_as_object_add (SWFDEC_AS_OBJECT (interval), context, size); interval->id = ++player->priv->interval_id; - interval->resource = SWFDEC_RESOURCE (g_object_ref (context->frame->security)); + interval->sandbox = SWFDEC_SANDBOX (context->global); interval->msecs = msecs; interval->repeat = repeat; interval->object = object; diff --git a/libswfdec/swfdec_interval.h b/libswfdec/swfdec_interval.h index 40a61cc..48941bf 100644 --- a/libswfdec/swfdec_interval.h +++ b/libswfdec/swfdec_interval.h @@ -23,6 +23,7 @@ #include <libswfdec/swfdec_as_object.h> #include <libswfdec/swfdec_as_types.h> #include <libswfdec/swfdec_player_internal.h> +#include <libswfdec/swfdec_sandbox.h> G_BEGIN_DECLS @@ -40,7 +41,7 @@ struct _SwfdecInterval { SwfdecAsObject asobject; SwfdecTimeout timeout; - SwfdecResource * resource; /* resouce that initiated this interval */ + SwfdecSandbox * sandbox; /* sandbox we run the script in */ guint id; /* id this interval is identified with */ guint msecs; /* interval in milliseconds */ gboolean repeat; /* TRUE for calling in intervals, FALSE for single-shot */ diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c index 3d3d0ec..f9acafe 100644 --- a/libswfdec/swfdec_load_object.c +++ b/libswfdec/swfdec_load_object.c @@ -130,8 +130,6 @@ swfdec_load_object_dispose (GObject *object) swfdec_buffer_unref (load->buffer); load->buffer = NULL; } - g_object_unref (load->resource); - load->resource = NULL; G_OBJECT_CLASS (swfdec_load_object_parent_class)->dispose (object); } @@ -156,7 +154,7 @@ swfdec_load_object_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean al if (!allow) { SWFDEC_WARNING ("SECURITY: no access to %s from %s", - load->url, swfdec_url_get_url (SWFDEC_FLASH_SECURITY (load->resource)->url)); + load->url, swfdec_url_get_url (load->sandbox->url)); /* FIXME: call finish? */ @@ -165,7 +163,7 @@ swfdec_load_object_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean al return; } - load->loader = swfdec_loader_load (load->resource->loader, url, load->request, load->buffer); + load->loader = swfdec_loader_load (player->priv->resource->loader, url, load->request, load->buffer); swfdec_stream_set_target (SWFDEC_STREAM (load->loader), SWFDEC_STREAM_TARGET (load)); swfdec_loader_set_data_type (load->loader, SWFDEC_LOADER_DATA_TEXT); @@ -180,8 +178,8 @@ swfdec_load_object_request (gpointer objectp, gpointer playerp) SwfdecURL *url; /* FIXME: or is this relative to the player? */ - url = swfdec_url_new_relative (SWFDEC_FLASH_SECURITY (load->resource)->url, load->url); - switch (SWFDEC_FLASH_SECURITY (load->resource)->sandbox) { + url = swfdec_url_new_relative (swfdec_loader_get_url (player->priv->resource->loader), load->url); + switch (load->sandbox->type) { case SWFDEC_SANDBOX_REMOTE: case SWFDEC_SANDBOX_LOCAL_NETWORK: case SWFDEC_SANDBOX_LOCAL_TRUSTED: @@ -213,6 +211,7 @@ swfdec_load_object_mark (gpointer object, gpointer player) { SwfdecLoadObject *load = object; + swfdec_as_object_mark (SWFDEC_AS_OBJECT (load->sandbox)); if (load->url) swfdec_as_string_mark (load->url); swfdec_as_object_mark (load->target); @@ -242,7 +241,6 @@ swfdec_load_object_create (SwfdecAsObject *target, const char *url, load->finish = finish; /* get the current security */ g_assert (SWFDEC_AS_CONTEXT (player)->frame); - load->resource = g_object_ref (SWFDEC_AS_CONTEXT (player)->frame->security); - g_assert (SWFDEC_IS_RESOURCE (load->resource)); + load->sandbox = SWFDEC_SANDBOX (SWFDEC_AS_CONTEXT (player)->global); swfdec_player_request_resource (player, swfdec_load_object_request, load, NULL); } diff --git a/libswfdec/swfdec_load_object.h b/libswfdec/swfdec_load_object.h index 5f36625..3436562 100644 --- a/libswfdec/swfdec_load_object.h +++ b/libswfdec/swfdec_load_object.h @@ -51,7 +51,7 @@ struct _SwfdecLoadObject { SwfdecBuffer * buffer; /* data to send */ SwfdecLoader * loader; /* loader when loading or NULL */ - SwfdecResource * resource; /* resource that inited the loading */ + SwfdecSandbox * sandbox; /* sandbox that inited the loading */ SwfdecAsObject * target; /* target object */ SwfdecLoadObjectProgress progress; /* progress callback */ SwfdecLoadObjectFinish finish; /* finish callback */ diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 3dd6902..2f45345 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -493,20 +493,20 @@ swfdec_movie_execute (SwfdecMovie *movie, SwfdecEventType condition) return; } + swfdec_sandbox_use (movie->resource->sandbox); if (movie->events) { - swfdec_event_list_execute (movie->events, thisp, - SWFDEC_SECURITY (movie->resource), condition, 0); + swfdec_event_list_execute (movie->events, thisp, condition, 0); } /* FIXME: how do we compute the version correctly here? */ if (swfdec_movie_get_version (movie) <= 5) return; name = swfdec_event_type_get_name (condition); if (name != NULL) { - swfdec_as_object_call_with_security (SWFDEC_AS_OBJECT (movie), - SWFDEC_SECURITY (movie->resource), name, 0, NULL, NULL); + swfdec_as_object_call (SWFDEC_AS_OBJECT (movie), name, 0, NULL, NULL); } if (condition == SWFDEC_EVENT_CONSTRUCT) swfdec_as_object_call (thisp, SWFDEC_AS_STR_constructor, 0, NULL, NULL); + swfdec_sandbox_unuse (movie->resource->sandbox); } /** @@ -1062,7 +1062,7 @@ swfdec_movie_mark (SwfdecAsObject *object) swfdec_as_object_mark (listener->object); swfdec_as_string_mark (listener->name); } - swfdec_resource_mark (movie->resource); + swfdec_as_object_mark (SWFDEC_AS_OBJECT (movie->resource)); SWFDEC_AS_OBJECT_CLASS (swfdec_movie_parent_class)->mark (object); } diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 5a1e935..01566ad 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -28,10 +28,10 @@ #include "swfdec_as_strings.h" #include "swfdec_audio_flv.h" #include "swfdec_debug.h" -#include "swfdec_flash_security.h" #include "swfdec_loader_internal.h" #include "swfdec_player_internal.h" #include "swfdec_resource.h" +#include "swfdec_sandbox.h" #include "swfdec_stream_target.h" /* NB: code and level must be rooted gc-strings */ @@ -499,11 +499,11 @@ swfdec_net_stream_set_url (SwfdecNetStream *stream, const char *url_string) cx = SWFDEC_AS_OBJECT (stream)->context; player = SWFDEC_PLAYER (cx); g_assert (cx->frame); - url = swfdec_url_new_relative (SWFDEC_FLASH_SECURITY (player->priv->resource)->url, url_string); + url = swfdec_url_new_relative (swfdec_loader_get_url (player->priv->resource->loader), url_string); if (swfdec_url_is_local (url)) { swfdec_net_stream_load (player, url, TRUE, stream); } else { - switch (SWFDEC_FLASH_SECURITY (cx->frame->security)->sandbox) { + switch (SWFDEC_SANDBOX (cx->global)->type) { case SWFDEC_SANDBOX_REMOTE: swfdec_net_stream_load (player, url, TRUE, stream); break; diff --git a/libswfdec/swfdec_net_stream_as.c b/libswfdec/swfdec_net_stream_as.c index 7057103..470b035 100644 --- a/libswfdec/swfdec_net_stream_as.c +++ b/libswfdec/swfdec_net_stream_as.c @@ -153,7 +153,7 @@ swfdec_net_stream_construct (SwfdecAsContext *cx, SwfdecAsObject *obj, guint arg } void -swfdec_net_stream_init_context (SwfdecPlayer *player, guint version) +swfdec_net_stream_init_context (SwfdecPlayer *player) { SwfdecAsContext *context; SwfdecAsObject *stream, *proto; diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 7bcce79..3393514 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -29,7 +29,6 @@ #include "swfdec_player_internal.h" #include "swfdec_as_frame_internal.h" -#include "swfdec_as_internal.h" #include "swfdec_as_strings.h" #include "swfdec_audio_internal.h" #include "swfdec_button_movie.h" /* for mouse cursor */ @@ -37,9 +36,6 @@ #include "swfdec_debug.h" #include "swfdec_enums.h" #include "swfdec_event.h" -#include "swfdec_flash_security.h" -#include "swfdec_initialize.h" -#include "swfdec_internal.h" #include "swfdec_loader_internal.h" #include "swfdec_marshal.h" #include "swfdec_movie.h" @@ -477,8 +473,9 @@ swfdec_player_do_action (SwfdecPlayer *player) } while (action->movie == NULL); /* skip removed actions */ if (action) { if (action->script) { - swfdec_as_object_run_with_security (SWFDEC_AS_OBJECT (action->movie), - action->script, SWFDEC_SECURITY (action->movie->resource)); + swfdec_sandbox_use (action->movie->resource->sandbox); + swfdec_as_object_run (SWFDEC_AS_OBJECT (action->movie), action->script); + swfdec_sandbox_unuse (action->movie->resource->sandbox); } else { swfdec_movie_execute (action->movie, action->event); } @@ -917,6 +914,8 @@ swfdec_player_dispose (GObject *object) } g_assert (priv->movies == NULL); g_assert (priv->audio == NULL); + g_assert (g_hash_table_size (priv->sandboxes) == 0); + g_hash_table_destroy (priv->sandboxes); if (priv->external_timeout.callback) swfdec_player_remove_timeout (player, &priv->external_timeout); if (priv->rate) { @@ -1796,6 +1795,8 @@ swfdec_player_init (SwfdecPlayer *player) priv->iterate_timeout.callback = swfdec_player_iterate; priv->stage_width = -1; priv->stage_height = -1; + + priv->sandboxes = g_hash_table_new (swfdec_url_hash, swfdec_url_equal); } void @@ -1986,8 +1987,7 @@ swfdec_player_launch (SwfdecPlayer *player, SwfdecLoaderRequest request, const c * the player is already initialized, this function does nothing. **/ void -swfdec_player_initialize (SwfdecPlayer *player, guint version, - guint rate, guint width, guint height) +swfdec_player_initialize (SwfdecPlayer *player, guint rate, guint width, guint height) { SwfdecPlayerPrivate *priv; @@ -1996,24 +1996,6 @@ swfdec_player_initialize (SwfdecPlayer *player, guint version, priv = player->priv; if (!priv->initialized) { - SwfdecAsContext *context = SWFDEC_AS_CONTEXT (player); - swfdec_as_context_startup (context, version); - /* reset state for initialization */ - /* FIXME: have a better way to do this */ - if (context->state == SWFDEC_AS_CONTEXT_RUNNING) { - context->state = SWFDEC_AS_CONTEXT_NEW; - swfdec_sprite_movie_init_context (player, version); - swfdec_video_movie_init_context (player, version); - swfdec_net_stream_init_context (player, version); - - swfdec_as_context_run_init_script (context, swfdec_initialize, - sizeof (swfdec_initialize), context->version); - - if (context->state == SWFDEC_AS_CONTEXT_NEW) { - context->state = SWFDEC_AS_CONTEXT_RUNNING; - swfdec_as_object_set_constructor (priv->roots->data, priv->MovieClip); - } - } priv->initialized = TRUE; g_object_notify (G_OBJECT (player), "initialized"); } else { diff --git a/libswfdec/swfdec_player_as.c b/libswfdec/swfdec_player_as.c index e844bb6..a091f93 100644 --- a/libswfdec/swfdec_player_as.c +++ b/libswfdec/swfdec_player_as.c @@ -346,7 +346,7 @@ swfdec_player_object_registerClass (SwfdecAsContext *cx, SwfdecAsObject *object, /* This is ran at the beginning of swfdec_as_context_startup. * Yes, this is a hack */ void -swfdec_player_preinit_global (SwfdecAsContext *context, guint version) +swfdec_player_preinit_global (SwfdecAsContext *context) { /* init these two before swfdec_as_context_startup, so they won't get * __proto__ and constructor properties */ diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index dd9184b..fe08454 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -27,7 +27,6 @@ #include <libswfdec/swfdec_player_scripting.h> #include <libswfdec/swfdec_rect.h> #include <libswfdec/swfdec_ringbuffer.h> -#include <libswfdec/swfdec_security.h> #include <libswfdec/swfdec_socket.h> #include <libswfdec/swfdec_system.h> @@ -136,12 +135,12 @@ struct _SwfdecPlayerPrivate SwfdecRingBuffer * actions[SWFDEC_PLAYER_N_ACTION_QUEUES]; /* all actions we've queued up so far */ /* security */ + GHashTable * sandboxes; /* SwfdecURL => SwfdecSandbox mapping */ GList * loading_policy_files; /* list of loading SwfdecPlayerLoader - newest first */ GSList * policy_files; /* list of SwfdecPolicyLoader that finished loading */ }; void swfdec_player_initialize (SwfdecPlayer * player, - guint version, guint rate, guint width, guint height); diff --git a/libswfdec/swfdec_policy_file.c b/libswfdec/swfdec_policy_file.c index 9fbb768..34a532d 100644 --- a/libswfdec/swfdec_policy_file.c +++ b/libswfdec/swfdec_policy_file.c @@ -25,7 +25,6 @@ #include <string.h> #include "swfdec_policy_file.h" -#include "swfdec_flash_security.h" #include "swfdec_resource.h" #include "swfdec_as_strings.h" #include "swfdec_debug.h" diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index f76f891..30baaa4 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -25,18 +25,18 @@ #include <stdlib.h> #include <string.h> #include "swfdec_resource.h" -#include "swfdec_as_frame_internal.h" +#include "swfdec_as_object.h" #include "swfdec_as_internal.h" #include "swfdec_as_interpret.h" #include "swfdec_as_strings.h" #include "swfdec_character.h" #include "swfdec_debug.h" #include "swfdec_decoder.h" -#include "swfdec_flash_security.h" #include "swfdec_image_decoder.h" #include "swfdec_loader_internal.h" #include "swfdec_movie_clip_loader.h" #include "swfdec_player_internal.h" +#include "swfdec_sandbox.h" #include "swfdec_script.h" #include "swfdec_sprite.h" #include "swfdec_stream_target.h" @@ -45,7 +45,7 @@ static void swfdec_resource_stream_target_init (SwfdecStreamTargetInterface *iface); -G_DEFINE_TYPE_WITH_CODE (SwfdecResource, swfdec_resource, SWFDEC_TYPE_FLASH_SECURITY, +G_DEFINE_TYPE_WITH_CODE (SwfdecResource, swfdec_resource, SWFDEC_TYPE_AS_OBJECT, G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_resource_stream_target_init)) /*** SWFDEC_STREAM_TARGET interface ***/ @@ -56,27 +56,13 @@ swfdec_resource_is_root (SwfdecResource *resource) g_return_val_if_fail (SWFDEC_IS_RESOURCE (resource), FALSE); return - resource->movie == SWFDEC_FLASH_SECURITY (resource)->player->priv->roots->data; + resource->movie == SWFDEC_PLAYER (SWFDEC_AS_OBJECT (resource)->context)->priv->roots->data; } static SwfdecPlayer * swfdec_resource_stream_target_get_player (SwfdecStreamTarget *target) { - return SWFDEC_FLASH_SECURITY (target)->player; -} - -static void -swfdec_resource_check_rights (SwfdecResource *resource) -{ - SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (resource); - SwfdecSwfDecoder *dec = SWFDEC_SWF_DECODER (resource->decoder); - - if (swfdec_resource_is_root (resource)) { - if (dec->use_network && sec->sandbox == SWFDEC_SANDBOX_LOCAL_FILE) - sec->sandbox = SWFDEC_SANDBOX_LOCAL_NETWORK; - SWFDEC_INFO ("enabling local-with-network sandbox for %s", - swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); - } + return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (target)->context); } static void @@ -90,14 +76,23 @@ swfdec_resource_stream_target_image (SwfdecResource *instance) if (SWFDEC_IS_SWF_DECODER (instance->decoder)) { SwfdecSwfDecoder *dec = SWFDEC_SWF_DECODER (instance->decoder); - movie->sprite = dec->main_sprite; - g_assert (movie->sprite->parse_frame > 0); - movie->n_frames = movie->sprite->n_frames; - swfdec_movie_invalidate_last (SWFDEC_MOVIE (movie)); - swfdec_resource_check_rights (instance); - if (swfdec_resource_is_root (instance)) { - swfdec_movie_initialize (SWFDEC_MOVIE (movie)); - swfdec_player_perform_actions (SWFDEC_FLASH_SECURITY (instance)->player); + if (swfdec_sandbox_set_allow_network (instance->sandbox, + SWFDEC_SWF_DECODER (instance->decoder)->use_network)) { + movie->sprite = dec->main_sprite; + g_assert (movie->sprite->parse_frame > 0); + movie->n_frames = movie->sprite->n_frames; + swfdec_movie_invalidate_last (SWFDEC_MOVIE (movie)); + if (swfdec_resource_is_root (instance)) { + SwfdecPlayer *player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (instance)->context); + swfdec_as_object_set_constructor (SWFDEC_AS_OBJECT (movie), player->priv->MovieClip); + swfdec_movie_initialize (SWFDEC_MOVIE (movie)); + swfdec_player_perform_actions (player); + } + } else { + SWFDEC_FIXME ("cannot continue loading %s, invalid rights", + swfdec_url_get_url (swfdec_loader_get_url (instance->loader))); + swfdec_stream_set_target (SWFDEC_STREAM (instance->loader), NULL); + /* FIXME: anyting on the movie we need to clear? */ } } else { g_assert_not_reached (); @@ -200,7 +195,7 @@ swfdec_resource_create_movie (SwfdecResource *resource) if (resource->movie) return TRUE; - player = SWFDEC_FLASH_SECURITY (resource)->player; + player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (resource)->context); movie = (SwfdecSpriteMovie *) swfdec_action_lookup_object (SWFDEC_AS_CONTEXT (player), player->priv->roots->data, resource->target, resource->target + strlen (resource->target)); if (!SWFDEC_IS_SPRITE_MOVIE (movie)) { @@ -217,7 +212,8 @@ swfdec_resource_create_movie (SwfdecResource *resource) if (movie == NULL) { movie = swfdec_player_create_movie_at_level (player, resource, level); } else { - movie = swfdec_resource_replace_movie (movie, resource); + /* FIXME: is this correct? */ + movie = swfdec_resource_replace_movie (movie, SWFDEC_MOVIE (movie)->resource); } swfdec_player_unroot (player, resource); return TRUE; @@ -262,7 +258,7 @@ swfdec_resource_stream_target_parse (SwfdecStreamTarget *target, SwfdecStream *s return; buffer = swfdec_buffer_queue_peek (queue, 4); dec - swfdec_decoder_new (SWFDEC_FLASH_SECURITY (resource)->player, buffer); + swfdec_decoder_new (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (resource)->context), buffer); swfdec_buffer_unref (buffer); if (dec == NULL) { SWFDEC_ERROR ("no decoder found for format"); @@ -304,8 +300,8 @@ swfdec_resource_stream_target_parse (SwfdecStreamTarget *target, SwfdecStream *s if (SWFDEC_IS_SWF_DECODER (dec)) resource->version = SWFDEC_SWF_DECODER (dec)->version; if (swfdec_resource_is_root (resource)) { - swfdec_player_initialize (SWFDEC_FLASH_SECURITY (resource)->player, - resource->version, dec->rate, dec->width, dec->height); + swfdec_player_initialize (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (resource)->context), + dec->rate, dec->width, dec->height); } } if (status & SWFDEC_STATUS_IMAGE) @@ -369,6 +365,16 @@ swfdec_resource_stream_target_init (SwfdecStreamTargetInterface *iface) } static void +swfdec_resource_mark (SwfdecAsObject *object) +{ + SwfdecResource *resource = SWFDEC_RESOURCE (object); + + if (resource->clip_loader) + swfdec_as_object_mark (SWFDEC_AS_OBJECT (resource->clip_loader)); + swfdec_as_object_mark (SWFDEC_AS_OBJECT (resource->sandbox)); +} + +static void swfdec_resource_dispose (GObject *object) { SwfdecResource *resource = SWFDEC_RESOURCE (object); @@ -398,8 +404,11 @@ static void swfdec_resource_class_init (SwfdecResourceClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + SwfdecAsObjectClass *asobject_class = SWFDEC_AS_OBJECT_CLASS (klass); object_class->dispose = swfdec_resource_dispose; + + asobject_class->mark = swfdec_resource_mark; } static void @@ -420,8 +429,6 @@ swfdec_resource_set_loader (SwfdecResource *resource, SwfdecLoader *loader) resource->loader = g_object_ref (loader); swfdec_stream_set_target (SWFDEC_STREAM (resource->loader), SWFDEC_STREAM_TARGET (resource)); - swfdec_flash_security_set_url (SWFDEC_FLASH_SECURITY (resource), - swfdec_loader_get_url (loader)); resource->state = SWFDEC_RESOURCE_REQUESTED; } @@ -429,28 +436,23 @@ SwfdecResource * swfdec_resource_new (SwfdecPlayer *player, SwfdecLoader *loader, const char *variables) { SwfdecResource *resource; + guint size; g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL); + size = sizeof (SwfdecResource); + if (!swfdec_as_context_use_mem (SWFDEC_AS_CONTEXT (player), size)) + size = 0; resource = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); - resource->version = 7; - SWFDEC_FLASH_SECURITY (resource)->player = player; + swfdec_as_object_add (SWFDEC_AS_OBJECT (resource), SWFDEC_AS_CONTEXT (player), size); + resource->version = 8; resource->variables = g_strdup (variables); swfdec_resource_set_loader (resource, loader); return resource; } -void -swfdec_resource_mark (SwfdecResource *resource) -{ - g_return_if_fail (SWFDEC_IS_RESOURCE (resource)); - - if (resource->clip_loader) - swfdec_as_object_mark (SWFDEC_AS_OBJECT (resource->clip_loader)); -} - gpointer swfdec_resource_get_export (SwfdecResource *instance, const char *name) { @@ -480,9 +482,11 @@ swfdec_resource_add_export (SwfdecResource *instance, SwfdecCharacter *character g_hash_table_insert (instance->export_names, g_object_ref (character), g_strdup (name)); } +/*** RESOURC LOAD ***/ + typedef struct _SwfdecResourceLoad SwfdecResourceLoad; struct _SwfdecResourceLoad { - SwfdecResource * resource; + SwfdecSandbox * sandbox; char * target; char * url; SwfdecLoaderRequest request; @@ -496,8 +500,7 @@ swfdec_resource_load_free (gpointer loadp) { SwfdecResourceLoad *load = loadp; - swfdec_player_unroot (SWFDEC_FLASH_SECURITY (load->resource)->player, load); - g_object_unref (load->resource); + swfdec_player_unroot (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (load->sandbox)->context), load); g_free (load->url); g_free (load->target); if (load->buffer) @@ -510,7 +513,7 @@ swfdec_resource_load_mark (gpointer loadp, gpointer playerp) { SwfdecResourceLoad *load = loadp; - swfdec_resource_mark (load->resource); + swfdec_as_object_mark (SWFDEC_AS_OBJECT (load->sandbox)); if (load->loader) swfdec_as_object_mark (SWFDEC_AS_OBJECT (load->loader)); } @@ -522,24 +525,27 @@ swfdec_resource_do_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean al SwfdecResource *resource; SwfdecLoader *loader; + if (!swfdec_as_context_use_mem (SWFDEC_AS_CONTEXT (player), sizeof (SwfdecResource))) + return; resource = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); - resource->version = load->resource->version; - SWFDEC_FLASH_SECURITY (resource)->player = player; + swfdec_as_object_add (SWFDEC_AS_OBJECT (resource), SWFDEC_AS_CONTEXT (player), sizeof (SwfdecResource)); + resource->version = 8; resource->target = g_strdup (load->target); if (load->loader) resource->clip_loader = g_object_ref (load->loader); - swfdec_player_root (player, resource, (GFunc) swfdec_resource_mark); + swfdec_player_root (player, resource, (GFunc) swfdec_as_object_mark); if (!allowed) { SWFDEC_WARNING ("SECURITY: no access to %s from %s", - load->url, swfdec_url_get_url (SWFDEC_FLASH_SECURITY (load->resource)->url)); + load->url, swfdec_url_get_url (load->sandbox->url)); /* FIXME: is replacing correct? */ swfdec_resource_emit_error (resource, SWFDEC_AS_STR_IllegalRequest); g_object_unref (resource); return; } - loader = swfdec_loader_load (load->resource->loader, url, load->request, load->buffer); + loader = swfdec_loader_load (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (load->sandbox))->priv->resource->loader, + url, load->request, load->buffer); swfdec_resource_set_loader (resource, loader); g_object_unref (loader); } @@ -562,7 +568,7 @@ swfdec_resource_load_request (gpointer loadp, gpointer playerp) SWFDEC_DEBUG ("no movie, not unloading"); return; } - swfdec_resource_replace_movie (movie, load->resource); + swfdec_resource_replace_movie (movie, SWFDEC_MOVIE (movie)->resource); return; } @@ -579,8 +585,8 @@ swfdec_resource_load_request (gpointer loadp, gpointer playerp) return; } - url = swfdec_url_new_relative (SWFDEC_FLASH_SECURITY (player->priv->resource)->url, load->url); - switch (SWFDEC_FLASH_SECURITY (load->resource)->sandbox) { + url = swfdec_url_new_relative (swfdec_loader_get_url (player->priv->resource->loader), load->url); + switch (load->sandbox->type) { case SWFDEC_SANDBOX_REMOTE: swfdec_resource_do_load (player, url, !swfdec_url_is_local (url), load); break; @@ -634,7 +640,7 @@ swfdec_resource_load (SwfdecPlayer *player, const char *target, const char *url, } else { load->target = g_strdup (target); } - load->resource = SWFDEC_RESOURCE (g_object_ref (SWFDEC_AS_CONTEXT (player)->frame->security)); + load->sandbox = SWFDEC_SANDBOX (SWFDEC_AS_CONTEXT (player)->global); load->url = g_strdup (url); load->request = request; load->buffer = buffer; diff --git a/libswfdec/swfdec_resource.h b/libswfdec/swfdec_resource.h index 5de9c9b..c7d9544 100644 --- a/libswfdec/swfdec_resource.h +++ b/libswfdec/swfdec_resource.h @@ -21,7 +21,7 @@ #define _SWFDEC_RESOURCE_H_ #include <libswfdec/swfdec_player.h> -#include <libswfdec/swfdec_flash_security.h> +#include <libswfdec/swfdec_sandbox.h> #include <libswfdec/swfdec_sprite_movie.h> G_BEGIN_DECLS @@ -45,9 +45,10 @@ typedef enum { struct _SwfdecResource { - SwfdecFlashSecurity flash_security; + SwfdecAsObject object; guint version; /* version of this resource */ + SwfdecSandbox * sandbox; /* sandbox this resource belongs to */ SwfdecSpriteMovie * movie; /* the movie responsible for creating this instance */ SwfdecLoader * loader; /* the loader providing data for the decoder */ @@ -65,7 +66,7 @@ struct _SwfdecResource struct _SwfdecResourceClass { - SwfdecFlashSecurityClass flash_security_class; + SwfdecAsObjectClass object_class; }; GType swfdec_resource_get_type (void); @@ -74,8 +75,6 @@ SwfdecResource *swfdec_resource_new (SwfdecPlayer * player, SwfdecLoader * loader, const char * variables); -void swfdec_resource_mark (SwfdecResource * resource); - gboolean swfdec_resource_emit_on_load_init (SwfdecResource * resource); void swfdec_resource_add_export (SwfdecResource * instance, SwfdecCharacter * character, diff --git a/libswfdec/swfdec_security.c b/libswfdec/swfdec_security.c deleted file mode 100644 index ae431a0..0000000 --- a/libswfdec/swfdec_security.c +++ /dev/null @@ -1,63 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <string.h> -#include "swfdec_security.h" -#include "swfdec_debug.h" - - -G_DEFINE_ABSTRACT_TYPE (SwfdecSecurity, swfdec_security, G_TYPE_OBJECT) - -static void -swfdec_security_class_init (SwfdecSecurityClass *klass) -{ -} - -static void -swfdec_security_init (SwfdecSecurity *security) -{ -} - -/** - * swfdec_security_allow: - * @guard: security guarding an operation - * @key: security available - * - * Asks @guard to check if the given @key allows accessing it. If so, a - * key for accessing the operation is returned. - * - * Returns: %TRUE if access was granted, %FALSE otherwise. - **/ -gboolean -swfdec_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) -{ - SwfdecSecurityClass *klass; - - g_return_val_if_fail (SWFDEC_IS_SECURITY (guard), FALSE); - g_return_val_if_fail (SWFDEC_IS_SECURITY (key), FALSE); - - klass = SWFDEC_SECURITY_GET_CLASS (guard); - g_return_val_if_fail (klass->allow, FALSE); - return klass->allow (guard, key); -} - diff --git a/libswfdec/swfdec_security.h b/libswfdec/swfdec_security.h deleted file mode 100644 index 0211301..0000000 --- a/libswfdec/swfdec_security.h +++ /dev/null @@ -1,58 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef _SWFDEC_SECURITY_H_ -#define _SWFDEC_SECURITY_H_ - -#include <glib-object.h> -#include <libswfdec/swfdec_url.h> - -G_BEGIN_DECLS - -typedef struct _SwfdecSecurity SwfdecSecurity; -typedef struct _SwfdecSecurityClass SwfdecSecurityClass; - -#define SWFDEC_TYPE_SECURITY (swfdec_security_get_type()) -#define SWFDEC_IS_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SECURITY)) -#define SWFDEC_IS_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_SECURITY)) -#define SWFDEC_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_SECURITY, SwfdecSecurity)) -#define SWFDEC_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_SECURITY, SwfdecSecurityClass)) -#define SWFDEC_SECURITY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_SECURITY, SwfdecSecurityClass)) - -struct _SwfdecSecurity -{ - GObject object; -}; - -struct _SwfdecSecurityClass -{ - GObjectClass object_class; - - gboolean (* allow) (SwfdecSecurity * guard, - SwfdecSecurity * key); -}; - -GType swfdec_security_get_type (void); - -gboolean swfdec_security_allow (SwfdecSecurity * guard, - SwfdecSecurity * key); - - -G_END_DECLS -#endif diff --git a/libswfdec/swfdec_security_allow.c b/libswfdec/swfdec_security_allow.c deleted file mode 100644 index fb678b4..0000000 --- a/libswfdec/swfdec_security_allow.c +++ /dev/null @@ -1,72 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <string.h> -#include "swfdec_security_allow.h" -#include "swfdec_debug.h" - - -G_DEFINE_TYPE (SwfdecSecurityAllow, swfdec_security_allow, SWFDEC_TYPE_SECURITY) - -static gboolean -swfdec_security_allow_allow (SwfdecSecurity *guard, SwfdecSecurity *key) -{ - return TRUE; -} - -static void -swfdec_security_allow_class_init (SwfdecSecurityAllowClass *klass) -{ - SwfdecSecurityClass *security_class = SWFDEC_SECURITY_CLASS (klass); - - security_class->allow = swfdec_security_allow_allow; -} - -static void -swfdec_security_allow_init (SwfdecSecurityAllow *security_allow) -{ -} - -/** - * swfdec_security_allow_new: - * - * Creates a new Security object that allows everything. These objects are used - * by default when no other security object is in use. This is particularly - * useful for script engines that are not security sensitive or code injection - * via debugging. - * - * Returns: a new #SwfdecSecurity object - **/ -SwfdecSecurity * -swfdec_security_allow_new (void) -{ - static SwfdecSecurity *singleton = NULL; - - /* FIXME: not threadsafe */ - if (singleton) - return g_object_ref (singleton); - - singleton = g_object_new (SWFDEC_TYPE_SECURITY_ALLOW, NULL); - g_object_add_weak_pointer (G_OBJECT (singleton), (gpointer) &singleton); - return singleton; -} diff --git a/libswfdec/swfdec_security_allow.h b/libswfdec/swfdec_security_allow.h deleted file mode 100644 index 108ed72..0000000 --- a/libswfdec/swfdec_security_allow.h +++ /dev/null @@ -1,53 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef _SWFDEC_SECURITY_ALLOW_H_ -#define _SWFDEC_SECURITY_ALLOW_H_ - -#include <libswfdec/swfdec_security.h> - -G_BEGIN_DECLS - -typedef struct _SwfdecSecurityAllow SwfdecSecurityAllow; -typedef struct _SwfdecSecurityAllowClass SwfdecSecurityAllowClass; - -#define SWFDEC_TYPE_SECURITY_ALLOW (swfdec_security_allow_get_type()) -#define SWFDEC_IS_SECURITY_ALLOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SECURITY_ALLOW)) -#define SWFDEC_IS_SECURITY_ALLOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_SECURITY_ALLOW)) -#define SWFDEC_SECURITY_ALLOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_SECURITY_ALLOW, SwfdecSecurityAllow)) -#define SWFDEC_SECURITY_ALLOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_SECURITY_ALLOW, SwfdecSecurityAllowClass)) -#define SWFDEC_SECURITY_ALLOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_SECURITY_ALLOW, SwfdecSecurityAllowClass)) - -struct _SwfdecSecurityAllow -{ - SwfdecSecurity security; -}; - -struct _SwfdecSecurityAllowClass -{ - SwfdecSecurityClass security_class; -}; - -GType swfdec_security_allow_get_type (void); - -SwfdecSecurity * swfdec_security_allow_new (void); - - -G_END_DECLS -#endif diff --git a/libswfdec/swfdec_sprite_movie_as.c b/libswfdec/swfdec_sprite_movie_as.c index 223d3b1..987a97e 100644 --- a/libswfdec/swfdec_sprite_movie_as.c +++ b/libswfdec/swfdec_sprite_movie_as.c @@ -867,7 +867,7 @@ swfdec_sprite_movie_setMask (SwfdecAsContext *cx, SwfdecAsObject *object, } void -swfdec_sprite_movie_init_context (SwfdecPlayer *player, guint version) +swfdec_sprite_movie_init_context (SwfdecPlayer *player) { SwfdecPlayerPrivate *priv = player->priv; SwfdecAsContext *context = SWFDEC_AS_CONTEXT (player); diff --git a/libswfdec/swfdec_system_security.c b/libswfdec/swfdec_system_security.c index f6b20e9..284eea1 100644 --- a/libswfdec/swfdec_system_security.c +++ b/libswfdec/swfdec_system_security.c @@ -24,7 +24,6 @@ #include "swfdec_as_internal.h" #include "swfdec_debug.h" #include "swfdec_as_strings.h" -#include "swfdec_flash_security.h" #include "swfdec_resource.h" #include "swfdec_player_internal.h" @@ -80,7 +79,7 @@ swfdec_system_security_get_sandboxType (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { - switch (SWFDEC_FLASH_SECURITY (SWFDEC_PLAYER (cx)->priv->resource)->sandbox) { + switch (SWFDEC_SANDBOX (cx->global)->type) { case SWFDEC_SANDBOX_REMOTE: SWFDEC_AS_VALUE_SET_STRING (ret, SWFDEC_AS_STR_remote); break; diff --git a/libswfdec/swfdec_video_movie_as.c b/libswfdec/swfdec_video_movie_as.c index 833c634..91f9c7e 100644 --- a/libswfdec/swfdec_video_movie_as.c +++ b/libswfdec/swfdec_video_movie_as.c @@ -61,7 +61,7 @@ swfdec_video_clear (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, } void -swfdec_video_movie_init_context (SwfdecPlayer *player, guint version) +swfdec_video_movie_init_context (SwfdecPlayer *player) { SwfdecAsContext *context; SwfdecAsObject *video, *proto; @@ -83,12 +83,6 @@ swfdec_video_movie_init_context (SwfdecPlayer *player, guint version) swfdec_as_object_set_variable_and_flags (video, SWFDEC_AS_STR_prototype, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); /* set the right properties on the Video.prototype object */ - if (version >= 6) { - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_attachVideo, - SWFDEC_TYPE_VIDEO_MOVIE, swfdec_video_attach_video, 0); - swfdec_as_object_add_function (proto, SWFDEC_AS_STR_clear, - SWFDEC_TYPE_VIDEO_MOVIE, swfdec_video_clear, 0); - } SWFDEC_AS_VALUE_SET_OBJECT (&val, video); swfdec_as_object_set_variable_and_flags (proto, SWFDEC_AS_STR_constructor, &val, SWFDEC_AS_VARIABLE_HIDDEN | SWFDEC_AS_VARIABLE_PERMANENT); diff --git a/test/swfdec_test.c b/test/swfdec_test.c index 6e1e1d6..3974f4b 100644 --- a/test/swfdec_test.c +++ b/test/swfdec_test.c @@ -111,7 +111,7 @@ main (int argc, char **argv) return EXIT_FAILURE; context = g_object_new (SWFDEC_TYPE_AS_CONTEXT, NULL); - swfdec_as_context_startup (context, SWFDEC_TEST_VERSION); + swfdec_as_context_startup (context); SWFDEC_AS_VALUE_SET_BOOLEAN (&val, dump); swfdec_as_object_set_variable (context->global, diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c index c52bf1e..40051aa 100644 --- a/vivified/core/vivi_application.c +++ b/vivified/core/vivi_application.c @@ -153,7 +153,7 @@ vivi_application_new (void) ViviApplication *app; app = g_object_new (VIVI_TYPE_APPLICATION, NULL); - swfdec_as_context_startup (SWFDEC_AS_CONTEXT (app), 8); + swfdec_as_context_startup (SWFDEC_AS_CONTEXT (app)); vivi_function_init_context (app); return app; } commit 26341ec1a740e9eb0db4f296c747359a6ee57ff9 Author: Benjamin Otte <otte at gnome.org> Date: Fri Jan 18 15:08:46 2008 +0100 add functions to use SwfdecURL as a hash table key diff --git a/libswfdec/swfdec_url.c b/libswfdec/swfdec_url.c index 6cdb54f..6243f75 100644 --- a/libswfdec/swfdec_url.c +++ b/libswfdec/swfdec_url.c @@ -469,3 +469,85 @@ swfdec_url_is_local (const SwfdecURL *url) /* FIXME: If we ever support gnome-vfs, this might become tricky */ return swfdec_url_has_protocol (url, "file"); } + +/** + * swfdec_url_equal: + * @a: a #SwfdecURL + * @b: a #SwfdecURL + * + * Compares the 2 given URLs for equality. 2 URLs are considered equal, when + * they point to the same resource. This function is intended to be + * used together with swfdec_url_hash() in a #GHashtable. + * + * Returns: %TRUE if the 2 given urls point to the same resource, %FALSE + * otherwise. + **/ +gboolean +swfdec_url_equal (gconstpointer a, gconstpointer b) +{ + const SwfdecURL *urla = a; + const SwfdecURL *urlb = b; + + if (!swfdec_url_has_protocol (urla, urlb->protocol)) + return FALSE; + + if (urla->host == NULL) { + if (urlb->host != NULL) + return FALSE; + } else { + if (urlb->host == NULL || + !g_str_equal (urla->host, urlb->host)) + return FALSE; + } + + if (urla->port != urlb->port) + return FALSE; + + if (urla->path == NULL) { + if (urlb->path != NULL) + return FALSE; + } else { + if (urlb->path == NULL || + !g_str_equal (urla->path, urlb->path)) + return FALSE; + } + + /* FIXME: include query strings? */ + if (urla->query == NULL) { + if (urlb->query != NULL) + return FALSE; + } else { + if (urlb->query == NULL || + !g_str_equal (urla->query, urlb->query)) + return FALSE; + } + + return TRUE; +} + +/** + * swfdec_url_hash: + * @url: a #SwfdecURL + * + * Creates a hash value for the given @url. This function is intended to be + * used together with swfdec_url_equal() in a #GHashtable. + * + * Returns: a hash value + **/ +guint +swfdec_url_hash (gconstpointer url) +{ + const SwfdecURL *u = url; + guint ret; + + /* random hash function, feel free to improve it */ + ret = g_str_hash (u->protocol); + if (u->host) + ret ^= g_str_hash (u->host); + ret ^= u->port; + if (u->path) + ret ^= g_str_hash (u->path); + /* queries aren't used often in hashed urls, so ignore them */ + return ret; +} + diff --git a/libswfdec/swfdec_url.h b/libswfdec/swfdec_url.h index 5eaa306..36a0dab 100644 --- a/libswfdec/swfdec_url.h +++ b/libswfdec/swfdec_url.h @@ -54,6 +54,10 @@ gboolean swfdec_url_has_protocol (const SwfdecURL * url, gboolean swfdec_url_is_parent (const SwfdecURL * parent, const SwfdecURL * child); gboolean swfdec_url_is_local (const SwfdecURL * url); + +gboolean swfdec_url_equal (gconstpointer a, + gconstpointer b); +guint swfdec_url_hash (gconstpointer url); G_END_DECLS commit 0ea23a5cd401ac0dcdb546f223b4fea310eddaaf Author: Benjamin Otte <otte at gnome.org> Date: Thu Jan 17 23:35:16 2008 +0100 only copy the loader if one exists diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index d269b6a..f76f891 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -526,7 +526,8 @@ swfdec_resource_do_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean al resource->version = load->resource->version; SWFDEC_FLASH_SECURITY (resource)->player = player; resource->target = g_strdup (load->target); - resource->clip_loader = g_object_ref (load->loader); + if (load->loader) + resource->clip_loader = g_object_ref (load->loader); swfdec_player_root (player, resource, (GFunc) swfdec_resource_mark); if (!allowed) { commit 8d7f1cd768a66565b79936bea8dd31074ddd5dab Author: Benjamin Otte <otte at gnome.org> Date: Thu Jan 17 23:30:57 2008 +0100 reimplement resource loading - it compiles diff --git a/libswfdec-gtk/swfdec_gtk_loader.c b/libswfdec-gtk/swfdec_gtk_loader.c index 479e6ad..26823cc 100644 --- a/libswfdec-gtk/swfdec_gtk_loader.c +++ b/libswfdec-gtk/swfdec_gtk_loader.c @@ -141,13 +141,13 @@ swfdec_gtk_loader_dispose (GObject *object) static void swfdec_gtk_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, - SwfdecLoaderRequest request, const char *data, gsize data_len) + SwfdecLoaderRequest request, SwfdecBuffer *buffer) { const SwfdecURL *url = swfdec_loader_get_url (loader); if (g_ascii_strcasecmp (swfdec_url_get_protocol (url), "http") != 0 && g_ascii_strcasecmp (swfdec_url_get_protocol (url), "https") != 0) { - SWFDEC_LOADER_CLASS (swfdec_gtk_loader_parent_class)->load (loader, parent, request, data, data_len); + SWFDEC_LOADER_CLASS (swfdec_gtk_loader_parent_class)->load (loader, parent, request, buffer); } else { SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (loader); SwfdecGtkLoaderClass *klass = SWFDEC_GTK_LOADER_GET_CLASS (gtk); @@ -157,9 +157,9 @@ swfdec_gtk_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, soup_message_set_flags (gtk->message, SOUP_MESSAGE_OVERWRITE_CHUNKS); g_signal_connect (gtk->message, "got-chunk", G_CALLBACK (swfdec_gtk_loader_push), gtk); g_signal_connect (gtk->message, "finished", G_CALLBACK (swfdec_gtk_loader_finished), gtk); - if (data) + if (buffer) soup_message_set_request (gtk->message, "appliation/x-www-urlencoded", - SOUP_BUFFER_USER_OWNED, (char *) data, data_len); + SOUP_BUFFER_USER_OWNED, (char *) buffer->data, buffer->length); g_object_ref (gtk->message); soup_session_queue_message (klass->session, gtk->message, NULL, NULL); } @@ -225,6 +225,6 @@ swfdec_gtk_loader_new (const char *uri) url = swfdec_url_new (uri); loader = g_object_new (SWFDEC_TYPE_GTK_LOADER, "url", url, NULL); swfdec_url_free (url); - swfdec_gtk_loader_load (loader, NULL, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0); + swfdec_gtk_loader_load (loader, NULL, SWFDEC_LOADER_REQUEST_DEFAULT, NULL); return loader; } diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 6316a0b..aa2c1c1 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -116,7 +116,6 @@ libswfdec_source_files = \ swfdec_rect.c \ swfdec_rectangle.c \ swfdec_resource.c \ - swfdec_resource_request.c \ swfdec_ringbuffer.c \ swfdec_script.c \ swfdec_security.c \ @@ -267,7 +266,6 @@ noinst_HEADERS = \ swfdec_policy_file.h \ swfdec_rect.h \ swfdec_resource.h \ - swfdec_resource_request.h \ swfdec_ringbuffer.h \ swfdec_script_internal.h \ swfdec_security.h \ diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 24a822c..813c1ce 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -45,7 +45,6 @@ #include "swfdec_sprite.h" #include "swfdec_sprite_movie.h" #include "swfdec_resource.h" -#include "swfdec_resource_request.h" #include "swfdec_text_field_movie.h" // for typeof /* Define this to get SWFDEC_WARN'd about missing properties of objects. @@ -1149,13 +1148,9 @@ swfdec_action_get_url (SwfdecAsContext *cx, guint action, const guint8 *data, gu } if (!SWFDEC_IS_PLAYER (cx)) { SWFDEC_ERROR ("GetURL without a SwfdecPlayer"); - } else if (swfdec_player_request_fscommand (SWFDEC_PLAYER (cx), url, target)) { - /* nothing to do here */ - } else if (swfdec_player_get_level (SWFDEC_PLAYER (cx), target) >= 0) { - swfdec_resource_load (SWFDEC_PLAYER (cx), target, url, - SWFDEC_LOADER_REQUEST_DEFAULT, NULL, NULL); } else { - swfdec_player_launch (SWFDEC_PLAYER (cx), SWFDEC_LOADER_REQUEST_DEFAULT, url, target, NULL); + swfdec_resource_load (SWFDEC_PLAYER (cx), target, url, + SWFDEC_LOADER_REQUEST_DEFAULT, NULL, NULL, FALSE); } g_free (url); g_free (target); @@ -1200,21 +1195,16 @@ swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, g if (!SWFDEC_IS_PLAYER (cx)) { SWFDEC_ERROR ("GetURL2 action requires a SwfdecPlayer"); - } else if (swfdec_player_request_fscommand (SWFDEC_PLAYER (cx), url, target)) { - /* nothing to do here */ } else if (variables) { SwfdecMovie *movie; movie = swfdec_player_get_movie_from_string (SWFDEC_PLAYER (cx), target); if (movie != NULL) { - swfdec_load_object_new (SWFDEC_AS_OBJECT (movie), url, method, NULL, NULL, + swfdec_load_object_create (SWFDEC_AS_OBJECT (movie), url, method, NULL, NULL, swfdec_as_interpret_load_variables_on_finish); } - } else if (internal) { - swfdec_resource_load (SWFDEC_PLAYER (cx), target, url, method, NULL, NULL); } else { - /* load an external file */ - swfdec_player_launch (SWFDEC_PLAYER (cx), method, url, target, NULL); + swfdec_resource_load (SWFDEC_PLAYER (cx), target, url, method, NULL, NULL, internal); } swfdec_as_stack_pop_n (cx, 2); diff --git a/libswfdec/swfdec_file_loader.c b/libswfdec/swfdec_file_loader.c index 1b498ac..a393185 100644 --- a/libswfdec/swfdec_file_loader.c +++ b/libswfdec/swfdec_file_loader.c @@ -38,12 +38,11 @@ G_DEFINE_TYPE (SwfdecFileLoader, swfdec_file_loader, SWFDEC_TYPE_LOADER) static void -swfdec_file_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, SwfdecLoaderRequest request, - const char *data, gsize data_len) +swfdec_file_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, + SwfdecLoaderRequest request, SwfdecBuffer *buffer) { SwfdecStream *stream = SWFDEC_STREAM (loader); const SwfdecURL *url; - SwfdecBuffer *buffer; GError *error = NULL; char *real; diff --git a/libswfdec/swfdec_flash_security.h b/libswfdec/swfdec_flash_security.h index 8ee888d..3af3442 100644 --- a/libswfdec/swfdec_flash_security.h +++ b/libswfdec/swfdec_flash_security.h @@ -61,7 +61,6 @@ GType swfdec_flash_security_get_type (void); void swfdec_flash_security_set_url (SwfdecFlashSecurity * sec, const SwfdecURL * url); -void swfdec_flash_security_free_pending (SwfdecFlashSecurity * sec); G_END_DECLS diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c index a7d3fd2..3d3d0ec 100644 --- a/libswfdec/swfdec_load_object.c +++ b/libswfdec/swfdec_load_object.c @@ -1,5 +1,5 @@ /* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org> * 2007 Pekka Lampila <pekka.lampila at iki.fi> * * This library is free software; you can redistribute it and/or @@ -30,7 +30,6 @@ #include "swfdec_loader_internal.h" #include "swfdec_stream_target.h" #include "swfdec_player_internal.h" -#include "swfdec_resource_request.h" /*** SWFDEC_STREAM_TARGET ***/ @@ -114,33 +113,25 @@ swfdec_load_object_stream_target_init (SwfdecStreamTargetInterface *iface) /*** SWFDEC_LOAD_OBJECT ***/ -G_DEFINE_TYPE_WITH_CODE (SwfdecLoadObject, swfdec_load_object, SWFDEC_TYPE_AS_OBJECT, +G_DEFINE_TYPE_WITH_CODE (SwfdecLoadObject, swfdec_load_object, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_load_object_stream_target_init)) static void -swfdec_load_object_reset (SwfdecLoadObject *load_object) -{ - if (load_object->loader) { - swfdec_stream_set_target (SWFDEC_STREAM (load_object->loader), NULL); - g_object_unref (load_object->loader); - load_object->loader = NULL; - } -} - -static void -swfdec_load_object_mark (SwfdecAsObject *object) -{ - swfdec_as_object_mark (SWFDEC_LOAD_OBJECT (object)->target); - - SWFDEC_AS_OBJECT_CLASS (swfdec_load_object_parent_class)->mark (object); -} - -static void swfdec_load_object_dispose (GObject *object) { - SwfdecLoadObject *load_object = SWFDEC_LOAD_OBJECT (object); + SwfdecLoadObject *load = SWFDEC_LOAD_OBJECT (object); - swfdec_load_object_reset (load_object); + if (load->loader) { + swfdec_stream_set_target (SWFDEC_STREAM (load->loader), NULL); + g_object_unref (load->loader); + load->loader = NULL; + } + if (load->buffer) { + swfdec_buffer_unref (load->buffer); + load->buffer = NULL; + } + g_object_unref (load->resource); + load->resource = NULL; G_OBJECT_CLASS (swfdec_load_object_parent_class)->dispose (object); } @@ -149,11 +140,8 @@ static void swfdec_load_object_class_init (SwfdecLoadObjectClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - SwfdecAsObjectClass *as_object_class = SWFDEC_AS_OBJECT_CLASS (klass); object_class->dispose = swfdec_load_object_dispose; - - as_object_class->mark = swfdec_load_object_mark; } static void @@ -162,70 +150,99 @@ swfdec_load_object_init (SwfdecLoadObject *load_object) } static void -swfdec_load_object_got_loader (SwfdecPlayer *player, SwfdecLoader *loader, gpointer obj) +swfdec_load_object_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean allow, gpointer obj) { - SwfdecLoadObject *load_object = SWFDEC_LOAD_OBJECT (obj); + SwfdecLoadObject *load = SWFDEC_LOAD_OBJECT (obj); + + if (!allow) { + SWFDEC_WARNING ("SECURITY: no access to %s from %s", + load->url, swfdec_url_get_url (SWFDEC_FLASH_SECURITY (load->resource)->url)); - if (loader == NULL) { + /* FIXME: call finish? */ + + /* unroot */ + swfdec_player_unroot (player, load); return; } - load_object->loader = loader; - swfdec_stream_set_target (SWFDEC_STREAM (loader), - SWFDEC_STREAM_TARGET (load_object)); - swfdec_loader_set_data_type (loader, SWFDEC_LOADER_DATA_TEXT); + load->loader = swfdec_loader_load (load->resource->loader, url, load->request, load->buffer); + + swfdec_stream_set_target (SWFDEC_STREAM (load->loader), SWFDEC_STREAM_TARGET (load)); + swfdec_loader_set_data_type (load->loader, SWFDEC_LOADER_DATA_TEXT); } -static gboolean -swfdec_load_object_load (SwfdecLoadObject *load_object, const char *url, - SwfdecLoaderRequest request, SwfdecBuffer *data) +/* perform security checks */ +static void +swfdec_load_object_request (gpointer objectp, gpointer playerp) { - SwfdecPlayer *player; - SwfdecSecurity *sec; - - g_return_val_if_fail (SWFDEC_IS_LOAD_OBJECT (load_object), FALSE); - g_return_val_if_fail (url != NULL, FALSE); - - player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (load_object)->context); - swfdec_load_object_reset (load_object); + SwfdecLoadObject *load = SWFDEC_LOAD_OBJECT (objectp); + SwfdecPlayer *player = SWFDEC_PLAYER (playerp); + SwfdecURL *url; + + /* FIXME: or is this relative to the player? */ + url = swfdec_url_new_relative (SWFDEC_FLASH_SECURITY (load->resource)->url, load->url); + switch (SWFDEC_FLASH_SECURITY (load->resource)->sandbox) { + case SWFDEC_SANDBOX_REMOTE: + case SWFDEC_SANDBOX_LOCAL_NETWORK: + case SWFDEC_SANDBOX_LOCAL_TRUSTED: + if (swfdec_url_is_local (url)) { + swfdec_load_object_load (player, url, swfdec_url_is_local (url), load); + } else { + SwfdecURL *load_url = swfdec_url_new_components ( + swfdec_url_get_protocol (url), swfdec_url_get_host (url), + swfdec_url_get_port (url), "crossdomain.xml", NULL); + swfdec_player_allow_or_load (player, url, load_url, + swfdec_load_object_load, load); + swfdec_url_free (load_url); + } + break; + case SWFDEC_SANDBOX_LOCAL_FILE: + swfdec_load_object_load (player, url, swfdec_url_is_local (url), load); + break; + case SWFDEC_SANDBOX_NONE: + default: + g_assert_not_reached (); + break; + } - /* get the current security */ - g_assert (SWFDEC_AS_CONTEXT (player)->frame); - sec = SWFDEC_AS_CONTEXT (player)->frame->security; + swfdec_url_free (url); +} - g_object_ref (load_object); - swfdec_player_request_resource (player, sec, url, request, data, - swfdec_load_object_got_loader, load_object, g_object_unref); +static void +swfdec_load_object_mark (gpointer object, gpointer player) +{ + SwfdecLoadObject *load = object; - return TRUE; + if (load->url) + swfdec_as_string_mark (load->url); + swfdec_as_object_mark (load->target); } -SwfdecAsObject * -swfdec_load_object_new (SwfdecAsObject *target, const char *url, +void +swfdec_load_object_create (SwfdecAsObject *target, const char *url, SwfdecLoaderRequest request, SwfdecBuffer *data, SwfdecLoadObjectProgress progress, SwfdecLoadObjectFinish finish) { - SwfdecLoadObject *load_object; - - g_return_val_if_fail (SWFDEC_IS_AS_OBJECT (target), NULL); - g_return_val_if_fail (url != NULL, NULL); - g_return_val_if_fail (finish != NULL, NULL); - - if (!swfdec_as_context_use_mem (target->context, sizeof (SwfdecLoadObject))) - return NULL; - load_object = SWFDEC_LOAD_OBJECT (g_object_new ( - SWFDEC_TYPE_LOAD_OBJECT, NULL)); - swfdec_as_object_add (SWFDEC_AS_OBJECT (load_object), target->context, - sizeof (SwfdecLoadObject)); - - load_object->target = target; - load_object->progress = progress; - load_object->finish = finish; - - if (!swfdec_load_object_load (load_object, url, request, data)) - return NULL; - - swfdec_player_root (SWFDEC_PLAYER (target->context), load_object, (GFunc) swfdec_as_object_mark); - - return SWFDEC_AS_OBJECT (load_object); + SwfdecPlayer *player; + SwfdecLoadObject *load; + + g_return_if_fail (SWFDEC_IS_AS_OBJECT (target)); + g_return_if_fail (url != NULL); + g_return_if_fail (finish != NULL); + + player = SWFDEC_PLAYER (target->context); + load = g_object_new (SWFDEC_TYPE_LOAD_OBJECT, NULL); + swfdec_player_root_full (player, load, swfdec_load_object_mark, g_object_unref); + + load->target = target; + load->url = url; + load->request = request; + load->buffer = data; + load->progress = progress; + load->finish = finish; + /* get the current security */ + g_assert (SWFDEC_AS_CONTEXT (player)->frame); + load->resource = g_object_ref (SWFDEC_AS_CONTEXT (player)->frame->security); + g_assert (SWFDEC_IS_RESOURCE (load->resource)); + swfdec_player_request_resource (player, swfdec_load_object_request, load, NULL); } diff --git a/libswfdec/swfdec_load_object.h b/libswfdec/swfdec_load_object.h index 00f4451..5f36625 100644 --- a/libswfdec/swfdec_load_object.h +++ b/libswfdec/swfdec_load_object.h @@ -1,5 +1,5 @@ /* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org> * 2007 Pekka Lampila <pekka.lampila at iki.fi> * * This library is free software; you can redistribute it and/or @@ -23,6 +23,7 @@ #include <libswfdec/swfdec.h> #include <libswfdec/swfdec_as_object.h> +#include <libswfdec/swfdec_resource.h> G_BEGIN_DECLS @@ -43,22 +44,26 @@ typedef void (* SwfdecLoadObjectFinish) (SwfdecAsObject *target, #define SWFDEC_LOAD_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_LOAD_OBJECT, SwfdecLoadObjectClass)) struct _SwfdecLoadObject { - SwfdecAsObject object; + GObject object; + + const char * url; /* GC'ed url to request */ + SwfdecLoaderRequest request; /* type of request */ + SwfdecBuffer * buffer; /* data to send */ + SwfdecLoader * loader; /* loader when loading or NULL */ - SwfdecLoader * loader; /* loader when loading or NULL */ - - SwfdecAsObject *target; /* target object */ - SwfdecLoadObjectProgress progress; - SwfdecLoadObjectFinish finish; + SwfdecResource * resource; /* resource that inited the loading */ + SwfdecAsObject * target; /* target object */ + SwfdecLoadObjectProgress progress; /* progress callback */ + SwfdecLoadObjectFinish finish; /* finish callback */ }; struct _SwfdecLoadObjectClass { - SwfdecAsObjectClass object_class; + GObjectClass object_class; }; GType swfdec_load_object_get_type (void); -SwfdecAsObject *swfdec_load_object_new (SwfdecAsObject * target, +void swfdec_load_object_create (SwfdecAsObject * target, const char * url, SwfdecLoaderRequest request, SwfdecBuffer * data, diff --git a/libswfdec/swfdec_load_object_as.c b/libswfdec/swfdec_load_object_as.c index 51656d5..012249e 100644 --- a/libswfdec/swfdec_load_object_as.c +++ b/libswfdec/swfdec_load_object_as.c @@ -65,30 +65,27 @@ swfdec_load_object_on_progress (SwfdecAsObject *target, glong size, SWFDEC_AS_NATIVE (301, 0, swfdec_load_object_as_load) void -swfdec_load_object_as_load (SwfdecAsContext *cx, SwfdecAsObject *obj, guint argc, +swfdec_load_object_as_load (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { SwfdecAsValue val; const char *url; - if (argc < 1 || obj == NULL) { - SWFDEC_AS_VALUE_SET_BOOLEAN (rval, FALSE); - return; - } + SWFDEC_AS_VALUE_SET_BOOLEAN (rval, FALSE); + SWFDEC_AS_CHECK (SWFDEC_TYPE_AS_OBJECT, &object, "s", &url); - url = swfdec_as_value_to_string (cx, &argv[0]); - swfdec_load_object_new (obj, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, + swfdec_load_object_create (object, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, swfdec_load_object_on_progress, swfdec_load_object_on_finish); SWFDEC_AS_VALUE_SET_INT (&val, 0); - swfdec_as_object_set_variable_and_flags (obj, SWFDEC_AS_STR__bytesLoaded, + swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR__bytesLoaded, &val, SWFDEC_AS_VARIABLE_HIDDEN); SWFDEC_AS_VALUE_SET_UNDEFINED (&val); - swfdec_as_object_set_variable_and_flags (obj, SWFDEC_AS_STR__bytesTotal, + swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR__bytesTotal, &val, SWFDEC_AS_VARIABLE_HIDDEN); SWFDEC_AS_VALUE_SET_BOOLEAN (&val, FALSE); - swfdec_as_object_set_variable_and_flags (obj, SWFDEC_AS_STR_loaded, &val, + swfdec_as_object_set_variable_and_flags (object, SWFDEC_AS_STR_loaded, &val, SWFDEC_AS_VARIABLE_HIDDEN); SWFDEC_AS_VALUE_SET_BOOLEAN (rval, TRUE); @@ -107,36 +104,27 @@ void swfdec_load_object_as_sendAndLoad (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *rval) { - const char *url, *data; + const char *url, *data, *method_string; SwfdecAsObject *target; SwfdecAsValue val; SwfdecBuffer *buffer; + SwfdecLoaderRequest method; - if (object == NULL) - return; - - if (argc < 2) - return; - - url = swfdec_as_value_to_string (cx, &argv[0]); - target = swfdec_as_value_to_object (cx, &argv[0]); - if (target == NULL) - return; + SWFDEC_AS_CHECK (SWFDEC_TYPE_AS_OBJECT, &object, "sO|s", &url, &target, &method_string); - // FIXME: support for contentType is missing + SWFDEC_FIXME ("support for contentType is missing"); - swfdec_as_object_call (object, SWFDEC_AS_STR_toString, 0, NULL, &val); - data = swfdec_as_value_to_string (cx, &val); - if (strlen (data) > 0) { - buffer = swfdec_buffer_new_for_data (g_memdup (data, strlen (data) + 1), - strlen (data)); - swfdec_load_object_new (target, url, SWFDEC_LOADER_REQUEST_POST, buffer, - swfdec_load_object_on_progress, swfdec_load_object_on_finish); - swfdec_buffer_unref (buffer); + if (method_string == NULL || g_ascii_strcasecmp (method_string, "get") == 0) { + method = SWFDEC_LOADER_REQUEST_GET; } else { - swfdec_load_object_new (target, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, - swfdec_load_object_on_progress, swfdec_load_object_on_finish); + method = SWFDEC_LOADER_REQUEST_POST; } + SWFDEC_AS_VALUE_SET_OBJECT (&val, object); + data = swfdec_as_value_to_string (cx, &val); + buffer = swfdec_buffer_new_for_data (g_memdup (data, strlen (data) + 1), + strlen (data) + 1); + swfdec_load_object_create (target, url, method, buffer, + swfdec_load_object_on_progress, swfdec_load_object_on_finish); SWFDEC_AS_VALUE_SET_INT (&val, 0); swfdec_as_object_set_variable_and_flags (target, SWFDEC_AS_STR__bytesLoaded, diff --git a/libswfdec/swfdec_loader.c b/libswfdec/swfdec_loader.c index 6b51e61..acf6944 100644 --- a/libswfdec/swfdec_loader.c +++ b/libswfdec/swfdec_loader.c @@ -208,19 +208,18 @@ swfdec_loader_init (SwfdecLoader *loader) SwfdecLoader * swfdec_loader_load (SwfdecLoader *loader, const SwfdecURL *url, - SwfdecLoaderRequest request, const char *data, gsize data_len) + SwfdecLoaderRequest request, SwfdecBuffer *buffer) { SwfdecLoader *ret; SwfdecLoaderClass *klass; g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL); g_return_val_if_fail (url != NULL, NULL); - g_return_val_if_fail (data != NULL || data_len == 0, NULL); klass = SWFDEC_LOADER_GET_CLASS (loader); g_return_val_if_fail (klass->load != NULL, NULL); ret = g_object_new (G_OBJECT_CLASS_TYPE (klass), "url", url, NULL); - klass->load (ret, loader, request, data, data_len); + klass->load (ret, loader, request, buffer); return ret; } diff --git a/libswfdec/swfdec_loader.h b/libswfdec/swfdec_loader.h index f668fca..e22cabd 100644 --- a/libswfdec/swfdec_loader.h +++ b/libswfdec/swfdec_loader.h @@ -72,8 +72,7 @@ struct _SwfdecLoaderClass void (* load) (SwfdecLoader * loader, SwfdecLoader * parent, SwfdecLoaderRequest request, - const char * data, - gsize data_len); + SwfdecBuffer * buffer); }; GType swfdec_loader_get_type (void); diff --git a/libswfdec/swfdec_loader_internal.h b/libswfdec/swfdec_loader_internal.h index 444610c..bb7bf67 100644 --- a/libswfdec/swfdec_loader_internal.h +++ b/libswfdec/swfdec_loader_internal.h @@ -36,8 +36,7 @@ void swfdec_stream_set_target (SwfdecStream * stream, SwfdecLoader * swfdec_loader_load (SwfdecLoader * loader, const SwfdecURL * url, SwfdecLoaderRequest request, - const char * data, - gsize data_len); + SwfdecBuffer * buffer); void swfdec_loader_set_data_type (SwfdecLoader * loader, SwfdecLoaderDataType type); char * swfdec_loader_get_text (SwfdecLoader * loader, diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 90147a3..3dd6902 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -43,7 +43,6 @@ #include "swfdec_resource.h" #include "swfdec_system.h" #include "swfdec_utils.h" -#include "swfdec_load_object.h" #include "swfdec_as_internal.h" /*** MOVIE ***/ diff --git a/libswfdec/swfdec_movie_clip_loader.c b/libswfdec/swfdec_movie_clip_loader.c index f3b9500..77d8704 100644 --- a/libswfdec/swfdec_movie_clip_loader.c +++ b/libswfdec/swfdec_movie_clip_loader.c @@ -29,7 +29,6 @@ #include "swfdec_decoder.h" #include "swfdec_player_internal.h" #include "swfdec_resource.h" -#include "swfdec_resource_request.h" G_DEFINE_TYPE (SwfdecMovieClipLoader, swfdec_movie_clip_loader, SWFDEC_TYPE_AS_OBJECT) @@ -75,7 +74,8 @@ swfdec_movie_clip_loader_loadClip (SwfdecAsContext *cx, SwfdecAsObject *object, SWFDEC_AS_CHECK (SWFDEC_TYPE_MOVIE_CLIP_LOADER, &loader, "ss", &url, &target); - swfdec_resource_load (SWFDEC_PLAYER (cx), target, url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, loader); + swfdec_resource_load (SWFDEC_PLAYER (cx), target, url, + SWFDEC_LOADER_REQUEST_DEFAULT, NULL, loader, TRUE); } SWFDEC_AS_NATIVE (112, 102, swfdec_movie_clip_loader_unloadClip) @@ -88,7 +88,8 @@ swfdec_movie_clip_loader_unloadClip (SwfdecAsContext *cx, SwfdecAsObject *object SWFDEC_AS_CHECK (SWFDEC_TYPE_MOVIE_CLIP_LOADER, &loader, "s", &target); - swfdec_resource_load (SWFDEC_PLAYER (cx), target, "", SWFDEC_LOADER_REQUEST_DEFAULT, NULL, loader); + swfdec_resource_load (SWFDEC_PLAYER (cx), target, "", + SWFDEC_LOADER_REQUEST_DEFAULT, NULL, loader, TRUE); } SWFDEC_AS_NATIVE (112, 101, swfdec_movie_clip_loader_getProgress) diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 324da0f..5a1e935 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -28,9 +28,11 @@ #include "swfdec_as_strings.h" #include "swfdec_audio_flv.h" #include "swfdec_debug.h" +#include "swfdec_flash_security.h" #include "swfdec_loader_internal.h" +#include "swfdec_player_internal.h" +#include "swfdec_resource.h" #include "swfdec_stream_target.h" -#include "swfdec_resource_request.h" /* NB: code and level must be rooted gc-strings */ static void @@ -468,31 +470,65 @@ swfdec_net_stream_new (SwfdecNetConnection *conn) } static void -swfdec_net_stream_request_callback (SwfdecPlayer *player, SwfdecLoader *loader, - gpointer data) +swfdec_net_stream_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean allowed, gpointer streamp) { - SwfdecNetStream *stream = data; + SwfdecNetStream *stream = streamp; + SwfdecLoader *loader; - if (loader) { + if (allowed) { + loader = swfdec_loader_load (player->priv->resource->loader, url, + SWFDEC_LOADER_REQUEST_DEFAULT, NULL); swfdec_net_stream_set_loader (stream, loader); g_object_unref (loader); + } else { + SWFDEC_WARNING ("SECURITY: no access to %s from NetStream", + swfdec_url_get_url (url)); } } void -swfdec_net_stream_set_url (SwfdecNetStream *stream, const char *url) +swfdec_net_stream_set_url (SwfdecNetStream *stream, const char *url_string) { + SwfdecPlayer *player; SwfdecAsContext *cx; + SwfdecURL *url; g_return_if_fail (SWFDEC_IS_NET_STREAM (stream)); g_return_if_fail (url != NULL); - /* FIXME: use the connection once connections are implemented */ cx = SWFDEC_AS_OBJECT (stream)->context; + player = SWFDEC_PLAYER (cx); g_assert (cx->frame); - swfdec_player_request_resource_now (SWFDEC_PLAYER (cx), cx->frame->security, - url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, - swfdec_net_stream_request_callback, NULL, stream); + url = swfdec_url_new_relative (SWFDEC_FLASH_SECURITY (player->priv->resource)->url, url_string); + if (swfdec_url_is_local (url)) { + swfdec_net_stream_load (player, url, TRUE, stream); + } else { + switch (SWFDEC_FLASH_SECURITY (cx->frame->security)->sandbox) { + case SWFDEC_SANDBOX_REMOTE: + swfdec_net_stream_load (player, url, TRUE, stream); + break; + case SWFDEC_SANDBOX_LOCAL_NETWORK: + case SWFDEC_SANDBOX_LOCAL_TRUSTED: + { + SwfdecURL *load_url = swfdec_url_new_components ( + swfdec_url_get_protocol (url), swfdec_url_get_host (url), + swfdec_url_get_port (url), "crossdomain.xml", NULL); + swfdec_player_allow_or_load (player, url, load_url, + swfdec_net_stream_load, stream); + swfdec_url_free (load_url); + } + break; + case SWFDEC_SANDBOX_LOCAL_FILE: + swfdec_net_stream_load (player, url, FALSE, stream); + break; + case SWFDEC_SANDBOX_NONE: + default: + g_assert_not_reached (); + break; + } + } + + swfdec_url_free (url); } void diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index eef2dce..7bcce79 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -44,7 +44,6 @@ #include "swfdec_marshal.h" #include "swfdec_movie.h" #include "swfdec_resource.h" -#include "swfdec_resource_request.h" #include "swfdec_script_internal.h" #include "swfdec_sprite_movie.h" #include "swfdec_utils.h" @@ -873,7 +872,7 @@ swfdec_player_dispose (GObject *object) guint i; swfdec_player_stop_all_sounds (player); - swfdec_player_resource_request_finish (player); + swfdec_function_list_clear (&priv->resource_requests); g_hash_table_destroy (priv->registered_classes); g_hash_table_destroy (priv->scripting_callbacks); @@ -887,8 +886,6 @@ swfdec_player_dispose (GObject *object) while (priv->roots) swfdec_movie_destroy (priv->roots->data); if (priv->resource) { - swfdec_flash_security_free_pending ( - SWFDEC_FLASH_SECURITY (priv->resource)); g_object_unref (priv->resource); priv->resource = NULL; } @@ -1345,7 +1342,7 @@ swfdec_player_iterate (SwfdecTimeout *timeout) swfdec_movie_destroy (cur); } swfdec_player_execute_on_load_init (player); - swfdec_player_resource_request_perform (player); + swfdec_function_list_execute_and_clear (&priv->resource_requests, player); swfdec_player_perform_actions (player); } @@ -1735,6 +1732,7 @@ swfdec_player_class_init (SwfdecPlayerClass *klass) * for keyboard shortcuts or similar.</para></listitem> * </itemizedlist> */ + /* FIXME: document fscommand:toggle */ signals[FSCOMMAND] = g_signal_new ("fscommand", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, swfdec_marshal_VOID__STRING_STRING, G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); @@ -1798,8 +1796,6 @@ swfdec_player_init (SwfdecPlayer *player) priv->iterate_timeout.callback = swfdec_player_iterate; priv->stage_width = -1; priv->stage_height = -1; - - swfdec_player_resource_request_init (player); } void diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index bb59e8e..dd9184b 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -42,7 +42,7 @@ typedef enum { typedef void (* SwfdecActionFunc) (gpointer object, gpointer data); typedef gboolean (* SwfdecAudioRemoveFunc) (SwfdecAudio *audio, gpointer data); -typedef void (* SwfdecPolicyFunc) (SwfdecPlayer *player, gboolean allow, gpointer data); +typedef void (* SwfdecPolicyFunc) (SwfdecPlayer *player, const SwfdecURL *url, gboolean allow, gpointer data); typedef struct _SwfdecTimeout SwfdecTimeout; struct _SwfdecTimeout { @@ -64,7 +64,6 @@ struct _SwfdecPlayerPrivate guint width; /* width of movie */ guint height; /* height of movie */ GList * roots; /* all the root movies */ - GSList * resource_requests; /* all external requested URIs - see swfdec_resource_request.[ch] */ SwfdecCache * cache; /* player cache */ gboolean bgcolor_set; /* TRUE if the background color has been set */ SwfdecColor bgcolor; /* background color */ @@ -87,6 +86,7 @@ struct _SwfdecPlayerPrivate int offset_x; /* x offset from top left edge after scaling */ int offset_y; /* y offset from top left edge after scaling */ + SwfdecFunctionList resource_requests; /* all external requested URIs - see swfdec_resource_request.[ch] */ guint unnamed_count; /* variable used for naming unnamed movies */ /* ActionScript */ SwfdecFunctionList rooted; /* all the objects we keep track of */ @@ -159,8 +159,12 @@ void swfdec_player_perform_actions (SwfdecPlayer * player); #define swfdec_player_root(player, data, mark_func) \ swfdec_function_list_add (&(player)->priv->rooted, (mark_func), (data), NULL) +#define swfdec_player_root_full(player, data, mark_func, destroy_notify) \ + swfdec_function_list_add (&(player)->priv->rooted, (mark_func), (data), (destroy_notify)) #define swfdec_player_unroot(player, data) \ swfdec_function_list_remove (&(player)->priv->rooted, (data)) +#define swfdec_player_request_resource(player, request_func, data, destroy_notify) \ + swfdec_function_list_add (&(player)->priv->resource_requests, (request_func), (data), (destroy_notify)) SwfdecAsObject *swfdec_player_get_export_class (SwfdecPlayer * player, const char * name); void swfdec_player_set_export_class (SwfdecPlayer * player, diff --git a/libswfdec/swfdec_policy_file.c b/libswfdec/swfdec_policy_file.c index dd4e0ca..9fbb768 100644 --- a/libswfdec/swfdec_policy_file.c +++ b/libswfdec/swfdec_policy_file.c @@ -147,7 +147,7 @@ swfdec_policy_file_finished_loading (SwfdecPolicyFile *file, const char *text) for (walk = file->requests; walk; walk = walk->next) { SwfdecPolicyFileRequest *request = walk->data; gboolean allow = swfdec_player_allow_now (file->player, request->url); - request->func (file->player, allow, request->data); + request->func (file->player, request->url, allow, request->data); swfdec_policy_file_request_free (request); } g_slist_free (file->requests); @@ -251,7 +251,7 @@ swfdec_policy_file_new (SwfdecPlayer *player, const SwfdecURL *url) SWFDEC_FIXME ("implement xmlsocket: protocol"); } else { file->stream = SWFDEC_STREAM (swfdec_loader_load (player->priv->resource->loader, - url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0)); + url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL)); swfdec_stream_set_target (file->stream, SWFDEC_STREAM_TARGET (file)); } player->priv->loading_policy_files = @@ -329,7 +329,7 @@ swfdec_player_allow_or_load (SwfdecPlayer *player, const SwfdecURL *url, g_return_if_fail (func); if (swfdec_player_allow_now (player, url)) { - func (player, TRUE, data); + func (player, url, TRUE, data); return; } if (load_url) @@ -337,7 +337,7 @@ swfdec_player_allow_or_load (SwfdecPlayer *player, const SwfdecURL *url, priv = player->priv; if (priv->loading_policy_files == NULL) { - func (player, FALSE, data); + func (player, url, FALSE, data); return; } request = g_slice_new (SwfdecPolicyFileRequest); diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 08113e3..d269b6a 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -37,7 +37,6 @@ #include "swfdec_loader_internal.h" #include "swfdec_movie_clip_loader.h" #include "swfdec_player_internal.h" -#include "swfdec_resource_request.h" #include "swfdec_script.h" #include "swfdec_sprite.h" #include "swfdec_stream_target.h" @@ -481,44 +480,137 @@ swfdec_resource_add_export (SwfdecResource *instance, SwfdecCharacter *character g_hash_table_insert (instance->export_names, g_object_ref (character), g_strdup (name)); } +typedef struct _SwfdecResourceLoad SwfdecResourceLoad; +struct _SwfdecResourceLoad { + SwfdecResource * resource; + char * target; + char * url; + SwfdecLoaderRequest request; + SwfdecBuffer * buffer; + SwfdecMovieClipLoader * loader; + gboolean target_is_movie; +}; + +static void +swfdec_resource_load_free (gpointer loadp) +{ + SwfdecResourceLoad *load = loadp; + + swfdec_player_unroot (SWFDEC_FLASH_SECURITY (load->resource)->player, load); + g_object_unref (load->resource); + g_free (load->url); + g_free (load->target); + if (load->buffer) + swfdec_buffer_unref (load->buffer); + g_slice_free (SwfdecResourceLoad, load); +} + static void -swfdec_resource_do_load (SwfdecPlayer *player, SwfdecLoader *loader, gpointer resourcep) +swfdec_resource_load_mark (gpointer loadp, gpointer playerp) { - SwfdecResource *resource = SWFDEC_RESOURCE (resourcep); + SwfdecResourceLoad *load = loadp; - if (loader == NULL) { - /* *** Security Sandbox Violation *** */ + swfdec_resource_mark (load->resource); + if (load->loader) + swfdec_as_object_mark (SWFDEC_AS_OBJECT (load->loader)); +} + +static void +swfdec_resource_do_load (SwfdecPlayer *player, const SwfdecURL *url, gboolean allowed, gpointer loadp) +{ + SwfdecResourceLoad *load = loadp; + SwfdecResource *resource; + SwfdecLoader *loader; + + resource = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); + resource->version = load->resource->version; + SWFDEC_FLASH_SECURITY (resource)->player = player; + resource->target = g_strdup (load->target); + resource->clip_loader = g_object_ref (load->loader); + swfdec_player_root (player, resource, (GFunc) swfdec_resource_mark); + + if (!allowed) { + SWFDEC_WARNING ("SECURITY: no access to %s from %s", + load->url, swfdec_url_get_url (SWFDEC_FLASH_SECURITY (load->resource)->url)); + /* FIXME: is replacing correct? */ swfdec_resource_emit_error (resource, SWFDEC_AS_STR_IllegalRequest); + g_object_unref (resource); return; } + + loader = swfdec_loader_load (load->resource->loader, url, load->request, load->buffer); swfdec_resource_set_loader (resource, loader); g_object_unref (loader); } static void -swfdec_resource_do_unload (SwfdecPlayer *player, const char *target, gpointer resourcep) +swfdec_resource_load_request (gpointer loadp, gpointer playerp) { - SwfdecResource *resource = SWFDEC_RESOURCE (resourcep); - SwfdecSpriteMovie *movie; - - movie = (SwfdecSpriteMovie *) swfdec_action_lookup_object ( - SWFDEC_AS_CONTEXT (player), player->priv->roots->data, - target, target + strlen (target)); - if (!SWFDEC_IS_SPRITE_MOVIE (movie)) { - SWFDEC_DEBUG ("no movie, not unloading"); + SwfdecResourceLoad *load = loadp; + SwfdecPlayer *player = playerp; + SwfdecURL *url; + + /* empty URL means unload (yay!) */ + if (load->url[0] == '\0') { + SwfdecSpriteMovie *movie; + + movie = (SwfdecSpriteMovie *) swfdec_action_lookup_object ( + SWFDEC_AS_CONTEXT (player), player->priv->roots->data, + load->target, load->target + strlen (load->target)); + if (!SWFDEC_IS_SPRITE_MOVIE (movie)) { + SWFDEC_DEBUG ("no movie, not unloading"); + return; + } + swfdec_resource_replace_movie (movie, load->resource); + return; + } + + /* fscommand? */ + if (g_ascii_strncasecmp (load->url, "FSCommand:", 10) == 0) { + char *command = load->url + 10; + g_signal_emit_by_name (player, "fscommand", command, load->target); + return; + } + + /* LAUNCH command (aka getURL) */ + if (!load->target_is_movie && swfdec_player_get_level (player, load->target) < 0) { + swfdec_player_launch (player, load->request, load->url,load->target, load->buffer); return; } - swfdec_resource_replace_movie (movie, resource); + + url = swfdec_url_new_relative (SWFDEC_FLASH_SECURITY (player->priv->resource)->url, load->url); + switch (SWFDEC_FLASH_SECURITY (load->resource)->sandbox) { + case SWFDEC_SANDBOX_REMOTE: + swfdec_resource_do_load (player, url, !swfdec_url_is_local (url), load); + break; + case SWFDEC_SANDBOX_LOCAL_NETWORK: + case SWFDEC_SANDBOX_LOCAL_TRUSTED: + if (!swfdec_url_is_local (url)) { + SWFDEC_FIXME ("Adobe claims you need to be allowed by policy files now, " + "we don't check that though"); + } + swfdec_resource_do_load (player, url, TRUE, load); + break; + case SWFDEC_SANDBOX_LOCAL_FILE: + swfdec_resource_do_load (player, url, swfdec_url_is_local (url), load); + break; + case SWFDEC_SANDBOX_NONE: + default: + g_assert_not_reached (); + break; + } + swfdec_url_free (url); } /* NB: must be called from a script */ +/* FIXME: 7 arguments?! */ void swfdec_resource_load (SwfdecPlayer *player, const char *target, const char *url, - SwfdecLoaderRequest request, SwfdecBuffer *buffer, SwfdecMovieClipLoader *loader) + SwfdecLoaderRequest request, SwfdecBuffer *buffer, SwfdecMovieClipLoader *loader, + gboolean target_is_movie) { SwfdecSpriteMovie *movie; - SwfdecResource *resource; - char *path; + SwfdecResourceLoad *load; g_return_if_fail (SWFDEC_IS_PLAYER (player)); g_return_if_fail (target != NULL); @@ -526,32 +618,30 @@ swfdec_resource_load (SwfdecPlayer *player, const char *target, const char *url, g_return_if_fail (loader == NULL || SWFDEC_IS_MOVIE_CLIP_LOADER (loader)); g_assert (SWFDEC_AS_CONTEXT (player)->frame != NULL); - movie = (SwfdecSpriteMovie *) swfdec_player_get_movie_from_string (player, target); - if (SWFDEC_IS_SPRITE_MOVIE (movie)) { - path = swfdec_movie_get_path (SWFDEC_MOVIE (movie), TRUE); - } else if (swfdec_player_get_level (player, target) >= 0) { - path = g_strdup (target); - } else { - SWFDEC_WARNING ("%s does not reference a movie, not loading %s", target, url); - return; - } - if (url[0] == '\0') { - if (movie) { - resource = g_object_ref (SWFDEC_MOVIE (movie)->resource); - swfdec_player_request_unload (player, path, swfdec_resource_do_unload, resource, g_object_unref); + load = g_slice_new (SwfdecResourceLoad); + + if (target_is_movie) { + movie = (SwfdecSpriteMovie *) swfdec_player_get_movie_from_string (player, target); + if (SWFDEC_IS_SPRITE_MOVIE (movie)) { + load->target = swfdec_movie_get_path (SWFDEC_MOVIE (movie), TRUE); + } else if (swfdec_player_get_level (player, target) >= 0) { + load->target = g_strdup (target); + } else { + SWFDEC_WARNING ("%s does not reference a movie, not loading %s", target, url); + return; } - g_free (path); } else { - resource = g_object_new (SWFDEC_TYPE_RESOURCE, NULL); - resource->version = SWFDEC_AS_CONTEXT (player)->version; - SWFDEC_FLASH_SECURITY (resource)->player = player; - resource->target = path; - if (loader) - resource->clip_loader = g_object_ref (loader); - swfdec_player_root (player, resource, (GFunc) swfdec_resource_mark); - swfdec_player_request_resource (player, SWFDEC_AS_CONTEXT (player)->frame->security, - url, request, buffer, swfdec_resource_do_load, resource, g_object_unref); + load->target = g_strdup (target); } + load->resource = SWFDEC_RESOURCE (g_object_ref (SWFDEC_AS_CONTEXT (player)->frame->security)); + load->url = g_strdup (url); + load->request = request; + load->buffer = buffer; + load->loader = loader; + load->target_is_movie = target_is_movie; + + swfdec_player_root (player, load, swfdec_resource_load_mark); + swfdec_player_request_resource (player, swfdec_resource_load_request, load, swfdec_resource_load_free); } gboolean diff --git a/libswfdec/swfdec_resource.h b/libswfdec/swfdec_resource.h index 178ae5a..5de9c9b 100644 --- a/libswfdec/swfdec_resource.h +++ b/libswfdec/swfdec_resource.h @@ -73,6 +73,7 @@ GType swfdec_resource_get_type (void); SwfdecResource *swfdec_resource_new (SwfdecPlayer * player, SwfdecLoader * loader, const char * variables); + void swfdec_resource_mark (SwfdecResource * resource); gboolean swfdec_resource_emit_on_load_init (SwfdecResource * resource); @@ -89,7 +90,8 @@ void swfdec_resource_load (SwfdecPlayer * player, const char * url, SwfdecLoaderRequest request, SwfdecBuffer * buffer, - SwfdecMovieClipLoader *loader); + SwfdecMovieClipLoader *loader, + gboolean target_is_movie); G_END_DECLS diff --git a/libswfdec/swfdec_resource_request.c b/libswfdec/swfdec_resource_request.c deleted file mode 100644 index e367993..0000000 --- a/libswfdec/swfdec_resource_request.c +++ /dev/null @@ -1,310 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <string.h> -#include "swfdec_resource_request.h" -#include "swfdec_as_interpret.h" -#include "swfdec_debug.h" -#include "swfdec_loader_internal.h" -#include "swfdec_player_internal.h" -#include "swfdec_resource.h" -#include "swfdec_sprite_movie.h" - -static void -swfdec_resource_request_free (SwfdecResourceRequest *request) -{ - g_return_if_fail (request != NULL); - - if (request->security) - g_object_unref (request->security); - if (request->destroy) - request->destroy (request->data); - g_free (request->url); - if (request->buffer) - swfdec_buffer_unref (request->buffer); - g_free (request->command); - g_free (request->value); - g_free (request->target); - g_slice_free (SwfdecResourceRequest, request); -} - -typedef struct { - SwfdecPlayer * player; - SwfdecLoaderRequest request; - SwfdecBuffer * buffer; - SwfdecResourceFunc callback; - SwfdecResourceAbortFunc abort; - gpointer user_data; -} AllowCallbackData; - -static void -swfdec_player_request_resource_allow_callback (const SwfdecURL *url, - int status, gpointer data_) -{ - AllowCallbackData *data = data_; - SwfdecLoader *loader; - - if (status < 0) { - if (data->abort != NULL) - data->abort (data->player, data->user_data); - g_free (data); - return; - } - - if (status == 0) { - SWFDEC_ERROR ("not allowing access to %s", swfdec_url_get_url (url)); - loader = NULL; - } else { - if (data->buffer) { - loader = swfdec_loader_load (data->player->priv->resource->loader, url, - data->request, (const char *) data->buffer->data, - data->buffer->length); - } else { - loader = swfdec_loader_load (data->player->priv->resource->loader, url, - data->request, NULL, 0); - } - } - - data->callback (data->player, loader, data->user_data); - - g_free (data); -} - -void -swfdec_player_request_resource_now (SwfdecPlayer *player, - SwfdecSecurity *security, const char *url, SwfdecLoaderRequest req, - SwfdecBuffer *buffer, SwfdecResourceFunc callback, - SwfdecResourceAbortFunc abort, gpointer user_data) -{ - SwfdecURL *absolute; - AllowCallbackData *data; - - g_assert (SWFDEC_IS_PLAYER (player)); - g_assert (SWFDEC_IS_SECURITY (security)); - g_assert (url != NULL); - - data = g_new (AllowCallbackData, 1); - data->player = player; - data->request = req; - data->buffer = buffer; - data->callback = callback; - data->abort = abort; - data->user_data = user_data; - - /* create absolute url first */ - absolute = swfdec_url_new_relative (swfdec_loader_get_url (player->priv->resource->loader), url); - - swfdec_player_request_resource_allow_callback (absolute, TRUE, data); - - swfdec_url_free (absolute); -} - -static void -swfdec_request_resource_perform_fscommand (SwfdecPlayer *player, SwfdecResourceRequest *request) -{ - g_signal_emit_by_name (player, "fscommand", request->command, request->value); - swfdec_resource_request_free (request); -} - -static void -swfdec_request_resource_perform_load_callback (SwfdecPlayer *player, - SwfdecLoader *loader, gpointer data) -{ - SwfdecResourceRequest *request = data; - - request->func (player, loader, request->data); - swfdec_resource_request_free (request); -} - -static void -swfdec_request_resource_perform_load_abort_callback (SwfdecPlayer *player, - gpointer data) -{ - SwfdecResourceRequest *request = data; - - swfdec_resource_request_free (request); -} - -static void -swfdec_request_resource_perform_load (SwfdecPlayer *player, SwfdecResourceRequest *request) -{ - g_assert (player->priv->resource); - swfdec_player_request_resource_now (player, request->security, - request->url, request->request, request->buffer, - swfdec_request_resource_perform_load_callback, - swfdec_request_resource_perform_load_abort_callback, request); -} - -static void -swfdec_request_resource_perform_unload (SwfdecPlayer *player, SwfdecResourceRequest *request) -{ - request->unload (player, request->target, request->data); - swfdec_resource_request_free (request); -} - -static void -swfdec_request_resource_perform_one (gpointer requestp, gpointer player) -{ - SwfdecResourceRequest *request = requestp; - - switch (request->type) { - case SWFDEC_RESOURCE_REQUEST_LOAD: - swfdec_request_resource_perform_load (player, request); - break; - case SWFDEC_RESOURCE_REQUEST_FSCOMMAND: - swfdec_request_resource_perform_fscommand (player, request); - break; - case SWFDEC_RESOURCE_REQUEST_UNLOAD: - swfdec_request_resource_perform_unload (player, request); - break; - default: - g_assert_not_reached (); - swfdec_resource_request_free (request); - break; - } -} - -void -swfdec_player_resource_request_perform (SwfdecPlayer *player) -{ - GSList *list; - - g_return_if_fail (SWFDEC_IS_PLAYER (player)); - - list = player->priv->resource_requests; - player->priv->resource_requests = NULL; - g_slist_foreach (list, swfdec_request_resource_perform_one, player); - g_slist_free (list); -} - -void -swfdec_player_request_resource (SwfdecPlayer *player, SwfdecSecurity *security, - const char *url, SwfdecLoaderRequest req, SwfdecBuffer *buffer, - SwfdecResourceFunc func, gpointer data, GDestroyNotify destroy) -{ - SwfdecResourceRequest *request; - - g_return_if_fail (SWFDEC_IS_PLAYER (player)); - g_return_if_fail (SWFDEC_IS_SECURITY (security)); - g_return_if_fail (url != NULL); - g_return_if_fail (func != NULL); - - request = g_slice_new0 (SwfdecResourceRequest); - request->type = SWFDEC_RESOURCE_REQUEST_LOAD; - request->security = g_object_ref (security); - request->url = g_strdup (url); - request->request = req; - if (buffer) - request->buffer = swfdec_buffer_ref (buffer); - request->func = func; - request->destroy = destroy; - request->data = data; - - player->priv->resource_requests = g_slist_append (player->priv->resource_requests, request); -} - -static gboolean -is_ascii (const char *s) -{ - while (*s) { - if (*s & 0x80) - return FALSE; - s++; - } - return TRUE; -} - -/** - * swfdec_player_request_fscommand: - * @player: a #SwfdecPlayer - * @command: the command to parse - * @value: the value passed to the command - * - * Checks if @command is an FSCommand and if so, queues emission of the - * SwfdecPlayer::fscommand signal. - * - * Returns: %TRUE if an fscommand was found and the signal emitted, %FALSE - * otherwise. - **/ -gboolean -swfdec_player_request_fscommand (SwfdecPlayer *player, const char *command, - const char *value) -{ - SwfdecResourceRequest *request; - - g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE); - g_return_val_if_fail (command != NULL, FALSE); - g_return_val_if_fail (value != NULL, FALSE); - - if (g_ascii_strncasecmp (command, "FSCommand:", 10) != 0) - return FALSE; - - command += 10; - if (!is_ascii (command)) { - SWFDEC_ERROR ("command \"%s\" are not ascii, skipping fscommand", command); - return TRUE; - } - request = g_slice_new0 (SwfdecResourceRequest); - request->type = SWFDEC_RESOURCE_REQUEST_FSCOMMAND; - request->command = g_ascii_strdown (command, -1); - request->value = g_strdup (value); - - player->priv->resource_requests = g_slist_append (player->priv->resource_requests, request); - return TRUE; -} - -void -swfdec_player_request_unload (SwfdecPlayer *player, const char *target, - SwfdecResourceUnloadFunc func, gpointer data, GDestroyNotify destroy) -{ - SwfdecResourceRequest *request; - - g_return_if_fail (SWFDEC_IS_PLAYER (player)); - g_return_if_fail (target != NULL); - - request = g_slice_new0 (SwfdecResourceRequest); - request->type = SWFDEC_RESOURCE_REQUEST_UNLOAD; - request->target = g_strdup (target); - request->unload = func; - request->data = data; - request->destroy = destroy; - - player->priv->resource_requests = g_slist_append (player->priv->resource_requests, request); -} - -void -swfdec_player_resource_request_init (SwfdecPlayer *player) -{ - /* empty */ -} - -void -swfdec_player_resource_request_finish (SwfdecPlayer *player) -{ - g_return_if_fail (SWFDEC_IS_PLAYER (player)); - - g_slist_foreach (player->priv->resource_requests, (GFunc) swfdec_resource_request_free, NULL); - g_slist_free (player->priv->resource_requests); - player->priv->resource_requests = NULL; -} - diff --git a/libswfdec/swfdec_resource_request.h b/libswfdec/swfdec_resource_request.h deleted file mode 100644 index af9c7c7..0000000 --- a/libswfdec/swfdec_resource_request.h +++ /dev/null @@ -1,96 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef _SWFDEC_RESOURCE_REQUEST_H_ -#define _SWFDEC_RESOURCE_REQUEST_H_ - -#include <libswfdec/swfdec.h> -#include <libswfdec/swfdec_security.h> - -G_BEGIN_DECLS - -typedef struct _SwfdecResourceRequest SwfdecResourceRequest; -typedef void (* SwfdecResourceFunc) (SwfdecPlayer *player, SwfdecLoader *loader, gpointer data); -typedef void (* SwfdecResourceAbortFunc) (SwfdecPlayer *player, gpointer data); -typedef void (* SwfdecResourceUnloadFunc) (SwfdecPlayer *player, const char *target, gpointer data); - -typedef enum { - SWFDEC_RESOURCE_REQUEST_LOAD, - SWFDEC_RESOURCE_REQUEST_FSCOMMAND, - SWFDEC_RESOURCE_REQUEST_UNLOAD -} SwfdecResourceRequestType; - -/* FIXME: make this a union? */ -struct _SwfdecResourceRequest -{ - SwfdecResourceRequestType type; /* type of request */ - - GDestroyNotify destroy; /* function to call on player dispose */ - gpointer data; /* function to pass to the above functions */ - - /* LOAD */ - SwfdecSecurity * security; /* security context when loading or NULL for fscommand */ - char * url; /* URL we're gonna load */ - SwfdecLoaderRequest request; /* how are we goona load this URL? */ - SwfdecBuffer * buffer; /* data to pass to load request or NULL */ - SwfdecResourceFunc func; /* function to call when we got a loader (or an error) */ - - /* FSCOMMAND */ - char * command; /* fscommand to execute */ - char * value; /* value to pass to fscommand */ - - /* UNLOAD */ - char * target; /* the target to unload */ - SwfdecResourceUnloadFunc unload; /* function to call when we got a loader (or an error) */ -}; - -/* public api for swfdec */ - -void swfdec_player_request_resource (SwfdecPlayer * player, - SwfdecSecurity * security, - const char * url, - SwfdecLoaderRequest req, - SwfdecBuffer * buffer, - SwfdecResourceFunc func, - gpointer data, - GDestroyNotify destroy); -void swfdec_player_request_resource_now (SwfdecPlayer * player, - SwfdecSecurity * security, - const char * url, - SwfdecLoaderRequest req, - SwfdecBuffer * buffer, - SwfdecResourceFunc callback, - SwfdecResourceAbortFunc abort, - gpointer user_data); -void swfdec_player_request_unload (SwfdecPlayer * player, - const char * target, - SwfdecResourceUnloadFunc func, - gpointer data, - GDestroyNotify destroy); -gboolean swfdec_player_request_fscommand (SwfdecPlayer * player, - const char * command, - const char * value); - -/* private api for swfdec_player.c */ -void swfdec_player_resource_request_init (SwfdecPlayer * player); -void swfdec_player_resource_request_perform (SwfdecPlayer * player); -void swfdec_player_resource_request_finish (SwfdecPlayer * player); - -G_END_DECLS -#endif diff --git a/libswfdec/swfdec_security.h b/libswfdec/swfdec_security.h index cdc0717..0211301 100644 --- a/libswfdec/swfdec_security.h +++ b/libswfdec/swfdec_security.h @@ -28,8 +28,6 @@ G_BEGIN_DECLS typedef struct _SwfdecSecurity SwfdecSecurity; typedef struct _SwfdecSecurityClass SwfdecSecurityClass; -typedef void (* SwfdecURLAllowFunc) (const SwfdecURL *url, int status, gpointer data); - #define SWFDEC_TYPE_SECURITY (swfdec_security_get_type()) #define SWFDEC_IS_SECURITY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SECURITY)) #define SWFDEC_IS_SECURITY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_SECURITY)) commit 7e5ebb199b18bc408f2ee4738b1d7fe8caa3eddb Author: Benjamin Otte <otte at gnome.org> Date: Thu Jan 17 23:29:43 2008 +0100 keep track of the security we were called with diff --git a/libswfdec/swfdec_interval.c b/libswfdec/swfdec_interval.c index 1d98b2b..c4caa21 100644 --- a/libswfdec/swfdec_interval.c +++ b/libswfdec/swfdec_interval.c @@ -26,9 +26,12 @@ #include "swfdec_interval.h" #include "swfdec_as_context.h" +#include "swfdec_as_frame_internal.h" #include "swfdec_as_function.h" +#include "swfdec_as_internal.h" #include "swfdec_debug.h" #include "swfdec_player_internal.h" +#include "swfdec_resource.h" G_DEFINE_TYPE (SwfdecInterval, swfdec_interval, SWFDEC_TYPE_AS_OBJECT) @@ -39,6 +42,7 @@ swfdec_interval_mark (SwfdecAsObject *object) SwfdecInterval *interval = SWFDEC_INTERVAL (object); swfdec_as_object_mark (interval->object); + swfdec_resource_mark (interval->resource); if (interval->fun_name) swfdec_as_string_mark (interval->fun_name); for (i = 0; i < interval->n_args; i++) { @@ -60,6 +64,10 @@ swfdec_interval_dispose (GObject *object) swfdec_player_remove_timeout (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (object)->context), &interval->timeout); interval->timeout.callback = NULL; } + if (interval->resource) { + g_object_unref (interval->resource); + interval->resource = NULL; + } G_OBJECT_CLASS (swfdec_interval_parent_class)->dispose (object); } @@ -97,8 +105,8 @@ swfdec_interval_trigger (SwfdecTimeout *timeout) interval->timeout.callback = NULL; } if (interval->fun_name) { - swfdec_as_object_call (interval->object, interval->fun_name, - interval->n_args, interval->args, &ret); + swfdec_as_object_call_with_security (interval->object, SWFDEC_SECURITY (interval->resource), + interval->fun_name, interval->n_args, interval->args, &ret); } else { swfdec_as_function_call (SWFDEC_AS_FUNCTION (interval->object), NULL, interval->n_args, interval->args, &ret); @@ -123,6 +131,7 @@ swfdec_interval_new (SwfdecPlayer *player, guint msecs, gboolean repeat, swfdec_as_object_add (SWFDEC_AS_OBJECT (interval), context, size); interval->id = ++player->priv->interval_id; + interval->resource = SWFDEC_RESOURCE (g_object_ref (context->frame->security)); interval->msecs = msecs; interval->repeat = repeat; interval->object = object; diff --git a/libswfdec/swfdec_interval.h b/libswfdec/swfdec_interval.h index 07da0c9..40a61cc 100644 --- a/libswfdec/swfdec_interval.h +++ b/libswfdec/swfdec_interval.h @@ -40,6 +40,7 @@ struct _SwfdecInterval { SwfdecAsObject asobject; SwfdecTimeout timeout; + SwfdecResource * resource; /* resouce that initiated this interval */ guint id; /* id this interval is identified with */ guint msecs; /* interval in milliseconds */ gboolean repeat; /* TRUE for calling in intervals, FALSE for single-shot */ commit b8e849b598af072124b6eb3c9eadd645832dadd5 Author: Benjamin Otte <otte at gnome.org> Date: Wed Jan 16 17:07:08 2008 +0100 send the terminating \0, too diff --git a/libswfdec/swfdec_load_object_as.c b/libswfdec/swfdec_load_object_as.c index de92fe8..51656d5 100644 --- a/libswfdec/swfdec_load_object_as.c +++ b/libswfdec/swfdec_load_object_as.c @@ -128,7 +128,7 @@ swfdec_load_object_as_sendAndLoad (SwfdecAsContext *cx, SwfdecAsObject *object, swfdec_as_object_call (object, SWFDEC_AS_STR_toString, 0, NULL, &val); data = swfdec_as_value_to_string (cx, &val); if (strlen (data) > 0) { - buffer = swfdec_buffer_new_for_data (g_memdup (data, strlen (data)), + buffer = swfdec_buffer_new_for_data (g_memdup (data, strlen (data) + 1), strlen (data)); swfdec_load_object_new (target, url, SWFDEC_LOADER_REQUEST_POST, buffer, swfdec_load_object_on_progress, swfdec_load_object_on_finish); commit ab96aeb0e7242f131bd4d4cf19ecb3c2ebb7026d Author: Benjamin Otte <otte at gnome.org> Date: Wed Jan 16 16:49:33 2008 +0100 really do the merge diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index bfeb0bb..eef2dce 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -2098,6 +2098,36 @@ swfdec_player_set_export_class (SwfdecPlayer *player, const char *name, SwfdecAs } } +/** + * swfdec_player_create_socket: + * @player: a #SwfdecPlayer + * @hostname: the host name to connect to. + * @port: the port to connect to + * + * Creates a new socket connecting to the given hostname and port. + * + * Returns: a new socket or %NULL if no socket implementation exists + **/ +/* FIXME: always return a socket? */ +SwfdecSocket * +swfdec_player_create_socket (SwfdecPlayer *player, const char *hostname, guint port) +{ + SwfdecSocket *sock; + SwfdecSocketClass *klass; + + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); + g_return_val_if_fail (hostname != NULL, NULL); + g_return_val_if_fail (port > 0, NULL); + + if (player->priv->socket_type == 0) + return NULL; + klass = g_type_class_ref (player->priv->socket_type); + sock = klass->create (hostname, port); + g_type_class_unref (klass); + + return sock; +} + /** PUBLIC API ***/ /** diff --git a/libswfdec/swfdec_policy_file.c b/libswfdec/swfdec_policy_file.c index e275119..dd4e0ca 100644 --- a/libswfdec/swfdec_policy_file.c +++ b/libswfdec/swfdec_policy_file.c @@ -113,10 +113,10 @@ swfdec_policy_file_parse (SwfdecPolicyFile *file, const char *text) } } -/*** SWFDEC_LOADER_TARGET ***/ +/*** SWFDEC_STREAM_TARGET ***/ static SwfdecPlayer * -swfdec_policy_file_target_get_player (SwfdecLoaderTarget *target) +swfdec_policy_file_target_get_player (SwfdecStreamTarget *target) { return SWFDEC_POLICY_FILE (target)->player; } @@ -128,7 +128,7 @@ swfdec_policy_file_finished_loading (SwfdecPolicyFile *file, const char *text) SwfdecPolicyFile *next; GList *link; - swfdec_loader_set_target (file->stream, NULL); + swfdec_stream_set_target (file->stream, NULL); file->stream = NULL; if (text) @@ -156,8 +156,8 @@ swfdec_policy_file_finished_loading (SwfdecPolicyFile *file, const char *text) } static void -swfdec_policy_file_target_error (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_policy_file_target_error (SwfdecStreamTarget *target, + SwfdecStream *stream) { SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (target); @@ -165,15 +165,20 @@ swfdec_policy_file_target_error (SwfdecLoaderTarget *target, } static void -swfdec_policy_file_target_eof (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_policy_file_target_close (SwfdecStreamTarget *target, + SwfdecStream *stream) { SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (target); char *text; - swfdec_loader_set_target (loader, NULL); + swfdec_stream_set_target (stream, NULL); file->stream = NULL; - text = swfdec_loader_get_text (loader, 8); + if (SWFDEC_IS_LOADER (stream)) { + text = swfdec_loader_get_text (SWFDEC_LOADER (stream), 8); + } else { + SWFDEC_FIXME ("rewrite swfdec_loader_get_text() to swfdec_buffer_queue_get_text()"); + text = NULL; + } if (text == NULL) { SWFDEC_ERROR ("couldn't get text from crossdomain policy file %s", @@ -184,17 +189,17 @@ swfdec_policy_file_target_eof (SwfdecLoaderTarget *target, } static void -swfdec_policy_file_loader_target_init (SwfdecLoaderTargetInterface *iface) +swfdec_policy_file_stream_target_init (SwfdecStreamTargetInterface *iface) { iface->get_player = swfdec_policy_file_target_get_player; - iface->eof = swfdec_policy_file_target_eof; + iface->close = swfdec_policy_file_target_close; iface->error = swfdec_policy_file_target_error; } /*** SWFDEC_POLICY_FILE ***/ G_DEFINE_TYPE_WITH_CODE (SwfdecPolicyFile, swfdec_policy_file, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_policy_file_loader_target_init)) + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_policy_file_stream_target_init)) static void swfdec_policy_file_dispose (GObject *object) @@ -202,7 +207,7 @@ swfdec_policy_file_dispose (GObject *object) SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (object); if (file->stream) { - swfdec_loader_set_target (file->stream, NULL); + swfdec_stream_set_target (file->stream, NULL); g_object_unref (file->stream); file->stream = NULL; g_slist_foreach (file->requests, (GFunc) swfdec_policy_file_request_free, NULL); @@ -245,9 +250,9 @@ swfdec_policy_file_new (SwfdecPlayer *player, const SwfdecURL *url) if (swfdec_url_has_protocol (url, "xmlsocket")) { SWFDEC_FIXME ("implement xmlsocket: protocol"); } else { - file->stream = swfdec_loader_load (player->priv->resource->loader, url, - SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0); - swfdec_loader_set_target (file->stream, SWFDEC_LOADER_TARGET (file)); + file->stream = SWFDEC_STREAM (swfdec_loader_load (player->priv->resource->loader, + url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0)); + swfdec_stream_set_target (file->stream, SWFDEC_STREAM_TARGET (file)); } player->priv->loading_policy_files = g_list_prepend (player->priv->loading_policy_files, file); diff --git a/libswfdec/swfdec_policy_file.h b/libswfdec/swfdec_policy_file.h index 9a89f81..b849562 100644 --- a/libswfdec/swfdec_policy_file.h +++ b/libswfdec/swfdec_policy_file.h @@ -42,7 +42,7 @@ struct _SwfdecPolicyFile { SwfdecPlayer * player; /* player we're loaded from */ SwfdecURL * load_url; /* url we're loaded from */ SwfdecURL * url; /* parent url we check with */ - SwfdecLoader * stream; /* stream we are loading or NULL if done loading */ + SwfdecStream * stream; /* stream we are loading or NULL if done loading */ GSList * allowed_hosts; /* list of GPatternSpec of the allowed hosts */ GSList * requests; /* requests waiting for this file to finish loading */ diff --git a/libswfdec/swfdec_xml_socket.c b/libswfdec/swfdec_xml_socket.c index bff72c7..2978a2f 100644 --- a/libswfdec/swfdec_xml_socket.c +++ b/libswfdec/swfdec_xml_socket.c @@ -46,7 +46,7 @@ swfdec_xml_socket_ensure_closed (SwfdecXmlSocket *xml) g_object_unref (xml->socket); xml->socket = NULL; - swfdec_player_unroot_object (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (xml)->context), G_OBJECT (xml)); + swfdec_player_unroot (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (xml)->context), xml); cur = g_object_get_qdata (G_OBJECT (xml->target), xml_socket_quark); if (cur != xml) g_object_set_qdata (G_OBJECT (xml->target), xml_socket_quark, cur); @@ -201,7 +201,7 @@ swfdec_xml_socket_create (SwfdecAsObject *target, const char *hostname, guint po xml = g_object_new (SWFDEC_TYPE_XML_SOCKET, NULL); swfdec_as_object_add (SWFDEC_AS_OBJECT (xml), cx, sizeof (SwfdecXmlSocket)); - swfdec_player_root_object (SWFDEC_PLAYER (cx), G_OBJECT (xml)); + swfdec_player_root (SWFDEC_PLAYER (cx), xml, (GFunc) swfdec_as_object_mark); xml->target = target; xml->socket = sock; commit 5f2bdfd1e50aafe4971779fdf428f39360c55788 Author: Benjamin Otte <otte at gnome.org> Date: Wed Jan 16 16:34:23 2008 +0100 add public API functions diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index af87562..bfeb0bb 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -877,6 +877,9 @@ swfdec_player_dispose (GObject *object) g_hash_table_destroy (priv->registered_classes); g_hash_table_destroy (priv->scripting_callbacks); + g_list_foreach (priv->loading_policy_files, (GFunc) g_object_unref, NULL); + g_list_free (priv->loading_policy_files); + priv->loading_policy_files = NULL; g_slist_foreach (priv->policy_files, (GFunc) g_object_unref, NULL); g_slist_free (priv->policy_files); priv->policy_files = NULL; diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index 09aaf33..bb59e8e 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -42,6 +42,7 @@ typedef enum { typedef void (* SwfdecActionFunc) (gpointer object, gpointer data); typedef gboolean (* SwfdecAudioRemoveFunc) (SwfdecAudio *audio, gpointer data); +typedef void (* SwfdecPolicyFunc) (SwfdecPlayer *player, gboolean allow, gpointer data); typedef struct _SwfdecTimeout SwfdecTimeout; struct _SwfdecTimeout { @@ -135,7 +136,8 @@ struct _SwfdecPlayerPrivate SwfdecRingBuffer * actions[SWFDEC_PLAYER_N_ACTION_QUEUES]; /* all actions we've queued up so far */ /* security */ - GSList * policy_files; /* list of SwfdecPolicyLoader objects, most recent first */ + GList * loading_policy_files; /* list of loading SwfdecPlayerLoader - newest first */ + GSList * policy_files; /* list of SwfdecPolicyLoader that finished loading */ }; void swfdec_player_initialize (SwfdecPlayer * player, @@ -227,6 +229,15 @@ void swfdec_player_global_to_stage (SwfdecPlayer * player, double * x, double * y); void swfdec_player_update_scale (SwfdecPlayer * player); + +/* in swfdec_policy_file.c */ +gboolean swfdec_player_allow_now (SwfdecPlayer * player, + const SwfdecURL * url); +void swfdec_player_allow_or_load (SwfdecPlayer * player, + const SwfdecURL * url, + const SwfdecURL * load_url, + SwfdecPolicyFunc func, + gpointer data); /* in swfdec_as_interpret.c */ SwfdecMovie * swfdec_player_get_movie_from_value (SwfdecPlayer * player, diff --git a/libswfdec/swfdec_policy_file.c b/libswfdec/swfdec_policy_file.c index d0f3e90..e275119 100644 --- a/libswfdec/swfdec_policy_file.c +++ b/libswfdec/swfdec_policy_file.c @@ -34,6 +34,20 @@ #include "swfdec_xml.h" #include "swfdec_xml_node.h" +typedef struct _SwfdecPolicyFileRequest SwfdecPolicyFileRequest; +struct _SwfdecPolicyFileRequest { + SwfdecURL * url; /* URL we are supposed to check */ + SwfdecPolicyFunc func; /* function to call when we know if access is (not) allowed */ + gpointer data; /* data to pass to func */ +}; + +static void +swfdec_policy_file_request_free (SwfdecPolicyFileRequest *request) +{ + swfdec_url_free (request->url); + g_slice_free (SwfdecPolicyFileRequest, request); +} + /*** PARSING THE FILE ***/ static void @@ -108,13 +122,46 @@ swfdec_policy_file_target_get_player (SwfdecLoaderTarget *target) } static void +swfdec_policy_file_finished_loading (SwfdecPolicyFile *file, const char *text) +{ + SwfdecPlayerPrivate *priv; + SwfdecPolicyFile *next; + GList *link; + + swfdec_loader_set_target (file->stream, NULL); + file->stream = NULL; + + if (text) + swfdec_policy_file_parse (file, text); + + priv = file->player->priv; + link = g_list_find (priv->loading_policy_files, file); + next = link->next ? link->next->data : NULL; + priv->loading_policy_files = g_list_delete_link (priv->loading_policy_files, link); + priv->policy_files = g_slist_prepend (priv->policy_files, file); + if (next) { + next->requests = g_slist_concat (next->requests, file->requests); + } else { + GSList *walk; + + for (walk = file->requests; walk; walk = walk->next) { + SwfdecPolicyFileRequest *request = walk->data; + gboolean allow = swfdec_player_allow_now (file->player, request->url); + request->func (file->player, allow, request->data); + swfdec_policy_file_request_free (request); + } + g_slist_free (file->requests); + } + file->requests = NULL; +} + +static void swfdec_policy_file_target_error (SwfdecLoaderTarget *target, SwfdecLoader *loader) { SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (target); - swfdec_loader_set_target (loader, NULL); - file->stream = NULL; + swfdec_policy_file_finished_loading (file, NULL); } static void @@ -131,10 +178,8 @@ swfdec_policy_file_target_eof (SwfdecLoaderTarget *target, if (text == NULL) { SWFDEC_ERROR ("couldn't get text from crossdomain policy file %s", swfdec_url_get_url (file->load_url)); - return; } - - swfdec_policy_file_parse (file, text); + swfdec_policy_file_finished_loading (file, text); g_free (text); } @@ -160,6 +205,11 @@ swfdec_policy_file_dispose (GObject *object) swfdec_loader_set_target (file->stream, NULL); g_object_unref (file->stream); file->stream = NULL; + g_slist_foreach (file->requests, (GFunc) swfdec_policy_file_request_free, NULL); + g_slist_free (file->requests); + file->requests = NULL; + } else { + g_assert (file->requests == NULL); } swfdec_url_free (file->load_url); swfdec_url_free (file->url); @@ -199,7 +249,8 @@ swfdec_policy_file_new (SwfdecPlayer *player, const SwfdecURL *url) SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0); swfdec_loader_set_target (file->stream, SWFDEC_LOADER_TARGET (file)); } - player->priv->policy_files = g_slist_prepend (player->priv->policy_files, file); + player->priv->loading_policy_files = + g_list_prepend (player->priv->loading_policy_files, file); return file; } @@ -243,15 +294,53 @@ swfdec_policy_file_allow (SwfdecPolicyFile *file, const SwfdecURL *url) return FALSE; } -void -swfdec_player_load_policy_file (SwfdecPlayer *player, const SwfdecURL *url) +/*** PLAYER API ***/ + +gboolean +swfdec_player_allow_now (SwfdecPlayer *player, const SwfdecURL *url) { - SWFDEC_FIXME ("implement"); + GSList *walk; + + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), FALSE); + g_return_val_if_fail (url != NULL, FALSE); + + for (walk = player->priv->policy_files; walk; walk = walk->next) { + if (swfdec_policy_file_allow (walk->data, url)) + return TRUE; + } + return FALSE; } void -swfdec_player_check_policy_files (SwfdecPlayer *player, - SwfdecPolicyFileFunc func, gpointer data) +swfdec_player_allow_or_load (SwfdecPlayer *player, const SwfdecURL *url, + const SwfdecURL *load_url, SwfdecPolicyFunc func, gpointer data) { - SWFDEC_FIXME ("implement"); + SwfdecPlayerPrivate *priv; + SwfdecPolicyFileRequest *request; + SwfdecPolicyFile *file; + + g_return_if_fail (SWFDEC_IS_PLAYER (player)); + g_return_if_fail (url != NULL); + g_return_if_fail (func); + + if (swfdec_player_allow_now (player, url)) { + func (player, TRUE, data); + return; + } + if (load_url) + swfdec_policy_file_new (player, load_url); + + priv = player->priv; + if (priv->loading_policy_files == NULL) { + func (player, FALSE, data); + return; + } + request = g_slice_new (SwfdecPolicyFileRequest); + request->url = swfdec_url_copy (url); + request->func = func; + request->data = data; + + file = priv->loading_policy_files->data; + file->requests = g_slist_append (file->requests, request); } + diff --git a/libswfdec/swfdec_policy_file.h b/libswfdec/swfdec_policy_file.h index 5342983..9a89f81 100644 --- a/libswfdec/swfdec_policy_file.h +++ b/libswfdec/swfdec_policy_file.h @@ -28,7 +28,6 @@ G_BEGIN_DECLS typedef struct _SwfdecPolicyFile SwfdecPolicyFile; typedef struct _SwfdecPolicyFileClass SwfdecPolicyFileClass; -typedef void (* SwfdecPolicyFileFunc) (SwfdecPlayer *player, gboolean allow, gpointer data); #define SWFDEC_TYPE_POLICY_FILE (swfdec_policy_file_get_type()) #define SWFDEC_IS_POLICY_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_POLICY_FILE)) @@ -45,6 +44,8 @@ struct _SwfdecPolicyFile { SwfdecURL * url; /* parent url we check with */ SwfdecLoader * stream; /* stream we are loading or NULL if done loading */ GSList * allowed_hosts; /* list of GPatternSpec of the allowed hosts */ + + GSList * requests; /* requests waiting for this file to finish loading */ }; struct _SwfdecPolicyFileClass { @@ -59,12 +60,6 @@ gboolean swfdec_policy_file_is_loading (SwfdecPolicyFile * file); gboolean swfdec_policy_file_allow (SwfdecPolicyFile * file, const SwfdecURL * url); -void swfdec_player_load_policy_file (SwfdecPlayer * player, - const SwfdecURL * url); -void swfdec_player_check_policy_files(SwfdecPlayer * player, - SwfdecPolicyFileFunc func, - gpointer data); - G_END_DECLS #endif commit 031c01a4b787d908bc85291b65228bef9e6518bf Author: Benjamin Otte <otte at gnome.org> Date: Wed Jan 16 11:10:53 2008 +0100 add initial (compiling) bunch of code that changes policy files handling Everythng compiles, nothing works diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 7da1ba0..6316a0b 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -112,7 +112,7 @@ libswfdec_source_files = \ swfdec_player_as.c \ swfdec_player_scripting.c \ swfdec_print_job.c \ - swfdec_policy_loader.c \ + swfdec_policy_file.c \ swfdec_rect.c \ swfdec_rectangle.c \ swfdec_resource.c \ @@ -264,7 +264,7 @@ noinst_HEADERS = \ swfdec_path.h \ swfdec_pattern.h \ swfdec_player_internal.h \ - swfdec_policy_loader.h \ + swfdec_policy_file.h \ swfdec_rect.h \ swfdec_resource.h \ swfdec_resource_request.h \ diff --git a/libswfdec/swfdec_flash_security.c b/libswfdec/swfdec_flash_security.c index 21fe688..ae7fce0 100644 --- a/libswfdec/swfdec_flash_security.c +++ b/libswfdec/swfdec_flash_security.c @@ -23,7 +23,6 @@ #include <string.h> #include "swfdec_flash_security.h" -#include "swfdec_policy_loader.h" #include "swfdec_debug.h" #include "swfdec_security_allow.h" @@ -47,227 +46,10 @@ swfdec_flash_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) } } -static gboolean -swfdec_flash_security_match_domain (const SwfdecURL *guard, const SwfdecURL *key) -{ - return g_ascii_strcasecmp (swfdec_url_get_host (guard), swfdec_url_get_host (key)) == 0; -} - -typedef struct { - SwfdecURL * url; - SwfdecURLAllowFunc callback; - gpointer user_data; -} SwfdecAllowURLPending; - -static void -swfdec_flash_security_call_pending (SwfdecFlashSecurity *sec, const char *host, - gboolean allow) -{ - GSList *iter, *prev, *next; - SwfdecAllowURLPending *pending; - - g_return_if_fail (SWFDEC_IS_FLASH_SECURITY (sec)); - g_return_if_fail (host != NULL); - - prev = NULL; - for (iter = sec->allow_url_pending; iter != NULL; iter = next) { - next = iter->next; - pending = iter->data; - - if (!g_ascii_strcasecmp (swfdec_url_get_host (pending->url), host)) { - pending->callback (pending->url, allow, pending->user_data); - swfdec_url_free (pending->url); - g_free (pending); - g_slist_free_1 (iter); - - if (prev != NULL) { - prev->next = iter->next; - iter = prev; - iter->next = next; - } else { - iter = NULL; - sec->allow_url_pending = next; - } - } - - prev = iter; - } -} - -static void -swfdec_flash_security_policy_loader_done (SwfdecPolicyLoader *policy_loader, - gboolean allow) -{ - SwfdecFlashSecurity *sec = policy_loader->sec; - char *host = g_strdup (policy_loader->host); - - if (allow) { - sec->crossdomain_allowed = g_slist_prepend (sec->crossdomain_allowed, host); - } else { - sec->crossdomain_denied = g_slist_prepend (sec->crossdomain_denied, host); - } - - sec->policy_loaders = g_slist_remove (sec->policy_loaders, policy_loader); - - swfdec_flash_security_call_pending (sec, host, allow); - - swfdec_policy_loader_free (policy_loader); -} - -static void -swfdec_flash_security_get_cross_domain_policy (SwfdecFlashSecurity *sec, - const char *host) -{ - GSList *iter; - SwfdecPolicyLoader *policy_loader; - - g_return_if_fail (SWFDEC_IS_FLASH_SECURITY (sec)); - g_return_if_fail (host != NULL); - - for (iter = sec->policy_loaders; iter != NULL; iter = iter->next) { - policy_loader = iter->data; - - if (!g_ascii_strcasecmp (policy_loader->host, host)) - return; - } - - policy_loader = swfdec_policy_loader_new (sec, host, - swfdec_flash_security_policy_loader_done); - if (policy_loader == NULL) { - sec->crossdomain_denied = g_slist_prepend (sec->crossdomain_denied, - g_strdup (host)); - swfdec_flash_security_call_pending (sec, host, FALSE); - return; - } - - sec->policy_loaders = g_slist_prepend (sec->policy_loaders, policy_loader); -} - -static void -swfdec_flash_security_allow_cross_domain (SwfdecFlashSecurity *sec, - const SwfdecURL *url, SwfdecURLAllowFunc callback, gpointer user_data) -{ - SwfdecAllowURLPending *pending; - const char *host; - - g_assert (SWFDEC_IS_FLASH_SECURITY (sec)); - g_assert (url != NULL); - g_assert (callback != NULL); - - host = swfdec_url_get_host (url); - - if (g_slist_find_custom (sec->crossdomain_allowed, host, - (GCompareFunc)g_ascii_strcasecmp)) { - callback (url, 1, user_data); - return; - } - - if (g_slist_find_custom (sec->crossdomain_denied, host, - (GCompareFunc)g_ascii_strcasecmp)) { - callback (url, 0, user_data); - return; - } - - pending = g_new (SwfdecAllowURLPending, 1); - pending->url = swfdec_url_copy (url); - pending->callback = callback; - pending->user_data = user_data; - - sec->allow_url_pending = g_slist_prepend (sec->allow_url_pending, pending); - - swfdec_flash_security_get_cross_domain_policy (sec, host); -} - -static void -swfdec_flash_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url, - SwfdecURLAllowFunc callback, gpointer user_data) -{ - SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (guard); - int status; - - switch (sec->sandbox) { - case SWFDEC_SANDBOX_NONE: - status = 0; - break; - case SWFDEC_SANDBOX_REMOTE: - if (swfdec_url_is_local (url)) { - status = 0; - } else if (swfdec_flash_security_match_domain (sec->url, url)) { - status = 1; - } else { - swfdec_flash_security_allow_cross_domain (sec, url, callback, - user_data); - return; - } - break; - case SWFDEC_SANDBOX_LOCAL_FILE: - if (swfdec_url_is_local (url)) { - status = 1; - } else { - status = 0; - } - break; - case SWFDEC_SANDBOX_LOCAL_NETWORK: - if (swfdec_url_is_local (url)) { - status = 0; - } else { - swfdec_flash_security_allow_cross_domain (sec, url, callback, - user_data); - return; - } - break; - case SWFDEC_SANDBOX_LOCAL_TRUSTED: - status = 1; - break; - default: - g_assert_not_reached (); - status = 0; - break; - } - - callback (url, status, user_data); -} - -void -swfdec_flash_security_free_pending (SwfdecFlashSecurity *sec) -{ - GSList *iter; - - for (iter = sec->allow_url_pending; iter != NULL; iter = iter->next) { - SwfdecAllowURLPending *pending = iter->data; - pending->callback (pending->url, -1, pending->user_data); - swfdec_url_free (pending->url); - g_free (pending); - } - g_slist_free (sec->allow_url_pending); - sec->allow_url_pending = NULL; -} - static void swfdec_flash_security_dispose (GObject *object) { SwfdecFlashSecurity *sec = SWFDEC_FLASH_SECURITY (object); - GSList *iter; - - g_assert (sec->allow_url_pending == NULL); - - for (iter = sec->policy_loaders; iter != NULL; iter = iter->next) { - swfdec_policy_loader_free (iter->data); - } - g_slist_free (sec->policy_loaders); - sec->policy_loaders = NULL; - - for (iter = sec->crossdomain_allowed; iter != NULL; iter = iter->next) { - g_free (iter->data); - } - g_slist_free (sec->crossdomain_allowed); - sec->crossdomain_allowed = NULL; - - for (iter = sec->crossdomain_denied; iter != NULL; iter = iter->next) { - g_free (iter->data); - } - g_slist_free (sec->crossdomain_denied); - sec->crossdomain_denied = NULL; if (sec->url) { swfdec_url_free (sec->url); @@ -287,7 +69,6 @@ swfdec_flash_security_class_init (SwfdecFlashSecurityClass *klass) object_class->dispose = swfdec_flash_security_dispose; security_class->allow = swfdec_flash_security_allow; - security_class->allow_url = swfdec_flash_security_allow_url; } static void diff --git a/libswfdec/swfdec_flash_security.h b/libswfdec/swfdec_flash_security.h index fcb2aaf..8ee888d 100644 --- a/libswfdec/swfdec_flash_security.h +++ b/libswfdec/swfdec_flash_security.h @@ -50,12 +50,6 @@ struct _SwfdecFlashSecurity SwfdecPlayer *player; SwfdecSandboxType sandbox; /* sandbox we are operating in */ SwfdecURL * url; /* url this security was loaded from */ - - GSList * policy_loaders; - GSList * crossdomain_allowed; - GSList * crossdomain_denied; - - GSList * allow_url_pending; }; struct _SwfdecFlashSecurityClass diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 4ff88a8..af87562 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -877,6 +877,10 @@ swfdec_player_dispose (GObject *object) g_hash_table_destroy (priv->registered_classes); g_hash_table_destroy (priv->scripting_callbacks); + g_slist_foreach (priv->policy_files, (GFunc) g_object_unref, NULL); + g_slist_free (priv->policy_files); + priv->policy_files = NULL; + while (priv->roots) swfdec_movie_destroy (priv->roots->data); if (priv->resource) { diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index cbe49ec..09aaf33 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -133,6 +133,9 @@ struct _SwfdecPlayerPrivate /* iterating */ GList * movies; /* list of all movies that want to be iterated */ SwfdecRingBuffer * actions[SWFDEC_PLAYER_N_ACTION_QUEUES]; /* all actions we've queued up so far */ + + /* security */ + GSList * policy_files; /* list of SwfdecPolicyLoader objects, most recent first */ }; void swfdec_player_initialize (SwfdecPlayer * player, diff --git a/libswfdec/swfdec_policy_file.c b/libswfdec/swfdec_policy_file.c new file mode 100644 index 0000000..d0f3e90 --- /dev/null +++ b/libswfdec/swfdec_policy_file.c @@ -0,0 +1,257 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * 2007 Pekka Lampila <pekka.lampila at iki.fi> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> + +#include "swfdec_policy_file.h" +#include "swfdec_flash_security.h" +#include "swfdec_resource.h" +#include "swfdec_as_strings.h" +#include "swfdec_debug.h" +#include "swfdec_loader_internal.h" +#include "swfdec_player_internal.h" +#include "swfdec_xml.h" +#include "swfdec_xml_node.h" + +/*** PARSING THE FILE ***/ + +static void +swfdec_policy_file_parse (SwfdecPolicyFile *file, const char *text) +{ + SwfdecXml *xml; + gint32 i, j; + + g_return_if_fail (SWFDEC_IS_POLICY_FILE (file)); + g_return_if_fail (text != NULL); + + xml = swfdec_xml_new_no_properties (SWFDEC_AS_CONTEXT (file->player), text, TRUE); + + if (xml == NULL) { + SWFDEC_ERROR ("failed to create an XML object for crossdomain policy"); + return; + } + + if (SWFDEC_XML_NODE (xml)->type != SWFDEC_XML_NODE_ELEMENT) { + SWFDEC_LOG ("empty crossdomain policy file"); + return; + } + + for (i = 0; i < swfdec_xml_node_num_children (SWFDEC_XML_NODE (xml)); i++) { + SwfdecXmlNode *node_cdp + swfdec_xml_node_get_child (SWFDEC_XML_NODE (xml), i); + + if (node_cdp->type != SWFDEC_XML_NODE_ELEMENT) + continue; + + if (g_ascii_strcasecmp (node_cdp->name, "cross-domain-policy") != 0) + continue; + + for (j = 0; j < swfdec_xml_node_num_children (node_cdp); j++) { + SwfdecXmlNode *node_aaf = swfdec_xml_node_get_child (node_cdp, j); + const char *value; + GPatternSpec *pattern; + char *value_lower; + + if (node_aaf->type != SWFDEC_XML_NODE_ELEMENT) + continue; + + if (g_ascii_strcasecmp (node_aaf->name, "allow-access-from") != 0) + continue; + + // FIXME: secure attribute? + + value = swfdec_xml_node_get_attribute (node_aaf, SWFDEC_AS_STR_domain); + if (value == NULL) + continue; + + if (strchr (value, '?') != NULL) { + SWFDEC_WARNING ("'?' in allowed domain attribute for %s", value); + continue; + } + + value_lower = g_ascii_strdown (value, -1); + pattern = g_pattern_spec_new (value_lower); + g_free (value_lower); + + file->allowed_hosts = g_slist_prepend (file->allowed_hosts, pattern); + } + } +} + +/*** SWFDEC_LOADER_TARGET ***/ + +static SwfdecPlayer * +swfdec_policy_file_target_get_player (SwfdecLoaderTarget *target) +{ + return SWFDEC_POLICY_FILE (target)->player; +} + +static void +swfdec_policy_file_target_error (SwfdecLoaderTarget *target, + SwfdecLoader *loader) +{ + SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (target); + + swfdec_loader_set_target (loader, NULL); + file->stream = NULL; +} + +static void +swfdec_policy_file_target_eof (SwfdecLoaderTarget *target, + SwfdecLoader *loader) +{ + SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (target); + char *text; + + swfdec_loader_set_target (loader, NULL); + file->stream = NULL; + text = swfdec_loader_get_text (loader, 8); + + if (text == NULL) { + SWFDEC_ERROR ("couldn't get text from crossdomain policy file %s", + swfdec_url_get_url (file->load_url)); + return; + } + + swfdec_policy_file_parse (file, text); + g_free (text); +} + +static void +swfdec_policy_file_loader_target_init (SwfdecLoaderTargetInterface *iface) +{ + iface->get_player = swfdec_policy_file_target_get_player; + iface->eof = swfdec_policy_file_target_eof; + iface->error = swfdec_policy_file_target_error; +} + +/*** SWFDEC_POLICY_FILE ***/ + +G_DEFINE_TYPE_WITH_CODE (SwfdecPolicyFile, swfdec_policy_file, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_policy_file_loader_target_init)) + +static void +swfdec_policy_file_dispose (GObject *object) +{ + SwfdecPolicyFile *file = SWFDEC_POLICY_FILE (object); + + if (file->stream) { + swfdec_loader_set_target (file->stream, NULL); + g_object_unref (file->stream); + file->stream = NULL; + } + swfdec_url_free (file->load_url); + swfdec_url_free (file->url); + + G_OBJECT_CLASS (swfdec_policy_file_parent_class)->dispose (object); +} + +static void +swfdec_policy_file_class_init (SwfdecPolicyFileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = swfdec_policy_file_dispose; +} + +static void +swfdec_policy_file_init (SwfdecPolicyFile *policy_file) +{ +} + +SwfdecPolicyFile * +swfdec_policy_file_new (SwfdecPlayer *player, const SwfdecURL *url) +{ + SwfdecPolicyFile *file; + + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); + g_return_val_if_fail (url != NULL, NULL); + + file = g_object_new (SWFDEC_TYPE_POLICY_FILE, NULL); + file->player = player; + file->load_url = swfdec_url_copy (url); + file->url = swfdec_url_new_parent (url); + if (swfdec_url_has_protocol (url, "xmlsocket")) { + SWFDEC_FIXME ("implement xmlsocket: protocol"); + } else { + file->stream = swfdec_loader_load (player->priv->resource->loader, url, + SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0); + swfdec_loader_set_target (file->stream, SWFDEC_LOADER_TARGET (file)); + } + player->priv->policy_files = g_slist_prepend (player->priv->policy_files, file); + + return file; +} + +gboolean +swfdec_policy_file_is_loading (SwfdecPolicyFile *file) +{ + g_return_val_if_fail (SWFDEC_IS_POLICY_FILE (file), FALSE); + + return file->stream != NULL; +} + +gboolean +swfdec_policy_file_allow (SwfdecPolicyFile *file, const SwfdecURL *url) +{ + GSList *walk; + gsize len; + char *emantsoh; + const char *hostname; + + g_return_val_if_fail (SWFDEC_IS_POLICY_FILE (file), FALSE); + g_return_val_if_fail (url != NULL, FALSE); + + hostname = swfdec_url_get_host (url); + /* This is a hack that simplifies the following code. As the pattern can not + * contain any ?, the only pattern that matches the string "?" is the pattern + * "*" + */ + if (hostname == NULL) + hostname = "?"; + len = strlen (hostname); + emantsoh = g_utf8_strreverse (emantsoh, len); + for (walk = file->allowed_hosts; walk; walk = walk->next) { + GPatternSpec *pattern = walk->data; + if (g_pattern_match (pattern, len, hostname, emantsoh)) { + g_free (emantsoh); + return TRUE; + } + } + g_free (emantsoh); + return FALSE; +} + +void +swfdec_player_load_policy_file (SwfdecPlayer *player, const SwfdecURL *url) +{ + SWFDEC_FIXME ("implement"); +} + +void +swfdec_player_check_policy_files (SwfdecPlayer *player, + SwfdecPolicyFileFunc func, gpointer data) +{ + SWFDEC_FIXME ("implement"); +} diff --git a/libswfdec/swfdec_policy_file.h b/libswfdec/swfdec_policy_file.h new file mode 100644 index 0000000..5342983 --- /dev/null +++ b/libswfdec/swfdec_policy_file.h @@ -0,0 +1,70 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * 2007 Pekka Lampila <pekka.lampila at iki.fi> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef _SWFDEC_FLASH_SECURITY_POLICY_H_ +#define _SWFDEC_FLASH_SECURITY_POLICY_H_ + +#include <libswfdec/swfdec.h> +#include <libswfdec/swfdec_player.h> + +G_BEGIN_DECLS + +typedef struct _SwfdecPolicyFile SwfdecPolicyFile; +typedef struct _SwfdecPolicyFileClass SwfdecPolicyFileClass; +typedef void (* SwfdecPolicyFileFunc) (SwfdecPlayer *player, gboolean allow, gpointer data); + +#define SWFDEC_TYPE_POLICY_FILE (swfdec_policy_file_get_type()) +#define SWFDEC_IS_POLICY_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_POLICY_FILE)) +#define SWFDEC_IS_POLICY_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_POLICY_FILE)) +#define SWFDEC_POLICY_FILE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_POLICY_FILE, SwfdecPolicyFile)) +#define SWFDEC_POLICY_FILE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_POLICY_FILE, SwfdecPolicyFileClass)) +#define SWFDEC_POLICY_FILE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_POLICY_FILE, SwfdecPolicyFileClass)) + +struct _SwfdecPolicyFile { + GObject object; + + SwfdecPlayer * player; /* player we're loaded from */ + SwfdecURL * load_url; /* url we're loaded from */ + SwfdecURL * url; /* parent url we check with */ + SwfdecLoader * stream; /* stream we are loading or NULL if done loading */ + GSList * allowed_hosts; /* list of GPatternSpec of the allowed hosts */ +}; + +struct _SwfdecPolicyFileClass { + GObjectClass object_class; +}; + +GType swfdec_policy_file_get_type (void); + +SwfdecPolicyFile *swfdec_policy_file_new (SwfdecPlayer * player, + const SwfdecURL * url); +gboolean swfdec_policy_file_is_loading (SwfdecPolicyFile * file); +gboolean swfdec_policy_file_allow (SwfdecPolicyFile * file, + const SwfdecURL * url); + +void swfdec_player_load_policy_file (SwfdecPlayer * player, + const SwfdecURL * url); +void swfdec_player_check_policy_files(SwfdecPlayer * player, + SwfdecPolicyFileFunc func, + gpointer data); + + +G_END_DECLS +#endif diff --git a/libswfdec/swfdec_policy_loader.c b/libswfdec/swfdec_policy_loader.c deleted file mode 100644 index ae722b6..0000000 --- a/libswfdec/swfdec_policy_loader.c +++ /dev/null @@ -1,255 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * 2007 Pekka Lampila <pekka.lampila at iki.fi> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <string.h> - -#include "swfdec_policy_loader.h" -#include "swfdec_flash_security.h" -#include "swfdec_resource.h" -#include "swfdec_as_strings.h" -#include "swfdec_debug.h" -#include "swfdec_loader_internal.h" -#include "swfdec_player_internal.h" -#include "swfdec_xml.h" -#include "swfdec_xml_node.h" - -/*** SWFDEC_STREAM_TARGET ***/ - -static SwfdecPlayer * -swfdec_policy_stream_target_get_player (SwfdecStreamTarget *target) -{ - return SWFDEC_POLICY_LOADER (target)->sec->player; -} - -static void -swfdec_policy_stream_target_error (SwfdecStreamTarget *target, - SwfdecStream *stream) -{ - SwfdecPolicyLoader *policy_loader = SWFDEC_POLICY_LOADER (target); - - policy_loader->func (policy_loader, FALSE); -} - -static gboolean -swfdec_policy_loader_check (SwfdecAsContext *context, const char *text, - const char *host) -{ - SwfdecXml *xml; - gint32 i, j; - char *host_lower; - - g_return_val_if_fail (SWFDEC_IS_AS_CONTEXT (context), FALSE); - g_return_val_if_fail (text != NULL, FALSE); - - xml = swfdec_xml_new_no_properties (context, text, TRUE); - - if (xml == NULL) { - SWFDEC_ERROR ("failed to create an XML object for crossdomain policy"); - return FALSE; - } - - if (SWFDEC_XML_NODE (xml)->type != SWFDEC_XML_NODE_ELEMENT) { - SWFDEC_LOG ("empty crossdomain policy file"); - return FALSE; - } - - if (host != NULL) { - host_lower = g_ascii_strdown (host, -1); - } else { - host_lower = NULL; - } - - for (i = 0; i < swfdec_xml_node_num_children (SWFDEC_XML_NODE (xml)); i++) { - SwfdecXmlNode *node_cdp - swfdec_xml_node_get_child (SWFDEC_XML_NODE (xml), i); - - if (node_cdp->type != SWFDEC_XML_NODE_ELEMENT) - continue; - - if (g_ascii_strcasecmp (node_cdp->name, "cross-domain-policy") != 0) - continue; - - for (j = 0; j < swfdec_xml_node_num_children (node_cdp); j++) { - SwfdecXmlNode *node_aaf = swfdec_xml_node_get_child (node_cdp, j); - const char *value; - GPatternSpec *pattern; - char *value_lower; - - if (node_aaf->type != SWFDEC_XML_NODE_ELEMENT) - continue; - - if (g_ascii_strcasecmp (node_aaf->name, "allow-access-from") != 0) - continue; - - // FIXME: secure attribute? - - value = swfdec_xml_node_get_attribute (node_aaf, SWFDEC_AS_STR_domain); - if (value == NULL) - continue; - - if (host != NULL) { - // GPatternSpec uses ? as a wildcard character, but we won't - // And there can't be a host that has ? character - if (strchr (value, '?') != NULL) - continue; - - value_lower = g_ascii_strdown (value, -1); - pattern = g_pattern_spec_new (value_lower); - g_free (value_lower); - - if (g_pattern_match_string (pattern, host_lower)) { - g_free (host_lower); - g_pattern_spec_free (pattern); - return TRUE; - } - - g_pattern_spec_free (pattern); - } else { - // in case we don't have a host name, only match asterisks - if (value[strspn (value, "*")] == '\0') - return TRUE; - } - } - } - - g_free (host_lower); - - return FALSE; -} - -static void -swfdec_policy_stream_target_close (SwfdecStreamTarget *target, - SwfdecStream *stream) -{ - SwfdecPolicyLoader *policy_loader = SWFDEC_POLICY_LOADER (target); - gboolean allow; - char *text; - - text = swfdec_loader_get_text (policy_loader->loader, 8); - - if (text == NULL) { - SWFDEC_ERROR ("couldn't get text from crossdomain policy"); - allow = FALSE; - } else { - allow = swfdec_policy_loader_check ( - SWFDEC_AS_CONTEXT (policy_loader->sec->player), text, - swfdec_url_get_host (policy_loader->sec->url)); - } - - g_free (text); - - SWFDEC_LOG ("crossdomain policy %s access from %s to %s", - (allow ? "allows" : "doesn't allow"), - swfdec_url_get_host (policy_loader->sec->url), policy_loader->host); - - policy_loader->func (policy_loader, allow); -} - -static void -swfdec_policy_loader_stream_target_init (SwfdecStreamTargetInterface *iface) -{ - iface->get_player = swfdec_policy_stream_target_get_player; - iface->close = swfdec_policy_stream_target_close; - iface->error = swfdec_policy_stream_target_error; -} - -/*** SWFDEC_POLICY_LOADER ***/ - -G_DEFINE_TYPE_WITH_CODE (SwfdecPolicyLoader, swfdec_policy_loader, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_policy_loader_stream_target_init)) - -static void -swfdec_policy_loader_dispose (GObject *object) -{ - SwfdecPolicyLoader *policy_loader = SWFDEC_POLICY_LOADER (object); - - g_assert (policy_loader->loader); - swfdec_stream_set_target (SWFDEC_STREAM (policy_loader->loader), NULL); - g_object_unref (policy_loader->loader); - policy_loader->loader = NULL; - - g_assert (policy_loader->host); - g_free (policy_loader->host); - - G_OBJECT_CLASS (swfdec_policy_loader_parent_class)->dispose (object); -} - -static void -swfdec_policy_loader_class_init (SwfdecPolicyLoaderClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = swfdec_policy_loader_dispose; -} - -static void -swfdec_policy_loader_init (SwfdecPolicyLoader *policy_loader) -{ -} - -SwfdecPolicyLoader * -swfdec_policy_loader_new (SwfdecFlashSecurity *sec, const char *host, - SwfdecPolicyLoaderFunc func) -{ - SwfdecPolicyLoader *policy_loader; - SwfdecURL *url; - char *url_str; - - g_return_val_if_fail (SWFDEC_IS_FLASH_SECURITY (sec), NULL); - g_return_val_if_fail (host != NULL, NULL); - g_return_val_if_fail (func != NULL, NULL); - - policy_loader = SWFDEC_POLICY_LOADER (g_object_new ( - SWFDEC_TYPE_POLICY_LOADER, NULL)); - - url_str = g_strdup_printf ("http://%s/crossdomain.xml", host); - url = swfdec_url_new (url_str); - g_free (url_str); - policy_loader->loader = swfdec_loader_load (sec->player->priv->resource->loader, - url, SWFDEC_LOADER_REQUEST_DEFAULT, NULL, 0); - swfdec_url_free (url); - - if (!policy_loader->loader) { - g_free (policy_loader); - return NULL; - } - - policy_loader->sec = sec; - policy_loader->host = g_strdup (host); - policy_loader->func = func; - - swfdec_stream_set_target (SWFDEC_STREAM (policy_loader->loader), - SWFDEC_STREAM_TARGET (policy_loader)); - swfdec_loader_set_data_type (policy_loader->loader, SWFDEC_LOADER_DATA_XML); - - return policy_loader; -} - -void -swfdec_policy_loader_free (SwfdecPolicyLoader *policy_loader) -{ - g_return_if_fail (SWFDEC_IS_POLICY_LOADER (policy_loader)); - - g_object_unref (policy_loader); -} diff --git a/libswfdec/swfdec_policy_loader.h b/libswfdec/swfdec_policy_loader.h deleted file mode 100644 index 525f48e..0000000 --- a/libswfdec/swfdec_policy_loader.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * 2007 Pekka Lampila <pekka.lampila at iki.fi> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef _SWFDEC_FLASH_SECURITY_POLICY_H_ -#define _SWFDEC_FLASH_SECURITY_POLICY_H_ - -#include <libswfdec/swfdec.h> -#include <libswfdec/swfdec_as_object.h> -#include <libswfdec/swfdec_flash_security.h> - -G_BEGIN_DECLS - -typedef struct _SwfdecPolicyLoader SwfdecPolicyLoader; -typedef struct _SwfdecPolicyLoaderClass SwfdecPolicyLoaderClass; -typedef void (* SwfdecPolicyLoaderFunc) (SwfdecPolicyLoader *policy_loader, gboolean allow); - -#define SWFDEC_TYPE_POLICY_LOADER (swfdec_policy_loader_get_type()) -#define SWFDEC_IS_POLICY_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_POLICY_LOADER)) -#define SWFDEC_IS_POLICY_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_POLICY_LOADER)) -#define SWFDEC_POLICY_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_POLICY_LOADER, SwfdecPolicyLoader)) -#define SWFDEC_POLICY_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_POLICY_LOADER, SwfdecPolicyLoaderClass)) -#define SWFDEC_POLICY_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_POLICY_LOADER, SwfdecPolicyLoaderClass)) - -struct _SwfdecPolicyLoader { - GObject object; - - SwfdecLoader * loader; - - SwfdecFlashSecurity * sec; - char * host; - SwfdecPolicyLoaderFunc func; -}; - -struct _SwfdecPolicyLoaderClass { - GObjectClass object_class; -}; - -GType swfdec_policy_loader_get_type (void); - -SwfdecPolicyLoader *swfdec_policy_loader_new (SwfdecFlashSecurity * sec, - const char * host, - SwfdecPolicyLoaderFunc func); -void swfdec_policy_loader_free (SwfdecPolicyLoader * policy_loader); - -G_END_DECLS -#endif diff --git a/libswfdec/swfdec_resource_request.c b/libswfdec/swfdec_resource_request.c index 8c3ddbf..e367993 100644 --- a/libswfdec/swfdec_resource_request.c +++ b/libswfdec/swfdec_resource_request.c @@ -114,8 +114,7 @@ swfdec_player_request_resource_now (SwfdecPlayer *player, /* create absolute url first */ absolute = swfdec_url_new_relative (swfdec_loader_get_url (player->priv->resource->loader), url); - swfdec_security_allow_url (security, absolute, - swfdec_player_request_resource_allow_callback, data); + swfdec_player_request_resource_allow_callback (absolute, TRUE, data); swfdec_url_free (absolute); } diff --git a/libswfdec/swfdec_security.c b/libswfdec/swfdec_security.c index a41f510..ae431a0 100644 --- a/libswfdec/swfdec_security.c +++ b/libswfdec/swfdec_security.c @@ -61,26 +61,3 @@ swfdec_security_allow (SwfdecSecurity *guard, SwfdecSecurity *key) return klass->allow (guard, key); } -/** - * swfdec_security_allow_url: - * @guard: security that is in effect - * @url: URL that should be accessed - * - * Asks @guard to check if the given @url may be accessed. - * - * Returns: %TRUE if @url may be accessed. - **/ -void -swfdec_security_allow_url (SwfdecSecurity *guard, const SwfdecURL *url, - SwfdecURLAllowFunc callback, gpointer user_data) -{ - SwfdecSecurityClass *klass; - - g_assert (SWFDEC_IS_SECURITY (guard)); - g_assert (url != NULL); - - klass = SWFDEC_SECURITY_GET_CLASS (guard); - g_assert (klass->allow_url); - klass->allow_url (guard, url, callback, user_data); -} - diff --git a/libswfdec/swfdec_security.h b/libswfdec/swfdec_security.h index 2933b44..cdc0717 100644 --- a/libswfdec/swfdec_security.h +++ b/libswfdec/swfdec_security.h @@ -47,21 +47,13 @@ struct _SwfdecSecurityClass GObjectClass object_class; gboolean (* allow) (SwfdecSecurity * guard, - SwfdecSecurity * from); - void (* allow_url) (SwfdecSecurity * guard, - const SwfdecURL * url, - SwfdecURLAllowFunc callback, - gpointer user_data); + SwfdecSecurity * key); }; GType swfdec_security_get_type (void); gboolean swfdec_security_allow (SwfdecSecurity * guard, SwfdecSecurity * key); -void swfdec_security_allow_url (SwfdecSecurity * guard, - const SwfdecURL * url, - SwfdecURLAllowFunc callback, - gpointer user_data); G_END_DECLS diff --git a/libswfdec/swfdec_security_allow.c b/libswfdec/swfdec_security_allow.c index e60a949..fb678b4 100644 --- a/libswfdec/swfdec_security_allow.c +++ b/libswfdec/swfdec_security_allow.c @@ -35,19 +35,11 @@ swfdec_security_allow_allow (SwfdecSecurity *guard, SwfdecSecurity *key) } static void -swfdec_security_allow_allow_url (SwfdecSecurity *guard, const SwfdecURL *url, - SwfdecURLAllowFunc callback, gpointer user_data) -{ - callback (url, TRUE, user_data); -} - -static void swfdec_security_allow_class_init (SwfdecSecurityAllowClass *klass) { SwfdecSecurityClass *security_class = SWFDEC_SECURITY_CLASS (klass); security_class->allow = swfdec_security_allow_allow; - security_class->allow_url = swfdec_security_allow_allow_url; } static void commit 39778f967e2829a6e9552c2e68cff17d0814b86a Author: Benjamin Otte <otte at gnome.org> Date: Tue Jan 15 10:52:03 2008 +0100 add more functions to SwfdecURL (untested) These functions are needed by policy file handling diff --git a/libswfdec/swfdec_url.c b/libswfdec/swfdec_url.c index 3d57c54..6cdb54f 100644 --- a/libswfdec/swfdec_url.c +++ b/libswfdec/swfdec_url.c @@ -50,9 +50,9 @@ struct _SwfdecURL { char * url; /* the complete url */ - char * protocol; /* http, file, rtmp, ... */ - char * host; /* can be NULL for files */ - guint port; /* can be NULL */ + char * protocol; /* lowercase, http, file, rtmp, ... */ + char * host; /* lowercase, can be NULL for files */ + guint port; /* can be 0 */ char * path; /* can be NULL for root path */ char * query; /* can be NULL */ }; @@ -111,16 +111,16 @@ swfdec_url_new (const char *string) string = s + 3; s = strchr (string, '/'); if (s == NULL) { - url->host = g_strdup (string); + url->host = g_ascii_strdown (string, -1); return url; } if (s != string) { char *colon = swfdec_memrchr (string, ':', s - string); if (colon) { url->port = strtoul (colon + 1, &colon, 10); - url->host = g_strndup (string, colon - string); + url->host = g_ascii_strdown (string, colon - string); } else { - url->host = g_strndup (string, s - string); + url->host = g_ascii_strdown (string, s - string); } } string = s + 1; @@ -137,6 +137,63 @@ swfdec_url_new (const char *string) } /** + * swfdec_url_new_components: + * @protocol: protocol to use + * @hostname: hostname or IP address or %NULL + * @port: port number or 0. Must be 0 if no hostname is given + * @path: a path or %NULL + * @query: the query string or %NULL + * + * Creates a new URL from the given components. + * + * Returns: a new url pointing to the url from the given components + **/ +SwfdecURL * +swfdec_url_new_components (const char *protocol, const char *hostname, + guint port, const char *path, const char *query) +{ + GString *url; + SwfdecURL *result; + + g_return_val_if_fail (protocol != NULL, NULL); + g_return_val_if_fail (hostname != NULL || port == 0, NULL); + g_return_val_if_fail (port < 65536, NULL); + + url = g_string_new (protocol); + g_string_append (url, "://"); + if (hostname) { + g_string_append (url, hostname); + if (port) { + g_string_append_printf (url, ":%u", port); + } + } + g_string_append (url, "/"); + if (path) + g_string_append (url, path); + if (query) { + g_string_append (url, "?"); + g_string_append (url, query); + } + result = swfdec_url_new (url->str); + g_string_free (url, TRUE); + return result; +} + +/** + * swfdec_url_new_parent: + * @url: a #SwfdecURL + * + * Creates a new url that is the parent of @url. + * + * Returns: a new url pointing to the parent of @url. + **/ +SwfdecURL * +swfdec_url_new_parent (const SwfdecURL *url) +{ + return swfdec_url_new_relative (url, ""); +} + +/** * swfdec_url_new_relative: * @url: a #SwfdecURL * @string: a relative or absolute URL path @@ -206,6 +263,7 @@ swfdec_url_copy (const SwfdecURL *url) copy->url = g_strdup (url->url); copy->protocol = g_strdup (url->protocol); copy->host = g_strdup (url->host); + copy->port = url->port; copy->path = g_strdup (url->path); copy->query = g_strdup (url->query); @@ -288,7 +346,7 @@ swfdec_url_has_protocol (const SwfdecURL *url, const char *protocol) * swfdec_url_get_host: * @url: a #SwfdecURL * - * Gets the host for @url. + * Gets the host for @url as a lower case string. * * Returns: the host or %NULL if none (typically for file URLs). **/ @@ -354,6 +412,47 @@ swfdec_url_get_query (const SwfdecURL *url) } /** + * swfdec_url_is_parent: + * @parent: the supposed parent url + * @child: the supposed child url + * + * Checks if the given @parent url is a parent url of the given @child url. The + * algorithm used is the same as checking policy files if hey apply. If @parent + * equals @child, %TRUE is returned. This function does not compare query + * strings. + * + * Returns: %TRUE if @parent is a parent of @child, %FALSE otherwise. + **/ +gboolean +swfdec_url_is_parent (const SwfdecURL *parent, const SwfdecURL *child) +{ + gsize len; + + g_return_val_if_fail (parent != NULL, FALSE); + g_return_val_if_fail (child != NULL, FALSE); + + if (!g_str_equal (parent->protocol, child->protocol)) + return FALSE; + if (parent->host == NULL) { + if (child->host != NULL) + return FALSE; + } else { + if (child->host == NULL || !g_str_equal (parent->host, child->host)) + return FALSE; + } + if (parent->port != child->port) + return FALSE; + if (parent->path == NULL) + return TRUE; + if (child->path == NULL) + return TRUE; + len = strlen (parent->path); + if (strncmp (parent->path, child->path, len) != 0) + return FALSE; + return child->path[len] == '\0' || child->path[len] == '/'; +} + +/** * swfdec_url_is_local: * @url: the url to check * diff --git a/libswfdec/swfdec_url.h b/libswfdec/swfdec_url.h index 3ac0b88..5eaa306 100644 --- a/libswfdec/swfdec_url.h +++ b/libswfdec/swfdec_url.h @@ -30,6 +30,12 @@ typedef struct _SwfdecURL SwfdecURL; GType swfdec_url_get_type (void) G_GNUC_CONST; SwfdecURL * swfdec_url_new (const char * string); +SwfdecURL * swfdec_url_new_components (const char * protocol, + const char * hostname, + guint port, + const char * path, + const char * query); +SwfdecURL * swfdec_url_new_parent (const SwfdecURL * url); SwfdecURL * swfdec_url_new_relative (const SwfdecURL * url, const char * string); SwfdecURL * swfdec_url_copy (const SwfdecURL * url); @@ -45,6 +51,8 @@ const char * swfdec_url_get_query (const SwfdecURL * url); gboolean swfdec_url_has_protocol (const SwfdecURL * url, const char * protocol); +gboolean swfdec_url_is_parent (const SwfdecURL * parent, + const SwfdecURL * child); gboolean swfdec_url_is_local (const SwfdecURL * url); commit be36299778c70baf6d7e84260d95bd6e69b79076 Author: Benjamin Otte <otte at gnome.org> Date: Tue Jan 15 10:51:40 2008 +0100 g_object_notify next-event after a call to advance() diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index feb0638..4ff88a8 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1399,6 +1399,7 @@ swfdec_player_do_advance (SwfdecPlayer *player, gulong msecs, guint audio_sample } g_assert (audio_samples == 0); + g_object_notify (G_OBJECT (player), "next-event"); swfdec_player_unlock (player); } @@ -1578,7 +1579,7 @@ swfdec_player_class_init (SwfdecPlayerClass *klass) g_param_spec_enum ("mouse-cursor", "mouse cursor", "how the mouse pointer should be presented", SWFDEC_TYPE_MOUSE_CURSOR, SWFDEC_MOUSE_CURSOR_NONE, G_PARAM_READABLE)); g_object_class_install_property (object_class, PROP_NEXT_EVENT, - g_param_spec_long ("next-event", "next event", "how many milliseconds until the next event or 0 when no event pending", + g_param_spec_long ("next-event", "next event", "how many milliseconds until the next event or -1 when no event pending", -1, G_MAXLONG, -1, G_PARAM_READABLE)); g_object_class_install_property (object_class, PROP_CACHE_SIZE, g_param_spec_uint ("cache-size", "cache size", "maximum cache size in bytes", commit b018fc217e22901b562d51b3c9b808b9a0f6f4a2 Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 12 00:23:51 2008 +0100 parse ports seperately diff --git a/libswfdec/swfdec_url.c b/libswfdec/swfdec_url.c index fe9ca0a..3d57c54 100644 --- a/libswfdec/swfdec_url.c +++ b/libswfdec/swfdec_url.c @@ -20,7 +20,10 @@ #ifdef HAVE_CONFIG_H #include "config.h" #endif + +#include <stdlib.h> #include <string.h> + #include "swfdec_url.h" #include "swfdec_debug.h" @@ -49,6 +52,7 @@ struct _SwfdecURL { char * url; /* the complete url */ char * protocol; /* http, file, rtmp, ... */ char * host; /* can be NULL for files */ + guint port; /* can be NULL */ char * path; /* can be NULL for root path */ char * query; /* can be NULL */ }; @@ -65,6 +69,19 @@ swfdec_url_get_type (void) return type; } +static void * +swfdec_memrchr (const void *s, int c, size_t n) +{ + void *cur, *next; + + cur = memchr (s, c, n); + if (cur == NULL) + return NULL; + while ((next = memchr (cur, c, n))) + cur = next; + return cur; +} + /** * swfdec_url_new: * @string: a full-qualified URL encoded in UTF-8 @@ -81,6 +98,7 @@ swfdec_url_new (const char *string) g_return_val_if_fail (string != NULL, NULL); + /* FIXME: error checking? */ SWFDEC_DEBUG ("new url: %s", string); url = g_slice_new0 (SwfdecURL); url->url = g_strdup (string); @@ -96,8 +114,15 @@ swfdec_url_new (const char *string) url->host = g_strdup (string); return url; } - if (s != string) - url->host = g_strndup (string, s - string); + if (s != string) { + char *colon = swfdec_memrchr (string, ':', s - string); + if (colon) { + url->port = strtoul (colon + 1, &colon, 10); + url->host = g_strndup (string, colon - string); + } else { + url->host = g_strndup (string, s - string); + } + } string = s + 1; s = strchr (string, '?'); if (s == NULL) { @@ -263,8 +288,7 @@ swfdec_url_has_protocol (const SwfdecURL *url, const char *protocol) * swfdec_url_get_host: * @url: a #SwfdecURL * - * Gets the host for @url. If the host includes a portnumber, it will be present - * in the returned string. + * Gets the host for @url. * * Returns: the host or %NULL if none (typically for file URLs). **/ @@ -277,6 +301,23 @@ swfdec_url_get_host (const SwfdecURL *url) } /** + * swfdec_url_get_port: + * @url: a #SwfdecURL + * + * Gets the port number specified by the given @url. If the @url does not + * specify a port number, 0 will be returned. + * + * Returns: the specified port or 0 if none was given. + **/ +guint +swfdec_url_get_port (const SwfdecURL *url) +{ + g_return_val_if_fail (url != NULL, 0); + + return url->port; +} + +/** * swfdec_url_get_path: * @url: a #SwfdecURL * diff --git a/libswfdec/swfdec_url.h b/libswfdec/swfdec_url.h index 7a94039..3ac0b88 100644 --- a/libswfdec/swfdec_url.h +++ b/libswfdec/swfdec_url.h @@ -38,6 +38,7 @@ void swfdec_url_free (SwfdecURL * url); const char * swfdec_url_get_url (const SwfdecURL * url); const char * swfdec_url_get_protocol (const SwfdecURL * url); const char * swfdec_url_get_host (const SwfdecURL * url); +guint swfdec_url_get_port (const SwfdecURL * url); const char * swfdec_url_get_path (const SwfdecURL * url); const char * swfdec_url_get_query (const SwfdecURL * url); commit 506c18b1eb4111743480be75fa30c7a230742070 Author: Benjamin Otte <otte at gnome.org> Date: Fri Jan 11 13:56:38 2008 +0100 get rid of swfdec_movie_load_variables() API and call it directly diff --git a/libswfdec/swfdec_as_interpret.c b/libswfdec/swfdec_as_interpret.c index 24ed902..24a822c 100644 --- a/libswfdec/swfdec_as_interpret.c +++ b/libswfdec/swfdec_as_interpret.c @@ -39,6 +39,7 @@ #include <math.h> #include <string.h> #include "swfdec_decoder.h" +#include "swfdec_load_object.h" #include "swfdec_movie.h" #include "swfdec_player_internal.h" #include "swfdec_sprite.h" @@ -1161,6 +1162,18 @@ swfdec_action_get_url (SwfdecAsContext *cx, guint action, const guint8 *data, gu } static void +swfdec_as_interpret_load_variables_on_finish (SwfdecAsObject *target, + const char *text) +{ + if (text != NULL) + swfdec_as_object_decode (target, text); + + // only call onData for sprite movies + // FIXME: is it called even when loading fails? + swfdec_movie_queue_script (SWFDEC_MOVIE (target), SWFDEC_EVENT_DATA); +} + +static void swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, guint len) { const char *target, *url; @@ -1193,8 +1206,10 @@ swfdec_action_get_url2 (SwfdecAsContext *cx, guint action, const guint8 *data, g SwfdecMovie *movie; movie = swfdec_player_get_movie_from_string (SWFDEC_PLAYER (cx), target); - if (movie != NULL) - swfdec_movie_load_variables (movie, url, method, NULL); + if (movie != NULL) { + swfdec_load_object_new (SWFDEC_AS_OBJECT (movie), url, method, NULL, NULL, + swfdec_as_interpret_load_variables_on_finish); + } } else if (internal) { swfdec_resource_load (SWFDEC_PLAYER (cx), target, url, method, NULL, NULL); } else { diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 547155b..90147a3 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -1724,35 +1724,6 @@ swfdec_movie_duplicate (SwfdecMovie *movie, const char *name, int depth) return copy; } -static void -swfdec_movie_load_variables_on_finish (SwfdecAsObject *target, - const char *text) -{ - if (text != NULL) - swfdec_as_object_decode (target, text); - - // only call onData for sprite movies - // FIXME: is it called even when loading fails? - if (target->context->version >= 6 && SWFDEC_IS_SPRITE_MOVIE (target)) - swfdec_as_object_call (target, SWFDEC_AS_STR_onData, 0, NULL, NULL); -} - -void -swfdec_movie_load_variables (SwfdecMovie *movie, const char *url, - SwfdecLoaderRequest request, SwfdecBuffer *data) -{ - g_return_if_fail (SWFDEC_IS_MOVIE (movie)); - g_return_if_fail (url != NULL); - - if (request != SWFDEC_LOADER_REQUEST_DEFAULT) { - SWFDEC_FIXME ("loadVariables: Different request-modes not supported"); - return; - } - - swfdec_load_object_new (SWFDEC_AS_OBJECT (movie), url, request, data, NULL, - swfdec_movie_load_variables_on_finish); -} - char * swfdec_movie_get_path (SwfdecMovie *movie, gboolean dot) { diff --git a/libswfdec/swfdec_movie.h b/libswfdec/swfdec_movie.h index 6b5b001..623707f 100644 --- a/libswfdec/swfdec_movie.h +++ b/libswfdec/swfdec_movie.h @@ -278,10 +278,6 @@ void swfdec_movie_execute (SwfdecMovie * movie, SwfdecEventType condition); void swfdec_movie_queue_script (SwfdecMovie * movie, SwfdecEventType condition); -void swfdec_movie_load_variables (SwfdecMovie * movie, - const char * url, - SwfdecLoaderRequest request, - SwfdecBuffer * data); int swfdec_movie_compare_depths (gconstpointer a, gconstpointer b); commit ddcdff6d0156b0de3002572e905577a0ccf42f2c Author: Benjamin Otte <otte at gnome.org> Date: Thu Jan 10 19:51:13 2008 +0100 use a function list for the player's rooted objects diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c index 72c1ceb..a7d3fd2 100644 --- a/libswfdec/swfdec_load_object.c +++ b/libswfdec/swfdec_load_object.c @@ -69,8 +69,8 @@ swfdec_load_object_stream_target_error (SwfdecStreamTarget *target, load_object->finish (load_object->target, NULL); /* unroot */ - swfdec_player_unroot_object (SWFDEC_PLAYER ( - SWFDEC_AS_OBJECT (load_object)->context), G_OBJECT (load_object)); + swfdec_player_unroot (SWFDEC_PLAYER ( + SWFDEC_AS_OBJECT (load_object)->context), load_object); } static void @@ -99,8 +99,8 @@ swfdec_load_object_stream_target_close (SwfdecStreamTarget *target, } /* unroot */ - swfdec_player_unroot_object (SWFDEC_PLAYER ( - SWFDEC_AS_OBJECT (load_object)->context), G_OBJECT (load_object)); + swfdec_player_unroot (SWFDEC_PLAYER ( + SWFDEC_AS_OBJECT (load_object)->context), load_object); } static void @@ -225,8 +225,7 @@ swfdec_load_object_new (SwfdecAsObject *target, const char *url, if (!swfdec_load_object_load (load_object, url, request, data)) return NULL; - swfdec_player_root_object (SWFDEC_PLAYER (target->context), - G_OBJECT (load_object)); + swfdec_player_root (SWFDEC_PLAYER (target->context), load_object, (GFunc) swfdec_as_object_mark); return SWFDEC_AS_OBJECT (load_object); } diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 2e2b728..feb0638 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -885,9 +885,8 @@ swfdec_player_dispose (GObject *object) g_object_unref (priv->resource); priv->resource = NULL; } - while (priv->rooted_objects) - swfdec_player_unroot_object (player, priv->rooted_objects->data); + swfdec_function_list_clear (&priv->rooted); /* we do this here so references to GC'd objects get freed */ G_OBJECT_CLASS (swfdec_player_parent_class)->dispose (object); @@ -1515,16 +1514,6 @@ swfdec_player_mark_string_object (gpointer key, gpointer value, gpointer data) } static void -swfdec_player_mark_rooted_object (gpointer object, gpointer unused) -{ - if (SWFDEC_IS_RESOURCE (object)) { - swfdec_resource_mark (object); - } else if (SWFDEC_IS_AS_OBJECT (object)) { - swfdec_as_object_mark (object); - } -} - -static void swfdec_player_mark (SwfdecAsContext *context) { SwfdecPlayer *player = SWFDEC_PLAYER (context); @@ -1536,7 +1525,7 @@ swfdec_player_mark (SwfdecAsContext *context) swfdec_as_object_mark (priv->Video); g_list_foreach (priv->roots, (GFunc) swfdec_as_object_mark, NULL); g_list_foreach (priv->intervals, (GFunc) swfdec_as_object_mark, NULL); - g_list_foreach (priv->rooted_objects, swfdec_player_mark_rooted_object, NULL); + swfdec_function_list_execute (&priv->rooted, player); SWFDEC_AS_CONTEXT_CLASS (swfdec_player_parent_class)->mark (context); } @@ -2101,68 +2090,6 @@ swfdec_player_set_export_class (SwfdecPlayer *player, const char *name, SwfdecAs } } -/* FIXME: - * I don't like the idea of rooting arbitrary objects very much. And so far, - * this API is only necessary for the objects used for loading data. So it seems - * like a good idea to revisit the refcounting and GCing of resources. - */ -void -swfdec_player_root_object (SwfdecPlayer *player, GObject *object) -{ - SwfdecPlayerPrivate *priv; - - g_return_if_fail (SWFDEC_IS_PLAYER (player)); - g_return_if_fail (G_IS_OBJECT (object)); - - priv = player->priv; - g_object_ref (object); - priv->rooted_objects = g_list_prepend (priv->rooted_objects, object); -} - -void -swfdec_player_unroot_object (SwfdecPlayer *player, GObject *object) -{ - SwfdecPlayerPrivate *priv = player->priv; - GList *entry; - - g_return_if_fail (SWFDEC_IS_PLAYER (player)); - g_return_if_fail (G_IS_OBJECT (object)); - entry = g_list_find (priv->rooted_objects, object); - g_return_if_fail (entry != NULL); - g_object_unref (object); - priv->rooted_objects = g_list_delete_link (priv->rooted_objects, entry); -} - -/** - * swfdec_player_create_socket: - * @player: a #SwfdecPlayer - * @hostname: the host name to connect to. - * @port: the port to connect to - * - * Creates a new socket connecting to the given hostname and port. - * - * Returns: a new socket or %NULL if no socket implementation exists - **/ -/* FIXME: always return a socket? */ -SwfdecSocket * -swfdec_player_create_socket (SwfdecPlayer *player, const char *hostname, guint port) -{ - SwfdecSocket *sock; - SwfdecSocketClass *klass; - - g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); - g_return_val_if_fail (hostname != NULL, NULL); - g_return_val_if_fail (port > 0, NULL); - - if (player->priv->socket_type == 0) - return NULL; - klass = g_type_class_ref (player->priv->socket_type); - sock = klass->create (hostname, port); - g_type_class_unref (klass); - - return sock; -} - /** PUBLIC API ***/ /** diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index fbbac20..cbe49ec 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -23,6 +23,7 @@ #include <libswfdec/swfdec_player.h> #include <libswfdec/swfdec_audio.h> #include <libswfdec/swfdec_event.h> +#include <libswfdec/swfdec_function_list.h> #include <libswfdec/swfdec_player_scripting.h> #include <libswfdec/swfdec_rect.h> #include <libswfdec/swfdec_ringbuffer.h> @@ -62,7 +63,6 @@ struct _SwfdecPlayerPrivate guint width; /* width of movie */ guint height; /* height of movie */ GList * roots; /* all the root movies */ - GList * rooted_objects; /* all the objects we keep track of */ GSList * resource_requests; /* all external requested URIs - see swfdec_resource_request.[ch] */ SwfdecCache * cache; /* player cache */ gboolean bgcolor_set; /* TRUE if the background color has been set */ @@ -88,6 +88,7 @@ struct _SwfdecPlayerPrivate guint unnamed_count; /* variable used for naming unnamed movies */ /* ActionScript */ + SwfdecFunctionList rooted; /* all the objects we keep track of */ guint interval_id; /* id returned from setInterval call */ GList * intervals; /* all currently running intervals */ GHashTable * registered_classes; /* name => SwfdecAsObject constructor */ @@ -151,10 +152,10 @@ void swfdec_player_unlock (SwfdecPlayer * player); void swfdec_player_unlock_soft (SwfdecPlayer * player); void swfdec_player_perform_actions (SwfdecPlayer * player); -void swfdec_player_root_object (SwfdecPlayer * player, - GObject * object); -void swfdec_player_unroot_object (SwfdecPlayer * player, - GObject * object); +#define swfdec_player_root(player, data, mark_func) \ + swfdec_function_list_add (&(player)->priv->rooted, (mark_func), (data), NULL) +#define swfdec_player_unroot(player, data) \ + swfdec_function_list_remove (&(player)->priv->rooted, (data)) SwfdecAsObject *swfdec_player_get_export_class (SwfdecPlayer * player, const char * name); void swfdec_player_set_export_class (SwfdecPlayer * player, diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index 6a8b3b4..08113e3 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -210,7 +210,7 @@ swfdec_resource_create_movie (SwfdecResource *resource) SWFDEC_WARNING ("%s does not reference a movie, not loading %s", resource->target, swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); swfdec_stream_close (SWFDEC_STREAM (resource->loader)); - swfdec_player_unroot_object (player, G_OBJECT (resource)); + swfdec_player_unroot (player, resource); return FALSE; } movie = swfdec_player_get_movie_at_level (player, level); @@ -220,7 +220,7 @@ swfdec_resource_create_movie (SwfdecResource *resource) } else { movie = swfdec_resource_replace_movie (movie, resource); } - swfdec_player_unroot_object (player, G_OBJECT (resource)); + swfdec_player_unroot (player, resource); return TRUE; } @@ -548,7 +548,7 @@ swfdec_resource_load (SwfdecPlayer *player, const char *target, const char *url, resource->target = path; if (loader) resource->clip_loader = g_object_ref (loader); - swfdec_player_root_object (player, G_OBJECT (resource)); + swfdec_player_root (player, resource, (GFunc) swfdec_resource_mark); swfdec_player_request_resource (player, SWFDEC_AS_CONTEXT (player)->frame->security, url, request, buffer, swfdec_resource_do_load, resource, g_object_unref); } commit 2db6a3d2215d8ce37c701943604b405ff804be03 Author: Benjamin Otte <otte at gnome.org> Date: Thu Jan 10 19:41:36 2008 +0100 add a SwfdecFunctionList struct This is supposed to make collecting callbacks easier, as there's a lot of those around. I'm not sure this API works out, but we can at least try it. diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index b0efc23..7da1ba0 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -80,6 +80,7 @@ libswfdec_source_files = \ swfdec_flash_security.c \ swfdec_flv_decoder.c \ swfdec_font.c \ + swfdec_function_list.c \ swfdec_glow_filter.c \ swfdec_gradient_filter.c \ swfdec_gradient_pattern.c \ @@ -242,6 +243,7 @@ noinst_HEADERS = \ swfdec_flash_security.h \ swfdec_flv_decoder.h \ swfdec_font.h \ + swfdec_function_list.h \ swfdec_gradient_pattern.h \ swfdec_graphic.h \ swfdec_graphic_movie.h \ diff --git a/libswfdec/swfdec_function_list.c b/libswfdec/swfdec_function_list.c new file mode 100644 index 0000000..0b29b59 --- /dev/null +++ b/libswfdec/swfdec_function_list.c @@ -0,0 +1,132 @@ +/* Swfdec + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> +#include "swfdec_function_list.h" + +typedef struct _SwfdecFunctionListEntry SwfdecFunctionListEntry; +struct _SwfdecFunctionListEntry { + GFunc func; + gpointer data; + GDestroyNotify destroy; +}; + +void +swfdec_function_list_clear (SwfdecFunctionList *list) +{ + GList *walk; + + g_return_if_fail (list != NULL); + + for (walk = list->list; walk; walk = walk->next) { + SwfdecFunctionListEntry *entry = walk->data; + if (entry->destroy) + entry->destroy (entry->data); + g_slice_free (SwfdecFunctionListEntry, entry); + } + g_list_free (list->list); + list->list = NULL; +} + +void +swfdec_function_list_add (SwfdecFunctionList *list, GFunc func, + gpointer data, GDestroyNotify destroy) +{ + SwfdecFunctionListEntry *entry; + + g_return_if_fail (list != NULL); + g_return_if_fail (func); + + entry = g_slice_new (SwfdecFunctionListEntry); + entry->func = func; + entry->data = data; + entry->destroy = destroy; + + list->list = g_list_append (list->list, entry); +} + +static int +swfdec_function_list_entry_compare (gconstpointer a, gconstpointer b) +{ + a = ((const SwfdecFunctionListEntry *) a)->data; + b = ((const SwfdecFunctionListEntry *) b)->data; + + if (a < b) + return -1; + if (a > b) + return 1; + return 0; +} + +void +swfdec_function_list_remove (SwfdecFunctionList *list, gpointer data) +{ + SwfdecFunctionListEntry entry = { NULL, data, NULL }; + SwfdecFunctionListEntry *e; + GList *node; + + g_return_if_fail (list != NULL); + + node = g_list_find_custom (list->list, &entry, + swfdec_function_list_entry_compare); + e = node->data; + if (e->destroy) + e->destroy (data); + g_slice_free (SwfdecFunctionListEntry, e); + list->list = g_list_delete_link (list->list, node); +} + +void +swfdec_function_list_execute (SwfdecFunctionList *list, gpointer data) +{ + SwfdecFunctionListEntry *entry; + GList *walk; + + g_return_if_fail (list != NULL); + + for (walk = list->list; walk; walk = walk->next) { + entry = walk->data; + entry->func (entry->data, data); + } +} + +void +swfdec_function_list_execute_and_clear (SwfdecFunctionList *list, gpointer data) +{ + SwfdecFunctionListEntry *entry; + GList *old, *walk; + + g_return_if_fail (list != NULL); + + old = list->list; + list->list = NULL; + for (walk = old; walk; walk = walk->next) { + entry = walk->data; + entry->func (entry->data, data); + if (entry->destroy) + entry->destroy (entry->data); + g_slice_free (SwfdecFunctionListEntry, entry); + } + g_list_free (old); +} + diff --git a/libswfdec/swfdec_function_list.h b/libswfdec/swfdec_function_list.h new file mode 100644 index 0000000..f7e8691 --- /dev/null +++ b/libswfdec/swfdec_function_list.h @@ -0,0 +1,50 @@ +/* Swfdec + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef __SWFDEC_FUNCTION_LIST_H__ +#define __SWFDEC_FUNCTION_LIST_H__ + +#include <glib.h> + +G_BEGIN_DECLS + + +typedef struct _SwfdecFunctionList SwfdecFunctionList; +struct _SwfdecFunctionList { + GList * list; +}; + +void swfdec_function_list_clear (SwfdecFunctionList * list); + +void swfdec_function_list_add (SwfdecFunctionList * list, + GFunc func, + gpointer data, + GDestroyNotify destroy); +void swfdec_function_list_remove (SwfdecFunctionList * list, + gpointer data); + +void swfdec_function_list_execute (SwfdecFunctionList * list, + gpointer data); +void swfdec_function_list_execute_and_clear + (SwfdecFunctionList * list, + gpointer data); + +G_END_DECLS + +#endif commit b51d972972da4aef91d54099a1f85bd614a35c96 Author: Benjamin Otte <otte at gnome.org> Date: Thu Jan 10 18:33:44 2008 +0100 add copyright headers diff --git a/libswfdec/swfdec_ringbuffer.c b/libswfdec/swfdec_ringbuffer.c index acc8ba1..6d3dd04 100644 --- a/libswfdec/swfdec_ringbuffer.c +++ b/libswfdec/swfdec_ringbuffer.c @@ -1,3 +1,21 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/libswfdec/swfdec_ringbuffer.h b/libswfdec/swfdec_ringbuffer.h index d7aad1b..3f02851 100644 --- a/libswfdec/swfdec_ringbuffer.h +++ b/libswfdec/swfdec_ringbuffer.h @@ -1,3 +1,21 @@ +/* Swfdec + * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ #ifndef __SWFDEC_RING_BUFFER_H__ #define __SWFDEC_RING_BUFFER_H__ commit ab2cdc38c16b4df99c12d4b65a43372fa01c842b Author: Benjamin Otte <otte at gnome.org> Date: Wed Jan 9 23:47:55 2008 +0100 dump current changes here The next round of changes needs a revamped load request system diff --git a/libswfdec/swfdec_as_strings.c b/libswfdec/swfdec_as_strings.c index 0729919..7f880aa 100644 --- a/libswfdec/swfdec_as_strings.c +++ b/libswfdec/swfdec_as_strings.c @@ -485,5 +485,7 @@ const char swfdec_as_strings[] SWFDEC_AS_CONSTANT_STRING ("y") SWFDEC_AS_CONSTANT_STRING ("idMap") SWFDEC_AS_CONSTANT_STRING ("id") + SWFDEC_AS_CONSTANT_STRING ("onClose") + SWFDEC_AS_CONSTANT_STRING ("onConnect") /* add more here */ ; diff --git a/libswfdec/swfdec_xml_socket.c b/libswfdec/swfdec_xml_socket.c index 89bfaae..bff72c7 100644 --- a/libswfdec/swfdec_xml_socket.c +++ b/libswfdec/swfdec_xml_socket.c @@ -1,5 +1,5 @@ /* Swfdec - * Copyright (C) 2007 Pekka Lampila <pekka.lampila at iki.fi> + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,14 +21,210 @@ #include "config.h" #endif +#include <string.h> + +#include "swfdec_xml_socket.h" #include "swfdec_as_internal.h" +#include "swfdec_as_strings.h" +#include "swfdec_buffer.h" #include "swfdec_debug.h" +#include "swfdec_loader_internal.h" +#include "swfdec_movie.h" +#include "swfdec_player_internal.h" + +static GQuark xml_socket_quark = 0; + +static void +swfdec_xml_socket_ensure_closed (SwfdecXmlSocket *xml) +{ + gpointer cur; + + if (xml->socket == NULL) + return; + + swfdec_stream_set_target (SWFDEC_STREAM (xml->socket), NULL); + g_object_unref (xml->socket); + xml->socket = NULL; + + swfdec_player_unroot_object (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (xml)->context), G_OBJECT (xml)); + cur = g_object_get_qdata (G_OBJECT (xml->target), xml_socket_quark); + if (cur != xml) + g_object_set_qdata (G_OBJECT (xml->target), xml_socket_quark, cur); + xml->target = NULL; +} + +/*** SWFDEC_STREAM_TARGET ***/ + +static SwfdecPlayer * +swfdec_xml_socket_stream_target_get_player (SwfdecStreamTarget *target) +{ + return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (target)->context); +} + +static void +swfdec_xml_socket_stream_target_error (SwfdecStreamTarget *target, + SwfdecStream *stream) +{ + SwfdecXmlSocket *xml = SWFDEC_XML_SOCKET (target); + + if (xml->open) { + SWFDEC_FIXME ("is onClose emitted on error?"); + swfdec_as_object_call (xml->target, SWFDEC_AS_STR_onClose, 0, NULL, NULL); + } else { + SwfdecAsValue value; + + SWFDEC_AS_VALUE_SET_BOOLEAN (&value, FALSE); + swfdec_as_object_call (xml->target, SWFDEC_AS_STR_onConnect, 1, &value, NULL); + } + + swfdec_xml_socket_ensure_closed (xml); +} + +static void +swfdec_xml_socket_stream_target_parse (SwfdecStreamTarget *target, + SwfdecStream *stream) +{ + SwfdecXmlSocket *xml = SWFDEC_XML_SOCKET (target); + SwfdecBufferQueue *queue; + SwfdecBuffer *buffer; + gsize len; + + /* parse until next 0 byte or take everything */ + queue = swfdec_stream_get_queue (stream); + while ((buffer = swfdec_buffer_queue_peek_buffer (queue))) { + guchar *nul = memchr (buffer->data, 0, buffer->length); + + len = nul ? (gsize) (nul - buffer->data + 1) : buffer->length; + g_assert (len > 0); + swfdec_buffer_unref (buffer); + buffer = swfdec_buffer_queue_pull (queue, len); + swfdec_buffer_queue_push (xml->queue, buffer); + if (nul) { + len = swfdec_buffer_queue_get_depth (xml->queue); + g_assert (len > 0); + buffer = swfdec_buffer_queue_pull (xml->queue, len); + if (!g_utf8_validate ((char *) buffer->data, len, NULL)) { + SWFDEC_FIXME ("invalid utf8 sent through socket, what now?"); + } else { + SwfdecAsValue val; + + SWFDEC_AS_VALUE_SET_STRING (&val, swfdec_as_context_get_string ( + SWFDEC_AS_OBJECT (xml)->context, (char *) buffer->data)); + swfdec_as_object_call (xml->target, SWFDEC_AS_STR_onData, 1, &val, NULL); + } + } + } +} + +static void +swfdec_xml_socket_stream_target_close (SwfdecStreamTarget *target, + SwfdecStream *stream) +{ + SwfdecXmlSocket *xml = SWFDEC_XML_SOCKET (target); + + if (swfdec_buffer_queue_get_depth (xml->queue)) { + SWFDEC_FIXME ("data left in socket, what now?"); + } + + swfdec_as_object_call (xml->target, SWFDEC_AS_STR_onClose, 0, NULL, NULL); + + swfdec_xml_socket_ensure_closed (xml); +} + +static void +swfdec_xml_socket_stream_target_init (SwfdecStreamTargetInterface *iface) +{ + iface->get_player = swfdec_xml_socket_stream_target_get_player; + iface->parse = swfdec_xml_socket_stream_target_parse; + iface->close = swfdec_xml_socket_stream_target_close; + iface->error = swfdec_xml_socket_stream_target_error; +} + +/*** SWFDEC_XML_SOCKET ***/ + +G_DEFINE_TYPE_WITH_CODE (SwfdecXmlSocket, swfdec_xml_socket, SWFDEC_TYPE_AS_OBJECT, + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_xml_socket_stream_target_init)) + +static void +swfdec_xml_socket_mark (SwfdecAsObject *object) +{ + swfdec_as_object_mark (SWFDEC_XML_SOCKET (object)->target); + + SWFDEC_AS_OBJECT_CLASS (swfdec_xml_socket_parent_class)->mark (object); +} + +static void +swfdec_xml_socket_dispose (GObject *object) +{ + SwfdecXmlSocket *xml = SWFDEC_XML_SOCKET (object); + + swfdec_xml_socket_ensure_closed (xml); + if (xml->queue) { + swfdec_buffer_queue_unref (xml->queue); + xml->queue = NULL; + } + + G_OBJECT_CLASS (swfdec_xml_socket_parent_class)->dispose (object); +} + +static void +swfdec_xml_socket_class_init (SwfdecXmlSocketClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + SwfdecAsObjectClass *as_object_class = SWFDEC_AS_OBJECT_CLASS (klass); + + object_class->dispose = swfdec_xml_socket_dispose; + + as_object_class->mark = swfdec_xml_socket_mark; +} + +static void +swfdec_xml_socket_init (SwfdecXmlSocket *xml) +{ + xml->queue = swfdec_buffer_queue_new (); +} + +static SwfdecXmlSocket * +swfdec_xml_socket_create (SwfdecAsObject *target, const char *hostname, guint port) +{ + SwfdecAsContext *cx = target->context; + SwfdecXmlSocket *xml; + SwfdecSocket *sock; + + if (!swfdec_as_context_use_mem (cx, sizeof (SwfdecXmlSocket))) + return NULL; + + SWFDEC_FIXME ("implement security checks please"); + sock = swfdec_player_create_socket (SWFDEC_PLAYER (cx), hostname, port); + if (sock == NULL) + return NULL; + + xml = g_object_new (SWFDEC_TYPE_XML_SOCKET, NULL); + swfdec_as_object_add (SWFDEC_AS_OBJECT (xml), cx, sizeof (SwfdecXmlSocket)); + swfdec_player_root_object (SWFDEC_PLAYER (cx), G_OBJECT (xml)); + + xml->target = target; + xml->socket = sock; + + return xml; +} + +/*** AS CODE ***/ SWFDEC_AS_NATIVE (400, 0, swfdec_xml_socket_connect) void swfdec_xml_socket_connect (SwfdecAsContext *cx, SwfdecAsObject *object, guint argc, SwfdecAsValue *argv, SwfdecAsValue *ret) { + const char *host; + int port; + + SWFDEC_AS_CHECK (0, NULL, "si", host, port); + + if (SWFDEC_IS_MOVIE (object) || object == NULL) + return; + + swfdec_xml_socket_create (object, host, port); SWFDEC_STUB ("XMLSocket.connect"); } commit 41cadc7536fe8c353fcbb2f375a4f2ff700ae3ea Author: Benjamin Otte <otte at gnome.org> Date: Wed Jan 9 22:59:41 2008 +0100 actually ref the connection to keep it Also use the pointer of the connection as its name diff --git a/test/rtmp/rtmp_server.c b/test/rtmp/rtmp_server.c index 9efc6da..ec431e8 100644 --- a/test/rtmp/rtmp_server.c +++ b/test/rtmp/rtmp_server.c @@ -30,7 +30,7 @@ socket_print (SoupSocket *sock, const char *format, ...) { va_list varargs; - g_print ("%s ", (char *) g_object_get_data (G_OBJECT (sock), "name")); + g_print ("%p ", sock); va_start (varargs, format); g_vprintf (format, varargs); va_end (varargs); @@ -66,17 +66,9 @@ do_read (SoupSocket *conn, gpointer unused) } static void -assign_name (SoupSocket *sock) -{ - static guint count = 0; - g_object_set_data_full (G_OBJECT (sock), "name", g_strdup_printf ("%u", ++count), g_free); -} - -static void new_connection (SoupSocket *server, SoupSocket *conn, gpointer unused) { - assign_name (conn); - g_object_set (conn, SOUP_SOCKET_FLAG_NONBLOCKING, TRUE, SOUP_SOCKET_FLAG_NODELAY, TRUE, NULL); + g_object_ref (conn); socket_print (conn, "new connection\n"); g_signal_connect (conn, "readable", G_CALLBACK (do_read), NULL); do_read (conn, NULL); commit 338c56052e0c6bc5cef599b34d0a2547fdcf8925 Author: Benjamin Otte <otte at gnome.org> Date: Wed Jan 9 12:41:03 2008 +0100 print out connection names diff --git a/test/rtmp/rtmp_server.c b/test/rtmp/rtmp_server.c index d64fbec..9efc6da 100644 --- a/test/rtmp/rtmp_server.c +++ b/test/rtmp/rtmp_server.c @@ -23,6 +23,18 @@ #include <libsoup/soup.h> #include <libsoup/soup-address.h> #include <libswfdec/swfdec.h> +#include <glib/gprintf.h> + +static void +socket_print (SoupSocket *sock, const char *format, ...) +{ + va_list varargs; + + g_print ("%s ", (char *) g_object_get_data (G_OBJECT (sock), "name")); + va_start (varargs, format); + g_vprintf (format, varargs); + va_end (varargs); +} static void hexdump (SwfdecBuffer *buffer) @@ -44,18 +56,28 @@ do_read (SoupSocket *conn, gpointer unused) buf = swfdec_buffer_new_and_alloc (16); while ((status = soup_socket_read (conn, buf->data, buf->length, &buf->length)) == SOUP_SOCKET_OK) { + socket_print (conn, "\n"); hexdump (buf); soup_socket_write (conn, buf->data, buf->length, &buf->length); buf->length = 16; } swfdec_buffer_unref (buf); - g_print ("status: %u\n", (guint) status); + socket_print (conn, "status: %u\n", (guint) status); +} + +static void +assign_name (SoupSocket *sock) +{ + static guint count = 0; + g_object_set_data_full (G_OBJECT (sock), "name", g_strdup_printf ("%u", ++count), g_free); } static void new_connection (SoupSocket *server, SoupSocket *conn, gpointer unused) { - g_print ("WOOT!\n"); + assign_name (conn); + g_object_set (conn, SOUP_SOCKET_FLAG_NONBLOCKING, TRUE, SOUP_SOCKET_FLAG_NODELAY, TRUE, NULL); + socket_print (conn, "new connection\n"); g_signal_connect (conn, "readable", G_CALLBACK (do_read), NULL); do_read (conn, NULL); } commit c35d9d03fb66ebeb3c6a347ffc09bd88781a4852 Author: Benjamin Otte <otte at gnome.org> Date: Sun Jan 6 00:56:09 2008 +0100 require libsoup when building libswfdec-gtk too many optional dependencies suck diff --git a/configure.ac b/configure.ac index 69504cd..2690e2f 100644 --- a/configure.ac +++ b/configure.ac @@ -97,7 +97,7 @@ AC_SUBST(PANGO_CFLAGS) AC_ARG_ENABLE(gtk, AS_HELP_STRING([--enable-gtk], - [enable Gtk integration (default=yes)])], + [enable build of libswfdec-gtk (default=yes)])], enable_gtk=$enableval, enable_gtk="yes") @@ -107,12 +107,8 @@ dnl GTK_VER=2.8.0 AC_SUBST(GTK_VER) if test "$enable_gtk" = "yes"; then - PKG_CHECK_MODULES(GTK, gtk+-2.0 >= $GTK_VER, HAVE_GTK=yes, HAVE_GTK=no) - if test "x$HAVE_GTK" = xyes; then - AC_DEFINE(HAVE_GTK, 1, [Define if Gtk is enabled]) - else - AC_MSG_ERROR([Couldn't find a suitable Gtk version. You need at least version $GTK_VER]) - fi + PKG_CHECK_MODULES(GTK, gtk+-2.0 >= $GTK_VER libsoup-2.2 >= 2.2.0, HAVE_GTK=yes) + AC_DEFINE(HAVE_GTK, 1, [Define if Gtk is enabled]) else AC_MSG_NOTICE([Gtk support was not enabled.]) fi @@ -266,24 +262,6 @@ fi AM_CONDITIONAL(HAVE_GST, [test "x$HAVE_GST" = xyes]) -AC_ARG_ENABLE(soup, - AS_HELP_STRING([--enable-soup], - [enable libsoup HTTP support for swfdec-gtk (default=yes)])], - enable_libsoup=$enableval, - enable_libsoup="yes") - -if test "$enable_libsoup" = "yes"; then - PKG_CHECK_MODULES(HTTP, libsoup-2.2 >= 2.2.0, HAVE_HTTP=yes, HAVE_HTTP=no) - if test "x$HAVE_HTTP" = xyes; then - AC_DEFINE(HAVE_HTTP, 1, [Define if libsoup is enabled]) - else - AC_MSG_ERROR([Couldn't find libsoup-2.2.]) - fi -else - AC_MSG_NOTICE([libsoup HTTP support was not enabled.]) -fi -AM_CONDITIONAL(HAVE_HTTP, [test "x$HAVE_HTTP" = xyes]) - AC_ARG_ENABLE(vivified, AS_HELP_STRING([--enable-vivified], [enable Vivified Flash debugger (default=no)])], diff --git a/libswfdec-gtk/Makefile.am b/libswfdec-gtk/Makefile.am index b94616c..4f724cf 100644 --- a/libswfdec-gtk/Makefile.am +++ b/libswfdec-gtk/Makefile.am @@ -23,12 +23,12 @@ noinst_HEADERS = \ libswfdec_gtk_ at SWFDEC_MAJORMINOR@_la_CFLAGS = \ -I$(top_srcdir) $(GLOBAL_CFLAGS) $(SWFDEC_CFLAGS) $(GTK_CFLAGS) \ - $(AUDIO_CFLAGS) $(HTTP_CFLAGS) \ + $(AUDIO_CFLAGS) \ -DG_LOG_DOMAIN=\"Swfdec-Gtk\" libswfdec_gtk_ at SWFDEC_MAJORMINOR@_la_LDFLAGS = \ -version-info $(SWFDEC_LIBVERSION) \ -export-symbols-regex '^(swfdec_.*)' \ - $(GTK_LIBS) $(SWFDEC_LIBS) $(AUDIO_LIBS) $(HTTP_LIBS) + $(GTK_LIBS) $(SWFDEC_LIBS) $(AUDIO_LIBS) libswfdec_ at SWFDEC_MAJORMINOR@includedir = $(includedir)/swfdec- at SWFDEC_MAJORMINOR@/libswfdec-gtk libswfdec_ at SWFDEC_MAJORMINOR@include_HEADERS = \ swfdec-gtk.h \ diff --git a/libswfdec-gtk/swfdec_gtk_loader.c b/libswfdec-gtk/swfdec_gtk_loader.c index 26979ce..479e6ad 100644 --- a/libswfdec-gtk/swfdec_gtk_loader.c +++ b/libswfdec-gtk/swfdec_gtk_loader.c @@ -21,10 +21,8 @@ #include "config.h" #endif -#ifdef HAVE_HTTP #include <libsoup/soup.h> #include <errno.h> -#endif #include <stdlib.h> #include <string.h> #include "swfdec_gtk_loader.h" @@ -55,25 +53,20 @@ struct _SwfdecGtkLoader { SwfdecLoader loader; -#ifdef HAVE_HTTP SoupMessage * message; /* the message we're sending */ gboolean opened; /* set after first bytes of data have arrived */ -#endif }; struct _SwfdecGtkLoaderClass { SwfdecLoaderClass loader_class; -#ifdef HAVE_HTTP SoupSession * session; /* the session used by the loader */ -#endif }; /*** SwfdecGtkLoader ***/ G_DEFINE_TYPE (SwfdecGtkLoader, swfdec_gtk_loader, SWFDEC_TYPE_FILE_LOADER) -#ifdef HAVE_HTTP static void swfdec_gtk_loader_set_size (SwfdecGtkLoader *gtk) { @@ -145,20 +138,16 @@ swfdec_gtk_loader_dispose (GObject *object) G_OBJECT_CLASS (swfdec_gtk_loader_parent_class)->dispose (object); } -#endif static void swfdec_gtk_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, SwfdecLoaderRequest request, const char *data, gsize data_len) { -#ifdef HAVE_HTTP const SwfdecURL *url = swfdec_loader_get_url (loader); if (g_ascii_strcasecmp (swfdec_url_get_protocol (url), "http") != 0 && g_ascii_strcasecmp (swfdec_url_get_protocol (url), "https") != 0) { -#endif SWFDEC_LOADER_CLASS (swfdec_gtk_loader_parent_class)->load (loader, parent, request, data, data_len); -#ifdef HAVE_HTTP } else { SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (loader); SwfdecGtkLoaderClass *klass = SWFDEC_GTK_LOADER_GET_CLASS (gtk); @@ -174,10 +163,8 @@ swfdec_gtk_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, g_object_ref (gtk->message); soup_session_queue_message (klass->session, gtk->message, NULL, NULL); } -#endif } -#ifdef HAVE_HTTP static void swfdec_gtk_loader_close (SwfdecStream *stream) { @@ -196,12 +183,10 @@ swfdec_gtk_loader_close (SwfdecStream *stream) } } } -#endif static void swfdec_gtk_loader_class_init (SwfdecGtkLoaderClass *klass) { -#ifdef HAVE_HTTP GObjectClass *object_class = G_OBJECT_CLASS (klass); SwfdecStreamClass *stream_class = SWFDEC_STREAM_CLASS (klass); SwfdecLoaderClass *loader_class = SWFDEC_LOADER_CLASS (klass); @@ -213,7 +198,6 @@ swfdec_gtk_loader_class_init (SwfdecGtkLoaderClass *klass) loader_class->load = swfdec_gtk_loader_load; klass->session = soup_session_async_new (); -#endif } static void diff --git a/test/rtmp/Makefile.am b/test/rtmp/Makefile.am index a0c4546..cfe8416 100644 --- a/test/rtmp/Makefile.am +++ b/test/rtmp/Makefile.am @@ -3,6 +3,6 @@ noinst_PROGRAMS = rtmp-server TESTS = $(check_PROGRAMS) rtmp_server_SOURCES = rtmp_server.c -rtmp_server_CFLAGS = $(GLOBAL_CFLAGS) $(HTTP_CFLAGS) $(SWFDEC_CFLAGS) $(CAIRO_CFLAGS) -rtmp_server_LDFLAGS = $(SWFDEC_LIBS) $(HTTP_LIBS) $(CAIRO_LIBS) +rtmp_server_CFLAGS = $(GLOBAL_CFLAGS) $(GTK_CFLAGS) $(SWFDEC_CFLAGS) $(CAIRO_CFLAGS) +rtmp_server_LDFLAGS = $(SWFDEC_LIBS) $(GTK_LIBS) $(CAIRO_LIBS) commit 2c1ca1e740444ab00c55d2cb280979a6d59191fd Author: Benjamin Otte <otte at gnome.org> Date: Sun Jan 6 00:46:25 2008 +0100 use a SwfdecGtkSocket by default inside the SwfdecGtkPlayer diff --git a/libswfdec-gtk/swfdec_gtk_player.c b/libswfdec-gtk/swfdec_gtk_player.c index c494a71..e9b8cd4 100644 --- a/libswfdec-gtk/swfdec_gtk_player.c +++ b/libswfdec-gtk/swfdec_gtk_player.c @@ -23,6 +23,7 @@ #include "libswfdec-gtk/swfdec_gtk_loader.h" #include "libswfdec-gtk/swfdec_gtk_player.h" +#include "libswfdec-gtk/swfdec_gtk_socket.h" #include "libswfdec-gtk/swfdec_playback.h" #include "libswfdec-gtk/swfdec_source.h" @@ -172,7 +173,9 @@ swfdec_gtk_player_new (SwfdecAsDebugger *debugger) SwfdecPlayer *player; swfdec_init (); - player = g_object_new (SWFDEC_TYPE_GTK_PLAYER, "debugger", debugger, NULL); + player = g_object_new (SWFDEC_TYPE_GTK_PLAYER, + "socket-type", SWFDEC_TYPE_GTK_SOCKET, + "debugger", debugger, NULL); return player; } commit c0fe44171c57fdb4724ab600fce4ee867098c2dc Author: Benjamin Otte <otte at gnome.org> Date: Sun Jan 6 00:46:00 2008 +0100 a variable I didn't catch when renaming sometimes using refactoring tools might be useful... diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 22de7fb..324da0f 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -266,7 +266,7 @@ swfdec_net_stream_stream_target_parse (SwfdecStreamTarget *target, if (ns->flvdecoder == NULL) { /* FIXME: add mp3 support */ ns->flvdecoder = g_object_new (SWFDEC_TYPE_FLV_DECODER, NULL); - SWFDEC_DECODER (ns->flvdecoder)->player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (stream)->context); + SWFDEC_DECODER (ns->flvdecoder)->player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (ns)->context); swfdec_net_stream_onstatus (ns, SWFDEC_AS_STR_NetStream_Play_Start, SWFDEC_AS_STR_status); swfdec_loader_set_data_type (SWFDEC_LOADER (stream), SWFDEC_LOADER_DATA_FLV); commit b17a272be5f83ec675cd97d91055bda26f890281 Author: Benjamin Otte <otte at gnome.org> Date: Sun Jan 6 00:42:28 2008 +0100 add a socket implementation using libsoup diff --git a/libswfdec-gtk/Makefile.am b/libswfdec-gtk/Makefile.am index c3c140f..b94616c 100644 --- a/libswfdec-gtk/Makefile.am +++ b/libswfdec-gtk/Makefile.am @@ -14,6 +14,7 @@ libswfdec_gtk_ at SWFDEC_MAJORMINOR@_la_SOURCES = \ swfdec_gtk_keys.c \ swfdec_gtk_loader.c \ swfdec_gtk_player.c \ + swfdec_gtk_socket.c \ swfdec_gtk_widget.c noinst_HEADERS = \ @@ -34,6 +35,7 @@ libswfdec_ at SWFDEC_MAJORMINOR@include_HEADERS = \ swfdec_gtk_keys.h \ swfdec_gtk_loader.h \ swfdec_gtk_player.h \ + swfdec_gtk_socket.h \ swfdec_gtk_widget.h EXTRA_DIST = \ diff --git a/libswfdec-gtk/swfdec-gtk.h b/libswfdec-gtk/swfdec-gtk.h index de4f723..b64cf83 100644 --- a/libswfdec-gtk/swfdec-gtk.h +++ b/libswfdec-gtk/swfdec-gtk.h @@ -23,6 +23,7 @@ #include <libswfdec-gtk/swfdec_gtk_keys.h> #include <libswfdec-gtk/swfdec_gtk_loader.h> #include <libswfdec-gtk/swfdec_gtk_player.h> +#include <libswfdec-gtk/swfdec_gtk_socket.h> #include <libswfdec-gtk/swfdec_gtk_widget.h> #endif diff --git a/libswfdec-gtk/swfdec_gtk_socket.c b/libswfdec-gtk/swfdec_gtk_socket.c new file mode 100644 index 0000000..08cbb76 --- /dev/null +++ b/libswfdec-gtk/swfdec_gtk_socket.c @@ -0,0 +1,220 @@ +/* Swfdec + * Copyright (C) 2006 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "swfdec_gtk_socket.h" +#include <libsoup/soup.h> +#include <libsoup/soup-address.h> + +/*** GTK-DOC ***/ + +/** + * SECTION:SwfdecGtkSocket + * @title: SwfdecGtkSocket + * @short_description: a socket implementation integrating into the Gtk main loop + * @see_also: #SwfdecSocket, #SwfdecGtkPlayer + * + * #SwfdecGtkSocket is a #SwfdecSocket that is a socket implementation that + * uses libsoup and integrates with the Gtk main loop. It is used by default + * by the #SwfecGtkPlayer. + */ + +/** + * SwfdecGtkSocket: + * + * This is the object used to represent a socket. It is completely private. + */ + +struct _SwfdecGtkSocket +{ + SwfdecSocket socket; + + SoupSocket * sock; /* libsoup socket we're using */ + gboolean sock_writable; /* FALSE if writing would block */ + SwfdecBufferQueue * queue; /* buffers we still need to push */ +}; + +struct _SwfdecGtkSocketClass { + SwfdecSocketClass socket_class; +}; + +/*** SwfdecGtkSocket ***/ + +G_DEFINE_TYPE (SwfdecGtkSocket, swfdec_gtk_socket, SWFDEC_TYPE_SOCKET) + +static void +swfdec_gtk_socket_close (SwfdecStream *stream) +{ + SwfdecGtkSocket *gtk = SWFDEC_GTK_SOCKET (stream); + + soup_socket_disconnect (gtk->sock); +} + +static void +swfdec_gtk_socket_do_connect (SoupSocket *sock, int status, SwfdecGtkSocket *gtk) +{ + if (SOUP_STATUS_IS_SUCCESSFUL (status)) + swfdec_stream_open (SWFDEC_STREAM (gtk)); + else + swfdec_stream_error (SWFDEC_STREAM (gtk), "error connecting"); + +} + +static void +swfdec_gtk_socket_do_disconnect (SoupSocket *sock, SwfdecGtkSocket *gtk) +{ + swfdec_stream_eof (SWFDEC_STREAM (gtk)); +} + +static void +swfdec_gtk_socket_do_read (SoupSocket *sock, SwfdecGtkSocket *gtk) +{ +#define SWFDEC_GTK_SOCKET_BLOCK_SIZE 1024 + SwfdecBuffer *buffer; + SoupSocketIOStatus status; + gsize len; + + do { + buffer = swfdec_buffer_new_and_alloc (SWFDEC_GTK_SOCKET_BLOCK_SIZE); + status = soup_socket_read (sock, buffer, SWFDEC_GTK_SOCKET_BLOCK_SIZE, &len); + buffer->length = len; + switch (status) { + case SOUP_SOCKET_OK: + swfdec_stream_push (SWFDEC_STREAM (gtk), buffer); + break; + case SOUP_SOCKET_WOULD_BLOCK: + case SOUP_SOCKET_EOF: + swfdec_buffer_unref (buffer); + break; + case SOUP_SOCKET_ERROR: + swfdec_buffer_unref (buffer); + swfdec_stream_error (SWFDEC_STREAM (gtk), "error reading data"); + break; + default: + g_warning ("unhandled status code %u from soup_socket_read()", (guint) status); + break; + } + } while (status == SOUP_SOCKET_OK); +} + +static void +swfdec_gtk_socket_do_write (SoupSocket *sock, SwfdecGtkSocket *gtk) +{ + SwfdecBuffer *buffer; + SoupSocketIOStatus status; + gsize len; + + gtk->sock_writable = TRUE; + while ((buffer = swfdec_buffer_queue_peek_buffer (gtk->queue))) { + status = soup_socket_write (sock, buffer->data, buffer->length, &len); + swfdec_buffer_unref (buffer); + switch (status) { + case SOUP_SOCKET_OK: + buffer = swfdec_buffer_queue_pull (gtk->queue, len); + swfdec_buffer_unref (buffer); + break; + case SOUP_SOCKET_WOULD_BLOCK: + case SOUP_SOCKET_EOF: + gtk->sock_writable = FALSE; + break; + case SOUP_SOCKET_ERROR: + swfdec_stream_error (SWFDEC_STREAM (gtk), "error writing data"); + break; + default: + g_warning ("unhandled status code %u from soup_socket_read()", (guint) status); + break; + } + }; +} + +static SwfdecSocket * +swfdec_gtk_socket_create (const char *hostname, guint port) +{ + SwfdecGtkSocket *sock = g_object_new (SWFDEC_TYPE_GTK_SOCKET, NULL); + SoupAddress *addr; + + addr = soup_address_new (hostname, port); + sock->sock = soup_socket_new (SOUP_SOCKET_FLAG_NONBLOCKING, TRUE, + /* FIXME: we should set nodelay, no? */ + SOUP_SOCKET_FLAG_NODELAY, TRUE, NULL); + g_signal_connect (sock->sock, "connect-result", + G_CALLBACK (swfdec_gtk_socket_do_connect), socket); + g_signal_connect (sock->sock, "disconnect", + G_CALLBACK (swfdec_gtk_socket_do_disconnect), socket); + g_signal_connect (sock->sock, "readable", + G_CALLBACK (swfdec_gtk_socket_do_read), socket); + g_signal_connect (sock->sock, "writable", + G_CALLBACK (swfdec_gtk_socket_do_write), socket); + + return SWFDEC_SOCKET (sock); +} + +static void +swfdec_gtk_socket_send (SwfdecSocket *sock, SwfdecBuffer *buffer) +{ + SwfdecGtkSocket *gtk = SWFDEC_GTK_SOCKET (sock); + + swfdec_buffer_queue_push (gtk->queue, buffer); + if (gtk->sock_writable) + swfdec_gtk_socket_do_write (gtk->sock, gtk); +} + +static void +swfdec_gtk_socket_dispose (GObject *object) +{ + SwfdecGtkSocket *gtk = SWFDEC_GTK_SOCKET (object); + + if (gtk->sock) { + g_signal_handlers_disconnect_matched (gtk->sock, G_SIGNAL_MATCH_DATA, + 0, 0, NULL, NULL, gtk); + g_object_unref (gtk->sock); + gtk->sock = NULL; + } + if (gtk->queue) { + swfdec_buffer_queue_unref (gtk->queue); + gtk->queue = NULL; + } + G_OBJECT_CLASS (swfdec_gtk_socket_parent_class)->dispose (object); +} + +static void +swfdec_gtk_socket_class_init (SwfdecGtkSocketClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + SwfdecStreamClass *stream_class = SWFDEC_STREAM_CLASS (klass); + SwfdecSocketClass *socket_class = SWFDEC_SOCKET_CLASS (klass); + + object_class->dispose = swfdec_gtk_socket_dispose; + + stream_class->close = swfdec_gtk_socket_close; + + socket_class->create = swfdec_gtk_socket_create; + socket_class->send = swfdec_gtk_socket_send; +} + +static void +swfdec_gtk_socket_init (SwfdecGtkSocket *gtk) +{ + gtk->sock_writable = TRUE; + gtk->queue = swfdec_buffer_queue_new (); +} + diff --git a/libswfdec-gtk/swfdec_gtk_socket.h b/libswfdec-gtk/swfdec_gtk_socket.h new file mode 100644 index 0000000..62bb546 --- /dev/null +++ b/libswfdec-gtk/swfdec_gtk_socket.h @@ -0,0 +1,42 @@ +/* Swfdec + * Copyright (C) 2006 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef _SWFDEC_GTK_SOCKET_H_ +#define _SWFDEC_GTK_SOCKET_H_ + +#include <libswfdec/swfdec.h> + +G_BEGIN_DECLS + + +typedef struct _SwfdecGtkSocket SwfdecGtkSocket; +typedef struct _SwfdecGtkSocketClass SwfdecGtkSocketClass; + +#define SWFDEC_TYPE_GTK_SOCKET (swfdec_gtk_socket_get_type()) +#define SWFDEC_IS_GTK_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_GTK_SOCKET)) +#define SWFDEC_IS_GTK_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_GTK_SOCKET)) +#define SWFDEC_GTK_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_GTK_SOCKET, SwfdecGtkSocket)) +#define SWFDEC_GTK_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_GTK_SOCKET, SwfdecGtkSocketClass)) +#define SWFDEC_GTK_SOCKET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_GTK_SOCKET, SwfdecGtkSocketClass)) + +GType swfdec_gtk_socket_get_type (void); + + +G_END_DECLS +#endif commit deb4ba14ce8e1b6ca1d560cc3ddf4b66a4e0228a Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 5 23:46:08 2008 +0100 send back every received buffer diff --git a/test/rtmp/rtmp_server.c b/test/rtmp/rtmp_server.c index 2a26675..d64fbec 100644 --- a/test/rtmp/rtmp_server.c +++ b/test/rtmp/rtmp_server.c @@ -45,6 +45,7 @@ do_read (SoupSocket *conn, gpointer unused) buf = swfdec_buffer_new_and_alloc (16); while ((status = soup_socket_read (conn, buf->data, buf->length, &buf->length)) == SOUP_SOCKET_OK) { hexdump (buf); + soup_socket_write (conn, buf->data, buf->length, &buf->length); buf->length = 16; } swfdec_buffer_unref (buf); commit 96ed3681c530049fedd67fb28a664f5a08752940 Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 5 23:45:53 2008 +0100 add a socket-type property diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 45ce8a9..2e2b728 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -621,7 +621,8 @@ enum { PROP_SCALE, PROP_SCRIPTING, PROP_SYSTEM, - PROP_MAX_RUNTIME + PROP_MAX_RUNTIME, + PROP_SOCKET_TYPE }; G_DEFINE_TYPE (SwfdecPlayer, swfdec_player, SWFDEC_TYPE_AS_CONTEXT) @@ -735,6 +736,9 @@ swfdec_player_get_property (GObject *object, guint param_id, GValue *value, case PROP_MAX_RUNTIME: g_value_set_ulong (value, priv->max_runtime); break; + case PROP_SOCKET_TYPE: + g_value_set_gtype (value, priv->socket_type); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); break; @@ -852,6 +856,9 @@ swfdec_player_set_property (GObject *object, guint param_id, const GValue *value case PROP_MAX_RUNTIME: swfdec_player_set_maximum_runtime (player, g_value_get_ulong (value)); break; + case PROP_SOCKET_TYPE: + priv->socket_type = g_value_get_gtype (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); break; @@ -1611,6 +1618,9 @@ swfdec_player_class_init (SwfdecPlayerClass *klass) g_object_class_install_property (object_class, PROP_MAX_RUNTIME, g_param_spec_ulong ("max-runtime", "maximum runtime", "maximum time in msecs scripts may run in the player before aborting", 0, G_MAXULONG, 10 * 1000, G_PARAM_READWRITE)); + g_object_class_install_property (object_class, PROP_SOCKET_TYPE, + g_param_spec_gtype ("socket type", "socket type", "type to use for creating sockets", + SWFDEC_TYPE_SOCKET, G_PARAM_READWRITE)); /** * SwfdecPlayer::invalidate: @@ -1780,6 +1790,7 @@ swfdec_player_init (SwfdecPlayer *player) priv->external_actions = swfdec_ring_buffer_new_for_type (SwfdecPlayerExternalAction, 8); priv->cache = swfdec_cache_new (50 * 1024 * 1024); /* 100 MB */ priv->bgcolor = SWFDEC_COLOR_COMBINE (0xFF, 0xFF, 0xFF, 0xFF); + priv->socket_type = SWFDEC_TYPE_SOCKET; priv->runtime = g_timer_new (); g_timer_stop (priv->runtime); commit 270a2138f7e98c603a8688eb383143b0e376c046 Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 5 22:36:52 2008 +0100 add a socket class diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 17d18ce..b0efc23 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -124,6 +124,7 @@ libswfdec_source_files = \ swfdec_shape.c \ swfdec_shape_parser.c \ swfdec_shared_object.c \ + swfdec_socket.c \ swfdec_sound.c \ swfdec_sound_object.c \ swfdec_sprite.c \ @@ -194,6 +195,7 @@ public_headers = \ swfdec_player_scripting.h \ swfdec_rectangle.h \ swfdec_script.h \ + swfdec_socket.h \ swfdec_stream.h \ swfdec_system.h \ swfdec_url.h diff --git a/libswfdec/swfdec.h b/libswfdec/swfdec.h index 8cb955a..e2432eb 100644 --- a/libswfdec/swfdec.h +++ b/libswfdec/swfdec.h @@ -40,6 +40,7 @@ #include <libswfdec/swfdec_player.h> #include <libswfdec/swfdec_player_scripting.h> #include <libswfdec/swfdec_rectangle.h> +#include <libswfdec/swfdec_socket.h> #include <libswfdec/swfdec_stream.h> #include <libswfdec/swfdec_system.h> #include <libswfdec/swfdec_url.h> diff --git a/libswfdec/swfdec_loader_internal.h b/libswfdec/swfdec_loader_internal.h index 2a3439f..444610c 100644 --- a/libswfdec/swfdec_loader_internal.h +++ b/libswfdec/swfdec_loader_internal.h @@ -43,6 +43,10 @@ void swfdec_loader_set_data_type (SwfdecLoader * loader, char * swfdec_loader_get_text (SwfdecLoader * loader, guint version); +/* swfdec_socket.c */ +void swfdec_socket_send (SwfdecSocket * sock, + SwfdecBuffer * buffer); + G_END_DECLS #endif diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 215d604..45ce8a9 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -2122,6 +2122,36 @@ swfdec_player_unroot_object (SwfdecPlayer *player, GObject *object) priv->rooted_objects = g_list_delete_link (priv->rooted_objects, entry); } +/** + * swfdec_player_create_socket: + * @player: a #SwfdecPlayer + * @hostname: the host name to connect to. + * @port: the port to connect to + * + * Creates a new socket connecting to the given hostname and port. + * + * Returns: a new socket or %NULL if no socket implementation exists + **/ +/* FIXME: always return a socket? */ +SwfdecSocket * +swfdec_player_create_socket (SwfdecPlayer *player, const char *hostname, guint port) +{ + SwfdecSocket *sock; + SwfdecSocketClass *klass; + + g_return_val_if_fail (SWFDEC_IS_PLAYER (player), NULL); + g_return_val_if_fail (hostname != NULL, NULL); + g_return_val_if_fail (port > 0, NULL); + + if (player->priv->socket_type == 0) + return NULL; + klass = g_type_class_ref (player->priv->socket_type); + sock = klass->create (hostname, port); + g_type_class_unref (klass); + + return sock; +} + /** PUBLIC API ***/ /** diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h index f3fbb60..fbbac20 100644 --- a/libswfdec/swfdec_player_internal.h +++ b/libswfdec/swfdec_player_internal.h @@ -27,6 +27,7 @@ #include <libswfdec/swfdec_rect.h> #include <libswfdec/swfdec_ringbuffer.h> #include <libswfdec/swfdec_security.h> +#include <libswfdec/swfdec_socket.h> #include <libswfdec/swfdec_system.h> G_BEGIN_DECLS @@ -69,6 +70,7 @@ struct _SwfdecPlayerPrivate SwfdecResource * resource; /* initial resource loaded */ SwfdecPlayerScripting *scripting; /* scripting object */ GHashTable * scripting_callbacks; /* GC string => SwfdecAsFunction mapping of script callbacks */ + GType socket_type; /* type to use for creating sockets */ /* stage properties */ guint internal_width; /* width used by the scripting engine */ guint internal_height; /* height used by the scripting engine */ @@ -159,6 +161,10 @@ void swfdec_player_set_export_class (SwfdecPlayer * player, const char * name, SwfdecAsObject * object); +SwfdecSocket * swfdec_player_create_socket (SwfdecPlayer * player, + const char * hostname, + guint port); + #define swfdec_player_is_mouse_pressed(player) ((player)->priv->mouse_button & 1) void swfdec_player_invalidate (SwfdecPlayer * player, const SwfdecRect * rect); diff --git a/libswfdec/swfdec_socket.c b/libswfdec/swfdec_socket.c new file mode 100644 index 0000000..723050c --- /dev/null +++ b/libswfdec/swfdec_socket.c @@ -0,0 +1,99 @@ +/* Swfdec + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "swfdec_socket.h" +#include "swfdec_loader_internal.h" + +/*** GTK-DOC ***/ + +/** + * SECTION:SwfdecSocket + * @title: SwfdecSocket + * @short_description: object used for network connections + * + * SwfdecSockets are used to implement TCP streams. These are for example used + * to implement RTMP support or the XMLSocket script class. Backends are + * supposed to provide an implementation for this, as by default this class is + * unimplemented. However, libswfdec-gtk or other convenience libraries provide + * a socket implementation by default. + * + * The socket implementation used by a #SwfdecPlayer can be set with the + * SwfdecPlayer:socket-type property. + */ + +/** + * SwfdecSocket: + * + * This is the base object used for providing input. It is abstract, create a + * subclass to provide your own socket implementation. All members are + * considered private. + */ + +/** + * SwfdecSocketClass: + * @create: Create a new socket for the given hostname and port. This function + * must return a new socket, returning %NULL is not allowed. If you + * encounter an error, create a new socket and call + * swfdec_stream_error() on it. + * @send: Called to send data down the given socket. This function will only be + * called when the socket is open. You get passed a reference to the + * buffer, so it is your responsibility to call swfdec_buffer_unref() on + * it when you are done with it. + * + * This is the socket class. When you create a subclass, you need to implement + * the functions listed above. + */ + +/*** SWFDEC_SOCKET ***/ + +G_DEFINE_ABSTRACT_TYPE (SwfdecSocket, swfdec_socket, SWFDEC_TYPE_STREAM) + +static void +swfdec_socket_class_init (SwfdecSocketClass *klass) +{ +} + +static void +swfdec_socket_init (SwfdecSocket *socket) +{ +} + +/** + * swfdec_socket_send: + * @sock: a #SwfdecSocket + * @buffer: data to send to the stream + * + * Pushes the given @buffer down the stream. + **/ +void +swfdec_socket_send (SwfdecSocket *sock, SwfdecBuffer *buffer) +{ + SwfdecSocketClass *klass; + + g_return_if_fail (SWFDEC_IS_SOCKET (sock)); + g_return_if_fail (buffer != NULL); + + klass = SWFDEC_SOCKET_GET_CLASS (sock); + klass->send (sock, buffer); +} + diff --git a/libswfdec/swfdec_socket.h b/libswfdec/swfdec_socket.h new file mode 100644 index 0000000..7e062ca --- /dev/null +++ b/libswfdec/swfdec_socket.h @@ -0,0 +1,58 @@ +/* Swfdec + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef _SWFDEC_SOCKET_H_ +#define _SWFDEC_SOCKET_H_ + +#include <glib-object.h> +#include <libswfdec/swfdec_stream.h> + +G_BEGIN_DECLS + +typedef struct _SwfdecSocket SwfdecSocket; +typedef struct _SwfdecSocketClass SwfdecSocketClass; + +#define SWFDEC_TYPE_SOCKET (swfdec_socket_get_type()) +#define SWFDEC_IS_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SOCKET)) +#define SWFDEC_IS_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_SOCKET)) +#define SWFDEC_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_SOCKET, SwfdecSocket)) +#define SWFDEC_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_SOCKET, SwfdecSocketClass)) +#define SWFDEC_SOCKET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_SOCKET, SwfdecSocketClass)) + +struct _SwfdecSocket +{ + SwfdecStream stream; +}; + +struct _SwfdecSocketClass +{ + SwfdecStreamClass stream_class; + + SwfdecSocket * (* create) (const char * hostname, + guint port); + + void (* send) (SwfdecSocket * socket, + SwfdecBuffer * buffer); +}; + +GType swfdec_socket_get_type (void); + + +G_END_DECLS +#endif commit 996dd227f81d79077dd76517d3a20dbc13228457 Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 5 13:35:49 2008 +0100 update tests to new loaders diff --git a/test/sound/sound.c b/test/sound/sound.c index 1a4eac7..5715ce7 100644 --- a/test/sound/sound.c +++ b/test/sound/sound.c @@ -233,9 +233,11 @@ run_test (const char *filename) g_free (basename); loader = swfdec_file_loader_new (filename); - if (loader->error) { - g_print (" ERROR: %s\n", loader->error); + g_object_get (loader, "error", &basename, NULL); + if (basename) { + g_print (" ERROR: %s\n", basename); g_object_unref (loader); + g_free (basename); goto error; } player = swfdec_player_new (NULL); commit 8e34d5a44e1d8c89938fb80f1bbb922812cd7911 Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 5 13:35:37 2008 +0100 no sound test in here diff --git a/test/rtmp/Makefile.am b/test/rtmp/Makefile.am index c9c633b..a0c4546 100644 --- a/test/rtmp/Makefile.am +++ b/test/rtmp/Makefile.am @@ -1,6 +1,5 @@ noinst_PROGRAMS = rtmp-server -check_PROGRAMS = sound TESTS = $(check_PROGRAMS) rtmp_server_SOURCES = rtmp_server.c commit f08ee88e4018cf43d6275b74aa698ea508fc9536 Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 5 13:28:47 2008 +0100 get rid of the slow loader The current loader design does not really allow writing a proxy loader the way it was written. And since the slow loader does the wrong thing technically (It should cnfigure the bandwidth, not the loading duration) I decided to get rid of it. If anyone wants to write a new one, It should probably implement the SwfdecStreamTarget interface. diff --git a/player/Makefile.am b/player/Makefile.am index 53e52c1..605e409 100644 --- a/player/Makefile.am +++ b/player/Makefile.am @@ -1,7 +1,6 @@ noinst_PROGRAMS = swfplay swfplay_SOURCES = \ - swfdec_slow_loader.c \ swfplay.c #swfdebug_SOURCES = \ @@ -12,9 +11,6 @@ swfplay_SOURCES = \ # swfdec_player_manager.c \ # swfdec_debug_widget.c -noinst_HEADERS = \ - swfdec_slow_loader.h - swfplay_CFLAGS = $(GLOBAL_CFLAGS) $(GTK_CFLAGS) $(SWFDEC_GTK_CFLAGS) swfplay_LDFLAGS = $(SWFDEC_GTK_LIBS) $(GTK_LIBS) diff --git a/player/swfdec_slow_loader.c b/player/swfdec_slow_loader.c deleted file mode 100644 index 4261800..0000000 --- a/player/swfdec_slow_loader.c +++ /dev/null @@ -1,153 +0,0 @@ -/* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "swfdec_slow_loader.h" -#include <libswfdec-gtk/swfdec-gtk.h> - -/*** SwfdecSlowLoader ***/ - -G_DEFINE_TYPE (SwfdecSlowLoader, swfdec_slow_loader, SWFDEC_TYPE_LOADER) - -static void -swfdec_slow_loader_notify_cb (SwfdecLoader *child, GParamSpec *pspec, SwfdecLoader *loader) -{ - if (g_str_equal (pspec->name, "size")) { - swfdec_loader_set_size (loader, swfdec_loader_get_size (child)); - } -} - -static void -swfdec_slow_loader_dispose (GObject *object) -{ - SwfdecSlowLoader *slow = SWFDEC_SLOW_LOADER (object); - - g_signal_handlers_disconnect_by_func (slow->loader, swfdec_slow_loader_notify_cb, slow); - g_object_unref (slow->loader); - if (slow->timeout_id) { - g_source_remove (slow->timeout_id); - slow->timeout_id = 0; - } - - G_OBJECT_CLASS (swfdec_slow_loader_parent_class)->dispose (object); -} - -static gboolean -swfdec_slow_loader_tick (gpointer data) -{ - SwfdecSlowLoader *slow = data; - SwfdecBuffer *buffer; - guint total, amount; - - amount = swfdec_buffer_queue_get_depth (slow->loader->queue); - if (amount > 0) { - total = swfdec_buffer_queue_get_offset (slow->loader->queue); - total += amount; - total *= slow->tick_time; - total += slow->duration - 1; /* rounding */ - amount = MIN (amount, total / slow->duration); - buffer = swfdec_buffer_queue_pull (slow->loader->queue, amount); -#if 0 - g_print ("pushing %u bytes (%u/%u total)\n", - amount, swfdec_buffer_queue_get_offset (slow->loader->queue), - swfdec_buffer_queue_get_offset (slow->loader->queue) + - swfdec_buffer_queue_get_depth (slow->loader->queue)); -#endif - swfdec_loader_push (SWFDEC_LOADER (slow), buffer); - if (swfdec_buffer_queue_get_depth (slow->loader->queue) > 0) - return TRUE; - } - - if (slow->loader->error) { - swfdec_loader_error (SWFDEC_LOADER (slow), slow->loader->error); - slow->timeout_id = 0; - return FALSE; - } else { - gboolean eof; - g_object_get (slow->loader, "eof", &eof, NULL); - if (eof) { - swfdec_loader_eof (SWFDEC_LOADER (slow)); - slow->timeout_id = 0; - return FALSE; - } else { - return TRUE; - } - } -} - -static void -swfdec_slow_loader_initialize (SwfdecSlowLoader *slow, SwfdecLoader *loader, guint duration) -{ - glong size; - - slow->tick_time = 100; - slow->duration = duration * 1000; - slow->loader = loader; - g_signal_connect (loader, "notify", G_CALLBACK (swfdec_slow_loader_notify_cb), slow); - size = swfdec_loader_get_size (loader); - if (size >= 0) - swfdec_loader_set_size (SWFDEC_LOADER (slow), size); - slow->timeout_id = g_timeout_add (slow->tick_time, swfdec_slow_loader_tick, slow); - swfdec_loader_open (SWFDEC_LOADER (slow), 0); -} - -static void -swfdec_slow_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, - SwfdecLoaderRequest request, const char *data, gsize data_len) -{ - SwfdecSlowLoader *slow = SWFDEC_SLOW_LOADER (loader); - SwfdecLoader *new; - - /* FIXME: include request and data */ - new = swfdec_gtk_loader_new (swfdec_url_get_url (swfdec_loader_get_url (loader))); - swfdec_slow_loader_initialize (slow, new, SWFDEC_SLOW_LOADER (parent)->duration / 1000); -} - -static void -swfdec_slow_loader_class_init (SwfdecSlowLoaderClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - SwfdecLoaderClass *loader_class = SWFDEC_LOADER_CLASS (klass); - - object_class->dispose = swfdec_slow_loader_dispose; - - loader_class->load = swfdec_slow_loader_load; -} - -static void -swfdec_slow_loader_init (SwfdecSlowLoader *slow_loader) -{ -} - -SwfdecLoader * -swfdec_slow_loader_new (SwfdecLoader *loader, guint duration) -{ - SwfdecSlowLoader *ret; - - g_return_val_if_fail (SWFDEC_IS_LOADER (loader), NULL); - g_return_val_if_fail (duration > 0, NULL); - - ret = g_object_new (SWFDEC_TYPE_SLOW_LOADER, "url", loader->url, NULL); - swfdec_slow_loader_initialize (ret, loader, duration); - return SWFDEC_LOADER (ret); -} - diff --git a/player/swfdec_slow_loader.h b/player/swfdec_slow_loader.h deleted file mode 100644 index d10ce93..0000000 --- a/player/swfdec_slow_loader.h +++ /dev/null @@ -1,60 +0,0 @@ -/* Swfdec - * Copyright (C) 2006 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef _SWFDEC_SLOW_LOADER_H_ -#define _SWFDEC_SLOW_LOADER_H_ - -#include <libswfdec/swfdec.h> - -G_BEGIN_DECLS - - -typedef struct _SwfdecSlowLoader SwfdecSlowLoader; -typedef struct _SwfdecSlowLoaderClass SwfdecSlowLoaderClass; - -#define SWFDEC_TYPE_SLOW_LOADER (swfdec_slow_loader_get_type()) -#define SWFDEC_IS_SLOW_LOADER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_SLOW_LOADER)) -#define SWFDEC_IS_SLOW_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_SLOW_LOADER)) -#define SWFDEC_SLOW_LOADER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_SLOW_LOADER, SwfdecSlowLoader)) -#define SWFDEC_SLOW_LOADER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_SLOW_LOADER, SwfdecSlowLoaderClass)) -#define SWFDEC_SLOW_LOADER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_SLOW_LOADER, SwfdecSlowLoaderClass)) - -struct _SwfdecSlowLoader -{ - SwfdecLoader parent; - - SwfdecLoader * loader; /* what we load */ - guint tick_time; /* how many msecs each tick takes */ - guint duration; /* total duration in msecs for loading */ - guint timeout_id; /* id from g_timeout_add */ -}; - -struct _SwfdecSlowLoaderClass -{ - SwfdecLoaderClass loader_class; -}; - -GType swfdec_slow_loader_get_type (void); - -SwfdecLoader * swfdec_slow_loader_new (SwfdecLoader * loader, - guint duration); - - -G_END_DECLS -#endif diff --git a/player/swfplay.c b/player/swfplay.c index 79978be..a21586e 100644 --- a/player/swfplay.c +++ b/player/swfplay.c @@ -26,8 +26,6 @@ #include <libswfdec-gtk/swfdec-gtk.h> -#include "swfdec_slow_loader.h" - static GMainLoop *loop = NULL; static void @@ -101,7 +99,6 @@ sanitize_url (const char *s) int main (int argc, char *argv[]) { - int delay = 0; int speed = 100; int max_runtime = 0; SwfdecLoader *loader; @@ -116,7 +113,6 @@ main (int argc, char *argv[]) GOptionEntry options[] = { { "always-gc", 'g', 0, G_OPTION_ARG_NONE, &gc, "run the garbage collector as often as possible", NULL }, - { "delay", 'd', 0, G_OPTION_ARG_INT, &delay, "make loading of resources take time", "SECS" }, { "image", 'i', 0, G_OPTION_ARG_NONE, &use_image, "use an intermediate image surface for drawing", NULL }, { "max-runtime", 0, 0, G_OPTION_ARG_INT, &max_runtime, "maximum time scripts run before aborting the player", "SECS" }, { "no-scripts", 0, 0, G_OPTION_ARG_NONE, &no_scripts, "don't execute scripts affecting the application", NULL }, @@ -151,9 +147,11 @@ main (int argc, char *argv[]) s = sanitize_url (argv[1]); loader = swfdec_gtk_loader_new (s); g_free (s); - if (loader->error) { - g_printerr ("Couldn't open file \"%s\": %s\n", argv[1], loader->error); + g_object_get (loader, "error", &s, NULL); + if (s) { + g_printerr ("Couldn't open file \"%s\": %s\n", argv[1], s); g_object_unref (loader); + g_free (s); return 1; } loop = g_main_loop_new (NULL, TRUE); @@ -178,9 +176,6 @@ main (int argc, char *argv[]) if (!no_scripts) g_signal_connect (player, "fscommand", G_CALLBACK (do_fscommand), window); - if (delay) - loader = swfdec_slow_loader_new (loader, delay); - swfdec_player_set_loader_with_variables (player, loader, variables); swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (player), TRUE); commit 03d96dece1a5aef7f3212d4999b8a3ff71fff43f Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 5 13:25:13 2008 +0100 make SwfdecLoader a SwfecStream diff --git a/libswfdec-gtk/swfdec_gtk_loader.c b/libswfdec-gtk/swfdec_gtk_loader.c index 80d95c7..26979ce 100644 --- a/libswfdec-gtk/swfdec_gtk_loader.c +++ b/libswfdec-gtk/swfdec_gtk_loader.c @@ -100,7 +100,8 @@ swfdec_gtk_loader_ensure_open (SwfdecGtkLoader *gtk) real_uri = soup_uri_to_string (soup_message_get_uri (gtk->message), FALSE); swfdec_gtk_loader_set_size (gtk); - swfdec_loader_open (SWFDEC_LOADER (gtk), real_uri); + swfdec_loader_set_url (SWFDEC_LOADER (gtk), real_uri); + swfdec_stream_open (SWFDEC_STREAM (gtk)); gtk->opened = TRUE; g_free (real_uri); } @@ -114,7 +115,7 @@ swfdec_gtk_loader_push (SoupMessage *msg, gpointer loader) swfdec_gtk_loader_ensure_open (gtk); buffer = swfdec_buffer_new_and_alloc (msg->response.length); memcpy (buffer->data, msg->response.body, msg->response.length); - swfdec_loader_push (loader, buffer); + swfdec_stream_push (loader, buffer); } static void @@ -122,10 +123,10 @@ swfdec_gtk_loader_finished (SoupMessage *msg, gpointer loader) { if (SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)) { swfdec_gtk_loader_ensure_open (loader); - swfdec_loader_eof (loader); + swfdec_stream_eof (loader); } else { char *s = g_strdup_printf ("%u %s", msg->status_code, msg->reason_phrase); - swfdec_loader_error (loader, s); + swfdec_stream_error (loader, s); g_free (s); } } @@ -178,14 +179,14 @@ swfdec_gtk_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, #ifdef HAVE_HTTP static void -swfdec_gtk_loader_close (SwfdecLoader *loader) +swfdec_gtk_loader_close (SwfdecStream *stream) { - SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (loader); + SwfdecGtkLoader *gtk = SWFDEC_GTK_LOADER (stream); if (gtk->message) { gboolean eof; - g_object_get (loader, "eof", &eof, NULL); + g_object_get (stream, "eof", &eof, NULL); if (!eof) { SwfdecGtkLoaderClass *klass = SWFDEC_GTK_LOADER_GET_CLASS (gtk); @@ -202,12 +203,14 @@ swfdec_gtk_loader_class_init (SwfdecGtkLoaderClass *klass) { #ifdef HAVE_HTTP GObjectClass *object_class = G_OBJECT_CLASS (klass); + SwfdecStreamClass *stream_class = SWFDEC_STREAM_CLASS (klass); SwfdecLoaderClass *loader_class = SWFDEC_LOADER_CLASS (klass); object_class->dispose = swfdec_gtk_loader_dispose; + stream_class->close = swfdec_gtk_loader_close; + loader_class->load = swfdec_gtk_loader_load; - loader_class->close = swfdec_gtk_loader_close; klass->session = soup_session_async_new (); #endif diff --git a/libswfdec-gtk/swfdec_playback_alsa.c b/libswfdec-gtk/swfdec_playback_alsa.c index dd539c5..bddd189 100644 --- a/libswfdec-gtk/swfdec_playback_alsa.c +++ b/libswfdec-gtk/swfdec_playback_alsa.c @@ -118,7 +118,7 @@ try_write (Stream *stream) } static void -swfdec_stream_remove_handlers (Stream *stream) +swfdec_playback_stream_remove_handlers (Stream *stream) { guint i; @@ -131,7 +131,7 @@ swfdec_stream_remove_handlers (Stream *stream) } } -static void swfdec_stream_start (Stream *stream); +static void swfdec_playback_stream_start (Stream *stream); static gboolean handle_stream (GIOChannel *source, GIOCondition cond, gpointer data) { @@ -140,7 +140,7 @@ handle_stream (GIOChannel *source, GIOCondition cond, gpointer data) state = snd_pcm_state (stream->pcm); if (state != SND_PCM_STATE_RUNNING) { - swfdec_stream_start (stream); + swfdec_playback_stream_start (stream); } else { try_write (stream); } @@ -148,7 +148,7 @@ handle_stream (GIOChannel *source, GIOCondition cond, gpointer data) } static void -swfdec_stream_install_handlers (Stream *stream) +swfdec_playback_stream_install_handlers (Stream *stream) { GIOChannel *channel; @@ -172,7 +172,7 @@ swfdec_stream_install_handlers (Stream *stream) } static void -swfdec_stream_start (Stream *stream) +swfdec_playback_stream_start (Stream *stream) { snd_pcm_state_t state = snd_pcm_state (stream->pcm); switch (state) { @@ -186,7 +186,7 @@ swfdec_stream_start (Stream *stream) //g_print ("offset: %u (delay: %ld)\n", sound->offset, delay); if (try_write (stream)) { ALSA_ERROR (snd_pcm_start (stream->pcm), "error starting",); - swfdec_stream_install_handlers (stream); + swfdec_playback_stream_install_handlers (stream); } break; case SND_PCM_STATE_OPEN: @@ -201,7 +201,7 @@ swfdec_stream_start (Stream *stream) } static void -swfdec_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) +swfdec_playback_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) { Stream *stream; snd_pcm_t *ret; @@ -259,7 +259,7 @@ swfdec_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) if (stream->n_sources > 0) stream->sources = g_new0 (GSource *, stream->n_sources); sound->streams = g_list_prepend (sound->streams, stream); - swfdec_stream_start (stream); + swfdec_playback_stream_start (stream); return; fail: @@ -267,10 +267,10 @@ fail: } static void -swfdec_stream_close (Stream *stream) +swfdec_playback_stream_close (Stream *stream) { ALSA_TRY (snd_pcm_close (stream->pcm), "failed closing"); - swfdec_stream_remove_handlers (stream); + swfdec_playback_stream_remove_handlers (stream); g_free (stream->sources); stream->sound->streams = g_list_remove (stream->sound->streams, stream); g_object_unref (stream->audio); @@ -298,7 +298,7 @@ advance_before (SwfdecPlayer *player, guint msecs, guint audio_samples, gpointer static void audio_added (SwfdecPlayer *player, SwfdecAudio *audio, SwfdecPlayback *sound) { - swfdec_stream_open (sound, audio); + swfdec_playback_stream_open (sound, audio); } static void @@ -309,7 +309,7 @@ audio_removed (SwfdecPlayer *player, SwfdecAudio *audio, SwfdecPlayback *sound) for (walk = sound->streams; walk; walk = walk->next) { Stream *stream = walk->data; if (stream->audio == audio) { - swfdec_stream_close (stream); + swfdec_playback_stream_close (stream); return; } } @@ -330,7 +330,7 @@ swfdec_playback_open (SwfdecPlayer *player, GMainContext *context) g_signal_connect (player, "audio-added", G_CALLBACK (audio_added), sound); g_signal_connect (player, "audio-removed", G_CALLBACK (audio_removed), sound); for (walk = swfdec_player_get_audio (player); walk; walk = walk->next) { - swfdec_stream_open (sound, walk->data); + swfdec_playback_stream_open (sound, walk->data); } g_main_context_ref (context); sound->context = context; @@ -349,7 +349,7 @@ swfdec_playback_close (SwfdecPlayback *sound) #define REMOVE_HANDLER(obj,func,data) REMOVE_HANDLER_FULL (obj, func, data, 1) while (sound->streams) - swfdec_stream_close (sound->streams->data); + swfdec_playback_stream_close (sound->streams->data); REMOVE_HANDLER (sound->player, advance_before, sound); REMOVE_HANDLER (sound->player, audio_added, sound); REMOVE_HANDLER (sound->player, audio_removed, sound); diff --git a/libswfdec-gtk/swfdec_playback_oss.c b/libswfdec-gtk/swfdec_playback_oss.c index 9c94252..c2eb493 100644 --- a/libswfdec-gtk/swfdec_playback_oss.c +++ b/libswfdec-gtk/swfdec_playback_oss.c @@ -108,7 +108,7 @@ handle_stream (GIOChannel *source, GIOCondition cond, gpointer data) } static void -swfdec_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) +swfdec_playback_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) { GIOChannel *channel; Stream *stream; @@ -171,7 +171,7 @@ swfdec_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) } static void -swfdec_stream_close (Stream *stream) +swfdec_playback_stream_close (Stream *stream) { close (stream->dsp_fd); g_source_destroy (stream->source); @@ -202,7 +202,7 @@ advance_before (SwfdecPlayer *player, guint msecs, guint audio_samples, gpointer static void audio_added (SwfdecPlayer *player, SwfdecAudio *audio, SwfdecPlayback *sound) { - swfdec_stream_open (sound, audio); + swfdec_playback_stream_open (sound, audio); } static void @@ -213,7 +213,7 @@ audio_removed (SwfdecPlayer *player, SwfdecAudio *audio, SwfdecPlayback *sound) for (walk = sound->streams; walk; walk = walk->next) { Stream *stream = walk->data; if (stream->audio == audio) { - swfdec_stream_close (stream); + swfdec_playback_stream_close (stream); return; } } @@ -235,7 +235,7 @@ swfdec_playback_open (SwfdecPlayer *player, GMainContext *context) g_signal_connect (player, "audio-added", G_CALLBACK (audio_added), sound); g_signal_connect (player, "audio-removed", G_CALLBACK (audio_removed), sound); for (walk = swfdec_player_get_audio (player); walk; walk = walk->next) { - swfdec_stream_open (sound, walk->data); + swfdec_playback_stream_open (sound, walk->data); } g_main_context_ref (context); sound->context = context; @@ -254,7 +254,7 @@ swfdec_playback_close (SwfdecPlayback *sound) #define REMOVE_HANDLER(obj,func,data) REMOVE_HANDLER_FULL (obj, func, data, 1) while (sound->streams) - swfdec_stream_close (sound->streams->data); + swfdec_playback_stream_close (sound->streams->data); REMOVE_HANDLER (sound->player, advance_before, sound); REMOVE_HANDLER (sound->player, audio_added, sound); REMOVE_HANDLER (sound->player, audio_removed, sound); diff --git a/libswfdec-gtk/swfdec_playback_pa.c b/libswfdec-gtk/swfdec_playback_pa.c index 825775b..755b033 100644 --- a/libswfdec-gtk/swfdec_playback_pa.c +++ b/libswfdec-gtk/swfdec_playback_pa.c @@ -112,7 +112,7 @@ stream_drain_complete (pa_stream *pa, int success, void *data) } static void -swfdec_stream_close (Stream *stream) +swfdec_playback_stream_close (Stream *stream) { /* Pull it off of the active stream list. */ stream->sound->streams = g_list_remove (stream->sound->streams, stream); @@ -148,7 +148,7 @@ stream_state_callback (pa_stream *pa, void *data) } static void -swfdec_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) +swfdec_playback_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) { Stream *stream; pa_sample_spec spec = { @@ -178,7 +178,7 @@ swfdec_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) ); if (stream->pa == NULL) { g_printerr("Failed to create PA stream\n"); - swfdec_stream_close(stream); + swfdec_playback_stream_close(stream); return; } @@ -200,7 +200,7 @@ swfdec_stream_open (SwfdecPlayback *sound, SwfdecAudio *audio) if (err != 0) { g_printerr ("Failed to connect PA stream: %s\n", pa_strerror(pa_context_errno(sound->pa))); - swfdec_stream_close(stream); + swfdec_playback_stream_close(stream); return; } } @@ -226,7 +226,7 @@ advance_before (SwfdecPlayer *player, guint msecs, guint audio_samples, gpointer static void audio_added (SwfdecPlayer *player, SwfdecAudio *audio, SwfdecPlayback *sound) { - swfdec_stream_open (sound, audio); + swfdec_playback_stream_open (sound, audio); } static void @@ -237,7 +237,7 @@ audio_removed (SwfdecPlayer *player, SwfdecAudio *audio, SwfdecPlayback *sound) for (walk = sound->streams; walk; walk = walk->next) { Stream *stream = walk->data; if (stream->audio == audio) { - swfdec_stream_close (stream); + swfdec_playback_stream_close (stream); return; } } @@ -299,7 +299,7 @@ swfdec_playback_open (SwfdecPlayer *player, GMainContext *context) ); for (walk = swfdec_player_get_audio (player); walk; walk = walk->next) { - swfdec_stream_open (sound, walk->data); + swfdec_playback_stream_open (sound, walk->data); } g_main_context_ref (context); sound->context = context; @@ -327,7 +327,7 @@ swfdec_playback_close (SwfdecPlayback *sound) #define REMOVE_HANDLER(obj,func,data) REMOVE_HANDLER_FULL (obj, func, data, 1) while (sound->streams) - swfdec_stream_close (sound->streams->data); + swfdec_playback_stream_close (sound->streams->data); REMOVE_HANDLER (sound->player, advance_before, sound); REMOVE_HANDLER (sound->player, audio_added, sound); REMOVE_HANDLER (sound->player, audio_removed, sound); diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index a8e2cf6..17d18ce 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -92,7 +92,6 @@ libswfdec_source_files = \ swfdec_load_object.c \ swfdec_load_object_as.c \ swfdec_loader.c \ - swfdec_loadertarget.c \ swfdec_loadvars_as.c \ swfdec_local_connection.c \ swfdec_microphone.c \ @@ -251,7 +250,6 @@ noinst_HEADERS = \ swfdec_interval.h \ swfdec_load_object.h \ swfdec_loader_internal.h \ - swfdec_loadertarget.h \ swfdec_marshal.h \ swfdec_morph_movie.h \ swfdec_morphshape.h \ diff --git a/libswfdec/swfdec_file_loader.c b/libswfdec/swfdec_file_loader.c index 53c7bb8..1b498ac 100644 --- a/libswfdec/swfdec_file_loader.c +++ b/libswfdec/swfdec_file_loader.c @@ -25,7 +25,6 @@ #include "swfdec_loader_internal.h" #include "swfdec_buffer.h" #include "swfdec_debug.h" -#include "swfdec_loadertarget.h" #include "swfdec_player_internal.h" /** @@ -42,6 +41,7 @@ static void swfdec_file_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, SwfdecLoaderRequest request, const char *data, gsize data_len) { + SwfdecStream *stream = SWFDEC_STREAM (loader); const SwfdecURL *url; SwfdecBuffer *buffer; GError *error = NULL; @@ -49,11 +49,11 @@ swfdec_file_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, SwfdecLoade url = swfdec_loader_get_url (loader); if (!g_str_equal (swfdec_url_get_protocol (url), "file")) { - swfdec_loader_error (loader, "Don't know how to handle this protocol"); + swfdec_stream_error (stream, "Don't know how to handle this protocol"); return; } if (swfdec_url_get_host (url)) { - swfdec_loader_error (loader, "filenames cannot have hostnames"); + swfdec_stream_error (stream, "filenames cannot have hostnames"); return; } @@ -62,13 +62,13 @@ swfdec_file_loader_load (SwfdecLoader *loader, SwfdecLoader *parent, SwfdecLoade buffer = swfdec_buffer_new_from_file (real, &error); g_free (real); if (buffer == NULL) { - swfdec_loader_error (loader, error->message); + swfdec_stream_error (stream, error->message); g_error_free (error); } else { swfdec_loader_set_size (loader, buffer->length); - swfdec_loader_open (loader, 0); - swfdec_loader_push (loader, buffer); - swfdec_loader_eof (loader); + swfdec_stream_open (stream); + swfdec_stream_push (stream, buffer); + swfdec_stream_eof (stream); } } @@ -99,6 +99,7 @@ swfdec_file_loader_new (const char *filename) { SwfdecBuffer *buf; SwfdecLoader *loader; + SwfdecStream *stream; GError *error = NULL; char *url_string; SwfdecURL *url; @@ -121,15 +122,16 @@ swfdec_file_loader_new (const char *filename) url = swfdec_url_new (url_string); g_free (url_string); loader = g_object_new (SWFDEC_TYPE_FILE_LOADER, "url", url, NULL); + stream = SWFDEC_STREAM (loader); swfdec_url_free (url); if (buf == NULL) { - swfdec_loader_error (loader, error->message); + swfdec_stream_error (stream, error->message); g_error_free (error); } else { swfdec_loader_set_size (loader, buf->length); - swfdec_loader_open (loader, 0); - swfdec_loader_push (loader, buf); - swfdec_loader_eof (loader); + swfdec_stream_open (stream); + swfdec_stream_push (stream, buf); + swfdec_stream_eof (stream); } return loader; } diff --git a/libswfdec/swfdec_load_object.c b/libswfdec/swfdec_load_object.c index 5b659f2..72c1ceb 100644 --- a/libswfdec/swfdec_load_object.c +++ b/libswfdec/swfdec_load_object.c @@ -28,22 +28,23 @@ #include "swfdec_as_strings.h" #include "swfdec_debug.h" #include "swfdec_loader_internal.h" -#include "swfdec_loadertarget.h" +#include "swfdec_stream_target.h" #include "swfdec_player_internal.h" #include "swfdec_resource_request.h" -/*** SWFDEC_LOADER_TARGET ***/ +/*** SWFDEC_STREAM_TARGET ***/ static SwfdecPlayer * -swfdec_load_object_loader_target_get_player (SwfdecLoaderTarget *target) +swfdec_load_object_stream_target_get_player (SwfdecStreamTarget *target) { return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (target)->context); } static void -swfdec_load_object_loader_target_parse (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_load_object_stream_target_parse (SwfdecStreamTarget *target, + SwfdecStream *stream) { + SwfdecLoader *loader = SWFDEC_LOADER (stream); SwfdecLoadObject *load_object = SWFDEC_LOAD_OBJECT (target); if (load_object->progress != NULL) { @@ -53,13 +54,14 @@ swfdec_load_object_loader_target_parse (SwfdecLoaderTarget *target, } static void -swfdec_load_object_loader_target_error (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_load_object_stream_target_error (SwfdecStreamTarget *target, + SwfdecStream *stream) { + SwfdecLoader *loader = SWFDEC_LOADER (stream); SwfdecLoadObject *load_object = SWFDEC_LOAD_OBJECT (target); /* break reference to the loader */ - swfdec_loader_set_target (loader, NULL); + swfdec_stream_set_target (SWFDEC_STREAM (loader), NULL); load_object->loader = NULL; g_object_unref (loader); @@ -72,9 +74,10 @@ swfdec_load_object_loader_target_error (SwfdecLoaderTarget *target, } static void -swfdec_load_object_loader_target_eof (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_load_object_stream_target_close (SwfdecStreamTarget *target, + SwfdecStream *stream) { + SwfdecLoader *loader = SWFDEC_LOADER (stream); SwfdecLoadObject *load_object = SWFDEC_LOAD_OBJECT (target); char *text; @@ -83,7 +86,7 @@ swfdec_load_object_loader_target_eof (SwfdecLoaderTarget *target, swfdec_loader_get_text (loader, load_object->target->context->version); /* break reference to the loader */ - swfdec_loader_set_target (loader, NULL); + swfdec_stream_set_target (stream, NULL); load_object->loader = NULL; g_object_unref (loader); @@ -101,24 +104,24 @@ swfdec_load_object_loader_target_eof (SwfdecLoaderTarget *target, } static void -swfdec_load_object_loader_target_init (SwfdecLoaderTargetInterface *iface) +swfdec_load_object_stream_target_init (SwfdecStreamTargetInterface *iface) { - iface->get_player = swfdec_load_object_loader_target_get_player; - iface->parse = swfdec_load_object_loader_target_parse; - iface->eof = swfdec_load_object_loader_target_eof; - iface->error = swfdec_load_object_loader_target_error; + iface->get_player = swfdec_load_object_stream_target_get_player; + iface->parse = swfdec_load_object_stream_target_parse; + iface->close = swfdec_load_object_stream_target_close; + iface->error = swfdec_load_object_stream_target_error; } /*** SWFDEC_LOAD_OBJECT ***/ G_DEFINE_TYPE_WITH_CODE (SwfdecLoadObject, swfdec_load_object, SWFDEC_TYPE_AS_OBJECT, - G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_load_object_loader_target_init)) + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_load_object_stream_target_init)) static void swfdec_load_object_reset (SwfdecLoadObject *load_object) { if (load_object->loader) { - swfdec_loader_set_target (load_object->loader, NULL); + swfdec_stream_set_target (SWFDEC_STREAM (load_object->loader), NULL); g_object_unref (load_object->loader); load_object->loader = NULL; } @@ -168,9 +171,9 @@ swfdec_load_object_got_loader (SwfdecPlayer *player, SwfdecLoader *loader, gpoin } load_object->loader = loader; - swfdec_loader_set_target (load_object->loader, - SWFDEC_LOADER_TARGET (load_object)); - swfdec_loader_set_data_type (load_object->loader, SWFDEC_LOADER_DATA_TEXT); + swfdec_stream_set_target (SWFDEC_STREAM (loader), + SWFDEC_STREAM_TARGET (load_object)); + swfdec_loader_set_data_type (loader, SWFDEC_LOADER_DATA_TEXT); } static gboolean diff --git a/libswfdec/swfdec_load_object_as.c b/libswfdec/swfdec_load_object_as.c index 42d4be3..de92fe8 100644 --- a/libswfdec/swfdec_load_object_as.c +++ b/libswfdec/swfdec_load_object_as.c @@ -28,7 +28,6 @@ #include "swfdec_as_strings.h" #include "swfdec_debug.h" #include "swfdec_loader_internal.h" -#include "swfdec_loadertarget.h" #include "swfdec_player_internal.h" static void diff --git a/libswfdec/swfdec_loader.c b/libswfdec/swfdec_loader.c index e089eef..6b51e61 100644 --- a/libswfdec/swfdec_loader.c +++ b/libswfdec/swfdec_loader.c @@ -25,7 +25,6 @@ #include "swfdec_loader_internal.h" #include "swfdec_buffer.h" #include "swfdec_debug.h" -#include "swfdec_loadertarget.h" #include "swfdec_player_internal.h" /*** gtk-doc ***/ @@ -35,14 +34,13 @@ * @title: SwfdecLoader * @short_description: object used for input * - * SwfdecLoader is the base class used for input. Since developers normally - * need to adapt input to the needs of their application, this class is - * provided to be adapted to their needs. + * SwfdecLoader is the base class used for reading input. Since developers + * normally need to adapt input to the needs of their application, this class + * is provided to be adapted to their needs. It is used both for HTTP and + * RTMP access. * * Since Flash files can load new resources while operating, a #SwfdecLoader - * can be instructed to load another resource. It's the loader's responsibility - * to make sure the player is allowed to access the resource and provide its - * data. + * can be instructed to load another resource. * * For convenience, a #SwfdecLoader for file access is provided by Swfdec. */ @@ -50,11 +48,20 @@ /** * SwfdecLoader: * - * This is the base class used for providing input. It is abstract, use a + * This is the base object used for providing input. It is abstract, use a * subclass to provide your input. */ /** + * SwfdecLoaderClass: + * @load: initialize a new loader based on a parent loader object. The new + * loader will already have its URL set. + * + * This is the base class used for input. If you create a subclass, you are + * supposed to set the function pointers listed above. + */ + +/** * SwfdecLoaderDataType: * @SWFDEC_LOADER_DATA_UNKNOWN: Unidentified data or data that cannot be * identified. @@ -87,15 +94,19 @@ enum { PROP_0, - PROP_ERROR, - PROP_EOF, PROP_DATA_TYPE, PROP_SIZE, PROP_LOADED, PROP_URL }; -G_DEFINE_ABSTRACT_TYPE (SwfdecLoader, swfdec_loader, G_TYPE_OBJECT) +G_DEFINE_ABSTRACT_TYPE (SwfdecLoader, swfdec_loader, SWFDEC_TYPE_STREAM) + +static const char * +swfdec_loader_describe (SwfdecStream *stream) +{ + return swfdec_url_get_url (SWFDEC_LOADER (stream)->url); +} static void swfdec_loader_get_property (GObject *object, guint param_id, GValue *value, @@ -104,12 +115,6 @@ swfdec_loader_get_property (GObject *object, guint param_id, GValue *value, SwfdecLoader *loader = SWFDEC_LOADER (object); switch (param_id) { - case PROP_ERROR: - g_value_set_string (value, loader->error); - break; - case PROP_EOF: - g_value_set_boolean (value, loader->state == SWFDEC_LOADER_STATE_EOF); - break; case PROP_DATA_TYPE: g_value_set_enum (value, loader->data_type); break; @@ -135,9 +140,6 @@ swfdec_loader_set_property (GObject *object, guint param_id, const GValue *value SwfdecLoader *loader = SWFDEC_LOADER (object); switch (param_id) { - case PROP_ERROR: - swfdec_loader_error (loader, g_value_get_string (value)); - break; case PROP_SIZE: if (loader->size == -1 && g_value_get_long (value) >= 0) swfdec_loader_set_size (loader, g_value_get_long (value)); @@ -160,11 +162,10 @@ swfdec_loader_dispose (GObject *object) { SwfdecLoader *loader = SWFDEC_LOADER (object); - /* targets are supposed to keep a reference around */ - g_assert (loader->target == NULL); - swfdec_buffer_queue_unref (loader->queue); - swfdec_url_free (loader->url); - g_free (loader->error); + if (loader->url) { + swfdec_url_free (loader->url); + loader->url = NULL; + } G_OBJECT_CLASS (swfdec_loader_parent_class)->dispose (object); } @@ -173,17 +174,12 @@ static void swfdec_loader_class_init (SwfdecLoaderClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + SwfdecStreamClass *stream_class = SWFDEC_STREAM_CLASS (klass); object_class->dispose = swfdec_loader_dispose; object_class->get_property = swfdec_loader_get_property; object_class->set_property = swfdec_loader_set_property; - g_object_class_install_property (object_class, PROP_ERROR, - g_param_spec_string ("error", "error", "NULL when no error or string describing error", - NULL, G_PARAM_READABLE)); - g_object_class_install_property (object_class, PROP_EOF, - g_param_spec_boolean ("eof", "eof", "TRUE when all data has been handed to the loader", - FALSE, G_PARAM_READABLE)); g_object_class_install_property (object_class, PROP_DATA_TYPE, g_param_spec_enum ("data-type", "data type", "the data's type as identified by Swfdec", SWFDEC_TYPE_LOADER_DATA_TYPE, SWFDEC_LOADER_DATA_UNKNOWN, G_PARAM_READABLE)); @@ -196,12 +192,13 @@ swfdec_loader_class_init (SwfdecLoaderClass *klass) g_object_class_install_property (object_class, PROP_URL, g_param_spec_boxed ("url", "url", "URL for this file", SWFDEC_TYPE_URL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + + stream_class->describe = swfdec_loader_describe; } static void swfdec_loader_init (SwfdecLoader *loader) { - loader->queue = swfdec_buffer_queue_new (); loader->data_type = SWFDEC_LOADER_DATA_UNKNOWN; loader->size = -1; @@ -209,53 +206,6 @@ swfdec_loader_init (SwfdecLoader *loader) /*** INTERNAL API ***/ -static void -swfdec_loader_process (gpointer loaderp, gpointer unused) -{ - SwfdecLoader *loader = loaderp; - - g_assert (loader->target != NULL); - - loader->queued = FALSE; - if (loader->state == loader->processed_state) - return; - g_assert (loader->state != SWFDEC_LOADER_STATE_CLOSED); - if (loader->state == SWFDEC_LOADER_STATE_ERROR) { - swfdec_loader_target_error (loader->target, loader); - return; - } - g_object_ref (loader); - while (loader->state != loader->processed_state) { - if (loader->processed_state == SWFDEC_LOADER_STATE_NEW) { - loader->processed_state = SWFDEC_LOADER_STATE_OPEN; - swfdec_loader_target_open (loader->target, loader); - } else if (loader->processed_state == SWFDEC_LOADER_STATE_OPEN) { - loader->processed_state = SWFDEC_LOADER_STATE_READING; - swfdec_loader_target_parse (loader->target, loader); - } else if (loader->processed_state == SWFDEC_LOADER_STATE_READING) { - loader->processed_state = SWFDEC_LOADER_STATE_EOF; - swfdec_loader_target_eof (loader->target, loader); - } - /* stupid reentrancy */ - if (loader->processed_state == SWFDEC_LOADER_STATE_NEW) - break; - } - g_object_unref (loader); -} - -static void -swfdec_loader_queue_processing (SwfdecLoader *loader) -{ - if (loader->queued) - return; - loader->queued = TRUE; - if (loader->target) { - g_assert (loader->player); - swfdec_player_add_external_action (loader->player, loader, - swfdec_loader_process, NULL); - } -} - SwfdecLoader * swfdec_loader_load (SwfdecLoader *loader, const SwfdecURL *url, SwfdecLoaderRequest request, const char *data, gsize data_len) @@ -274,142 +224,9 @@ swfdec_loader_load (SwfdecLoader *loader, const SwfdecURL *url, return ret; } -void -swfdec_loader_close (SwfdecLoader *loader) -{ - SwfdecLoaderClass *klass; - - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - klass = SWFDEC_LOADER_GET_CLASS (loader); - - if (klass->close) - klass->close (loader); - if (loader->state != SWFDEC_LOADER_STATE_ERROR) { - loader->state = SWFDEC_LOADER_STATE_CLOSED; - loader->processed_state = SWFDEC_LOADER_STATE_CLOSED; - } -} - -void -swfdec_loader_set_target (SwfdecLoader *loader, SwfdecLoaderTarget *target) -{ - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - g_return_if_fail (target == NULL || SWFDEC_IS_LOADER_TARGET (target)); - - if (loader->target) { - swfdec_player_remove_all_external_actions (loader->player, loader); - } - loader->queued = FALSE; - loader->target = target; - loader->processed_state = SWFDEC_LOADER_STATE_NEW; - if (target) { - loader->player = swfdec_loader_target_get_player (target); - swfdec_loader_queue_processing (loader); - } else { - loader->player = NULL; - } -} - /** PUBLIC API ***/ /** - * swfdec_loader_error: - * @loader: a #SwfdecLoader - * @error: a string describing the error - * - * Moves the loader in the error state if it wasn't before. A loader that is in - * the error state will not process any more data. Also, internal error - * handling scripts may be executed. - **/ -void -swfdec_loader_error (SwfdecLoader *loader, const char *error) -{ - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - g_return_if_fail (error != NULL); - - if (loader->error) { - SWFDEC_ERROR ("another error in loader for %s: %s", swfdec_url_get_url (loader->url), error); - return; - } - - SWFDEC_ERROR ("error in loader for %s: %s", swfdec_url_get_url (loader->url), error); - loader->state = SWFDEC_LOADER_STATE_ERROR; - loader->error = g_strdup (error); - swfdec_loader_queue_processing (loader); -} - -/** - * swfdec_loader_open: - * @loader: a #SwfdecLoader - * @url: the real URL used for this loader if it has changed (e.g. after HTTP - * redirects) or %NULL if it hasn't changed - * - * Call this function when your loader opened the resulting file. For HTTP this - * is when having received the headers. You must call this function before - * swfdec_laoder_push() can be called. - **/ -void -swfdec_loader_open (SwfdecLoader *loader, const char *url) -{ - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - g_return_if_fail (loader->state == SWFDEC_LOADER_STATE_NEW); - - loader->state = SWFDEC_LOADER_STATE_OPEN; - if (url) { - swfdec_url_free (loader->url); - loader->url = swfdec_url_new (url); - g_object_notify (G_OBJECT (loader), "url"); - } - swfdec_loader_queue_processing (loader); -} - -/** - * swfdec_loader_push: - * @loader: a #SwfdecLoader - * @buffer: new data to make available. The loader takes the reference - * to the buffer. - * - * Makes the data in @buffer available to @loader and processes it. The @loader - * must be open. - **/ -void -swfdec_loader_push (SwfdecLoader *loader, SwfdecBuffer *buffer) -{ - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - g_return_if_fail (loader->state == SWFDEC_LOADER_STATE_OPEN || loader->state == SWFDEC_LOADER_STATE_READING); - g_return_if_fail (buffer != NULL); - - swfdec_buffer_queue_push (loader->queue, buffer); - g_object_notify (G_OBJECT (loader), "loaded"); - loader->state = SWFDEC_LOADER_STATE_READING; - if (loader->processed_state == SWFDEC_LOADER_STATE_READING) - loader->processed_state = SWFDEC_LOADER_STATE_OPEN; - swfdec_loader_queue_processing (loader); -} - -/** - * swfdec_loader_eof: - * @loader: a #SwfdecLoader - * - * Indicates to @loader that no more data will follow. The loader must be open. - **/ -void -swfdec_loader_eof (SwfdecLoader *loader) -{ - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - g_return_if_fail (loader->state == SWFDEC_LOADER_STATE_OPEN || loader->state == SWFDEC_LOADER_STATE_READING); - - if (loader->size == 0) { - gulong bytes = swfdec_loader_get_loaded (loader); - if (bytes) - swfdec_loader_set_size (loader, bytes); - } - g_object_notify (G_OBJECT (loader), "eof"); - loader->state = SWFDEC_LOADER_STATE_EOF; - swfdec_loader_queue_processing (loader); -} - -/** * swfdec_loader_get_filename: * @loader: a #SwfdecLoader * @@ -458,6 +275,27 @@ swfdec_loader_get_filename (SwfdecLoader *loader) } /** + * swfdec_loader_set_url: + * @loader: the loader to update + * @url: string specifying the new URL. The url must be a valid absolute URL. + * + * Updates the url of the given @loader to point to the new @url. This is useful + * whe encountering HTTP redirects, as the loader is supposed to reference the + * final URL after all rdirections. + * This function may not be called after calling swfdec_loader_open(). + **/ +void +swfdec_loader_set_url (SwfdecLoader *loader, const char *url) +{ + g_return_if_fail (SWFDEC_IS_LOADER (loader)); + g_return_if_fail (url != NULL); + /* g_return_if_fail (LOADER_IS_NOT_OPEN_YET) */ + + swfdec_url_free (loader->url); + loader->url = swfdec_url_new (url); +} + +/** * swfdec_loader_get_url: * @loader: a #SwfdecLoader * @@ -550,10 +388,13 @@ swfdec_loader_get_size (SwfdecLoader *loader) gulong swfdec_loader_get_loaded (SwfdecLoader *loader) { + SwfdecBufferQueue *queue; + g_return_val_if_fail (SWFDEC_IS_LOADER (loader), 0); - return swfdec_buffer_queue_get_depth (loader->queue) + - swfdec_buffer_queue_get_offset (loader->queue); + queue = swfdec_stream_get_queue (SWFDEC_STREAM (loader)); + return swfdec_buffer_queue_get_depth (queue) + + swfdec_buffer_queue_get_offset (queue); } /** @@ -605,18 +446,20 @@ static ByteOrderMark boms[] = { char * swfdec_loader_get_text (SwfdecLoader *loader, guint version) { + SwfdecBufferQueue *queue; SwfdecBuffer *buffer; char *text; guint size, i, j; /* get the text from the loader */ - size = swfdec_buffer_queue_get_depth (loader->queue); + queue = swfdec_stream_get_queue (SWFDEC_STREAM (loader)); + size = swfdec_buffer_queue_get_depth (queue); if (size == 0) { SWFDEC_LOG ("empty loader, returning empty string"); return g_strdup (""); } - buffer = swfdec_buffer_queue_peek (loader->queue, size); + buffer = swfdec_buffer_queue_peek (queue, size); if (!buffer) return NULL; @@ -662,45 +505,3 @@ swfdec_loader_get_text (SwfdecLoader *loader, guint version) return text; } -/*** X-WWW-FORM-URLENCODED ***/ - -/* if speed ever gets an issue, use a 256 byte array instead of strchr */ -static const char *urlencode_unescaped="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_.,:/()'"; -static void -swfdec_urlencode_append_string (GString *str, const char *s) -{ - g_assert (s != NULL); - while (*s) { - if (strchr (urlencode_unescaped, *s)) - g_string_append_c (str, *s); - else if (*s == ' ') - g_string_append_c (str, '+'); - else - g_string_append_printf (str, "%%%02X", (guint) *s); - s++; - } -} - -/** - * swfdec_string_append_urlencoded: - * @str: a #GString - * @name: name of the property to append - * @value: value of property to append or NULL for empty - * - * Appends a name/value pair in encoded as 'application/x-www-form-urlencoded' - * to the given @str - **/ -void -swfdec_string_append_urlencoded (GString *str, const char *name, const char *value) -{ - g_return_if_fail (str != NULL); - g_return_if_fail (name != NULL); - - if (str->len > 0) - g_string_append_c (str, '&'); - swfdec_urlencode_append_string (str, name); - g_string_append_c (str, '='); - if (value) - swfdec_urlencode_append_string (str, value); -} - diff --git a/libswfdec/swfdec_loader.h b/libswfdec/swfdec_loader.h index 0d0c6a4..f668fca 100644 --- a/libswfdec/swfdec_loader.h +++ b/libswfdec/swfdec_loader.h @@ -22,6 +22,7 @@ #include <glib-object.h> #include <libswfdec/swfdec_buffer.h> +#include <libswfdec/swfdec_stream.h> #include <libswfdec/swfdec_url.h> G_BEGIN_DECLS @@ -55,24 +56,17 @@ typedef struct _SwfdecLoaderClass SwfdecLoaderClass; struct _SwfdecLoader { - GObject object; + SwfdecStream stream; /*< private >*/ - guint state; /* SwfdecLoaderState the loader is currently in */ - guint processed_state;/* SwfdecLoaderState the target knows about */ - gboolean queued; /* TRUE if we have queued an action already */ SwfdecURL * url; /* the URL for this loader in UTF-8 - must be set on creation */ glong size; /* number of bytes in stream or -1 if unknown */ - char * error; /* error message if in error state or NULL */ - gpointer target; /* SwfdecLoaderTarget that gets notified about loading progress */ - gpointer player; /* SwfdecPlayer belonging to target or %NULL */ - SwfdecBufferQueue * queue; /* SwfdecBufferQueue managing the input buffers */ SwfdecLoaderDataType data_type; /* type this stream is in (identified by swfdec) */ }; struct _SwfdecLoaderClass { - GObjectClass object_class; + SwfdecStreamClass stream_class; /* initialize the loader. The URL will be set already. */ void (* load) (SwfdecLoader * loader, @@ -80,19 +74,12 @@ struct _SwfdecLoaderClass SwfdecLoaderRequest request, const char * data, gsize data_len); - /* if open, close the loader. NB: you may not call push() or eof() after the loader has been closed */ - void (* close) (SwfdecLoader * loader); }; GType swfdec_loader_get_type (void); -void swfdec_loader_open (SwfdecLoader * loader, +void swfdec_loader_set_url (SwfdecLoader * loader, const char * url); -void swfdec_loader_push (SwfdecLoader * loader, - SwfdecBuffer * buffer); -void swfdec_loader_eof (SwfdecLoader * loader); -void swfdec_loader_error (SwfdecLoader * loader, - const char * error); const SwfdecURL * swfdec_loader_get_url (SwfdecLoader * loader); void swfdec_loader_set_size (SwfdecLoader * loader, diff --git a/libswfdec/swfdec_loader_internal.h b/libswfdec/swfdec_loader_internal.h index 0a835d4..2a3439f 100644 --- a/libswfdec/swfdec_loader_internal.h +++ b/libswfdec/swfdec_loader_internal.h @@ -21,21 +21,12 @@ #define _SWFDEC_LOADER_INTERNAL_H_ #include "swfdec_loader.h" -#include "swfdec_loadertarget.h" #include "swfdec_stream_target.h" G_BEGIN_DECLS -typedef enum { - SWFDEC_LOADER_STATE_NEW = 0, /* loader is new and has not been opened yet */ - SWFDEC_LOADER_STATE_OPEN, /* loader is opened and has got the HTTP headers */ - SWFDEC_LOADER_STATE_READING, /* loader has read some bytes of data and is still reading */ - SWFDEC_LOADER_STATE_EOF, /* swfdec_loader_eof() has been called */ - SWFDEC_LOADER_STATE_CLOSED, /* loader has been closed by Swfdec */ - SWFDEC_LOADER_STATE_ERROR /* loader is in error state */ -} SwfdecLoaderState; - /* swfdec_stream.c */ +SwfdecBufferQueue * swfdec_stream_get_queue (SwfdecStream * stream); const char * swfdec_stream_describe (SwfdecStream * stream); void swfdec_stream_close (SwfdecStream * stream); void swfdec_stream_set_target (SwfdecStream * stream, @@ -47,17 +38,11 @@ SwfdecLoader * swfdec_loader_load (SwfdecLoader * loader, SwfdecLoaderRequest request, const char * data, gsize data_len); -void swfdec_loader_close (SwfdecLoader * loader); -void swfdec_loader_set_target (SwfdecLoader * loader, - SwfdecLoaderTarget * target); void swfdec_loader_set_data_type (SwfdecLoader * loader, SwfdecLoaderDataType type); char * swfdec_loader_get_text (SwfdecLoader * loader, guint version); -void swfdec_string_append_urlencoded (GString * str, - const char * name, - const char * value); G_END_DECLS #endif diff --git a/libswfdec/swfdec_loadertarget.c b/libswfdec/swfdec_loadertarget.c deleted file mode 100644 index 39bc745..0000000 --- a/libswfdec/swfdec_loadertarget.c +++ /dev/null @@ -1,137 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "swfdec_loadertarget.h" -#include "swfdec_debug.h" -#include "swfdec_loader_internal.h" -#include "swfdec_player_internal.h" -#include "swfdec_swf_decoder.h" /* HACK */ - -static void -swfdec_loader_target_base_init (gpointer g_class) -{ - static gboolean initialized = FALSE; - - if (G_UNLIKELY (!initialized)) { - initialized = TRUE; - } -} - -GType -swfdec_loader_target_get_type (void) -{ - static GType loader_target_type = 0; - - if (!loader_target_type) { - static const GTypeInfo loader_target_info = { - sizeof (SwfdecLoaderTargetInterface), - swfdec_loader_target_base_init, - NULL, - NULL, - NULL, - NULL, - 0, - 0, - NULL, - }; - - loader_target_type = g_type_register_static (G_TYPE_INTERFACE, - "SwfdecLoaderTarget", &loader_target_info, 0); - g_type_interface_add_prerequisite (loader_target_type, G_TYPE_OBJECT); - } - - return loader_target_type; -} - -SwfdecPlayer * -swfdec_loader_target_get_player (SwfdecLoaderTarget *target) -{ - SwfdecLoaderTargetInterface *iface; - - g_return_val_if_fail (SWFDEC_IS_LOADER_TARGET (target), NULL); - - iface = SWFDEC_LOADER_TARGET_GET_INTERFACE (target); - g_assert (iface->get_player != NULL); - return iface->get_player (target); -} - -void -swfdec_loader_target_open (SwfdecLoaderTarget *target, SwfdecLoader *loader) -{ - SwfdecLoaderTargetInterface *iface; - - g_return_if_fail (SWFDEC_IS_LOADER_TARGET (target)); - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - - SWFDEC_LOG ("opening %p (state %u)", loader, loader->state); - - iface = SWFDEC_LOADER_TARGET_GET_INTERFACE (target); - if (iface->open) - iface->open (target, loader); -} - -void -swfdec_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *loader) -{ - SwfdecLoaderTargetInterface *iface; - - g_return_if_fail (SWFDEC_IS_LOADER_TARGET (target)); - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - - SWFDEC_LOG ("parsing %p (state %u)", loader, loader->state); - - iface = SWFDEC_LOADER_TARGET_GET_INTERFACE (target); - if (iface->parse) - iface->parse (target, loader); -} - -void -swfdec_loader_target_eof (SwfdecLoaderTarget *target, SwfdecLoader *loader) -{ - SwfdecLoaderTargetInterface *iface; - - g_return_if_fail (SWFDEC_IS_LOADER_TARGET (target)); - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - - SWFDEC_LOG ("eof on %p (state %u)", loader, loader->state); - - iface = SWFDEC_LOADER_TARGET_GET_INTERFACE (target); - if (iface->eof) - iface->eof (target, loader); -} - -void -swfdec_loader_target_error (SwfdecLoaderTarget *target, SwfdecLoader *loader) -{ - SwfdecLoaderTargetInterface *iface; - - g_return_if_fail (SWFDEC_IS_LOADER_TARGET (target)); - g_return_if_fail (SWFDEC_IS_LOADER (loader)); - - SWFDEC_LOG ("error on %p (state %u)", loader, loader->state); - - iface = SWFDEC_LOADER_TARGET_GET_INTERFACE (target); - if (iface->error) - iface->error (target, loader); -} - diff --git a/libswfdec/swfdec_loadertarget.h b/libswfdec/swfdec_loadertarget.h deleted file mode 100644 index 1e9c523..0000000 --- a/libswfdec/swfdec_loadertarget.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Swfdec - * Copyright (C) 2007 Benjamin Otte <otte at gnome.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA - */ - -#ifndef __SWFDEC_LOADER_TARGET_H__ -#define __SWFDEC_LOADER_TARGET_H__ - -#include <libswfdec/swfdec.h> -#include <libswfdec/swfdec_decoder.h> - -G_BEGIN_DECLS - -#define SWFDEC_TYPE_LOADER_TARGET (swfdec_loader_target_get_type ()) -#define SWFDEC_LOADER_TARGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_LOADER_TARGET, SwfdecLoaderTarget)) -#define SWFDEC_IS_LOADER_TARGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_LOADER_TARGET)) -#define SWFDEC_LOADER_TARGET_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), SWFDEC_TYPE_LOADER_TARGET, SwfdecLoaderTargetInterface)) - -typedef struct _SwfdecLoaderTarget SwfdecLoaderTarget; /* dummy object */ -typedef struct _SwfdecLoaderTargetInterface SwfdecLoaderTargetInterface; - -struct _SwfdecLoaderTargetInterface { - GTypeInterface parent; - - /* mandatory vfunc */ - SwfdecPlayer * (* get_player) (SwfdecLoaderTarget * target); - /* optional vfuncs */ - void (* open) (SwfdecLoaderTarget * target, - SwfdecLoader * loader); - void (* parse) (SwfdecLoaderTarget * target, - SwfdecLoader * loader); - void (* eof) (SwfdecLoaderTarget * target, - SwfdecLoader * loader); - void (* error) (SwfdecLoaderTarget * target, - SwfdecLoader * loader); -}; - -GType swfdec_loader_target_get_type (void) G_GNUC_CONST; - -SwfdecPlayer * swfdec_loader_target_get_player (SwfdecLoaderTarget * target); -void swfdec_loader_target_open (SwfdecLoaderTarget * target, - SwfdecLoader * loader); -void swfdec_loader_target_parse (SwfdecLoaderTarget * target, - SwfdecLoader * loader); -void swfdec_loader_target_eof (SwfdecLoaderTarget * target, - SwfdecLoader * loader); -void swfdec_loader_target_error (SwfdecLoaderTarget * target, - SwfdecLoader * loader); - -G_END_DECLS - -#endif /* __SWFDEC_LOADER_TARGET_H__ */ diff --git a/libswfdec/swfdec_net_stream.c b/libswfdec/swfdec_net_stream.c index 36e0d9c..22de7fb 100644 --- a/libswfdec/swfdec_net_stream.c +++ b/libswfdec/swfdec_net_stream.c @@ -29,7 +29,7 @@ #include "swfdec_audio_flv.h" #include "swfdec_debug.h" #include "swfdec_loader_internal.h" -#include "swfdec_loadertarget.h" +#include "swfdec_stream_target.h" #include "swfdec_resource_request.h" /* NB: code and level must be rooted gc-strings */ @@ -216,27 +216,27 @@ swfdec_net_stream_update_playing (SwfdecNetStream *stream) } } -/*** SWFDEC_LOADER_TARGET interface ***/ +/*** SWFDEC_STREAM_TARGET interface ***/ static SwfdecPlayer * -swfdec_net_stream_loader_target_get_player (SwfdecLoaderTarget *target) +swfdec_net_stream_stream_target_get_player (SwfdecStreamTarget *target) { return SWFDEC_PLAYER (SWFDEC_AS_OBJECT (target)->context); } static void -swfdec_net_stream_loader_target_error (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_net_stream_stream_target_error (SwfdecStreamTarget *target, + SwfdecStream *stream) { - SwfdecNetStream *stream = SWFDEC_NET_STREAM (target); + SwfdecNetStream *ns = SWFDEC_NET_STREAM (target); - if (stream->flvdecoder == NULL) - swfdec_net_stream_onstatus (stream, SWFDEC_AS_STR_NetStream_Play_StreamNotFound, + if (ns->flvdecoder == NULL) + swfdec_net_stream_onstatus (ns, SWFDEC_AS_STR_NetStream_Play_StreamNotFound, SWFDEC_AS_STR_error); } static void -swfdec_net_stream_loader_target_recheck (SwfdecNetStream *stream) +swfdec_net_stream_stream_target_recheck (SwfdecNetStream *stream) { if (stream->buffering) { guint first, last; @@ -256,65 +256,63 @@ swfdec_net_stream_loader_target_recheck (SwfdecNetStream *stream) } static void -swfdec_net_stream_loader_target_parse (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_net_stream_stream_target_parse (SwfdecStreamTarget *target, + SwfdecStream *stream) { - SwfdecNetStream *stream = SWFDEC_NET_STREAM (target); + SwfdecNetStream *ns = SWFDEC_NET_STREAM (target); + SwfdecBufferQueue *queue; SwfdecStatus status; - if (loader->state != SWFDEC_LOADER_STATE_EOF && swfdec_buffer_queue_get_depth (loader->queue) == 0) { - SWFDEC_INFO ("nothing to do"); - return; - } - if (stream->flvdecoder == NULL) { + if (ns->flvdecoder == NULL) { /* FIXME: add mp3 support */ - stream->flvdecoder = g_object_new (SWFDEC_TYPE_FLV_DECODER, NULL); - SWFDEC_DECODER (stream->flvdecoder)->player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (stream)->context); - swfdec_net_stream_onstatus (stream, SWFDEC_AS_STR_NetStream_Play_Start, + ns->flvdecoder = g_object_new (SWFDEC_TYPE_FLV_DECODER, NULL); + SWFDEC_DECODER (ns->flvdecoder)->player = SWFDEC_PLAYER (SWFDEC_AS_OBJECT (stream)->context); + swfdec_net_stream_onstatus (ns, SWFDEC_AS_STR_NetStream_Play_Start, SWFDEC_AS_STR_status); - swfdec_loader_set_data_type (loader, SWFDEC_LOADER_DATA_FLV); + swfdec_loader_set_data_type (SWFDEC_LOADER (stream), SWFDEC_LOADER_DATA_FLV); } status = SWFDEC_STATUS_OK; + queue = swfdec_stream_get_queue (stream); do { - SwfdecBuffer *buffer = swfdec_buffer_queue_pull_buffer (loader->queue); + SwfdecBuffer *buffer = swfdec_buffer_queue_pull_buffer (queue); if (buffer == NULL) break; status &= ~SWFDEC_STATUS_NEEDBITS; - status |= swfdec_decoder_parse (SWFDEC_DECODER (stream->flvdecoder), buffer); + status |= swfdec_decoder_parse (SWFDEC_DECODER (ns->flvdecoder), buffer); } while ((status & (SWFDEC_STATUS_ERROR | SWFDEC_STATUS_EOF)) == 0); if (status & SWFDEC_STATUS_IMAGE) - swfdec_net_stream_loader_target_recheck (stream); + swfdec_net_stream_stream_target_recheck (ns); } static void -swfdec_net_stream_loader_target_eof (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_net_stream_stream_target_close (SwfdecStreamTarget *target, + SwfdecStream *stream) { - SwfdecNetStream *stream = SWFDEC_NET_STREAM (target); + SwfdecNetStream *ns = SWFDEC_NET_STREAM (target); guint first, last; - swfdec_decoder_eof (SWFDEC_DECODER (stream->flvdecoder)); - swfdec_net_stream_onstatus (stream, SWFDEC_AS_STR_NetStream_Buffer_Flush, + swfdec_decoder_eof (SWFDEC_DECODER (ns->flvdecoder)); + swfdec_net_stream_onstatus (ns, SWFDEC_AS_STR_NetStream_Buffer_Flush, SWFDEC_AS_STR_status); - swfdec_net_stream_video_goto (stream, stream->current_time); - stream->buffering = FALSE; - if (swfdec_flv_decoder_get_video_info (stream->flvdecoder, &first, &last) && - stream->current_time + stream->buffer_time <= last) { - swfdec_net_stream_onstatus (stream, SWFDEC_AS_STR_NetStream_Buffer_Full, + swfdec_net_stream_video_goto (ns, ns->current_time); + ns->buffering = FALSE; + if (swfdec_flv_decoder_get_video_info (ns->flvdecoder, &first, &last) && + ns->current_time + ns->buffer_time <= last) { + swfdec_net_stream_onstatus (ns, SWFDEC_AS_STR_NetStream_Buffer_Full, SWFDEC_AS_STR_status); } - swfdec_net_stream_loader_target_recheck (stream); + swfdec_net_stream_stream_target_recheck (ns); } static void -swfdec_net_stream_loader_target_init (SwfdecLoaderTargetInterface *iface) +swfdec_net_stream_stream_target_init (SwfdecStreamTargetInterface *iface) { - iface->get_player = swfdec_net_stream_loader_target_get_player; - iface->parse = swfdec_net_stream_loader_target_parse; - iface->eof = swfdec_net_stream_loader_target_eof; - iface->error = swfdec_net_stream_loader_target_error; + iface->get_player = swfdec_net_stream_stream_target_get_player; + iface->parse = swfdec_net_stream_stream_target_parse; + iface->close = swfdec_net_stream_stream_target_close; + iface->error = swfdec_net_stream_stream_target_error; } /*** SWFDEC VIDEO MOVIE INPUT ***/ @@ -348,7 +346,7 @@ swfdec_net_stream_input_get_image (SwfdecVideoMovieInput *input) /*** SWFDEC_NET_STREAM ***/ G_DEFINE_TYPE_WITH_CODE (SwfdecNetStream, swfdec_net_stream, SWFDEC_TYPE_AS_OBJECT, - G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_net_stream_loader_target_init)) + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_net_stream_stream_target_init)) static void swfdec_net_stream_dispose (GObject *object) @@ -504,9 +502,10 @@ swfdec_net_stream_set_loader (SwfdecNetStream *stream, SwfdecLoader *loader) g_return_if_fail (loader == NULL || SWFDEC_IS_LOADER (loader)); if (stream->loader) { - swfdec_loader_set_target (stream->loader, NULL); - swfdec_loader_close (stream->loader); - g_object_unref (stream->loader); + SwfdecStream *lstream = SWFDEC_STREAM (loader); + swfdec_stream_close (lstream); + swfdec_stream_set_target (lstream, NULL); + g_object_unref (lstream); } if (stream->flvdecoder) { g_object_unref (stream->flvdecoder); @@ -516,7 +515,7 @@ swfdec_net_stream_set_loader (SwfdecNetStream *stream, SwfdecLoader *loader) stream->buffering = TRUE; if (loader) { g_object_ref (loader); - swfdec_loader_set_target (loader, SWFDEC_LOADER_TARGET (stream)); + swfdec_stream_set_target (SWFDEC_STREAM (loader), SWFDEC_STREAM_TARGET (stream)); } swfdec_net_stream_set_playing (stream, TRUE); } diff --git a/libswfdec/swfdec_policy_loader.c b/libswfdec/swfdec_policy_loader.c index 6d04c75..ae722b6 100644 --- a/libswfdec/swfdec_policy_loader.c +++ b/libswfdec/swfdec_policy_loader.c @@ -34,17 +34,17 @@ #include "swfdec_xml.h" #include "swfdec_xml_node.h" -/*** SWFDEC_LOADER_TARGET ***/ +/*** SWFDEC_STREAM_TARGET ***/ static SwfdecPlayer * -swfdec_policy_loader_target_get_player (SwfdecLoaderTarget *target) +swfdec_policy_stream_target_get_player (SwfdecStreamTarget *target) { return SWFDEC_POLICY_LOADER (target)->sec->player; } static void -swfdec_policy_loader_target_error (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_policy_stream_target_error (SwfdecStreamTarget *target, + SwfdecStream *stream) { SwfdecPolicyLoader *policy_loader = SWFDEC_POLICY_LOADER (target); @@ -139,8 +139,8 @@ swfdec_policy_loader_check (SwfdecAsContext *context, const char *text, } static void -swfdec_policy_loader_target_eof (SwfdecLoaderTarget *target, - SwfdecLoader *loader) +swfdec_policy_stream_target_close (SwfdecStreamTarget *target, + SwfdecStream *stream) { SwfdecPolicyLoader *policy_loader = SWFDEC_POLICY_LOADER (target); gboolean allow; @@ -167,17 +167,17 @@ swfdec_policy_loader_target_eof (SwfdecLoaderTarget *target, } static void -swfdec_policy_loader_loader_target_init (SwfdecLoaderTargetInterface *iface) +swfdec_policy_loader_stream_target_init (SwfdecStreamTargetInterface *iface) { - iface->get_player = swfdec_policy_loader_target_get_player; - iface->eof = swfdec_policy_loader_target_eof; - iface->error = swfdec_policy_loader_target_error; + iface->get_player = swfdec_policy_stream_target_get_player; + iface->close = swfdec_policy_stream_target_close; + iface->error = swfdec_policy_stream_target_error; } /*** SWFDEC_POLICY_LOADER ***/ G_DEFINE_TYPE_WITH_CODE (SwfdecPolicyLoader, swfdec_policy_loader, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_policy_loader_loader_target_init)) + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_policy_loader_stream_target_init)) static void swfdec_policy_loader_dispose (GObject *object) @@ -185,7 +185,7 @@ swfdec_policy_loader_dispose (GObject *object) SwfdecPolicyLoader *policy_loader = SWFDEC_POLICY_LOADER (object); g_assert (policy_loader->loader); - swfdec_loader_set_target (policy_loader->loader, NULL); + swfdec_stream_set_target (SWFDEC_STREAM (policy_loader->loader), NULL); g_object_unref (policy_loader->loader); policy_loader->loader = NULL; @@ -239,9 +239,9 @@ swfdec_policy_loader_new (SwfdecFlashSecurity *sec, const char *host, policy_loader->host = g_strdup (host); policy_loader->func = func; - swfdec_loader_set_target (policy_loader->loader, - SWFDEC_LOADER_TARGET (policy_loader)); - swfdec_loader_set_data_type (policy_loader->loader, SWFDEC_LOADER_DATA_TEXT); + swfdec_stream_set_target (SWFDEC_STREAM (policy_loader->loader), + SWFDEC_STREAM_TARGET (policy_loader)); + swfdec_loader_set_data_type (policy_loader->loader, SWFDEC_LOADER_DATA_XML); return policy_loader; } diff --git a/libswfdec/swfdec_resource.c b/libswfdec/swfdec_resource.c index cac371a..6a8b3b4 100644 --- a/libswfdec/swfdec_resource.c +++ b/libswfdec/swfdec_resource.c @@ -35,21 +35,21 @@ #include "swfdec_flash_security.h" #include "swfdec_image_decoder.h" #include "swfdec_loader_internal.h" -#include "swfdec_loadertarget.h" #include "swfdec_movie_clip_loader.h" #include "swfdec_player_internal.h" #include "swfdec_resource_request.h" #include "swfdec_script.h" #include "swfdec_sprite.h" +#include "swfdec_stream_target.h" #include "swfdec_swf_decoder.h" #include "swfdec_utils.h" -static void swfdec_resource_loader_target_init (SwfdecLoaderTargetInterface *iface); +static void swfdec_resource_stream_target_init (SwfdecStreamTargetInterface *iface); G_DEFINE_TYPE_WITH_CODE (SwfdecResource, swfdec_resource, SWFDEC_TYPE_FLASH_SECURITY, - G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_LOADER_TARGET, swfdec_resource_loader_target_init)) + G_IMPLEMENT_INTERFACE (SWFDEC_TYPE_STREAM_TARGET, swfdec_resource_stream_target_init)) -/*** SWFDEC_LOADER_TARGET interface ***/ +/*** SWFDEC_STREAM_TARGET interface ***/ static gboolean swfdec_resource_is_root (SwfdecResource *resource) @@ -61,7 +61,7 @@ swfdec_resource_is_root (SwfdecResource *resource) } static SwfdecPlayer * -swfdec_resource_loader_target_get_player (SwfdecLoaderTarget *target) +swfdec_resource_stream_target_get_player (SwfdecStreamTarget *target) { return SWFDEC_FLASH_SECURITY (target)->player; } @@ -81,7 +81,7 @@ swfdec_resource_check_rights (SwfdecResource *resource) } static void -swfdec_resource_loader_target_image (SwfdecResource *instance) +swfdec_resource_stream_target_image (SwfdecResource *instance) { SwfdecSpriteMovie *movie = instance->movie; @@ -209,7 +209,7 @@ swfdec_resource_create_movie (SwfdecResource *resource) if (level < 0) { SWFDEC_WARNING ("%s does not reference a movie, not loading %s", resource->target, swfdec_url_get_url (swfdec_loader_get_url (resource->loader))); - swfdec_loader_close (resource->loader); + swfdec_stream_close (SWFDEC_STREAM (resource->loader)); swfdec_player_unroot_object (player, G_OBJECT (resource)); return FALSE; } @@ -225,8 +225,9 @@ swfdec_resource_create_movie (SwfdecResource *resource) } static void -swfdec_resource_loader_target_open (SwfdecLoaderTarget *target, SwfdecLoader *loader) +swfdec_resource_stream_target_open (SwfdecStreamTarget *target, SwfdecStream *stream) { + SwfdecLoader *loader = SWFDEC_LOADER (stream); SwfdecResource *instance = SWFDEC_RESOURCE (target); const char *query; @@ -246,18 +247,21 @@ swfdec_resource_loader_target_open (SwfdecLoaderTarget *target, SwfdecLoader *lo } static void -swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *loader) +swfdec_resource_stream_target_parse (SwfdecStreamTarget *target, SwfdecStream *stream) { + SwfdecLoader *loader = SWFDEC_LOADER (stream); SwfdecResource *resource = SWFDEC_RESOURCE (target); + SwfdecBufferQueue *queue; SwfdecBuffer *buffer; SwfdecDecoder *dec = resource->decoder; SwfdecStatus status; guint parsed; - if (dec == NULL && swfdec_buffer_queue_get_offset (loader->queue) == 0) { - if (swfdec_buffer_queue_get_depth (loader->queue) < SWFDEC_DECODER_DETECT_LENGTH) + queue = swfdec_stream_get_queue (stream); + if (dec == NULL && swfdec_buffer_queue_get_offset (queue) == 0) { + if (swfdec_buffer_queue_get_depth (queue) < SWFDEC_DECODER_DETECT_LENGTH) return; - buffer = swfdec_buffer_queue_peek (loader->queue, 4); + buffer = swfdec_buffer_queue_peek (queue, 4); dec swfdec_decoder_new (SWFDEC_FLASH_SECURITY (resource)->player, buffer); swfdec_buffer_unref (buffer); @@ -271,19 +275,19 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l dec->bytes_total = total; } } - while (swfdec_buffer_queue_get_depth (loader->queue)) { + while (swfdec_buffer_queue_get_depth (queue)) { parsed = 0; status = 0; do { - buffer = swfdec_buffer_queue_peek_buffer (loader->queue); + buffer = swfdec_buffer_queue_peek_buffer (queue); if (buffer == NULL) break; if (parsed + buffer->length <= 65536) { swfdec_buffer_unref (buffer); - buffer = swfdec_buffer_queue_pull_buffer (loader->queue); + buffer = swfdec_buffer_queue_pull_buffer (queue); } else { swfdec_buffer_unref (buffer); - buffer = swfdec_buffer_queue_pull (loader->queue, 65536 - parsed); + buffer = swfdec_buffer_queue_pull (queue, 65536 - parsed); } parsed += buffer->length; if (dec) { @@ -294,7 +298,7 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l } while (parsed < 65536 && (status & (SWFDEC_STATUS_ERROR | SWFDEC_STATUS_EOF)) == 0); if (status & SWFDEC_STATUS_ERROR) { SWFDEC_ERROR ("parsing error"); - swfdec_loader_set_target (loader, NULL); + swfdec_stream_set_target (SWFDEC_STREAM (loader), NULL); return; } if ((status & SWFDEC_STATUS_INIT)) { @@ -306,7 +310,7 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l } } if (status & SWFDEC_STATUS_IMAGE) - swfdec_resource_loader_target_image (resource); + swfdec_resource_stream_target_image (resource); swfdec_resource_emit_signal (resource, SWFDEC_AS_STR_onLoadProgress, TRUE, NULL, 0); if (status & SWFDEC_STATUS_EOF) return; @@ -314,7 +318,7 @@ swfdec_resource_loader_target_parse (SwfdecLoaderTarget *target, SwfdecLoader *l } static void -swfdec_resource_loader_target_eof (SwfdecLoaderTarget *target, SwfdecLoader *loader) +swfdec_resource_stream_target_close (SwfdecStreamTarget *target, SwfdecStream *stream) { SwfdecResource *resource = SWFDEC_RESOURCE (target); SwfdecAsValue val; @@ -324,7 +328,7 @@ swfdec_resource_loader_target_eof (SwfdecLoaderTarget *target, SwfdecLoader *loa SwfdecDecoder *dec = resource->decoder; swfdec_decoder_eof (dec); if (dec->data_type != SWFDEC_LOADER_DATA_UNKNOWN) - swfdec_loader_set_data_type (loader, dec->data_type); + swfdec_loader_set_data_type (SWFDEC_LOADER (stream), dec->data_type); } SWFDEC_AS_VALUE_SET_INT (&val, 0); /* FIXME */ swfdec_resource_emit_signal (resource, SWFDEC_AS_STR_onLoadComplete, FALSE, &val, 1); @@ -332,7 +336,7 @@ swfdec_resource_loader_target_eof (SwfdecLoaderTarget *target, SwfdecLoader *loa } static void -swfdec_resource_loader_target_error (SwfdecLoaderTarget *target, SwfdecLoader *loader) +swfdec_resource_stream_target_error (SwfdecStreamTarget *target, SwfdecStream *stream) { SwfdecResource *resource = SWFDEC_RESOURCE (target); const char *message; @@ -356,13 +360,13 @@ swfdec_resource_loader_target_error (SwfdecLoaderTarget *target, SwfdecLoader *l } static void -swfdec_resource_loader_target_init (SwfdecLoaderTargetInterface *iface) +swfdec_resource_stream_target_init (SwfdecStreamTargetInterface *iface) { - iface->get_player = swfdec_resource_loader_target_get_player; - iface->open = swfdec_resource_loader_target_open; - iface->parse = swfdec_resource_loader_target_parse; - iface->error = swfdec_resource_loader_target_error; - iface->eof = swfdec_resource_loader_target_eof; + iface->get_player = swfdec_resource_stream_target_get_player; + iface->open = swfdec_resource_stream_target_open; + iface->parse = swfdec_resource_stream_target_parse; + iface->error = swfdec_resource_stream_target_error; + iface->close = swfdec_resource_stream_target_close; } static void @@ -371,7 +375,7 @@ swfdec_resource_dispose (GObject *object) SwfdecResource *resource = SWFDEC_RESOURCE (object); if (resource->loader) { - swfdec_loader_set_target (resource->loader, NULL); + swfdec_stream_set_target (SWFDEC_STREAM (resource->loader), NULL); g_object_unref (resource->loader); resource->loader = NULL; } @@ -416,7 +420,7 @@ swfdec_resource_set_loader (SwfdecResource *resource, SwfdecLoader *loader) g_return_if_fail (resource->loader == NULL); resource->loader = g_object_ref (loader); - swfdec_loader_set_target (resource->loader, SWFDEC_LOADER_TARGET (resource)); + swfdec_stream_set_target (SWFDEC_STREAM (resource->loader), SWFDEC_STREAM_TARGET (resource)); swfdec_flash_security_set_url (SWFDEC_FLASH_SECURITY (resource), swfdec_loader_get_url (loader)); resource->state = SWFDEC_RESOURCE_REQUESTED; diff --git a/libswfdec/swfdec_stream.c b/libswfdec/swfdec_stream.c index f5e446d..545d0c9 100644 --- a/libswfdec/swfdec_stream.c +++ b/libswfdec/swfdec_stream.c @@ -161,7 +161,7 @@ swfdec_stream_class_init (SwfdecStreamClass *klass) g_param_spec_string ("error", "error", "NULL when no error or string describing error", NULL, G_PARAM_READABLE)); g_object_class_install_property (object_class, PROP_OPEN, - g_param_spec_boolean ("eof", "eof", "TRUE while data is flowing", + g_param_spec_boolean ("open", "open", "TRUE while data is flowing", FALSE, G_PARAM_READABLE)); g_object_class_install_property (object_class, PROP_EOF, g_param_spec_boolean ("eof", "eof", "TRUE when all data has been transmitted", @@ -180,6 +180,14 @@ swfdec_stream_init (SwfdecStream *stream) /*** INTERNAL API ***/ +SwfdecBufferQueue * +swfdec_stream_get_queue (SwfdecStream *stream) +{ + g_return_val_if_fail (SWFDEC_IS_STREAM (stream), NULL); + + return stream->priv->queue; +} + static void swfdec_stream_process (gpointer streamp, gpointer unused) { @@ -192,7 +200,7 @@ swfdec_stream_process (gpointer streamp, gpointer unused) if (priv->state == priv->processed_state && priv->state != SWFDEC_STREAM_STATE_OPEN) return; - g_assert (priv->state != SWFDEC_STREAM_STATE_CLOSED); + g_assert (priv->processed_state != SWFDEC_STREAM_STATE_CLOSED); g_object_ref (stream); if (priv->state == SWFDEC_STREAM_STATE_ERROR) { swfdec_stream_target_error (priv->target, stream); @@ -338,7 +346,7 @@ swfdec_stream_error (SwfdecStream *stream, const char *error) * swfdec_stream_push() can be called. **/ void -swfdec_stream_open (SwfdecStream *stream, const char *url) +swfdec_stream_open (SwfdecStream *stream) { g_return_if_fail (SWFDEC_IS_STREAM (stream)); g_return_if_fail (stream->priv->state == SWFDEC_STREAM_STATE_CONNECTING); diff --git a/libswfdec/swfdec_stream.h b/libswfdec/swfdec_stream.h index fb45b53..f971886 100644 --- a/libswfdec/swfdec_stream.h +++ b/libswfdec/swfdec_stream.h @@ -22,7 +22,6 @@ #include <glib-object.h> #include <libswfdec/swfdec_buffer.h> -#include <libswfdec/swfdec_player.h> G_BEGIN_DECLS @@ -57,8 +56,7 @@ struct _SwfdecStreamClass GType swfdec_stream_get_type (void); -void swfdec_stream_open (SwfdecStream * stream, - const char * url); +void swfdec_stream_open (SwfdecStream * stream); void swfdec_stream_push (SwfdecStream * stream, SwfdecBuffer * buffer); void swfdec_stream_eof (SwfdecStream * stream); diff --git a/tools/crashfinder.c b/tools/crashfinder.c index 3c4a4a7..addf1da 100644 --- a/tools/crashfinder.c +++ b/tools/crashfinder.c @@ -93,6 +93,7 @@ main (int argc, char **argv) for (i = 0; i < g_strv_length (filenames); i++) { glong played, advance, elapsed; + char *error; g_print ("Running: %s\n", filenames[i]); @@ -103,9 +104,11 @@ main (int argc, char **argv) loader = swfdec_file_loader_new (filenames[i]); player = swfdec_player_new (NULL); - if (loader->error) { - g_printerr ("Error loading %s: %s\n", filenames[i], loader->error); + g_object_get (loader, "error", &error, NULL); + if (error) { + g_printerr ("Error loading %s: %s\n", filenames[i], error); g_object_unref (loader); + g_free (error); continue; } diff --git a/tools/dump.c b/tools/dump.c index efea56d..c8c1e1f 100644 --- a/tools/dump.c +++ b/tools/dump.c @@ -405,11 +405,6 @@ main (int argc, char *argv[]) } player = swfdec_player_new_from_file (argv[1]); - if (player->priv->resource->loader->error) { - g_printerr ("Couldn't open file \"%s\": %s\n", argv[1], player->priv->resource->loader->error); - g_object_unref (player); - return 1; - } /* FIXME: HACK! */ swfdec_player_advance (player, 0); if (!swfdec_player_is_initialized (player)) { commit d56d2f0996f5f916b1a4b228e78377f4aa6436ac Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 5 11:32:59 2008 +0100 make SwfdecStream use a private field diff --git a/libswfdec/swfdec_stream.c b/libswfdec/swfdec_stream.c index c6bcc98..f5e446d 100644 --- a/libswfdec/swfdec_stream.c +++ b/libswfdec/swfdec_stream.c @@ -74,6 +74,17 @@ typedef enum { SWFDEC_STREAM_STATE_ERROR /* loader is in error state */ } SwfdecStreamState; +struct _SwfdecStreamPrivate +{ + SwfdecPlayer * player; /* player to queue target notificaions in */ + SwfdecStreamTarget * target; /* SwfdecStreamTarget that gets notified about loading progress */ + SwfdecStreamState state; /* SwfdecStreamState the stream is currently in */ + SwfdecStreamState processed_state;/* SwfdecStreamState the target knows about */ + gboolean queued; /* TRUE if we have queued an action already */ + char * error; /* error message if in error state or NULL */ + SwfdecBufferQueue * queue; /* SwfdecBufferQueue managing the input buffers */ +}; + enum { PROP_0, PROP_ERROR, @@ -87,7 +98,7 @@ static void swfdec_stream_get_property (GObject *object, guint param_id, GValue *value, GParamSpec * pspec) { - SwfdecStream *stream = SWFDEC_STREAM (object); + SwfdecStreamPrivate *stream = SWFDEC_STREAM (object)->priv; switch (param_id) { case PROP_ERROR: @@ -121,7 +132,7 @@ swfdec_stream_set_property (GObject *object, guint param_id, const GValue *value static void swfdec_stream_dispose (GObject *object) { - SwfdecStream *stream = SWFDEC_STREAM (object); + SwfdecStreamPrivate *stream = SWFDEC_STREAM (object)->priv; /* targets are supposed to keep a reference around */ g_assert (stream->target == NULL); @@ -140,6 +151,8 @@ swfdec_stream_class_init (SwfdecStreamClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); + g_type_class_add_private (klass, sizeof (SwfdecStreamPrivate)); + object_class->dispose = swfdec_stream_dispose; object_class->get_property = swfdec_stream_get_property; object_class->set_property = swfdec_stream_set_property; @@ -158,7 +171,11 @@ swfdec_stream_class_init (SwfdecStreamClass *klass) static void swfdec_stream_init (SwfdecStream *stream) { - stream->queue = swfdec_buffer_queue_new (); + SwfdecStreamPrivate *priv; + + stream->priv = priv = G_TYPE_INSTANCE_GET_PRIVATE (stream, SWFDEC_TYPE_STREAM, SwfdecStreamPrivate); + + priv->queue = swfdec_buffer_queue_new (); } /*** INTERNAL API ***/ @@ -167,29 +184,31 @@ static void swfdec_stream_process (gpointer streamp, gpointer unused) { SwfdecStream *stream = streamp; + SwfdecStreamPrivate *priv = stream->priv; - g_assert (stream->target != NULL); + g_assert (priv->target != NULL); - stream->queued = FALSE; - if (stream->state == stream->processed_state && - stream->state != SWFDEC_STREAM_STATE_OPEN) + priv->queued = FALSE; + if (priv->state == priv->processed_state && + priv->state != SWFDEC_STREAM_STATE_OPEN) return; - g_assert (stream->state != SWFDEC_STREAM_STATE_CLOSED); + g_assert (priv->state != SWFDEC_STREAM_STATE_CLOSED); g_object_ref (stream); - if (stream->state == SWFDEC_STREAM_STATE_ERROR) { - swfdec_stream_target_error (stream->target, stream); + if (priv->state == SWFDEC_STREAM_STATE_ERROR) { + swfdec_stream_target_error (priv->target, stream); } else { - while (stream->state != stream->processed_state) { - if (stream->processed_state == SWFDEC_STREAM_STATE_CONNECTING) { - stream->processed_state = SWFDEC_STREAM_STATE_OPEN; - swfdec_stream_target_open (stream->target, stream); - } else if (stream->processed_state == SWFDEC_STREAM_STATE_OPEN) { - stream->processed_state = SWFDEC_STREAM_STATE_CLOSED; - swfdec_stream_target_close (stream->target, stream); + while (priv->state != priv->processed_state) { + if (priv->processed_state == SWFDEC_STREAM_STATE_CONNECTING) { + priv->processed_state = SWFDEC_STREAM_STATE_OPEN; + swfdec_stream_target_open (priv->target, stream); + } else if (priv->processed_state == SWFDEC_STREAM_STATE_OPEN) { + swfdec_stream_target_parse (priv->target, stream); + priv->processed_state = SWFDEC_STREAM_STATE_CLOSED; + swfdec_stream_target_close (priv->target, stream); } } - if (stream->processed_state == SWFDEC_STREAM_STATE_OPEN) { - swfdec_stream_target_parse (stream->target, stream); + if (priv->processed_state == SWFDEC_STREAM_STATE_OPEN) { + swfdec_stream_target_parse (priv->target, stream); } } g_object_unref (stream); @@ -198,12 +217,14 @@ swfdec_stream_process (gpointer streamp, gpointer unused) static void swfdec_stream_queue_processing (SwfdecStream *stream) { - if (stream->queued) + SwfdecStreamPrivate *priv = stream->priv; + + if (priv->queued) return; - stream->queued = TRUE; - if (stream->target) { - g_assert (stream->player); - swfdec_player_add_external_action (stream->player, stream, + priv->queued = TRUE; + if (priv->target) { + g_assert (priv->player); + swfdec_player_add_external_action (priv->player, stream, swfdec_stream_process, NULL); } } @@ -211,42 +232,47 @@ swfdec_stream_queue_processing (SwfdecStream *stream) void swfdec_stream_close (SwfdecStream *stream) { + SwfdecStreamPrivate *priv; SwfdecStreamClass *klass; g_return_if_fail (SWFDEC_IS_STREAM (stream)); - - if (stream->state == SWFDEC_STREAM_STATE_ERROR && - stream->state == SWFDEC_STREAM_STATE_CLOSED) + + priv = stream->priv; + if (priv->state == SWFDEC_STREAM_STATE_ERROR && + priv->state == SWFDEC_STREAM_STATE_CLOSED) return; klass = SWFDEC_STREAM_GET_CLASS (stream); if (klass->close) klass->close (stream); - stream->state = SWFDEC_STREAM_STATE_CLOSED; - stream->processed_state = SWFDEC_STREAM_STATE_CLOSED; + priv->state = SWFDEC_STREAM_STATE_CLOSED; + priv->processed_state = SWFDEC_STREAM_STATE_CLOSED; } void swfdec_stream_set_target (SwfdecStream *stream, SwfdecStreamTarget *target) { + SwfdecStreamPrivate *priv; + g_return_if_fail (SWFDEC_IS_STREAM (stream)); if (target != NULL) { - g_return_if_fail (stream->processed_state == SWFDEC_STREAM_STATE_CONNECTING); + g_return_if_fail (stream->priv->processed_state == SWFDEC_STREAM_STATE_CONNECTING); g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); } - if (stream->target) { - swfdec_player_remove_all_external_actions (stream->player, stream); + priv = stream->priv; + if (priv->target) { + swfdec_player_remove_all_external_actions (priv->player, stream); } - stream->queued = FALSE; - stream->target = target; + priv->queued = FALSE; + priv->target = target; if (target) { - stream->player = swfdec_stream_target_get_player (target); - if (stream->state != SWFDEC_STREAM_STATE_CONNECTING) + priv->player = swfdec_stream_target_get_player (target); + if (priv->state != SWFDEC_STREAM_STATE_CONNECTING) swfdec_stream_queue_processing (stream); } else { - stream->player = NULL; + priv->player = NULL; } } @@ -286,17 +312,20 @@ swfdec_stream_describe (SwfdecStream *stream) void swfdec_stream_error (SwfdecStream *stream, const char *error) { + SwfdecStreamPrivate *priv; + g_return_if_fail (SWFDEC_IS_STREAM (stream)); g_return_if_fail (error != NULL); - if (stream->error) { + priv = stream->priv; + if (priv->error) { SWFDEC_ERROR ("another error in stream for %s: %s", swfdec_stream_describe (stream), error); return; } SWFDEC_ERROR ("error in stream for %s: %s", swfdec_stream_describe (stream), error); - stream->state = SWFDEC_STREAM_STATE_ERROR; - stream->error = g_strdup (error); + priv->state = SWFDEC_STREAM_STATE_ERROR; + priv->error = g_strdup (error); swfdec_stream_queue_processing (stream); } @@ -312,9 +341,9 @@ void swfdec_stream_open (SwfdecStream *stream, const char *url) { g_return_if_fail (SWFDEC_IS_STREAM (stream)); - g_return_if_fail (stream->state == SWFDEC_STREAM_STATE_CONNECTING); + g_return_if_fail (stream->priv->state == SWFDEC_STREAM_STATE_CONNECTING); - stream->state = SWFDEC_STREAM_STATE_OPEN; + stream->priv->state = SWFDEC_STREAM_STATE_OPEN; g_object_notify (G_OBJECT (stream), "open"); swfdec_stream_queue_processing (stream); } @@ -332,10 +361,10 @@ void swfdec_stream_push (SwfdecStream *stream, SwfdecBuffer *buffer) { g_return_if_fail (SWFDEC_IS_STREAM (stream)); - g_return_if_fail (stream->state == SWFDEC_STREAM_STATE_OPEN); + g_return_if_fail (stream->priv->state == SWFDEC_STREAM_STATE_OPEN); g_return_if_fail (buffer != NULL); - swfdec_buffer_queue_push (stream->queue, buffer); + swfdec_buffer_queue_push (stream->priv->queue, buffer); /* FIXME */ if (SWFDEC_IS_LOADER (stream)) g_object_notify (G_OBJECT (stream), "loaded"); @@ -352,11 +381,11 @@ void swfdec_stream_eof (SwfdecStream *stream) { g_return_if_fail (SWFDEC_IS_STREAM (stream)); - g_return_if_fail (stream->state == SWFDEC_STREAM_STATE_OPEN); + g_return_if_fail (stream->priv->state == SWFDEC_STREAM_STATE_OPEN); + stream->priv->state = SWFDEC_STREAM_STATE_CLOSED; g_object_notify (G_OBJECT (stream), "open"); g_object_notify (G_OBJECT (stream), "eof"); - stream->state = SWFDEC_STREAM_STATE_CLOSED; swfdec_stream_queue_processing (stream); } diff --git a/libswfdec/swfdec_stream.h b/libswfdec/swfdec_stream.h index 15587fc..fb45b53 100644 --- a/libswfdec/swfdec_stream.h +++ b/libswfdec/swfdec_stream.h @@ -28,6 +28,7 @@ G_BEGIN_DECLS typedef struct _SwfdecStream SwfdecStream; typedef struct _SwfdecStreamClass SwfdecStreamClass; +typedef struct _SwfdecStreamPrivate SwfdecStreamPrivate; #define SWFDEC_TYPE_STREAM (swfdec_stream_get_type()) #define SWFDEC_IS_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_STREAM)) @@ -41,13 +42,7 @@ struct _SwfdecStream GObject object; /*< private >*/ - SwfdecPlayer * player; /* player to queue target notificaions in */ - gpointer target; /* SwfdecStreamTarget that gets notified about loading progress */ - guint state; /* SwfdecStreamState the stream is currently in */ - guint processed_state;/* SwfdecStreamState the target knows about */ - gboolean queued; /* TRUE if we have queued an action already */ - char * error; /* error message if in error state or NULL */ - SwfdecBufferQueue * queue; /* SwfdecBufferQueue managing the input buffers */ + SwfdecStreamPrivate * priv; }; struct _SwfdecStreamClass diff --git a/libswfdec/swfdec_stream_target.c b/libswfdec/swfdec_stream_target.c index 8593fcb..a5d7184 100644 --- a/libswfdec/swfdec_stream_target.c +++ b/libswfdec/swfdec_stream_target.c @@ -82,7 +82,7 @@ swfdec_stream_target_open (SwfdecStreamTarget *target, SwfdecStream *stream) g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); g_return_if_fail (SWFDEC_IS_STREAM (stream)); - SWFDEC_LOG ("opening %s (state %u)", swfdec_stream_describe (stream), stream->state); + SWFDEC_LOG ("opening %s", swfdec_stream_describe (stream)); iface = SWFDEC_STREAM_TARGET_GET_INTERFACE (target); if (iface->open) @@ -97,7 +97,7 @@ swfdec_stream_target_parse (SwfdecStreamTarget *target, SwfdecStream *stream) g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); g_return_if_fail (SWFDEC_IS_STREAM (stream)); - SWFDEC_LOG ("parsing %s (state %u)", swfdec_stream_describe (stream), stream->state); + SWFDEC_LOG ("parsing %s", swfdec_stream_describe (stream)); iface = SWFDEC_STREAM_TARGET_GET_INTERFACE (target); if (iface->parse) @@ -112,7 +112,7 @@ swfdec_stream_target_close (SwfdecStreamTarget *target, SwfdecStream *stream) g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); g_return_if_fail (SWFDEC_IS_STREAM (stream)); - SWFDEC_LOG ("close on %s (state %u)", swfdec_stream_describe (stream), stream->state); + SWFDEC_LOG ("close on %s", swfdec_stream_describe (stream)); iface = SWFDEC_STREAM_TARGET_GET_INTERFACE (target); if (iface->close) @@ -127,7 +127,7 @@ swfdec_stream_target_error (SwfdecStreamTarget *target, SwfdecStream *stream) g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); g_return_if_fail (SWFDEC_IS_STREAM (stream)); - SWFDEC_LOG ("error on %s (state %u)", swfdec_stream_describe (stream), stream->state); + SWFDEC_LOG ("error on %s", swfdec_stream_describe (stream)); iface = SWFDEC_STREAM_TARGET_GET_INTERFACE (target); if (iface->error) commit ca02fc6414eedfa5c1a851afddfd9cb9f20907ac Author: Benjamin Otte <otte at gnome.org> Date: Sat Jan 5 11:17:54 2008 +0100 add a new SwfdecStream class This is supposed to end up as the base class for sockets and loaders diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 4f2d438..a8e2cf6 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -127,11 +127,13 @@ libswfdec_source_files = \ swfdec_shared_object.c \ swfdec_sound.c \ swfdec_sound_object.c \ - swfdec_stroke.c \ swfdec_sprite.c \ swfdec_sprite_movie.c \ swfdec_sprite_movie_as.c \ swfdec_stage_as.c \ + swfdec_stream.c \ + swfdec_stream_target.c \ + swfdec_stroke.c \ swfdec_style_sheet.c \ swfdec_swf_decoder.c \ swfdec_system.c \ @@ -193,6 +195,7 @@ public_headers = \ swfdec_player_scripting.h \ swfdec_rectangle.h \ swfdec_script.h \ + swfdec_stream.h \ swfdec_system.h \ swfdec_url.h @@ -273,9 +276,10 @@ noinst_HEADERS = \ swfdec_sound_object.h \ swfdec_sprite.h \ swfdec_sprite_movie.h \ - swfdec_style_sheet.h \ swfdec_swf_decoder.h \ + swfdec_stream_target.h \ swfdec_stroke.h \ + swfdec_style_sheet.h \ swfdec_tag.h \ swfdec_text.h \ swfdec_text_format.h \ diff --git a/libswfdec/swfdec.h b/libswfdec/swfdec.h index 1a9a4ca..8cb955a 100644 --- a/libswfdec/swfdec.h +++ b/libswfdec/swfdec.h @@ -40,6 +40,7 @@ #include <libswfdec/swfdec_player.h> #include <libswfdec/swfdec_player_scripting.h> #include <libswfdec/swfdec_rectangle.h> +#include <libswfdec/swfdec_stream.h> #include <libswfdec/swfdec_system.h> #include <libswfdec/swfdec_url.h> diff --git a/libswfdec/swfdec_loader_internal.h b/libswfdec/swfdec_loader_internal.h index 49ab95d..0a835d4 100644 --- a/libswfdec/swfdec_loader_internal.h +++ b/libswfdec/swfdec_loader_internal.h @@ -22,6 +22,7 @@ #include "swfdec_loader.h" #include "swfdec_loadertarget.h" +#include "swfdec_stream_target.h" G_BEGIN_DECLS @@ -34,6 +35,13 @@ typedef enum { SWFDEC_LOADER_STATE_ERROR /* loader is in error state */ } SwfdecLoaderState; +/* swfdec_stream.c */ +const char * swfdec_stream_describe (SwfdecStream * stream); +void swfdec_stream_close (SwfdecStream * stream); +void swfdec_stream_set_target (SwfdecStream * stream, + SwfdecStreamTarget * target); + +/* swfdec_loader.c */ SwfdecLoader * swfdec_loader_load (SwfdecLoader * loader, const SwfdecURL * url, SwfdecLoaderRequest request, diff --git a/libswfdec/swfdec_stream.c b/libswfdec/swfdec_stream.c new file mode 100644 index 0000000..c6bcc98 --- /dev/null +++ b/libswfdec/swfdec_stream.c @@ -0,0 +1,362 @@ +/* Swfdec + * Copyright (C) 2006-2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> +#include "swfdec_loader_internal.h" +#include "swfdec_buffer.h" +#include "swfdec_debug.h" +#include "swfdec_stream_target.h" +#include "swfdec_player_internal.h" + +/*** gtk-doc ***/ + +/** + * SECTION:SwfdecStream + * @title: SwfdecStream + * @short_description: object used for input + * + * SwfdecStream is the base class used for communication inside Swfdec. If you + * are a UNIX developer, think of this class as the equivalent to a file + * descriptor. #SwfdecLoader and #SwfdecSocket are the subclasses supposed to + * be used for files or network sockets, respectively. + * + * This class provides the functions necessary to implement subclasses of + * streams. None of the functions described in this section should be used by + * anything but subclass implementations. Consider them "protected". + */ + +/** + * SwfdecStream: + * + * This is the base object used for providing input. It is abstract, use a + * subclass to provide your input. All members are considered private. + */ + +/** + * SwfdecStreamClass: + * @describe: Provide a string describing your string. Default implementations + * of this function exist for both the #SwfdecLoader and + * #SwfdecStream subclasses. They return the URL for the stream. + * @close: Called when Swfdec requests that the stream be closed. After this + * function was called, Swfdec will consider the stream finished and + * will not ever read data from it again. + * + * This is the base class used for providing input. You are supposed to create + * a subclass that fills in the function pointers mentioned above. + */ + +/*** SwfdecStream ***/ + +typedef enum { + SWFDEC_STREAM_STATE_CONNECTING = 0, /* stream is still in the process of establishing a connection */ + SWFDEC_STREAM_STATE_OPEN, /* stream is open and data flow is happening */ + SWFDEC_STREAM_STATE_CLOSED, /* loader has been closed */ + SWFDEC_STREAM_STATE_ERROR /* loader is in error state */ +} SwfdecStreamState; + +enum { + PROP_0, + PROP_ERROR, + PROP_OPEN, + PROP_EOF +}; + +G_DEFINE_ABSTRACT_TYPE (SwfdecStream, swfdec_stream, G_TYPE_OBJECT) + +static void +swfdec_stream_get_property (GObject *object, guint param_id, GValue *value, + GParamSpec * pspec) +{ + SwfdecStream *stream = SWFDEC_STREAM (object); + + switch (param_id) { + case PROP_ERROR: + g_value_set_string (value, stream->error); + break; + case PROP_OPEN: + g_value_set_boolean (value, stream->state == SWFDEC_STREAM_STATE_OPEN); + break; + case PROP_EOF: + g_value_set_boolean (value, stream->state == SWFDEC_STREAM_STATE_CLOSED); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +swfdec_stream_set_property (GObject *object, guint param_id, const GValue *value, + GParamSpec *pspec) +{ + //SwfdecStream *stream = SWFDEC_STREAM (object); + + switch (param_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +swfdec_stream_dispose (GObject *object) +{ + SwfdecStream *stream = SWFDEC_STREAM (object); + + /* targets are supposed to keep a reference around */ + g_assert (stream->target == NULL); + if (stream->queue) { + swfdec_buffer_queue_unref (stream->queue); + stream->queue = NULL; + } + g_free (stream->error); + stream->error = NULL; + + G_OBJECT_CLASS (swfdec_stream_parent_class)->dispose (object); +} + +static void +swfdec_stream_class_init (SwfdecStreamClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = swfdec_stream_dispose; + object_class->get_property = swfdec_stream_get_property; + object_class->set_property = swfdec_stream_set_property; + + g_object_class_install_property (object_class, PROP_ERROR, + g_param_spec_string ("error", "error", "NULL when no error or string describing error", + NULL, G_PARAM_READABLE)); + g_object_class_install_property (object_class, PROP_OPEN, + g_param_spec_boolean ("eof", "eof", "TRUE while data is flowing", + FALSE, G_PARAM_READABLE)); + g_object_class_install_property (object_class, PROP_EOF, + g_param_spec_boolean ("eof", "eof", "TRUE when all data has been transmitted", + FALSE, G_PARAM_READABLE)); +} + +static void +swfdec_stream_init (SwfdecStream *stream) +{ + stream->queue = swfdec_buffer_queue_new (); +} + +/*** INTERNAL API ***/ + +static void +swfdec_stream_process (gpointer streamp, gpointer unused) +{ + SwfdecStream *stream = streamp; + + g_assert (stream->target != NULL); + + stream->queued = FALSE; + if (stream->state == stream->processed_state && + stream->state != SWFDEC_STREAM_STATE_OPEN) + return; + g_assert (stream->state != SWFDEC_STREAM_STATE_CLOSED); + g_object_ref (stream); + if (stream->state == SWFDEC_STREAM_STATE_ERROR) { + swfdec_stream_target_error (stream->target, stream); + } else { + while (stream->state != stream->processed_state) { + if (stream->processed_state == SWFDEC_STREAM_STATE_CONNECTING) { + stream->processed_state = SWFDEC_STREAM_STATE_OPEN; + swfdec_stream_target_open (stream->target, stream); + } else if (stream->processed_state == SWFDEC_STREAM_STATE_OPEN) { + stream->processed_state = SWFDEC_STREAM_STATE_CLOSED; + swfdec_stream_target_close (stream->target, stream); + } + } + if (stream->processed_state == SWFDEC_STREAM_STATE_OPEN) { + swfdec_stream_target_parse (stream->target, stream); + } + } + g_object_unref (stream); +} + +static void +swfdec_stream_queue_processing (SwfdecStream *stream) +{ + if (stream->queued) + return; + stream->queued = TRUE; + if (stream->target) { + g_assert (stream->player); + swfdec_player_add_external_action (stream->player, stream, + swfdec_stream_process, NULL); + } +} + +void +swfdec_stream_close (SwfdecStream *stream) +{ + SwfdecStreamClass *klass; + + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + + if (stream->state == SWFDEC_STREAM_STATE_ERROR && + stream->state == SWFDEC_STREAM_STATE_CLOSED) + return; + + klass = SWFDEC_STREAM_GET_CLASS (stream); + + if (klass->close) + klass->close (stream); + stream->state = SWFDEC_STREAM_STATE_CLOSED; + stream->processed_state = SWFDEC_STREAM_STATE_CLOSED; +} + +void +swfdec_stream_set_target (SwfdecStream *stream, SwfdecStreamTarget *target) +{ + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + if (target != NULL) { + g_return_if_fail (stream->processed_state == SWFDEC_STREAM_STATE_CONNECTING); + g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); + } + + if (stream->target) { + swfdec_player_remove_all_external_actions (stream->player, stream); + } + stream->queued = FALSE; + stream->target = target; + if (target) { + stream->player = swfdec_stream_target_get_player (target); + if (stream->state != SWFDEC_STREAM_STATE_CONNECTING) + swfdec_stream_queue_processing (stream); + } else { + stream->player = NULL; + } +} + +/** PUBLIC API ***/ + +/** + * swfdec_stream_describe: + * @stream: a #SwfdecStream + * + * Describes the stream in a simple string. This is mostly useful for debugging + * purposes. + * + * Returns: a constant string describing the stream + **/ +const char * +swfdec_stream_describe (SwfdecStream *stream) +{ + SwfdecStreamClass *klass; + + g_return_val_if_fail (SWFDEC_IS_STREAM (stream), NULL); + + klass = SWFDEC_STREAM_GET_CLASS (stream); + g_return_val_if_fail (klass->describe, NULL); + + return klass->describe (stream); +} + +/** + * swfdec_stream_error: + * @stream: a #SwfdecStream + * @error: a string describing the error + * + * Moves the stream in the error state if it wasn't before. A stream that is in + * the error state will not process any more data. Also, internal error + * handling scripts may be executed. + **/ +void +swfdec_stream_error (SwfdecStream *stream, const char *error) +{ + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + g_return_if_fail (error != NULL); + + if (stream->error) { + SWFDEC_ERROR ("another error in stream for %s: %s", swfdec_stream_describe (stream), error); + return; + } + + SWFDEC_ERROR ("error in stream for %s: %s", swfdec_stream_describe (stream), error); + stream->state = SWFDEC_STREAM_STATE_ERROR; + stream->error = g_strdup (error); + swfdec_stream_queue_processing (stream); +} + +/** + * swfdec_stream_open: + * @stream: a #SwfdecStream + * + * Call this function when your stream opened the resulting file. For HTTP this + * is when having received the headers. You must call this function before + * swfdec_stream_push() can be called. + **/ +void +swfdec_stream_open (SwfdecStream *stream, const char *url) +{ + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + g_return_if_fail (stream->state == SWFDEC_STREAM_STATE_CONNECTING); + + stream->state = SWFDEC_STREAM_STATE_OPEN; + g_object_notify (G_OBJECT (stream), "open"); + swfdec_stream_queue_processing (stream); +} + +/** + * swfdec_stream_push: + * @stream: a #SwfdecStream + * @buffer: new data to make available. The stream takes the reference + * to the buffer. + * + * Makes the data in @buffer available to @stream and processes it. The @stream + * must be open. + **/ +void +swfdec_stream_push (SwfdecStream *stream, SwfdecBuffer *buffer) +{ + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + g_return_if_fail (stream->state == SWFDEC_STREAM_STATE_OPEN); + g_return_if_fail (buffer != NULL); + + swfdec_buffer_queue_push (stream->queue, buffer); + /* FIXME */ + if (SWFDEC_IS_LOADER (stream)) + g_object_notify (G_OBJECT (stream), "loaded"); + swfdec_stream_queue_processing (stream); +} + +/** + * swfdec_stream_eof: + * @stream: a #SwfdecStream + * + * Indicates to @stream that no more data will follow. The stream must be open. + **/ +void +swfdec_stream_eof (SwfdecStream *stream) +{ + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + g_return_if_fail (stream->state == SWFDEC_STREAM_STATE_OPEN); + + g_object_notify (G_OBJECT (stream), "open"); + g_object_notify (G_OBJECT (stream), "eof"); + stream->state = SWFDEC_STREAM_STATE_CLOSED; + swfdec_stream_queue_processing (stream); +} + diff --git a/libswfdec/swfdec_stream.h b/libswfdec/swfdec_stream.h new file mode 100644 index 0000000..15587fc --- /dev/null +++ b/libswfdec/swfdec_stream.h @@ -0,0 +1,75 @@ +/* Swfdec + * Copyright (C) 2006-2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef _SWFDEC_STREAM_H_ +#define _SWFDEC_STREAM_H_ + +#include <glib-object.h> +#include <libswfdec/swfdec_buffer.h> +#include <libswfdec/swfdec_player.h> + +G_BEGIN_DECLS + +typedef struct _SwfdecStream SwfdecStream; +typedef struct _SwfdecStreamClass SwfdecStreamClass; + +#define SWFDEC_TYPE_STREAM (swfdec_stream_get_type()) +#define SWFDEC_IS_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_STREAM)) +#define SWFDEC_IS_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SWFDEC_TYPE_STREAM)) +#define SWFDEC_STREAM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_STREAM, SwfdecStream)) +#define SWFDEC_STREAM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SWFDEC_TYPE_STREAM, SwfdecStreamClass)) +#define SWFDEC_STREAM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SWFDEC_TYPE_STREAM, SwfdecStreamClass)) + +struct _SwfdecStream +{ + GObject object; + + /*< private >*/ + SwfdecPlayer * player; /* player to queue target notificaions in */ + gpointer target; /* SwfdecStreamTarget that gets notified about loading progress */ + guint state; /* SwfdecStreamState the stream is currently in */ + guint processed_state;/* SwfdecStreamState the target knows about */ + gboolean queued; /* TRUE if we have queued an action already */ + char * error; /* error message if in error state or NULL */ + SwfdecBufferQueue * queue; /* SwfdecBufferQueue managing the input buffers */ +}; + +struct _SwfdecStreamClass +{ + GObjectClass object_class; + + /* get a nice description string */ + const char * (* describe) (SwfdecStream * stream); + /* close the stream. */ + void (* close) (SwfdecStream * stream); +}; + +GType swfdec_stream_get_type (void); + +void swfdec_stream_open (SwfdecStream * stream, + const char * url); +void swfdec_stream_push (SwfdecStream * stream, + SwfdecBuffer * buffer); +void swfdec_stream_eof (SwfdecStream * stream); +void swfdec_stream_error (SwfdecStream * stream, + const char * error); + + +G_END_DECLS +#endif diff --git a/libswfdec/swfdec_stream_target.c b/libswfdec/swfdec_stream_target.c new file mode 100644 index 0000000..8593fcb --- /dev/null +++ b/libswfdec/swfdec_stream_target.c @@ -0,0 +1,136 @@ +/* Swfdec + * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "swfdec_stream_target.h" +#include "swfdec_debug.h" +#include "swfdec_loader_internal.h" +#include "swfdec_player_internal.h" + +static void +swfdec_stream_target_base_init (gpointer g_class) +{ + static gboolean initialized = FALSE; + + if (G_UNLIKELY (!initialized)) { + initialized = TRUE; + } +} + +GType +swfdec_stream_target_get_type (void) +{ + static GType stream_target_type = 0; + + if (!stream_target_type) { + static const GTypeInfo stream_target_info = { + sizeof (SwfdecStreamTargetInterface), + swfdec_stream_target_base_init, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + NULL, + }; + + stream_target_type = g_type_register_static (G_TYPE_INTERFACE, + "SwfdecStreamTarget", &stream_target_info, 0); + g_type_interface_add_prerequisite (stream_target_type, G_TYPE_OBJECT); + } + + return stream_target_type; +} + +SwfdecPlayer * +swfdec_stream_target_get_player (SwfdecStreamTarget *target) +{ + SwfdecStreamTargetInterface *iface; + + g_return_val_if_fail (SWFDEC_IS_STREAM_TARGET (target), NULL); + + iface = SWFDEC_STREAM_TARGET_GET_INTERFACE (target); + g_assert (iface->get_player != NULL); + return iface->get_player (target); +} + +void +swfdec_stream_target_open (SwfdecStreamTarget *target, SwfdecStream *stream) +{ + SwfdecStreamTargetInterface *iface; + + g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + + SWFDEC_LOG ("opening %s (state %u)", swfdec_stream_describe (stream), stream->state); + + iface = SWFDEC_STREAM_TARGET_GET_INTERFACE (target); + if (iface->open) + iface->open (target, stream); +} + +void +swfdec_stream_target_parse (SwfdecStreamTarget *target, SwfdecStream *stream) +{ + SwfdecStreamTargetInterface *iface; + + g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + + SWFDEC_LOG ("parsing %s (state %u)", swfdec_stream_describe (stream), stream->state); + + iface = SWFDEC_STREAM_TARGET_GET_INTERFACE (target); + if (iface->parse) + iface->parse (target, stream); +} + +void +swfdec_stream_target_close (SwfdecStreamTarget *target, SwfdecStream *stream) +{ + SwfdecStreamTargetInterface *iface; + + g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + + SWFDEC_LOG ("close on %s (state %u)", swfdec_stream_describe (stream), stream->state); + + iface = SWFDEC_STREAM_TARGET_GET_INTERFACE (target); + if (iface->close) + iface->close (target, stream); +} + +void +swfdec_stream_target_error (SwfdecStreamTarget *target, SwfdecStream *stream) +{ + SwfdecStreamTargetInterface *iface; + + g_return_if_fail (SWFDEC_IS_STREAM_TARGET (target)); + g_return_if_fail (SWFDEC_IS_STREAM (stream)); + + SWFDEC_LOG ("error on %s (state %u)", swfdec_stream_describe (stream), stream->state); + + iface = SWFDEC_STREAM_TARGET_GET_INTERFACE (target); + if (iface->error) + iface->error (target, stream); +} + diff --git a/libswfdec/swfdec_stream_target.h b/libswfdec/swfdec_stream_target.h new file mode 100644 index 0000000..42b8e16 --- /dev/null +++ b/libswfdec/swfdec_stream_target.h @@ -0,0 +1,67 @@ +/* Swfdec + * Copyright (C) 2007-2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifndef __SWFDEC_STREAM_TARGET_H__ +#define __SWFDEC_STREAM_TARGET_H__ + +#include <libswfdec/swfdec.h> + +G_BEGIN_DECLS + + +#define SWFDEC_TYPE_STREAM_TARGET (swfdec_stream_target_get_type ()) +#define SWFDEC_STREAM_TARGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SWFDEC_TYPE_STREAM_TARGET, SwfdecStreamTarget)) +#define SWFDEC_IS_STREAM_TARGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SWFDEC_TYPE_STREAM_TARGET)) +#define SWFDEC_STREAM_TARGET_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), SWFDEC_TYPE_STREAM_TARGET, SwfdecStreamTargetInterface)) + +typedef struct _SwfdecStreamTarget SwfdecStreamTarget; /* dummy object */ +typedef struct _SwfdecStreamTargetInterface SwfdecStreamTargetInterface; + +struct _SwfdecStreamTargetInterface { + GTypeInterface parent; + + /* mandatory vfunc */ + SwfdecPlayer * (* get_player) (SwfdecStreamTarget * target); + /* optional vfuncs */ + void (* open) (SwfdecStreamTarget * target, + SwfdecStream * stream); + void (* parse) (SwfdecStreamTarget * target, + SwfdecStream * stream); + void (* close) (SwfdecStreamTarget * target, + SwfdecStream * stream); + void (* error) (SwfdecStreamTarget * target, + SwfdecStream * stream); +}; + +GType swfdec_stream_target_get_type (void) G_GNUC_CONST; + +SwfdecPlayer * swfdec_stream_target_get_player (SwfdecStreamTarget * target); +void swfdec_stream_target_open (SwfdecStreamTarget * target, + SwfdecStream * stream); +void swfdec_stream_target_parse (SwfdecStreamTarget * target, + SwfdecStream * stream); +void swfdec_stream_target_close (SwfdecStreamTarget * target, + SwfdecStream * stream); +void swfdec_stream_target_error (SwfdecStreamTarget * target, + SwfdecStream * stream); + + +G_END_DECLS + +#endif /* __SWFDEC_STREAM_TARGET_H__ */ commit 5c0f95cba76370f852b72592c2f7c43c65f17d00 Author: Benjamin Otte <otte at gnome.org> Date: Fri Jan 4 19:17:36 2008 +0100 add rtmp test directory and a first stab at a server application diff --git a/configure.ac b/configure.ac index 25bb286..69504cd 100644 --- a/configure.ac +++ b/configure.ac @@ -354,6 +354,7 @@ player/Makefile test/Makefile test/custom/Makefile test/image/Makefile +test/rtmp/Makefile test/sound/Makefile test/trace/Makefile test/various/Makefile diff --git a/test/rtmp/.gitignore b/test/rtmp/.gitignore new file mode 100644 index 0000000..804265c --- /dev/null +++ b/test/rtmp/.gitignore @@ -0,0 +1,10 @@ +*~ +.deps +.libs + +Makefile +Makefile.in +*.lo +*.o + +rtmp-server diff --git a/test/rtmp/Makefile.am b/test/rtmp/Makefile.am new file mode 100644 index 0000000..c9c633b --- /dev/null +++ b/test/rtmp/Makefile.am @@ -0,0 +1,9 @@ +noinst_PROGRAMS = rtmp-server + +check_PROGRAMS = sound +TESTS = $(check_PROGRAMS) + +rtmp_server_SOURCES = rtmp_server.c +rtmp_server_CFLAGS = $(GLOBAL_CFLAGS) $(HTTP_CFLAGS) $(SWFDEC_CFLAGS) $(CAIRO_CFLAGS) +rtmp_server_LDFLAGS = $(SWFDEC_LIBS) $(HTTP_LIBS) $(CAIRO_LIBS) + diff --git a/test/rtmp/rtmp_server.c b/test/rtmp/rtmp_server.c new file mode 100644 index 0000000..2a26675 --- /dev/null +++ b/test/rtmp/rtmp_server.c @@ -0,0 +1,83 @@ +/* Swfdec + * Copyright (C) 2008 Benjamin Otte <otte at gnome.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include <libsoup/soup.h> +#include <libsoup/soup-address.h> +#include <libswfdec/swfdec.h> + +static void +hexdump (SwfdecBuffer *buffer) +{ + guint i; + + for (i = 0; i < buffer->length; i++) { + g_print ("%02X%s", buffer->data[i], i % 8 == 7 ? "\n" : (i % 4 == 3 ? " " : " ")); + } + if (i % 8) + g_print ("\n"); +} + +static void +do_read (SoupSocket *conn, gpointer unused) +{ + SwfdecBuffer *buf; + SoupSocketIOStatus status; + + buf = swfdec_buffer_new_and_alloc (16); + while ((status = soup_socket_read (conn, buf->data, buf->length, &buf->length)) == SOUP_SOCKET_OK) { + hexdump (buf); + buf->length = 16; + } + swfdec_buffer_unref (buf); + g_print ("status: %u\n", (guint) status); +} + +static void +new_connection (SoupSocket *server, SoupSocket *conn, gpointer unused) +{ + g_print ("WOOT!\n"); + g_signal_connect (conn, "readable", G_CALLBACK (do_read), NULL); + do_read (conn, NULL); +} + +int +main (int argc, char **argv) +{ + GMainLoop *loop; + SoupSocket *server; + SoupAddress *address; + + swfdec_init (); + + address = soup_address_new_any (SOUP_ADDRESS_FAMILY_IPV4, 1935); + server = soup_socket_new ("non-blocking", TRUE, NULL); + soup_socket_listen (server, address); + g_signal_connect (server, "new-connection", G_CALLBACK (new_connection), NULL); + g_object_unref (address); + + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + g_main_loop_unref (loop); + + return 0; +} +
Apparently Analagous Threads
- 36 commits - libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_date.c libswfdec/swfdec_as_initialize.as libswfdec/swfdec_as_initialize.h libswfdec/swfdec_as_strings.c libswfdec/swfdec_flash_security.c
- 3 commits - libswfdec/swfdec_as_function.c libswfdec/swfdec_as_initialize.as libswfdec/swfdec_as_initialize.h libswfdec/swfdec_as_object.c
- 19 commits - libswfdec/swfdec_audio_event.c libswfdec/swfdec_bits.c libswfdec/swfdec_color.c libswfdec/swfdec_color.h libswfdec/swfdec_flv_decoder.c libswfdec/swfdec_image.c libswfdec/swfdec_initialize.as libswfdec/swfdec_initialize.h
- 9 commits - libswfdec/swfdec_as_function.c libswfdec/swfdec_as_initialize.as libswfdec/swfdec_as_initialize.h libswfdec/swfdec_as_object.c libswfdec/swfdec_as_strings.c libswfdec/swfdec_player_as.c test/trace
- 20 commits - libswfdec/swfdec_as_function.c libswfdec/swfdec_as_string.c libswfdec/swfdec_initialize.as libswfdec/swfdec_initialize.h libswfdec/swfdec_load_object_as.c libswfdec/swfdec_movie_as_drawing.c libswfdec/swfdec_player_as.c