#region ParseTags
        private void ParseTags()
        {
            SwfActionId id = ((SwfActionId)r.GetByte());
            while(id != SwfActionId.End)
            {
                switch(id)
                {   

    // Version 3 Tags
                    case SwfActionId.GotoFrame :
                    {
                        ParseGotoFrame();
                        break;
                    }   
                    case SwfActionId.GetURL :
                    {
                        ParseGetURL();
                        break;
                    }   
                    case SwfActionId.NextFrame :
                    {
                        actions.Add(new NextFrameAction());
                        break;
                    }   
                    case SwfActionId.PreviousFrame :
                    {
                        actions.Add(new PreviousFrameAction());
                        break;
                    }   
                    case SwfActionId.Play :
                    {
                        actions.Add(new PlayAction());
                        break;
                    }   
                    case SwfActionId.Stop :
                    {
                        actions.Add(new StopAction());
                        break;
                    }   
                    case SwfActionId.ToggleQuality :
                    {
                        actions.Add(new ToggleQualityAction());
                        break;
                    }   
                    case SwfActionId.StopSounds :
                    {
                        actions.Add(new StopSoundsAction());
                        break;
                    }   
                    case SwfActionId.WaitForFrame :
                    {
                        ParseWaitForFrame();
                        break;
                    }   
                    case SwfActionId.SetTarget :
                    {
                        ParseSetTarget();
                        break;
                    }   
                    case SwfActionId.GoToLabel :
                    {
                        ParseGoToLabel();
                        break;
                    }   


    // Version 4 Tags
                    case SwfActionId.Add :
                    {
                        actions.Add(new AddAction());
                        break;
                    }   
                    case SwfActionId.Divide :
                    {
                        actions.Add(new DivideAction());
                        break;
                    }   
                    case SwfActionId.Multiply :
                    {
                        actions.Add(new MultiplyAction());
                        break;
                    }   
                    case SwfActionId.Subtract :
                    {
                        actions.Add(new SubtractAction());
                        break;
                    }   

                    case SwfActionId.Equals :
                    {
                        actions.Add(new EqualsAction());
                        break;
                    }   
                    case SwfActionId.Less :
                    {
                        actions.Add(new LessAction());
                        break;
                    }   

                    case SwfActionId.And :
                    {
                        actions.Add(new AndAction());
                        break;
                    }   
                    case SwfActionId.Not :
                    {
                        actions.Add(new NotAction());
                        break;
                    }   
                    case SwfActionId.Or :
                    {
                        actions.Add(new OrAction());
                        break;
                    }   

                    case SwfActionId.StringAdd :
                    {
                        actions.Add(new StringAddAction());
                        break;
                    }   
                    case SwfActionId.StringEquals :
                    {
                        actions.Add(new StringEqualsAction());
                        break;
                    }   
                    case SwfActionId.StringExtract :
                    {
                        actions.Add(new StringExtractAction());
                        break;
                    }   
                    case SwfActionId.StringLength :
                    {
                        actions.Add(new StringLengthAction());
                        break;
                    }   
                    case SwfActionId.MBStringExtract :
                    {
                        actions.Add(new MBStringExtractAction());
                        break;
                    }   
                    case SwfActionId.MBStringLength :
                    {
                        actions.Add(new MBStringLengthAction());
                        break;
                    }   
                    case SwfActionId.StringLess :
                    {
                        actions.Add(new StringLessAction());
                        break;
                    }   

                    case SwfActionId.Pop :
                    {
                        actions.Add(new PopAction());
                        break;
                    }   
                    case SwfActionId.Push :
                    {
                        ParsePush();
                        break;
                    }   

                    case SwfActionId.AsciiToChar :
                    {
                        actions.Add(new AsciiToCharAction());
                        break;
                    }   
                    case SwfActionId.CharToAscii :
                    {
                        actions.Add(new CharToAsciiAction());
                        break;
                    }   
                    case SwfActionId.ToInteger :
                    {
                        actions.Add(new ToIntegerAction());
                        break;
                    }   
                    case SwfActionId.MBAsciiToChar :
                    {
                        actions.Add(new MBAsciiToCharAction());
                        break;
                    }   
                    case SwfActionId.MBCharToAscii :
                    {
                        actions.Add(new MBCharToAsciiAction());
                        break;
                    }   

                    case SwfActionId.If :
                    {
                        ParseIf();
                        break;
                    }   
                    case SwfActionId.Jump :
                    {
                        ParseJump();
                        break;
                    }   
                    case SwfActionId.Call :
                    {
                        actions.Add(new CallAction());
                        break;
                    }   

                    case SwfActionId.GetVariable :
                    {
                        actions.Add(new GetVariableAction());
                        break;
                    }   
                    case SwfActionId.SetVariable :
                    {
                        actions.Add(new SetVariableAction());
                        break;
                    }   

                    case SwfActionId.GetURL2 :
                    {
                        ParseGetURL2();
                        break;
                    }   
                    case SwfActionId.GetProperty :
                    {
                        actions.Add(new GetPropertyAction());
                        break;
                    }   
                    case SwfActionId.GotoFrame2 :
                    {
                        ParseGotoFrame2();
                        break;
                    }   
                    case SwfActionId.RemoveSprite :
                    {
                        actions.Add(new RemoveSpriteAction());
                        break;
                    }   
                    case SwfActionId.SetProperty :
                    {
                        actions.Add(new SetPropertyAction());
                        break;
                    }   
                    case SwfActionId.SetTarget2 :
                    {
                        actions.Add(new SetTarget2Action());
                        break;
                    }   
                    case SwfActionId.StartDrag :
                    {
                        actions.Add(new StartDragAction());
                        break;
                    }   
                    case SwfActionId.WaitForFrame2 :
                    {
                        ParseWaitForFrame2();
                        break;
                    }   
                    case SwfActionId.CloneSprite :
                    {
                        actions.Add(new CloneSpriteAction());
                        break;
                    }   
                    case SwfActionId.EndDrag :
                    {
                        actions.Add(new EndDragAction());
                        break;
                    }   

                    case SwfActionId.GetTime :
                    {
                        actions.Add(new GetTimeAction());
                        break;
                    }   
                    case SwfActionId.RandomNumber :
                    {
                        actions.Add(new RandomNumberAction());
                        break;
                    }   
                    case SwfActionId.Trace :
                    {
                        actions.Add(new TraceAction());
                        break;
                    }   


    // Version 5 Tags
                    case SwfActionId.CallFunction :
                    {
                        actions.Add(new CallFunctionAction());
                        break;
                    }   
                    case SwfActionId.CallMethod :
                    {
                        actions.Add(new CallMethodAction());
                        break;
                    }   
                    case SwfActionId.ConstantPool :
                    {
                        ParseConstantPool();
                        break;
                    }   
                    case SwfActionId.DefineFunction :
                    {
                        ParseDefineFunction();
                        break;
                    }   
                    case SwfActionId.DefineLocal :
                    {
                        actions.Add(new DefineLocalAction());
                        break;
                    }   
                    case SwfActionId.DefineLocal2 :
                    {
                        actions.Add(new DefineLocal2Action());
                        break;
                    }   
                    case SwfActionId.Delete :
                    {
                        actions.Add(new DeleteAction());
                        break;
                    }   
                    case SwfActionId.Delete2 :
                    {
                        actions.Add(new Delete2Action());
                        break;
                    }   
                    case SwfActionId.Enumerate :
                    {
                        actions.Add(new EnumerateAction());
                        break;
                    }   
                    case SwfActionId.Equals2 :
                    {
                        actions.Add(new Equals2Action());
                        break;
                    }   
                    case SwfActionId.GetMember :
                    {
                        actions.Add(new GetMemberAction());
                        break;
                    }   
                    case SwfActionId.InitArray :
                    {
                        actions.Add(new InitArrayAction());
                        break;
                    }   
                    case SwfActionId.InitObject :
                    {
                        actions.Add(new InitObjectAction());
                        break;
                    }   
                    case SwfActionId.NewMethod :
                    {
                        actions.Add(new NewMethodAction());
                        break;
                    }   
                    case SwfActionId.NewObject :
                    {
                        actions.Add(new NewObjectAction());
                        break;
                    }   
                    case SwfActionId.SetMember :
                    {
                        actions.Add(new SetMemberAction());
                        break;
                    }   
                    case SwfActionId.TargetPath :
                    {
                        actions.Add(new TargetPathAction());
                        break;
                    }   
                    case SwfActionId.With :
                    {
                        ParseWith();
                        break;
                    }   

                    case SwfActionId.ToNumber :
                    {
                        actions.Add(new ToNumberAction());
                        break;
                    }   
                    case SwfActionId.ToString :
                    {
                        actions.Add(new ToStringAction());
                        break;
                    }   
                    case SwfActionId.TypeOf :
                    {
                        actions.Add(new TypeOfAction());
                        break;
                    }   

                    case SwfActionId.Add2 :
                    {
                        actions.Add(new Add2Action());
                        break;
                    }   
                    case SwfActionId.Less2 :
                    {
                        actions.Add(new Less2Action());
                        break;
                    }   
                    case SwfActionId.Modulo :
                    {
                        actions.Add(new ModuloAction());
                        break;
                    }   

                    case SwfActionId.BitAnd :
                    {
                        actions.Add(new BitAndAction());
                        break;
                    }   
                    case SwfActionId.BitLShift :
                    {
                        actions.Add(new BitLShiftAction());
                        break;
                    }   
                    case SwfActionId.BitOr :
                    {
                        actions.Add(new BitOrAction());
                        break;
                    }   
                    case SwfActionId.BitRShift :
                    {
                        actions.Add(new BitRShiftAction());
                        break;
                    }   
                    case SwfActionId.BitURShift :
                    {
                        actions.Add(new BitURShiftAction());
                        break;
                    }   
                    case SwfActionId.BitXor :
                    {
                        actions.Add(new BitXorAction());
                        break;
                    }   
                    case SwfActionId.Decrement :
                    {
                        actions.Add(new DecrementAction());
                        break;
                    }   
                    case SwfActionId.Increment :
                    {
                        actions.Add(new IncrementAction());
                        break;
                    }   
                    case SwfActionId.PushDuplicate :
                    {
                        actions.Add(new PushDuplicateAction());
                        break;
                    }   
                    case SwfActionId.Return :
                    {
                        actions.Add(new ReturnAction());
                        break;
                    }   
                    case SwfActionId.StackSwap :
                    {
                        actions.Add(new StackSwapAction());
                        break;
                    }   
                    case SwfActionId.StoreRegister :
                    {
                        ParseStoreRegister();
                        break;
                    }   


    // Version 6 Tags
                    case SwfActionId.DoInitAction :
                    {
                        ParseDoInitAction();
                        break;
                    }   
                    case SwfActionId.InstanceOf :
                    {
                        actions.Add(new InstanceOfAction());
                        break;
                    }   
                    case SwfActionId.Enumerate2 :
                    {
                        actions.Add(new Enumerate2Action());
                        break;
                    }   
                    case SwfActionId.StrictEquals :
                    {
                        actions.Add(new StrictEqualsAction());
                        break;
                    }   
                    case SwfActionId.Greater :
                    {
                        actions.Add(new GreaterAction());
                        break;
                    }   
                    case SwfActionId.StringGreater :
                    {
                        actions.Add(new StringGreaterAction());
                        break;
                    }   


    // Version 7 Tags
                    case SwfActionId.DefineFunction2 :
                    {
                        ParseDefineFunction2();
                        break;
                    }   
                    case SwfActionId.Extends :
                    {
                        actions.Add(new ExtendsAction());
                        break;
                    }   
                    case SwfActionId.CastOp :
                    {
                        actions.Add(new CastOpAction());
                        break;
                    }   
                    case SwfActionId.ImplementsOp :
                    {
                        actions.Add(new ImplementsOpAction());
                        break;
                    }   
                    case SwfActionId.Try :
                    {
                        ParseTry();
                        break;
                    }   
                    case SwfActionId.Throw :
                    {
                        actions.Add(new ThrowAction());
                        break;
                    }   
                    default :
                    {
                        throw(new InvalidCastException(
                                "Invalid swf action tag: 0x" + ((byte)id).ToString("X2") ));
                    }
                }       
                id = ((SwfActionId)r.GetByte());
            }
        }
        #endregion

// temp
private object todo = new object();

        #region ParseGotoFrame
        private void ParseGotoFrame()
        {
            GotoFrameAction tag = new GotoFrameAction();

            tag.Length = r.GetUI16();
            tag.Frame = r.GetUI16();

            actions.Add(tag);
        }
        #endregion
        #region ParseGetURL
        private void ParseGetURL()
        {
            GetURLAction tag = new GetURLAction();

            tag.Length = r.GetUI16();
            tag.UrlString = r.GetString();
            tag.TargetString = r.GetString();

            actions.Add(tag);
        }
        #endregion
        #region ParseWaitForFrame
        private void ParseWaitForFrame()
        {
            WaitForFrameAction tag = new WaitForFrameAction();

            tag.Length = r.GetUI16();
            tag.Frame = r.GetUI16();
            tag.SkipCount = r.GetByte();

            actions.Add(tag);
        }
        #endregion
        #region ParseSetTarget
        private void ParseSetTarget()
        {
            SetTargetAction tag = new SetTargetAction();

            tag.Length = r.GetUI16();
            tag.TargetName = r.GetString();

            actions.Add(tag);
        }
        #endregion
        #region ParseGoToLabel
        private void ParseGoToLabel()
        {
            GoToLabelAction tag = new GoToLabelAction();

            tag.Length = r.GetUI16();
            tag.Label = r.GetString();

            actions.Add(tag);
        }
        #endregion
        #region ParsePush
        private void ParsePush()
        {
            PushAction tag = new PushAction();

            //tag.Type = r.GetBytes();
            tag.StringValue = r.GetString();
            //tag.FloatValue = r.GetFixedBits(bits);
            tag.RegisterNumber = r.GetByte();
            tag.BooleanValue = r.GetBit();
            //tag.DoubleValue = r.GetBytes();
            tag.IntegerValue = r.GetUI16();
            tag.Constant8Value = r.GetByte();
            tag.Constant16Value = r.GetUI16();

            actions.Add(tag);
        }
        #endregion
        #region ParseIf
        private void ParseIf()
        {
            IfAction tag = new IfAction();

            tag.BranchOffset = r.GetUI16();

            actions.Add(tag);
        }
        #endregion
        #region ParseJump
        private void ParseJump()
        {
            JumpAction tag = new JumpAction();

            tag.BranchOffset = r.GetUI16();

            actions.Add(tag);
        }
        #endregion
        #region ParseGetURL2
        private void ParseGetURL2()
        {
            GetURL2Action tag = new GetURL2Action();

            //tag.SendVarsMethod = r.GetBytes();
            //tag.LoadTarget = r.GetBytes();
            tag.LoadVariables = r.GetBit();

            actions.Add(tag);
        }
        #endregion
        #region ParseGotoFrame2
        private void ParseGotoFrame2()
        {
            GotoFrame2Action tag = new GotoFrame2Action();

            tag.SceneBiasFlag = r.GetBit();
            tag.Play = r.GetBit();
            tag.SceneBias = r.GetUI16();

            actions.Add(tag);
        }
        #endregion
        #region ParseWaitForFrame2
        private void ParseWaitForFrame2()
        {
            WaitForFrame2Action tag = new WaitForFrame2Action();

            tag.SkipCount = r.GetByte();

            actions.Add(tag);
        }
        #endregion
        #region ParseConstantPool
        private void ParseConstantPool()
        {
            ConstantPoolAction tag = new ConstantPoolAction();

            tag.Count = r.GetUI16();
            while(false)
            {
            //tag.ConstantPool = r.GetString();
            }

            actions.Add(tag);
        }
        #endregion
        #region ParseDefineFunction
        private void ParseDefineFunction()
        {
            DefineFunctionAction tag = new DefineFunctionAction();

            tag.FunctionName = r.GetString();
            tag.NumParams = r.GetUI16();
            while(false)
            {
            //tag.Params = r.GetString();
            }
            tag.CodeSize = r.GetUI16();
            //tag.Statements = r.GetBytes();

            actions.Add(tag);
        }
        #endregion
        #region ParseWith
        private void ParseWith()
        {
            WithAction tag = new WithAction();

            tag.Size = r.GetUI16();
            tag.WithBlock = r.GetString();
            //tag.Statements = r.GetBytes();

            actions.Add(tag);
        }
        #endregion
        #region ParseStoreRegister
        private void ParseStoreRegister()
        {
            StoreRegisterAction tag = new StoreRegisterAction();

            tag.Register = r.GetUI16();

            actions.Add(tag);
        }
        #endregion
        #region ParseDoInitAction
        private void ParseDoInitAction()
        {
            DoInitActionAction tag = new DoInitActionAction();

            tag.Sprite = r.GetUI16();
            //tag.Actions = r.GetBytes();

            actions.Add(tag);
        }
        #endregion
        #region ParseDefineFunction2
        private void ParseDefineFunction2()
        {
            DefineFunction2Action tag = new DefineFunction2Action();

            tag.FunctionName = r.GetString();
            tag.NumParams = r.GetUI16();
            tag.RegisterCount = r.GetByte();
            tag.PreloadParent = r.GetBit();
            tag.PreloadRoot = r.GetBit();
            tag.SuppressSuper = r.GetBit();
            tag.PreloadSuper = r.GetBit();
            tag.SuppressArguments = r.GetBit();
            tag.PreloadArguments = r.GetBit();
            tag.SuppressThis = r.GetBit();
            tag.PreloadThis = r.GetBit();
            tag.PreloadGlobal = r.GetBit();
            //tag.Parameters = r.GetBytes();
            tag.codeSize = r.GetUI16();

            actions.Add(tag);
        }
        #endregion
        #region ParseTry
        private void ParseTry()
        {
            TryAction tag = new TryAction();

            tag.CatchInRegister = r.GetBit();
            tag.FinallyBlock = r.GetBit();
            tag.CatchBlock = r.GetBit();
            tag.TrySize = r.GetUI16();
            tag.CatchSize = r.GetUI16();
            tag.FinallySize = r.GetUI16();
            tag.CatchName = r.GetString();
            tag.CatchRegister = r.GetUI16();
            //tag.TryBody = r.GetBytes();
            //tag.CatchBody = r.GetBytes();
            //tag.FinallyBody = r.GetBytes();

            actions.Add(tag);
        }
        #endregion