diff options
Diffstat (limited to 'testsuite/tests/concurrent')
186 files changed, 5103 insertions, 0 deletions
diff --git a/testsuite/tests/concurrent/2317/2317.hs b/testsuite/tests/concurrent/2317/2317.hs new file mode 100644 index 0000000000..5025582ebe --- /dev/null +++ b/testsuite/tests/concurrent/2317/2317.hs @@ -0,0 +1,34 @@ +{-# LANGUAGE PatternSignatures #-} + +import Control.Monad +import Control.Parallel +import System.Environment +import System.Random + +sort (x:xs) = sort lesser ++ [x] ++ sort greater + where lesser = filter (< x) xs + greater = filter (>= x) xs +sort _ = [] + + +psort xs 10 = sort xs +psort (x:xs) d = let d' = d + 1 + l = psort lesser d' + g = psort greater d' + in l `par` g `par` (l ++ [x] ++ g) + where lesser = filter (< x) xs + greater = filter (>= x) xs +psort _ _ = [] + +main = do + args <- getArgs + let counts | null args = [100000] + | otherwise = map read args + rs :: [Int] <- randoms `fmap` getStdGen + forM_ counts $ \k -> do + let xs = take k rs + print . length $ xs +-- s <- getCurrentTime + print . length $ psort xs 0 +-- e <- getCurrentTime +-- print (e `diffUTCTime` s) diff --git a/testsuite/tests/concurrent/2317/2317.stdout b/testsuite/tests/concurrent/2317/2317.stdout new file mode 100644 index 0000000000..7ab314964e --- /dev/null +++ b/testsuite/tests/concurrent/2317/2317.stdout @@ -0,0 +1,2 @@ +100000 +100000 diff --git a/testsuite/tests/concurrent/2317/Makefile b/testsuite/tests/concurrent/2317/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/concurrent/2317/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/concurrent/2317/all.T b/testsuite/tests/concurrent/2317/all.T new file mode 100644 index 0000000000..80b46f8c75 --- /dev/null +++ b/testsuite/tests/concurrent/2317/all.T @@ -0,0 +1,5 @@ +test('2317', + [skip_if_fast, + reqlib('parallel')], + multimod_compile_and_run, + ['2317','']) diff --git a/testsuite/tests/concurrent/Makefile b/testsuite/tests/concurrent/Makefile new file mode 100644 index 0000000000..9a36a1c5fe --- /dev/null +++ b/testsuite/tests/concurrent/Makefile @@ -0,0 +1,3 @@ +TOP=../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/concurrent/prog001/Arithmetic.hs b/testsuite/tests/concurrent/prog001/Arithmetic.hs new file mode 100644 index 0000000000..c1c18c549b --- /dev/null +++ b/testsuite/tests/concurrent/prog001/Arithmetic.hs @@ -0,0 +1,235 @@ +module Arithmetic where + +import Control.Concurrent +import Control.Concurrent.MVar +import System.IO.Unsafe +import Utilities +import Converter +import Stream +import Data.Ratio +import Trit + + +-- Negate a stream of Gray code +negateGray :: Gray -> Gray +negateGray = fl + + +-- Multiply a Gray code stream by 2 +-- The stream must represent a real number in (-1/2, 1/2) only +mul2 :: Gray -> Gray +mul2 (x:1:xs) = (x:fl xs) + + +-- Division by 2, the result is to be in (-1/2, 1/2) +div2 :: Gray -> Gray +div2 (x:xs) = x:1:(fl xs) + + +-- Addition by 1, the input must be in (-1,0) +plusOne :: Gray -> Gray +plusOne (0:xs) = 1:fl xs + + + +-- Substraction by 1, the input must be in (0,1) +minusOne :: Gray -> Gray +minusOne (1:xs) = 0:fl xs + + + + +threadTesting :: Gray -> Gray -> IO Int +threadTesting xs ys = do + m <- newEmptyMVar + c1 <- forkIO (t1 m xs ys) + c2 <- forkIO (t2 m xs ys) + c3 <- forkIO (t3 m xs ys) + c4 <- forkIO (t4 m xs ys) + c5 <- forkIO (t5 m xs ys) + c6 <- forkIO (t6 m xs ys) + c <- takeMVar m + killThread c1 + killThread c2 + killThread c3 + killThread c4 + killThread c5 + killThread c6 + return c + + + + +addition :: Gray -> Gray -> IO Gray +addition xs ys = do + c <- threadTesting xs ys + case c of + 1 -> do + let tx = tail xs + let ty = tail ys + t <- unsafeInterleaveIO (addition tx ty) + return (0:t) + 2 -> do + let tx = tail xs + let ty = tail ys + t <- unsafeInterleaveIO (addition tx ty) + return (1:t) + 3 -> do + let tx = tail xs + let ty = tail ys + cs <- unsafeInterleaveIO (addition tx (fl ty)) + let c1 = cs !! 0 + let c2 = tail cs + return (c1:1:fl c2) + 4 -> do + let tx = tail xs + let ty = tail ys + (cs) <- unsafeInterleaveIO (addition (fl tx) ty) + let c1 = cs !! 0 + let c2 = tail cs + return (c1:1:(fl c2)) + 5 -> do + let x1 = xs!!0 + let y1 = ys!!0 + let tx = (drop 2) xs + let ty = (drop 2) ys + cs <- unsafeInterleaveIO (addition (x1:(fl tx)) (y1:(fl ty))) + let c1 = cs !! 0 + let c2 = tail cs + return (c1:(1:(fl c2))) + 6 -> do + let x1 = xs !! 0 + let tx = drop 3 xs + let ty = drop 2 ys + t <- unsafeInterleaveIO (addition (x1:1:tx) (1:fl ty)) + return (0:t) + 7 -> do + let x1 = xs !! 0 + let tx = drop 3 xs + let ty = drop 2 ys + t <- unsafeInterleaveIO (addition (fl (x1:1:tx)) (1:(fl ty))) + return (1:t) + 8 -> do + let x1 = xs !! 0 + let y2 = ys !! 1 + let tx = drop 3 xs + let ty = drop 3 ys + t <- unsafeInterleaveIO (addition (fl (x1:fl tx)) (fl (y2:fl ty))) + return (0:1:t) + 9 -> do + let x1 = xs !! 0 + let y2 = ys !! 1 + let tx = drop 3 xs + let ty = drop 3 ys + t <- unsafeInterleaveIO (addition (x1:fl tx) (fl (y2:fl ty))) + return (1:1:t) + 10 -> do + let y1 = ys !! 0 + let ty = drop 3 ys + let tx = drop 2 xs + t <- unsafeInterleaveIO (addition (1:fl tx) (y1:1:ty)) + return (0:t) + 11 -> do + let y1 = ys !! 0 + let ty = drop 3 ys + let tx = drop 2 xs + t <- unsafeInterleaveIO (addition (1:fl tx) (fl (y1:1:ty))) + return (1:t) + 12 -> do + let y1 = ys !! 0 + let x2 = xs !! 1 + let tx = drop 3 xs + let ty = drop 3 ys + t <- unsafeInterleaveIO (addition (fl (x2:fl tx)) (fl (y1:fl ty))) + return (0:1:t) + 13 -> do + let y1 = ys !! 0 + let x2 = xs !! 1 + let tx = drop 3 xs + let ty = drop 3 ys + t <- unsafeInterleaveIO (addition (fl (x2:fl tx)) (y1:fl ty)) + return (1:1:t) + + + + + + + + + + + + + +-- Compute (a-b)/2 +substraction :: Gray -> Gray -> IO Gray +substraction xs ys = addition xs (negateGray ys) + + + + + +t1 :: MVar Int -> Stream -> Stream -> IO() +t1 m (0:as) (0:bs) = putMVar m 1 +t1 m (1:as) (1:bs) = putMVar m 2 +t1 m (0:as) (1:bs) = putMVar m 3 +t1 m (1:as) (0:bs) = putMVar m 4 + + +t2 :: MVar Int -> Stream -> Stream -> IO() +t2 m (a:1:x) (b:1:y) = putMVar m 5 +t2 m x y = yield + + +t3 m (a:1:0:x) (0:0:y) = putMVar m 6 +t3 m (a:1:0:x) (1:0:y) = putMVar m 7 +t3 m x y = yield + + +t4 m (a:1:0:x) (0:b:1:y) = putMVar m 8 +t4 m (a:1:0:x) (1:b:1:y) = putMVar m 9 +t4 m x y = yield + + +t5 m (0:0:x) (b:1:0:y) = putMVar m 10 +t5 m (1:0:x) (b:1:0:y) = putMVar m 11 +t5 m x y = yield + + +t6 m (0:a:1:x) (b:1:0:y) = putMVar m 12 +t6 m (1:a:1:x) (b:1:0:y) = putMVar m 13 +t6 m x y = yield + + + + + +multiplyIO :: Gray -> Gray -> IO Gray +multiplyIO xs ys = do + s1 <- unsafeInterleaveIO (grayToSignIO xs) + s2 <- unsafeInterleaveIO (grayToSignIO ys) + let s = Trit.multiply s1 s2 + let g = signToGray s + return g + + + +start :: IO() +start = do + c <- unsafeInterleaveIO(multiplyIO z1 z1) + putStrLn (show c) + + +startA :: IO() +startA = do + c <- unsafeInterleaveIO(addition (1:1:z0) (1:1:z0)) + putStrLn (show (take 30 c)) + +z0 = (0:z0) +z1 = (1:z1) + +zl = 0:loop:z0 + +loop = loop +loop01 = 0:1:loop01 diff --git a/testsuite/tests/concurrent/prog001/Converter.hs b/testsuite/tests/concurrent/prog001/Converter.hs new file mode 100644 index 0000000000..d3dfe2a34f --- /dev/null +++ b/testsuite/tests/concurrent/prog001/Converter.hs @@ -0,0 +1,130 @@ + +module Converter (rationalToGray, grayToSignIO, signToGray, Gray, startF, startC) where + +import Stream +import Data.Ratio +import Control.Concurrent +import Control.Concurrent.MVar +import System.IO.Unsafe + + +type Gray = [Integer] +type State = (Integer, Integer) + + +-- Convert a rational number (in (-1,1)) to its Gray representation +rationalToGray :: Rational -> Gray +rationalToGray x + |x<0 = f (negate' (rationalToStream (-x))) (0,0) + |otherwise = f (rationalToStream x) (0,0) + + +-- Function to implement the two heads Turing machine that convert a +-- signed-digit stream to the corresponding Gray-code representation +f :: Stream -> State -> Stream +f (x:xs) (0,0) + |x==(-1) = 0:f xs (0,0) + |x==0 = c:1:ds + |x==1 = 1:f xs (1,0) + where c:ds = f xs (0,1) + +f (x:xs) (0,1) + |x==(-1) = 0:f xs (1,0) + |x==0 = c:0:ds + |x==1 = 1:f xs (0,0) + where c:ds = f xs (0,1) + +f (x:xs) (1,0) + |x==(-1) = 1:f xs (0,0) + |x==0 = c:1:ds + |x==1 = 0:f xs (1,0) + where c:ds = f xs (1,1) + +f (x:xs) (1,1) + |x==(-1) = 1:f xs (1,0) + |x==0 = c:0:ds + |x==1 = 0:f xs (0,0) + where c:ds = f xs (1,1) + + + + +-- Anotherway to convert from a rational to Gray code representation +-- Behave exactly the same like above +rationalToGray' :: Rational -> Gray +rationalToGray' x + |x<0 = signToGray (negate' (rationalToStream (-x))) + |otherwise = signToGray (rationalToStream x) + + +-- Function to convert a signed-digit stream to Gray representation +-- Is much shorter than above +signToGray :: Stream -> Stream +signToGray (1:xs) = 1:f'(signToGray xs) +signToGray ((-1):xs) = 0:signToGray xs +signToGray (0:xs) = c:1:(f' ds) + where c:ds = signToGray xs + + + +-- Convert a Gray-code stream to the corresponding signed-digit representation +-- Make use of threads +grayToSignIO :: Stream -> IO Stream +grayToSignIO (x1:x2:xs) = do + c <- threadTesting(x1:x2:xs) + if (c==1) + then (do co <- unsafeInterleaveIO (grayToSignIO (f'(x2:xs))) + return (1:co)) + else if (c==2) + then (do co <- unsafeInterleaveIO (grayToSignIO (x2:xs)) + return ((-1):co)) + else (do co <- unsafeInterleaveIO (grayToSignIO (x1:f' xs)) + return (0:co)) + +-- Flip the first bit of an infinite stream +f' (x:xs) = (f'' x):xs + where f'' 1 = 0 + f'' 0 = 1 + + +-- Launch two threads which run concurrently, test for the first digit of the stream (1, 0 or bottom) +-- As soon as one thread terminate, grab that result and proceed +threadTesting :: Stream -> IO Int +threadTesting xs = do m <- newEmptyMVar + c1 <- forkIO (f1 m xs) + c2 <- forkIO (f2 m xs) + c <- takeMVar m + killThread c1 + killThread c2 + return c + +-- Test case 1, when the first bit is either 1 or 0. +-- In case of bottom, f1 will never terminate, then f2 will definitely terminate +f1 :: MVar Int -> Stream -> IO() +f1 m (0:xs) = putMVar m 2 +f1 m (1:xs) = putMVar m 1 + +-- Test case 2, when the first bit is completely ignored, esp in case it was a bottom +-- If the second bit is 1, then we can output, don't care value of the first bit +-- If the second bit is 0, then loop forever, give chances to f1 to terminate +f2 :: MVar Int -> Stream -> IO() +f2 m (c1:c2:xs) + |c2==1 = putMVar m 3 + |otherwise = yield + + + + +-- Testing +startC :: IO() +startC = do + c<- unsafeInterleaveIO (grayToSignIO (1:1:z0)) + putStrLn (show (take 100 c)) + + +startF = signToGray ((-1):1:z0) + + +z0 = 0:z0 +loop' = loop' +z1' = (1:z1') diff --git a/testsuite/tests/concurrent/prog001/Main.hs b/testsuite/tests/concurrent/prog001/Main.hs new file mode 100644 index 0000000000..b90fe11c5d --- /dev/null +++ b/testsuite/tests/concurrent/prog001/Main.hs @@ -0,0 +1,3 @@ +import Mutiply + +main = startM1 diff --git a/testsuite/tests/concurrent/prog001/Makefile b/testsuite/tests/concurrent/prog001/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/concurrent/prog001/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/concurrent/prog001/Mult.hs b/testsuite/tests/concurrent/prog001/Mult.hs new file mode 100644 index 0000000000..e387244f68 --- /dev/null +++ b/testsuite/tests/concurrent/prog001/Mult.hs @@ -0,0 +1,237 @@ + +module Main where + +import Arithmetic +import Trit +import Converter +import System.IO.Unsafe +import Data.Ratio +import Utilities +import Thread + +main = startM1 + +startM1 :: IO() +startM1 = do + c <- unsafeInterleaveIO (mult (rationalToGray (1%3)) (rationalToGray (0%1))) + putStrLn (show (take 100 (drop 1 c))) + + + + +mult :: Gray -> Gray -> IO Gray +mult xs ys = do + c <- threadTesting1 xs ys + case c of + + 101 -> do + --putStrLn ("In case 101") + let tx = drop 2 xs + let ty = drop 2 ys + t1 <- unsafeInterleaveIO (addition tx ty) + t2 <- unsafeInterleaveIO (addition (fl t1) (1:t1)) + t3 <- unsafeInterleaveIO (mult tx ty) + c' <- unsafeInterleaveIO (addition t2 (1:0:0:(fl t3))) + return c' + + 102 -> do + --putStrLn ("In case 102") + let tx = drop 2 xs + let ty = drop 2 ys + t1 <- unsafeInterleaveIO (addition (fl tx) ty) + t2 <- unsafeInterleaveIO (addition tx ty) + t0 <- unsafeInterleaveIO (addition t1 (1:fl t2)) + t3 <- unsafeInterleaveIO (mult tx ty) + c' <- unsafeInterleaveIO (addition t0 (1:1:0:fl t3)) + return c' + + 103 -> do + --putStrLn ("In case 103") + let tx = drop 2 xs + let ty = drop 2 ys + t <- unsafeInterleaveIO (mult (0:0:tx) (0:0:ty)) + return (fl t) + + 104 -> do + --putStrLn ("In case 104") + let tx = drop 2 xs + let ty = drop 2 ys + t <- unsafeInterleaveIO (mult (0:0:tx) (0:1:ty)) + return (fl t) + + 201 -> do + c' <- unsafeInterleaveIO (mult ys xs) + return c' + + 202 -> do + --putStrLn ("In case 202") + let tx = drop 2 xs + let ty = drop 2 ys + t1 <- unsafeInterleaveIO (addition tx ty) + t2 <- unsafeInterleaveIO (addition t1 (0:fl t1)) + t3 <- unsafeInterleaveIO (mult tx ty) + c' <- unsafeInterleaveIO (addition t2 (1:1:1:fl t3)) + return c' + + 203 -> do + --putStrLn ("In case 203") + let tx = drop 2 xs + let ty = drop 2 ys + t <- unsafeInterleaveIO (mult (0:1:tx) (0:0:ty)) + return (fl t) + + 204 -> do + --putStrLn ("In case 204") + let tx = drop 2 xs + let ty = drop 2 ys + t <- unsafeInterleaveIO (mult (0:1:tx) (0:1:ty)) + return (fl t) + + 30 -> do + --putStrLn ("In case 30") + let y1 = ys !! 0 + let tx = drop 2 xs + let ty = drop 3 ys + t1 <- unsafeInterleaveIO (addition ((f0' y1):1:ty) ((f0' y1):1:0:ty)) + t0 <- unsafeInterleaveIO (mult tx (y1: fl ty)) + let c4 = head t0 + let d4 = fl (tail t0) + c' <- unsafeInterleaveIO (addition t1 (c4:1:0:0:d4)) + return c' + + 31 -> do + --putStrLn ("In case 31") + let tx = drop 2 xs + c' <- unsafeInterleaveIO (mult (0:0:tx) ys) + return (fl c') + + 40 -> do + --putStrLn ("In case 40") + let tx = drop 2 xs + let y2 = ys !! 1 + let ty = drop 3 ys + t1 <- unsafeInterleaveIO (addition (y2:fl ty) tx) + t2 <- unsafeInterleaveIO (addition (fl t1) (1:y2:1:ty)) + t0 <- unsafeInterleaveIO (mult tx (y2:fl ty)) + let c2 = f0' (head t0) + let d2 = fl (tail t0) + c' <- unsafeInterleaveIO (addition t2 (1:c2:1:0:d2)) + return c' + + 41 -> do + --putStrLn ("In case 41") + let tx = drop 2 xs + let y2 = ys !! 1 + let ty = drop 3 ys + c' <- unsafeInterleaveIO (mult (0:0:tx) (0:y2:1:ty)) + return (fl c') + + 50 -> do + --putStrLn ("In case 50") + let tx = drop 2 xs + let y2 = ys !! 1 + let ty = drop 3 ys + t1 <- unsafeInterleaveIO (addition tx (fl (y2:fl ty))) + t2 <- unsafeInterleaveIO (addition t1 (0:y2:1:ty)) + t0 <- unsafeInterleaveIO (mult (fl tx) (y2:fl ty)) + let c1 = f0' (head t0) + let d1 = fl (tail t0) + c' <- unsafeInterleaveIO (addition t2 (1:c1:1:0:d1)) + return c' + + 51 -> do + --putStrLn ("In case 51") + let tx = drop 2 xs + let y2 = ys !! 1 + let ty = drop 3 ys + c' <- unsafeInterleaveIO (mult (0:1:tx) (0:y2:1:ty)) + return (fl c') + + + 60 -> do + --putStrLn ("In case 60") + let tx = drop 2 xs + let y1 = ys !! 0 + let ty = drop 3 ys + t1 <- unsafeInterleaveIO (addition ((f0' y1):1:ty) (y1:1:0:ty)) + t0 <- unsafeInterleaveIO (mult (fl tx) (y1:fl ty)) + let c1 = head t0 + let d1 = fl (tail t0) + c' <- unsafeInterleaveIO (addition t1 (c1:1:0:0:d1)) + return c' + + 61 -> do + --putStrLn ("In case 61") + let tx = drop 2 xs + let y1 = ys !! 0 + let ty = drop 3 ys + c' <- unsafeInterleaveIO (mult (0:1:tx) (y1:1:0:ty)) + return (fl c') + + + 70 -> do + --putStrLn ("In case 70") + c' <- unsafeInterleaveIO (mult ys xs) + return c' + + 80 -> do + --putStrLn ("In case 80") + let x2 = xs !! 1 + let y2 = ys !! 1 + let tx = drop 3 xs + let ty = drop 3 ys + t1 <- unsafeInterleaveIO (addition (x2:fl tx) (y2:fl ty)) + t0 <- unsafeInterleaveIO (mult (x2:fl tx) (y2:fl ty)) + let c1 = head (fl t1) + let d1 = tail (fl t1) + let c2 = f0' (head t0) + let d2 = fl (tail t0) + c' <- unsafeInterleaveIO (addition (c1:1:(fl d1)) (1:c2:1:0:d2)) + return c' + + 81 -> do + --putStrLn ("In case 81") + let x2 = xs !! 1 + let y2 = ys !! 1 + let tx = drop 3 xs + let ty = drop 3 ys + c' <- unsafeInterleaveIO (mult (0:x2:1:tx) (0:y2:1:ty)) + return (fl c') + + 90 -> do + --putStrLn ("In case 90") + let x2 = xs!!1 + let y1 = ys!!0 + let tx = drop 3 xs + let ty = drop 3 ys + t0 <- unsafeInterleaveIO (mult (x2:fl tx) (y1:fl ty)) + let c1 = head t0 + let d1 = fl (tail t0) + c' <- unsafeInterleaveIO (addition ((f0' y1):1:0:ty) (c1:1:0:0:d1)) + return c' + + 91 -> do + --putStrLn ("In case 91") + let x2 = xs!!1 + let y1 = ys!!0 + let tx = drop 3 xs + let ty = drop 3 ys + c' <- unsafeInterleaveIO (mult (0:x2:1:tx) (y1:1:0:ty)) + return (fl c') + + 100 -> do + --putStrLn ("In case 100") + let x1 = head xs + let y1 = head ys + let tx = drop 3 xs + let ty = drop 3 ys + t0 <- unsafeInterleaveIO (mult (x1:fl tx) (y1:fl ty)) + let c4 = head t0 + let d4 = fl (tail t0) + return (c4:1:0:0:0:d4) + + + +f0' 0 = 1 +f0' 1 = 0 + diff --git a/testsuite/tests/concurrent/prog001/Stream.hs b/testsuite/tests/concurrent/prog001/Stream.hs new file mode 100644 index 0000000000..349af32962 --- /dev/null +++ b/testsuite/tests/concurrent/prog001/Stream.hs @@ -0,0 +1,156 @@ +module Stream (Stream, carry, addStream, rationalToStream, + streamToFloat, addFiniteStream, negate', average) where + +import Data.Ratio + + +type Digit = Integer +type Stream = [Integer] + + + +-- Convert from a Rational fraction to its stream representation +rationalToStream :: Rational -> Stream +rationalToStream x + |t<1 = 0:rationalToStream t + |otherwise = 1:rationalToStream (t-1) + where t = 2*x + + + + +-- Convert from a stream to the Float value +streamToFloat :: Stream -> Float +streamToFloat x = f x (1) + +f :: Stream -> Integer -> Float +f [] n = 0 +f (y:ys) n = (fromIntegral)y/(fromIntegral(2^n)) + f ys (n+1) + + + + + +-- Add two stream +addStream :: Stream -> Stream -> Stream +addStream (x1:x2:x3:xs) (y1:y2:y3:ys) = (u+c):(addStream (x2:x3:xs) (y2:y3:ys)) + where u = interim x1 x2 y1 y2 + c = carry x2 x3 y2 y3 + + + +-- Compute carry, the C(i) value, given x(i) and y(i) +carry :: Digit -> Digit -> Digit -> Digit -> Digit +carry x1 x2 y1 y2 + |t>1 = 1 + |t<(-1) = -1 + |t==1 && (minus1 x2 y2) = 0 + |t==1 && not (minus1 x2 y2) = 1 + |t==(-1) && (minus1 x2 y2) = -1 + |t==(-1) && not (minus1 x2 y2) = 0 + |t==0 = 0 + where t = x1+y1 + + + +-- Computer the interim sum, the U(i) value, given x(i), y(i) and c(i) +interim :: Digit -> Digit -> Digit -> Digit -> Digit +interim x1 x2 y1 y2 + |t>1 = 0 + |t<(-1) = 0 + |t==1 && (minus1 x2 y2) = 1 + |t==1 && not (minus1 x2 y2) = -1 + |t==(-1) && (minus1 x2 y2) = 1 + |t==(-1) && not (minus1 x2 y2) = -1 + |t==0 = 0 + where t = x1+y1 + + + +-- Check if at least one of 2 digits is -1 +minus1 :: Digit -> Digit -> Bool +minus1 x y = (x==(-1))|| (y==(-1)) + + + + + + +-- Algin two stream so that they have the same length +align :: Stream -> Stream -> (Stream, Stream) +align xs ys + |x>y = (xs, (copy 0 (x-y)) ++ys) + |otherwise = ((copy 0 (y-x)) ++ xs, ys) + where x = toInteger(length xs) + y = toInteger(length ys) + + + +-- Generate a list of x +copy :: Integer -> Integer -> [Integer] +copy x n = [x| i<- [1..n]] + + + + + + + +-- Add two finite stream (to add the integral part) +addFiniteStream :: Stream -> Stream -> Stream +addFiniteStream xs ys = add' u v + where (u,v) = align xs ys + + + +-- Utility function for addFinitieStream +add' :: Stream -> Stream -> Stream +add' u v = normalise (f u v) + where f [] [] = [] + f (x:xs) (y:ys) = (x+y):f xs ys + + +-- Normalise the sum +normalise :: Stream -> Stream +normalise = foldr f [0] + where f x (y:ys) = (u:v:ys) + where u = (x+y) `div` 2 + v = (x+y) `mod` 2 + + +-- Negate a stream +negate' :: Stream -> Stream +negate' = map (*(-1)) + + + +-- Compute average of two stream +-- Using [-2,-1,0,1,2] to add, and then divide by 2 +average :: Stream -> Stream -> Stream +average xs ys = div2 (add xs ys) + + +-- Addition of two streams, using [-2,-1,0,1,2] +add :: Stream -> Stream -> Stream +add (x:xs) (y:ys) = (x+y):(add xs ys) + + +-- Then divided by 2, [-2,-1,0,1,2] -> [-1,0,1] +div2 :: Stream -> Stream +div2 (2:xs) = 1:div2 xs +div2 ((-2):xs) = (-1):div2 xs +div2 (0:xs) = 0:div2 xs +div2 (1:(-2):xs) = div2 (0:0:xs) +div2 (1:(-1):xs) = div2 (0:1:xs) +div2 (1:0:xs) = div2 (0:2:xs) +div2 (1:1:xs) = div2 (2:(-1):xs) +div2 (1:2:xs) = div2 (2:0:xs) +div2 ((-1):(-2):xs) = div2 ((-2):0:xs) +div2 ((-1):(-1):xs) = div2 ((-2):1:xs) +div2 ((-1):0:xs) = div2 (0:(-2):xs) +div2 ((-1):1:xs) = div2 (0:(-1):xs) +div2 ((-1):2:xs) = div2 (0:0:xs) + + + +test = take 100 (average (rationalToStream (1%2)) (rationalToStream (1%3))) diff --git a/testsuite/tests/concurrent/prog001/Thread.hs b/testsuite/tests/concurrent/prog001/Thread.hs new file mode 100644 index 0000000000..62bb7dd3c3 --- /dev/null +++ b/testsuite/tests/concurrent/prog001/Thread.hs @@ -0,0 +1,114 @@ + +module Thread (threadTesting1) where + +import Control.Concurrent +import Control.Concurrent.MVar +import Stream +import Converter + +threadTesting1 :: Gray -> Gray -> IO Int +threadTesting1 xs ys = do + m <- newEmptyMVar + c1 <- forkIO (t1 m xs ys) + c2 <- forkIO (t2 m xs ys) + c3 <- forkIO (t3 m xs ys) + c4 <- forkIO (t4 m xs ys) + c5 <- forkIO (t5 m xs ys) + c6 <- forkIO (t6 m xs ys) + c7 <- forkIO (t7 m xs ys) + c8 <- forkIO (t8 m xs ys) + c9 <- forkIO (t9 m xs ys) + c <- takeMVar m + killThread c1 + killThread c2 + killThread c3 + killThread c4 + killThread c5 + killThread c6 + killThread c7 + killThread c8 + killThread c9 + return c + + + + + + + + +t1 :: MVar Int -> Stream -> Stream -> IO() +t1 m (0:0:x) (0:0:y) = putMVar m 101 +t1 m (0:0:x) (0:1:y) = putMVar m 102 +t1 m (0:0:x) (1:0:y) = putMVar m 103 +t1 m (0:0:x) (1:1:y) = putMVar m 104 + +t1 m (0:1:x) (0:0:y) = putMVar m 201 +t1 m (0:1:x) (0:1:y) = putMVar m 202 +t1 m (0:1:x) (1:0:y) = putMVar m 203 +t1 m (0:1:x) (1:1:y) = putMVar m 204 + +t1 m (1:0:x) (0:0:y) = putMVar m 103 +t1 m (1:0:x) (0:1:y) = putMVar m 104 +t1 m (1:0:x) (1:0:y) = putMVar m 101 +t1 m (1:0:x) (1:1:y) = putMVar m 102 + + +t1 m (1:1:x) (0:0:y) = putMVar m 203 +t1 m (1:1:x) (0:1:y) = putMVar m 204 +t1 m (1:1:x) (1:0:y) = putMVar m 201 +t1 m (1:1:x) (1:1:y) = putMVar m 202 + + +t2 :: MVar Int -> Stream -> Stream -> IO() +t2 m (0:0:x) (b:1:0:y) = putMVar m 30 +t2 m (1:0:x) (b:1:0:y) = putMVar m 31 +t2 m (0:1:x) (b:1:0:y) = putMVar m 60 +t2 m (1:1:x) (b:1:0:y) = putMVar m 61 +t2 m x y = yield + + +t3 m (0:0:x) (0:b:1:y) = putMVar m 40 +t3 m (1:0:x) (1:b:1:y) = putMVar m 40 +t3 m (0:0:x) (1:b:1:y) = putMVar m 41 +t3 m (1:0:x) (0:b:1:y) = putMVar m 41 + +t3 m (0:1:x) (0:b:1:y) = putMVar m 50 +t3 m (1:1:x) (1:b:1:y) = putMVar m 50 +t3 m (0:1:x) (1:b:1:y) = putMVar m 51 +t3 m (1:1:x) (0:b:1:y) = putMVar m 51 +t3 m x y = yield + +t4 m (0:a:1:y) (0:0:x) = putMVar m 70 +t4 m (1:a:1:y) (1:0:x) = putMVar m 70 +t4 m (1:a:1:y) (0:0:x) = putMVar m 70 +t4 m (0:a:1:y) (1:0:x) = putMVar m 70 +t4 m (0:a:1:y) (0:1:x) = putMVar m 70 +t4 m (1:a:1:y) (1:1:x) = putMVar m 70 +t4 m (1:a:1:y) (0:1:x) = putMVar m 70 +t4 m (0:a:1:y) (1:1:x) = putMVar m 70 +t4 m x y = yield + + +t5 m (a:1:0:y) (0:0:x) = putMVar m 70 +t5 m (a:1:0:y) (1:0:x) = putMVar m 70 +t5 m (a:1:0:y) (0:1:x) = putMVar m 70 +t5 m (a:1:0:y) (1:1:x) = putMVar m 70 +t5 m x y = yield + +t6 m (0:a:1:x) (0:b:1:y) = putMVar m 80 +t6 m (1:a:1:x) (1:b:1:y) = putMVar m 80 +t6 m (0:a:1:x) (1:b:1:y) = putMVar m 81 +t6 m (1:a:1:x) (0:b:1:y) = putMVar m 81 +t6 m x y = yield + +t7 m (0:a:1:x) (b:1:0:y) = putMVar m 90 +t7 m (1:a:1:x) (b:1:0:y) = putMVar m 91 +t7 m x y = yield + +t8 m (a:1:0:x) (b:1:0:y) = putMVar m 100 +t8 m x y = yield + +t9 m (a:1:0:x) (0:b:1:y) = putMVar m 70 +t9 m (a:1:0:x) (1:b:1:y) = putMVar m 70 +t9 m x y = yield diff --git a/testsuite/tests/concurrent/prog001/Trit.hs b/testsuite/tests/concurrent/prog001/Trit.hs new file mode 100644 index 0000000000..bb6d03c9e2 --- /dev/null +++ b/testsuite/tests/concurrent/prog001/Trit.hs @@ -0,0 +1,112 @@ +module Trit (Trit, rationalToTrit, getIntegral, getFraction, getFraction', + neg, addTrits, subTrits, shiftLeft, shiftRight, multiply + ) where + +import Stream +import Utilities +import Data.Ratio + +type Mantissa = Stream +type Fraction = Stream +type Trit = (Mantissa, Fraction) + + +-- Convert from a Rational number to its Trit representation (Integral, Fraction) +rationalToTrit :: Rational -> Trit +rationalToTrit x + |x<1 = ([0], rationalToStream x) + |otherwise = (u', rationalToStream v) + where u = n `div` d + u' = toBinary u + v = x - (toRational u) + n = numerator x + d = denominator x + + +-- Get the integral part of Trit +getIntegral :: Trit -> Mantissa +getIntegral = fst + + + +-- Get the fraction part of Trit, with n digit of the stream +getFraction :: Int -> Trit -> Stream +getFraction n = take n. snd + + +-- Get the fraction part of Trit +getFraction' :: Trit -> Stream +getFraction' = snd + + + +-- Negate a Trit +neg :: Trit -> Trit +neg (a, b) = (negate' a, negate' b) + + + +-- Add two Trits +addTrits :: Trit -> Trit -> Trit +addTrits (m1, (x1:x2:xs)) (m2, (y1:y2:ys)) = (u,addStream (x1:x2:xs) (y1:y2:ys)) + where u' = addFiniteStream m1 m2 + c = [carry x1 x2 y1 y2] + u = addFiniteStream u' c + + + +-- Substraction of 2 Trits +subTrits :: Trit -> Trit -> Trit +subTrits x y = addTrits x (neg y) + + + +-- Shift left = *2 opertaion with Trit +shiftLeft :: Trit -> Trit +shiftLeft (x, (y:ys)) = (x++ [y], ys) + + +-- Shift right = /2 operation with Trit +shiftRight :: Trit -> Integer -> Trit +shiftRight (x, xs) 1 = (init x, (u:xs)) + where u = last x +shiftRight (x, xs) n = shiftRight (init x, (u:xs)) (n-1) + where u = last x + + + +-- Multiply a Trit stream by 1,0 or -1, simply return the stream +mulOneDigit :: Integer -> Stream -> Stream +mulOneDigit x xs + |x==1 = xs + |x==0 = zero' + |otherwise = negate' xs + where zero' = (0:zero') + + + + + + +-- Multiplication of two streams +multiply :: Stream -> Stream -> Stream +multiply (a0:a1:x) (b0:b1:y) = average p q + where p = average (a1*b0: (average (mulOneDigit b1 x) + (mulOneDigit a1 y))) + (average (mulOneDigit b0 x) + (mulOneDigit a0 y)) + q = (a0*b0:a0*b1:a1*b1:(multiply x y)) + + + + +start0 = take 30 (multiply (rationalToStream (1%2)) zo) + +zo :: Stream +zo = 1:(-1):zero + where zero = 0:zero + +start1 = take 30 (average (rationalToStream (1%2)) (negate' (rationalToStream (1%4)))) + + + diff --git a/testsuite/tests/concurrent/prog001/Utilities.hs b/testsuite/tests/concurrent/prog001/Utilities.hs new file mode 100644 index 0000000000..9e8a39187d --- /dev/null +++ b/testsuite/tests/concurrent/prog001/Utilities.hs @@ -0,0 +1,17 @@ +module Utilities (toBinary, fl) where + +import Stream +import Data.Ratio + +-- Convert from an Integer to its signed-digit representation +toBinary :: Integer -> Stream +toBinary 0 = [0] +toBinary x = toBinary t ++ [x `mod` 2] + where t = x `div` 2 + + + +fl :: Stream -> Stream +fl (x:xs) = (f x):xs + where f 0 = 1 + f 1 = 0 diff --git a/testsuite/tests/concurrent/prog001/all.T b/testsuite/tests/concurrent/prog001/all.T new file mode 100644 index 0000000000..70f38dca4f --- /dev/null +++ b/testsuite/tests/concurrent/prog001/all.T @@ -0,0 +1,26 @@ +# Test for bug #1285326, results in "internal error: scavenge_one: +# strange object 47" with GHC 6.4, fixed in 6.4.1. + +# Also tests for bug #1466. + +# NB. This is a VERY IMPORTANT test! It is the only good test we have +# for throwTo. It has shown up several bugs that were not caught by the +# other concurrency tests. + +# The program appears to be sensitive to scheduling, and can diverge +# in some cases. I find that it only reliably completes when given +# multiple cores, which is why it is only running the 'threaded2' way +# right now. --SDM 1/4/2010 + +test('concprog001', + [skip_if_fast, + only_ways(['threaded2']), + extra_clean(['Arithmetic.hi', 'Arithmetic.o', + 'Converter.hi', 'Converter.o', + 'Mult.hi', 'Mult.o', + 'Stream.hi', 'Stream.o', + 'Thread.hi', 'Thread.o', + 'Trit.hi', 'Trit.o', + 'Utilities.hi', 'Utilities.o'])], + multimod_compile_and_run, + ['Mult','']) diff --git a/testsuite/tests/concurrent/prog001/concprog001.stdout b/testsuite/tests/concurrent/prog001/concprog001.stdout new file mode 100644 index 0000000000..fb69b5b792 --- /dev/null +++ b/testsuite/tests/concurrent/prog001/concprog001.stdout @@ -0,0 +1 @@ +[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] diff --git a/testsuite/tests/concurrent/prog002/Event.hs b/testsuite/tests/concurrent/prog002/Event.hs new file mode 100644 index 0000000000..4abf6878c4 --- /dev/null +++ b/testsuite/tests/concurrent/prog002/Event.hs @@ -0,0 +1,6 @@ +module Event +where + +data SysReq = SysReq + +data SysRsp = SysRsp diff --git a/testsuite/tests/concurrent/prog002/FileIO.hs b/testsuite/tests/concurrent/prog002/FileIO.hs new file mode 100644 index 0000000000..bf97712287 --- /dev/null +++ b/testsuite/tests/concurrent/prog002/FileIO.hs @@ -0,0 +1,9 @@ +module FileIO where +import System.IO +import Foreign +import Foreign.C + + +foreign import ccall safe "fileio.h c_file_getresult" + c_file_getresult :: CInt -> IO CInt + diff --git a/testsuite/tests/concurrent/prog002/Makefile b/testsuite/tests/concurrent/prog002/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/concurrent/prog002/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/concurrent/prog002/Scheduler.hs b/testsuite/tests/concurrent/prog002/Scheduler.hs new file mode 100644 index 0000000000..bbfd374c43 --- /dev/null +++ b/testsuite/tests/concurrent/prog002/Scheduler.hs @@ -0,0 +1,74 @@ +module Scheduler +( runTIO +, module Event +, module Thread +, TTree +, TIO +) +where + +import Event +import Thread +import Control.Concurrent +import System.IO + +-------------------------------- +type TTree = ThreadTree SysReq SysRsp IO +type TIO = ContM SysReq SysRsp IO + + +runTIO :: [TIO ()] -> IO () +runTIO l = runThreads $ map buildThread l + +data World = World + { mReadyQ :: ! (Chan (TTree)) } + +max_steps = 1 +worker_pure world= + do + t <- readChan readyq + case t of + (Atom _) -> return () + _ -> return () + exec_thread max_steps t + return () + where + readyq = mReadyQ world + + exec_thread 0 t = + do putStr "."; hFlush stdout + writeChan readyq t + exec_thread c (Atom mx) = + do + x <- mx + exec_thread (c-1) x + exec_thread c (Stop) = return () + +runThreads :: [TTree] -> IO () +runThreads l = + do + mready <- newChan + writeList2Chan mready l + let world = World mready + multiloop world + +loop_p world = do worker_pure world; loop_p world + +multiloop world = + do + -- a mixture of bound threads & lightweight threads + -- to make things interesting... + forkOS (loop_p world) + forkOS (loop_p world) + forkOS (loop_p world) + forkOS (loop_p world) + forkOS (loop_p world) + forkOS (loop_p world) + forkIO (loop_p world) + forkIO (loop_p world) + forkIO (loop_p world) + forkIO (loop_p world) + forkIO (loop_p world) + forkIO (loop_p world) + forkIO (loop_p world) + loop_p world diff --git a/testsuite/tests/concurrent/prog002/Server.hs b/testsuite/tests/concurrent/prog002/Server.hs new file mode 100644 index 0000000000..2ff1ccb8c8 --- /dev/null +++ b/testsuite/tests/concurrent/prog002/Server.hs @@ -0,0 +1,18 @@ +import Scheduler +import Foreign +import Foreign.C +import System.Random +import Control.Concurrent + +expensive = f (500 :: Int) + where f 0 = stop + f n = do + r <- atom $ getStdRandom (randomR (0,99::Int)) + r `seq` f $! n-1 + +main = do + m <- newEmptyMVar + forkIO (do + runTIO $ map (\x->expensive) [1..500] + putMVar m ()) + takeMVar m diff --git a/testsuite/tests/concurrent/prog002/Thread.hs b/testsuite/tests/concurrent/prog002/Thread.hs new file mode 100644 index 0000000000..9e342ac977 --- /dev/null +++ b/testsuite/tests/concurrent/prog002/Thread.hs @@ -0,0 +1,38 @@ +module Thread +( ThreadTree (..) +, ContM (..) +, atom +, stop +, buildThread +) +where + +---------------------------------- +data ThreadTree req rsp m = + Atom (m (ThreadTree req rsp m)) + | Stop +---------------------------------- +newtype ContM req rsp m a = ContM ((a-> ThreadTree req rsp m)-> ThreadTree req rsp m) + +instance Monad m => Monad (ContM req rsp m) where + m >>= f = contmBind m f + return = contmReturn + +contmBind :: (ContM req rsp m a) -> (a -> (ContM req rsp m b)) -> (ContM req rsp m b) +contmBind (ContM x) f = + ContM(\y-> x (\z-> let ContM f' = f z in f' y)) +contmReturn :: a -> (ContM req rsp m a) +contmReturn x = ContM(\c -> c x) + +{-- how to build primitive ContM blocks... --} + +atom :: Monad m => (m a) -> (ContM req rsp m a) +atom mx = ContM( \c -> Atom( do x <- mx; return (c x) )) + +stop :: (ContM req rsp m a) +stop = ContM( \c -> Stop ) + +buildThread :: (ContM req rsp m a) -> ThreadTree req rsp m +buildThread (ContM f) = f (\c->Stop) + +---------------------------------- diff --git a/testsuite/tests/concurrent/prog002/all.T b/testsuite/tests/concurrent/prog002/all.T new file mode 100644 index 0000000000..f87bc8b77f --- /dev/null +++ b/testsuite/tests/concurrent/prog002/all.T @@ -0,0 +1,17 @@ +# Test for bug #713, results in crashes in GHC prior to 20060315 with +RTS -N2 + +# the conditions are fairly delicate. It must be compiled without optimisation, +# hence -O0: + +test('concprog002', + # Add 'threaded2_hT' so that we have at least one test for bug #5127 + [only_ways(['threaded2','threaded2_hT']), + extra_ways(['threaded2_hT']), + exit_code(1), + skip_if_fast, + extra_clean(['Event.hi', 'Event.o', + 'Scheduler.hi', 'Scheduler.o', + 'Server.hi', 'Server.o', + 'Thread.hi', 'Thread.o'])], + multimod_compile_and_run, + ['Server','-O0']) diff --git a/testsuite/tests/concurrent/prog002/concprog002.stderr b/testsuite/tests/concurrent/prog002/concprog002.stderr new file mode 100644 index 0000000000..268fccc3f6 --- /dev/null +++ b/testsuite/tests/concurrent/prog002/concprog002.stderr @@ -0,0 +1 @@ +concprog002: thread blocked indefinitely in an MVar operation diff --git a/testsuite/tests/concurrent/prog002/concprog002.stdout b/testsuite/tests/concurrent/prog002/concprog002.stdout new file mode 100644 index 0000000000..f8d8e8defa --- /dev/null +++ b/testsuite/tests/concurrent/prog002/concprog002.stdout @@ -0,0 +1 @@ +................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
\ No newline at end of file diff --git a/testsuite/tests/concurrent/prog003/BackList2.lhs b/testsuite/tests/concurrent/prog003/BackList2.lhs new file mode 100644 index 0000000000..b856beb4c3 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/BackList2.lhs @@ -0,0 +1,185 @@ + +> module BackList2 where + +> import Data.IORef +> import Control.Concurrent +> --import Control.Concurrent.STM + +> import RefInterface + +> data List r a = Node { val :: a, next :: (r (List r a)) } +> | Head { next :: r (List r a) } +> | DelNode (r (List r a)) -- backpointer +> | Null + +> data ListHandle r a = ListHandle { headList :: r (r (List r a)), +> tailList :: r (r (List r a)) } + + + abbreviations + +> newAtomic x = atomicRef (newRef x) + +> readAtomic x = atomicRef (readRef x) + +> writeAtomic ptr x = atomicRef (writeRef ptr x) + + +> -- we create a new list +> newList :: Ref r m => IO (ListHandle r a) +> newList = +> do null <- newAtomic Null +> hd <- newAtomic (Head {next = null }) +> hdPtr <- newAtomic hd +> tailPtr <- newAtomic null +> return (ListHandle {headList = hdPtr, tailList = tailPtr}) + + + +> find :: (Eq a, Ref r m) => ListHandle r a -> a -> IO Bool +> find (ListHandle {headList = ptrPtr}) i = +> do startPtr <- atomicRef (readRef ptrPtr) +> find2 startPtr i + + +NOTE: I thought we can catch the 'head' case here, + so we don't need to check for 'head' in findNode, + but this leads to a non-exhaustive pattern failure + +> {- +> do startptr <- atomically ( +> do ptr <- readTVar ptrPtr +> Head {next = startptr} <- readTVar ptr +> return startptr) +> find2 startptr i +> -} + +> find2 :: (Eq a, Ref r m) => r (List r a) -> a -> IO Bool +> find2 curNodePtr i = +> do +> { comp <- atomicRef (findNode curNodePtr i) +> ; comp } + + +We atomically check for lhs and guards + +f1 @ node(X,P,Next) \ find(X,P,R) <=> R=tt.. +f2 @ nil(P) \ find(Y,P,R) <=> R=ff. +f3 @ node(X,P,Next) \ find(Y,P,R) <=> X /= Y | find(Y,Next,R). +f4 @ nodeDel(P,Q) \ find(X,P,R) <=> find(X,Q,R). + + + +> findNode :: (Eq a, Ref r m) => r (List r a) -> a -> m (IO Bool) +> findNode curNodePtr x = do +> { curNode <- readRef curNodePtr +> ; case curNode of +> Node {val = y, next = q} -> +> if (y == x) then return (return True) -- f1 +> else return (find2 q x) -- f3 +> Null -> return (return False) -- f2 +> Head p-> return (find2 p x) --error "findNode: impossible" +> DelNode p -> return (find2 p x) -- f4 +> } + + +> -- we add a new node, by overwriting the null tail node +> -- we only need to adjust tailList but not headList because +> -- of the static Head +> -- we return the location of the newly added node +> addToTail :: Ref r m => ListHandle r a -> a -> IO (r (List r a)) +> addToTail (ListHandle {tailList = tailPtrPtr}) x = +> do tPtr <- atomicRef ( +> do null <- newRef Null +> tailPtr <- readRef tailPtrPtr +> writeRef tailPtr (Node {val = x, next = null}) +> writeRef tailPtrPtr null +> return tailPtr +> ) +> return tPtr + + +> delete :: (Eq a, Ref r m) => ListHandle r a -> a -> IO Bool +> delete (ListHandle {headList = ptrPtr}) i = +> do prevPtr <- atomicRef (readRef ptrPtr) +> delete2 prevPtr i + + +> delete2 :: (Eq a, Ref r m) => r (List r a) -> a -> IO Bool +> delete2 prevPtr i = +> do +> { comp <- atomicRef (deleteNode prevPtr i) +> ; comp } + + +> deleteNode :: (Eq a,Ref r m) => r (List r a) -> a -> m (IO Bool) +> deleteNode prevPtr x = +> do +> { prevNode <- readRef prevPtr +> ; case prevNode of +> Null -> error "impossible case" +> DelNode q -> return (delete2 q x) +> nodeOrhead -> +> do let curPtr = next prevNode +> curNode <- readRef curPtr +> case curNode of +> Node {val = y, next= nextNode} -> +> if (y /= x) +> then return (delete2 curPtr x) +> else -- (delink node) +> do writeRef curPtr (DelNode prevPtr) -- add backpointer +> case prevNode of +> Head {} -> do writeRef prevPtr (Head {next = nextNode}) +> return (return True) +> Node {} -> do writeRef prevPtr +> (Node {val = val prevNode, next = nextNode}) +> return (return True) +> Null -> return (return False) +> DelNode _ -> retryRef +> -- means that the prevNode points to next of delNode +> -- we simply retry therefore +> } + + +printing and counting + +> printList :: (Show a, Ref r m) => ListHandle r a -> IO () +> printList (ListHandle {headList = ptrPtr}) = +> do startptr <- atomicRef ( +> do ptr <- readRef ptrPtr +> Head {next = startptr} <- readRef ptr +> return startptr) +> printListHelp startptr + + +> printListHelp :: (Show a, Ref r m) => r (List r a) -> IO () +> printListHelp curNodePtr = +> do { curNode <- atomicRef (readRef curNodePtr) +> ; case curNode of +> Null -> putStr "Nil" +> Node {val = curval, next = curnext} -> +> do { putStr (show curval ++ " -> ") +> ; printListHelp curnext } +> DelNode curnext -> +> printListHelp curnext +> } + +> cntList :: (Show a, Ref r m) => ListHandle r a -> IO Int +> cntList (ListHandle {headList = ptrPtr}) = +> do startptr <- atomicRef ( +> do ptr <- readRef ptrPtr +> Head {next = startptr} <- readRef ptr +> return startptr) +> cntListHelp startptr 0 + +> cntListHelp :: (Show a, Ref r m) => r (List r a) -> Int -> IO Int +> cntListHelp curNodePtr i = +> do { curNode <- atomicRef (readRef curNodePtr) +> ; case curNode of +> Null -> return i +> Node {val = curval, next = curnext} -> +> cntListHelp curnext (i+1) +> DelNode curnext -> +> cntListHelp curnext i +> } + diff --git a/testsuite/tests/concurrent/prog003/CASList.hs b/testsuite/tests/concurrent/prog003/CASList.hs new file mode 100644 index 0000000000..445af790a3 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/CASList.hs @@ -0,0 +1,254 @@ +{-# LANGUAGE BangPatterns,CPP #-} +module CASList where + +import Control.Monad +import Data.IORef +import Control.Concurrent +import Control.Concurrent.Chan +import System.Environment +import Data.Time + +-- #define USE_UNPACK +-- #define USE_STRICT + +#if defined(USE_UNPACK) +#define UNPACK(p) {-# UNPACK #-} !(p) +#elif defined(USE_STRICT) +#define UNPACK(p) !(p) +#else +#define UNPACK(p) p +#endif + +data List a = Node { val :: a + , next :: UNPACK(IORef (List a)) } + | DelNode { next :: UNPACK(IORef (List a)) } + | Null + | Head { next :: UNPACK(IORef (List a)) } deriving Eq + +data ListHandle a = ListHandle { headList :: UNPACK(IORef (IORef (List a))), + tailList :: UNPACK(IORef (IORef (List a))) } + +{-# INLINE myNext #-} +myNext :: List a -> IORef (List a) +myNext Node{next = n} = n +myNext DelNode{next = n} = n +myNext Head{next = n} = n +myNext _ = error "myNext" + +-- we assume a static head pointer, pointing to the first node which must be Head +-- the deleted field of Head is always False, it's only there to make some of the code +-- more uniform +-- tail points to the last node which must be Null + + +type Iterator a = IORef (IORef (List a)) + + +------------------------------------------- +-- auxilliary functions + + + +while b cmd = if b then do {cmd; while b cmd} + else return () + +repeatUntil cmd = do { b <- cmd; if b then return () + else repeatUntil cmd } + +atomCAS :: Eq a => IORef a -> a -> a -> IO Bool +atomCAS ptr old new = + atomicModifyIORef ptr (\ cur -> if cur == old + then (new, True) + else (cur, False)) + +atomicWrite :: IORef a -> a -> IO () +atomicWrite ptr x = + atomicModifyIORef ptr (\ _ -> (x,())) + + +---------------------------------------------- +-- functions operating on lists + + +-- we create a new list +newList :: IO (ListHandle a) +newList = + do null <- newIORef Null + hd <- newIORef (Head {next = null }) + hdPtr <- newIORef hd + tailPtr <- newIORef null + return (ListHandle {headList = hdPtr, tailList = tailPtr}) + + +-- we add a new node, by overwriting the null tail node +-- we only need to adjust tailList but not headList because +-- of the static Head +-- we return the location of the newly added node +addToTail :: Eq a => ListHandle a -> a -> IO () +addToTail (ListHandle {tailList = tailPtrPtr}) x = + do null <- newIORef Null + repeatUntil + (do tailPtr <- readIORef tailPtrPtr + b <- atomCAS tailPtr Null (Node {val = x, next = null}) + return b ) + -- we atomically update the tail + -- (by spinning on the tailPtr) + atomicWrite tailPtrPtr null + + +find :: Eq a => ListHandle a -> a -> IO Bool +find (ListHandle { headList = head }) x = + let go !prevPtr = + do prevNode <- readIORef prevPtr + let curPtr = myNext prevNode -- head/node/delnode have all next + curNode <- readIORef curPtr + case curNode of + Node {val = y, next = nextNode } -> + if (x == y) + then -- node found and alive + return True + else go curPtr -- continue + Null -> return False -- reached end of list + DelNode {next = nextNode } -> + -- atomically delete curNode by setting the next of prevNode to next of curNode + -- if this fails we simply move ahead + case prevNode of + Node {} -> do b <- atomCAS prevPtr prevNode (Node {val = val prevNode, + next = nextNode}) + if b then go prevPtr + else go curPtr + Head {} -> do b <- atomCAS prevPtr prevNode (Head {next = nextNode}) + if b then go prevPtr + else go curPtr + DelNode {} -> go curPtr -- if parent deleted simply move ahead + {- + correct as well, but a deleted parent deleting a child is (for certain cases) a useless operation + do atomicModifyIORef prevPtr ( \ cur -> (cur{next = nextNode},True)) + go prevPtr + -} + + in do startPtr <- readIORef head + go startPtr + + + + +delete :: Eq a => ListHandle a -> a -> IO Bool +delete (ListHandle { headList = head }) x = + let go prevPtr = + do do prevNode <- readIORef prevPtr + let curPtr = next prevNode -- head/node/delnode have all next + curNode <- readIORef curPtr + case curNode of + Node {val = y, next = nextNode } -> + if (x == y) + then -- node found and alive + do b <- atomCAS curPtr curNode (DelNode {next = nextNode}) + if b then return True + else go prevPtr -- spin + else go curPtr -- continue + Null -> return False -- reached end of list + DelNode {next = nextNode } -> + -- atomically delete curNode by setting the next of prevNode to next of curNode + -- if this fails we simply move ahead + case prevNode of + Node {} -> do b <- atomCAS prevPtr prevNode (Node {val = val prevNode, + next = nextNode}) + if b then go prevPtr + else go curPtr + Head {} -> do b <- atomCAS prevPtr prevNode (Head {next = nextNode}) + if b then go prevPtr + else go curPtr + DelNode {} -> go curPtr -- if parent deleted simply move ahead + + in do startPtr <- readIORef head + go startPtr + + + +-- the iterator always points to the PREVIOUS node, +-- recall that there's a static dummy new Head +-- Assumption: iterators are private, +-- ie they won't be shared among threads +newIterator :: ListHandle a -> IO (Iterator a) +newIterator (ListHandle {headList = hd}) = + do hdPtr <- readIORef hd + it <- newIORef hdPtr + return it + +-- we iterate through the list and return the first "not deleted" node +-- we delink deleted nodes +-- there's no need to adjust headList, tailList +-- cause headList has a static Head and +-- tailList points to Null +iterateList :: Eq a => Iterator a -> IO (Maybe (IORef (List a))) +iterateList itPtrPtr = + let go prevPtr = + do do prevNode <- readIORef prevPtr + let curPtr = next prevNode -- head/node/delnode have all next + curNode <- readIORef curPtr + case curNode of + Node {} -> do writeIORef itPtrPtr curPtr + -- adjust iterator + return (Just curPtr) + Null -> return Nothing -- reached end of list + DelNode {next = nextNode} -> + -- atomically delete curNode by setting the next of prevNode to next of curNode + -- if this fails we simply move ahead + case prevNode of + Node {} -> do b <- atomCAS prevPtr prevNode (Node {val = val prevNode, + next = nextNode}) + if b then go prevPtr + else go curPtr + Head {} -> do b <- atomCAS prevPtr prevNode (Head {next = nextNode}) + if b then go prevPtr + else go curPtr + DelNode {} -> go curPtr -- if parent deleted simply move ahead + + in do startPtr <- readIORef itPtrPtr + go startPtr + + +--printing and counting + +printList :: Show a => ListHandle a -> IO () +printList (ListHandle {headList = ptrPtr}) = + do startptr <- ( + do ptr <- readIORef ptrPtr + Head {next = startptr} <- readIORef ptr + return startptr) + printListHelp startptr + + +printListHelp :: Show a => IORef (List a) -> IO () +printListHelp curNodePtr = + do { curNode <- readIORef curNodePtr + ; case curNode of + Null -> putStr "Nil" + Node {val = curval, next = curnext} -> + do { putStr (show curval ++ " -> ") + ; printListHelp curnext } + DelNode {next = curnext} -> + do { putStr ("DEAD -> ") + ; printListHelp curnext } + } + +cntList :: Show a => ListHandle a -> IO Int +cntList (ListHandle {headList = ptrPtr}) = + do startptr <- ( + do ptr <- readIORef ptrPtr + Head {next = startptr} <- readIORef ptr + return startptr) + cntListHelp startptr 0 + + +cntListHelp :: Show a => IORef (List a) -> Int -> IO Int +cntListHelp curNodePtr i = + do { curNode <- readIORef curNodePtr + ; case curNode of + Null -> return i + Node {val = curval, next = curnext} -> + cntListHelp curnext (i+1) + DelNode {next = curnext} -> + cntListHelp curnext (i+1) + } diff --git a/testsuite/tests/concurrent/prog003/Collate.hs b/testsuite/tests/concurrent/prog003/Collate.hs new file mode 100644 index 0000000000..2c1879d450 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/Collate.hs @@ -0,0 +1,64 @@ +{-# LANGUAGE PatternGuards #-} +module Main (main) where + +import qualified Data.Map as M +import Data.Map (Map) + +import System.Environment +import System.IO +import Text.Regex +import Data.List +import Control.Monad +import Data.Maybe + +type RawResults = Map (String,Int) [Double] + +main = do + [time,speedup] <- getArgs + s <- getContents + let raw = slurp_raw (lines s) + avg = M.map calc_average raw + + let keys = M.keys avg + modes = nub (map fst keys) + cores = sort (nub (map snd keys)) + + h <- openFile time WriteMode + forM modes $ \m -> do + hPutStrLn h (m ++ concatMap (',':) [ show (fromJust (M.lookup (m,n) avg)) + | n <- cores ]) + hClose h + + let + baselines = M.fromList [ (m, fromJust (M.lookup (m,1) avg)) | m <- modes ] + spd = M.mapWithKey (calc_speedup baselines) avg + + h <- openFile speedup WriteMode + forM modes $ \m -> do + hPutStrLn h (m ++ concatMap (',':) [ show (fromJust (M.lookup (m,n) spd)) + | n <- cores ]) + hClose h + +calc_average :: [Double] -> Double +calc_average = foldl f 0 . zip [(1::Int)..] + where f mean (i,x) = mean + (x - mean) / fromIntegral i + +calc_speedup :: Map String Double -> (String,Int) -> Double -> Double +calc_speedup baselines (mode,_) result = base / result + where Just base = M.lookup mode baselines + +slurp_raw :: [String] -> RawResults +slurp_raw lines = add_results ("",1) M.empty lines + where + add_results m results [] = results + add_results m results (line:lines) + | Just [mode,cores] <- matchRegex header line + = add_results (mode, read cores :: Int) results lines + | Just [time] <- matchRegex result line + = let t = read time :: Double in + add_results m (M.insertWith (\_ o -> t:o) m [t] results) lines + | otherwise + = add_results m results lines + +header = mkRegex "run\\.([^\\.]*)\\.N([0-9]*)" +result = mkRegex "time: ([0-9\\.]+)s" diff --git a/testsuite/tests/concurrent/prog003/Collection.hs b/testsuite/tests/concurrent/prog003/Collection.hs new file mode 100644 index 0000000000..73a71f6714 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/Collection.hs @@ -0,0 +1,11 @@ +{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} +module Collection where + + +class Show e => Col c e | c -> e where + newCol :: IO c + insertCol :: c -> e -> IO () + deleteCol :: c -> e -> IO Bool + findCol :: c -> e -> IO Bool + printCol :: c -> IO () + cntCol :: c -> IO Int diff --git a/testsuite/tests/concurrent/prog003/IOList.lhs b/testsuite/tests/concurrent/prog003/IOList.lhs new file mode 100644 index 0000000000..72aa1dee46 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/IOList.lhs @@ -0,0 +1,138 @@ +> {-# LANGUAGE BangPatterns,CPP #-} +> module IOList where + +-- #define USE_UNPACK +-- #define USE_STRICT + +#if defined(USE_UNPACK) +#define UNPACK(p) {-# UNPACK #-} !(p) +#elif defined(USE_STRICT) +#define UNPACK(p) !(p) +#else +#define UNPACK(p) p +#endif + +> import Data.IORef + + +> data List a = Node { val :: a, next :: UNPACK(IORef (List a))} +> | Null +> | Head {next :: UNPACK(IORef (List a)) } + +> data ListHandle a = ListHandle { headList :: UNPACK(IORef (IORef (List a))), +> tailList :: UNPACK(IORef (IORef (List a))) } + +> atomically = \x -> x + + +> -- we create a new list +> newList :: IO (ListHandle a) +> newList = +> do null <- newIORef Null +> hd <- newIORef (Head {next = null }) +> hdPtr <- newIORef hd +> tailPtr <- newIORef null +> return (ListHandle {headList = hdPtr, tailList = tailPtr}) + +> find :: Eq a => ListHandle a -> a -> IO Bool +> find (ListHandle {headList = ptrPtr}) i = do +> ptr <- readIORef ptrPtr +> Head {next = startptr} <- readIORef ptr +> find2 startptr i +> where +> find2 :: Eq a => IORef (List a) -> a -> IO Bool +> find2 curNodePtr i = do +> { curNode <- readIORef curNodePtr +> ; case curNode of +> Null -> return False -- we've reached the end of the list +> -- element not found +> Node {val = curval, next = curnext} -> +> if (curval == i) then return True -- element found +> else find2 curnext i -- keep searching +> } + + +> -- we add a new node, by overwriting the null tail node +> -- we only need to adjust tailList but not headList because +> -- of the static Head +> -- we return the location of the newly added node +> addToTail :: ListHandle a -> a -> IO (IORef (List a)) +> addToTail (ListHandle {tailList = tailPtrPtr}) x = +> do tPtr <- atomically ( +> do null <- newIORef Null +> tailPtr <- readIORef tailPtrPtr +> writeIORef tailPtr (Node {val = x, next = null}) +> writeIORef tailPtrPtr null +> return tailPtr +> ) +> return tPtr + + +> delete :: Eq a => ListHandle a -> a -> IO Bool +> delete (ListHandle {headList = ptrPtr}) i = +> atomically ( +> do startptr <- readIORef ptrPtr +> delete2 startptr i) +> where +> delete2 :: Eq a => IORef (List a) -> a -> IO Bool +> delete2 prevPtr i = +> do +> { prevNode <- readIORef prevPtr +> ; let curNodePtr = next prevNode -- head/node have both next +> ; curNode <- readIORef curNodePtr +> ; case curNode of +> Null -> return False -- we've reached the end of the list +> -- element not found +> Node {val = curval, next = nextNode} -> +> if (curval /= i) +> then delete2 curNodePtr i -- keep searching +> else +> -- delete element (ie delink node) +> do { case prevNode of +> Head {} -> do writeIORef prevPtr (Head {next = nextNode}) +> return True +> Node {} -> do writeIORef prevPtr +> (Node {val = val prevNode, next = nextNode}) +> return True +> } +> } + + +printing and counting + +> printList :: Show a => ListHandle a -> IO () +> printList (ListHandle {headList = ptrPtr}) = +> do startptr <- ( +> do ptr <- readIORef ptrPtr +> Head {next = startptr} <- readIORef ptr +> return startptr) +> printListHelp startptr + + +> printListHelp :: Show a => IORef (List a) -> IO () +> printListHelp curNodePtr = +> do { curNode <- readIORef curNodePtr +> ; case curNode of +> Null -> putStr "Nil" +> Node {val = curval, next = curnext} -> +> do { putStr (show curval ++ " -> ") +> ; printListHelp curnext } +> } + +> cntList :: Show a => ListHandle a -> IO Int +> cntList (ListHandle {headList = ptrPtr}) = +> do startptr <- ( +> do ptr <- readIORef ptrPtr +> Head {next = startptr} <- readIORef ptr +> return startptr) +> cntListHelp startptr 0 + + +> cntListHelp :: Show a => IORef (List a) -> Int -> IO Int +> cntListHelp curNodePtr i = +> do { curNode <- readIORef curNodePtr +> ; case curNode of +> Null -> return i +> Node {val = curval, next = curnext} -> +> cntListHelp curnext (i+1) +> } diff --git a/testsuite/tests/concurrent/prog003/ImmList.hs b/testsuite/tests/concurrent/prog003/ImmList.hs new file mode 100644 index 0000000000..70d81633d2 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/ImmList.hs @@ -0,0 +1,71 @@ +{-# LANGUAGE CPP,PatternGuards #-} +module ImmList where + +import Control.Concurrent +import Data.IORef +import qualified Data.Sequence as S +import Data.Sequence (Seq, (|>), (<|), (><), ViewL(..)) +import Data.Maybe +import Data.Foldable + +#if 0 +newtype ListHandle a = ListHandle (IORef (Seq a)) + +newList :: IO (ListHandle a) +newList = do + r <- newIORef S.empty + return (ListHandle r) + +addToTail :: Eq a => ListHandle a -> a -> IO () +addToTail (ListHandle r) x = + atomicModifyIORef r $ \s -> (s |> x, ()) + +find :: Eq a => ListHandle a -> a -> IO Bool +find (ListHandle r) x = do + s <- readIORef r + return (isJust (S.elemIndexL x s)) + +delete :: Eq a => ListHandle a -> a -> IO Bool +delete (ListHandle r) x = atomicModifyIORef r $ \s -> + case S.breakl (== x) s of + (xs, ys) | c :< zs <- S.viewl ys, c == x -> (xs >< zs, True) + | otherwise -> (xs >< ys, False) + +printList :: Show a => ListHandle a -> IO () +printList (ListHandle r) = do + s <- readIORef r + print (toList s) + +cntList :: Show a => ListHandle a -> IO Int +cntList (ListHandle r) = readIORef r >>= return . S.length +#else +newtype ListHandle a = ListHandle (IORef [a]) + +newList :: IO (ListHandle a) +newList = do + r <- newIORef [] + return (ListHandle r) + +addToTail :: Eq a => ListHandle a -> a -> IO () +addToTail (ListHandle r) x = + atomicModifyIORef r $ \s -> (s ++ [x], ()) + +find :: Eq a => ListHandle a -> a -> IO Bool +find (ListHandle r) x = do + s <- readIORef r + return (x `Prelude.elem` s) + +delete :: Eq a => ListHandle a -> a -> IO Bool +delete (ListHandle r) x = atomicModifyIORef r $ \s -> + case break (== x) s of + (xs, ys) | (c:zs) <- ys, c == x -> (xs ++ zs, True) + | otherwise -> (xs ++ ys, False) + +printList :: Show a => ListHandle a -> IO () +printList (ListHandle r) = do + s <- readIORef r + print s + +cntList :: Show a => ListHandle a -> IO Int +cntList (ListHandle r) = readIORef r >>= return . length +#endif diff --git a/testsuite/tests/concurrent/prog003/MVarListLockCoupling.hs b/testsuite/tests/concurrent/prog003/MVarListLockCoupling.hs new file mode 100644 index 0000000000..0820ccd0d2 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/MVarListLockCoupling.hs @@ -0,0 +1,183 @@ +{-# LANGUAGE BangPatterns,CPP #-} +module MVarListLockCoupling where + +import Control.Monad +import Data.IORef +import Control.Concurrent +import Control.Concurrent.Chan +import System.Environment +import Data.Time + + +-- #define USE_UNPACK +-- #define USE_STRICT + +#if defined(USE_UNPACK) +#define UNPACK(p) {-# UNPACK #-} !(p) +#elif defined(USE_STRICT) +#define UNPACK(p) !(p) +#else +#define UNPACK(p) p +#endif + + +data List a = Node { val :: a + , next :: UNPACK(MVar (List a)) } + | Null + | Head { next :: UNPACK(MVar (List a)) } deriving Eq + +data ListHandle a = ListHandle { headList :: IORef (MVar (List a)), + tailList :: IORef (MVar (List a)) } + + +-- we assume a static head pointer, pointing to the first node which must be Head +-- the deleted field of Head is always False, it's only there to make some of the code +-- more uniform +-- tail points to the last node which must be Null + +-- head is static, therefore IORef +-- tail will be adjusted, therefore MVar + + +type Iterator a = IORef (MVar (List a)) + +-- iterators are private + +------------------------------------------- +-- auxilliary functions + + + +while b cmd = if b then do {cmd; while b cmd} + else return () + +repeatUntil cmd = do { b <- cmd; if b then return () + else repeatUntil cmd } + +atomCAS :: Eq a => IORef a -> a -> a -> IO Bool +atomCAS ptr old new = + atomicModifyIORef ptr (\ cur -> if cur == old + then (new, True) + else (cur, False)) + +atomicWrite :: IORef a -> a -> IO () +atomicWrite ptr x = + atomicModifyIORef ptr (\ _ -> (x,())) + + +---------------------------------------------- +-- functions operating on lists + + +-- we create a new list +newList :: IO (ListHandle a) +newList = + do null <- newMVar Null + hd <- newMVar (Head {next = null }) + hdPtr <- newIORef hd + tailPtr <- newIORef null + return (ListHandle {headList = hdPtr, tailList = tailPtr}) + + +-- we add a new node, by overwriting the null tail node +-- we only need to adjust tailList but not headList because +-- of the static Head +-- we return the location of the newly added node +addToTail :: Eq a => ListHandle a -> a -> IO () +addToTail (ListHandle {tailList = tailPtrPtr}) x = + do null <- newMVar Null + tailPtr <- readIORef tailPtrPtr + takeMVar tailPtr + writeIORef tailPtrPtr null + putMVar tailPtr (Node {val = x, next = null}) + + +find :: Eq a => ListHandle a -> a -> IO Bool +find (ListHandle { headList = head }) x = + let go prevPtr prevNode = + do let curPtr = next prevNode -- head/node/delnode have all next + curNode <- takeMVar curPtr + case curNode of + Node {val = y, next = nextNode } -> + if (x == y) + then -- node found + do putMVar prevPtr prevNode + putMVar curPtr curNode + return True + else + do putMVar prevPtr prevNode + go curPtr curNode -- continue + Null -> do putMVar prevPtr prevNode + putMVar curPtr curNode + return False -- reached end of list + in do startPtr <- readIORef head + startNode <- takeMVar startPtr + go startPtr startNode + +delete :: Eq a => ListHandle a -> a -> IO Bool +delete (ListHandle { headList = head }) x = + let go prevPtr prevNode = + do do let curPtr = next prevNode -- head/node/delnode have all next + curNode <- takeMVar curPtr + case curNode of + Node {val = y, next = nextNode } -> + if (x == y) + then -- delink node + do case prevNode of + Node {} -> do putMVar prevPtr (Node {val = val prevNode, + next = nextNode}) + putMVar curPtr curNode + return True + Head {} -> do putMVar prevPtr (Head {next = nextNode}) + putMVar curPtr curNode + return True + else do putMVar prevPtr prevNode + go curPtr curNode -- continue + Null -> do putMVar curPtr curNode + putMVar prevPtr prevNode + return False -- reached end of list + + in do startPtr <- readIORef head + startNode <- takeMVar startPtr + go startPtr startNode + + + +--printing and counting + +printList :: Show a => ListHandle a -> IO () +printList (ListHandle {headList = ptrPtr}) = + do startptr <- ( + do ptr <- readIORef ptrPtr + Head {next = startptr} <- readMVar ptr + return startptr) + printListHelp startptr + + +printListHelp :: Show a => MVar (List a) -> IO () +printListHelp curNodePtr = + do { curNode <- readMVar curNodePtr + ; case curNode of + Null -> putStr "Nil" + Node {val = curval, next = curnext} -> + do { putStr (show curval ++ " -> ") + ; printListHelp curnext } + } + +cntList :: Show a => ListHandle a -> IO Int +cntList (ListHandle {headList = ptrPtr}) = + do startptr <- ( + do ptr <- readIORef ptrPtr + Head {next = startptr} <- readMVar ptr + return startptr) + cntListHelp startptr 0 + + +cntListHelp :: Show a => MVar (List a) -> Int -> IO Int +cntListHelp curNodePtr i = + do { curNode <- readMVar curNodePtr + ; case curNode of + Null -> return i + Node {val = curval, next = curnext} -> + cntListHelp curnext (i+1) + } diff --git a/testsuite/tests/concurrent/prog003/Main.lhs b/testsuite/tests/concurrent/prog003/Main.lhs new file mode 100644 index 0000000000..e4e8ad790e --- /dev/null +++ b/testsuite/tests/concurrent/prog003/Main.lhs @@ -0,0 +1,217 @@ + +> {-# LANGUAGE UndecidableInstances, PatternSignatures, FlexibleInstances, MultiParamTypeClasses, FlexibleContexts #-} + +> module Main where + +> import Data.IORef +> import Control.Concurrent +> --import Control.Concurrent.STM +> import System.Environment +> import Data.Time + +> import System.Mem +> import Data.List + +> import Collection +> import RefInterface + +> import TestData +> import TestRun + +-- the contenders (we can run stand-alone for a fixed test case mainPar) + +> import qualified CASList as CAS +>-- import qualified CASusingSTMList as CASusingSTM +> import qualified MVarListLockCoupling as MLC +>-- import qualified MVarusingSTM as MLCusingSTM +>-- import qualified LazyList2 as Lazy +> import qualified IOList as I +>-- import qualified STMList as S +> import qualified ImmList as IMM + + +create List + +> createList :: Col c e => [e] -> IO c +> createList n = +> do nl <- newCol +> mapM (insertCol nl) n +> return nl + + + +> createTasks :: [a] -> [Op a] +> createTasks xs = task 1 xs +> where +> insCnt = 5 -- every 5th op is insert +> delCnt = 9 -- ever 9th op is delete +> task _ [] = [] +> task cnt (x:xs) +> | (cnt `mod` insCnt) == 0 = (Insert x) : task (cnt+1) xs +> | (cnt `mod` delCnt) == 0 = (Delete x) : task (cnt+1) xs +> | otherwise = (Find x) : task (cnt+1) xs + + + +mainly finds, some deletes which will be inserted again + +> specificTask1 :: [a] -> [Op a] +> specificTask1 xs = task 1 xs [] +> where +> delCnt = 6 -- every 6th op is delete +> insCnt = 50 -- after 5 deletes we'll insert them again +> task _ [] _ = [] +> task cnt (x:xs) deletes +> | length deletes == insCnt = map Insert deletes ++ task (cnt+1) (x:xs) [] +> | (cnt `mod` delCnt) == 0 = (Delete x) : task (cnt+1) xs (x:deletes) +> | otherwise = (Find x) : task (cnt+1) xs deletes + +> executeTasks :: Col c e => c -> [Op e] -> IO () +> executeTasks lh ops = +> do mapM (\ task -> +> case task of +> Find x -> do { findCol lh x; return () } +> Insert x -> do { insertCol lh x; return () } +> Delete x -> do { deleteCol lh x; return () }) +> ops +> return () + + put number into threads buckets + +> distribution :: [Int] -> Int -> [[Int]] +> distribution no threads = +> let init = map (\ _ -> []) [1..threads] +> go :: [Int] -> Int -> [[Int]] -> [[Int]] +> go [] _ acc = acc +> go (x:xs) cnt acc = +> let idx = cnt `mod` threads +> acc' = take idx acc ++ [x : (acc !! idx)] ++ drop (idx+1) acc +> in go xs (cnt+1) acc' +> +> in go no 1 init + + +runnable version + + main = mainPar + +parallel version + +> type RUN = CAS.ListHandle Int + +> main :: IO () +> main = +> do args <- getArgs +> case args of +> (mode:"-t":in_fname:rest) -> run_testdata in_fname mode +>-- [mode, t, l] -> +>-- do let len = read l :: Int +>-- let threads = read t :: Int +>-- let run nl = mainPar nl threads len +>-- case mode of +>-- "CAS" -> do nl :: CAS.ListHandle Int <- createList [0..len] +>-- run nl +>-- "CASusingSTM" -> do nl :: CASusingSTM.ListHandle Int <- createList [0..len] +>-- run nl +>-- "LAZY" -> do nl :: Lazy.ListHandle Int <- createList [0..len] +>-- run nl +>-- "MLC" -> do nl :: MLC.ListHandle Int <- createList [0..len] +>-- run nl +>-- "MLCusingSTM" -> do nl :: MLCusingSTM.ListHandle Int <- createList [0..len] +>-- run nl +>-- "IO" -> do nl :: I.ListHandle Int <- createList [0..len] +>-- run nl +>-- "STM" -> do nl :: S.ListHandle Int <- createList [0..len] +>-- run nl +>-- "IMM" -> do nl :: IMM.ListHandle Int <- createList [0..len] +>-- run nl + + + + mainPar :: Col c Int => c -> Int -> Int -> IO () + mainPar nl threads len = + do let numbers = [1..len] ++ (reverse [1..len]) ++ [1..len] ++ (reverse [1..len]) + ++ [1..len] ++ (reverse [1..len]) ++ [1..len] ++ (reverse [1..len]) + let ds = distribution numbers threads + let ts = ds + wait <- atomically (newTVar 0) + putStrLn "Start" + start <- getCurrentTime + mapM (\ t -> forkIO (do executeTasks nl (specificTask1 t) + atomically(do counter <- readTVar wait + writeTVar wait (counter+1)))) + ts + atomically ( do counter <- readTVar wait + if counter < threads then retry + else return () ) + fin <- getCurrentTime + putStrLn "Done" + putStrLn $ "Time: " ++ show (diffUTCTime fin start) + + + + mainPar2 nl len = + do cnt <- atomically (newTVar 0) + printCol nl + mapM (\ e -> forkIO ( do insertCol nl e + atomically(do i <- readTVar cnt + writeTVar cnt (i+1)))) + [6..len] + + atomically ( do i <- readTVar cnt + if i <= len-6 then retry + else return () ) + + printCol nl + n <- cntCol nl + putStrLn $ "Overall: " ++ show n + + +sequential version + +> mainSeq nl len = +> do let threads = 4 +> let numbers = [1..len] ++ (reverse [1..len]) ++ [1..len] ++ (reverse [1..len]) +> ++ [1..len] ++ (reverse [1..len]) ++ [1..len] ++ (reverse [1..len]) +> let [d1,d2,d3,d4] = distribution numbers threads +> let t1 = d1++d2++d3++d4 +> let t2 = d2++d3++d4++d1 +> let t3 = d3++d4++d1++d2 +> let t4 = d4++d1++d2++d3 +> putStrLn "Start" +> start <- getCurrentTime +> mapM (\ t -> executeTasks nl (specificTask1 t)) [t1,t2,t3,t4] +> fin <- getCurrentTime +> putStrLn "Done" +> putStrLn $ "Time: " ++ show (diffUTCTime fin start) + + +just testing + +> mainTest nl len = +> do +> printCol nl + + r <- deleteCol nl 3 + putStrLn ("Result : " ++ show r) + find nl 10 + +> insertCol nl 11 + +> deleteCol nl 3 +> findCol nl 11 + + +> mapM (\x -> forkIO (insertCol nl x)) [12..50] + +> threadDelay 1000000 + +> {- +> putStrLn "Start" +> executeTasks nl $ createTasks [1..len] +> find nl (len+1) -- we try to find a non-existant element +> -- this way, in the LazyList case, we will physically delete all (logically deleted) elements +> -} +> putStrLn "End" +> printCol nl + diff --git a/testsuite/tests/concurrent/prog003/MainMVarList.lhs b/testsuite/tests/concurrent/prog003/MainMVarList.lhs new file mode 100644 index 0000000000..9bcf9b1240 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/MainMVarList.lhs @@ -0,0 +1,237 @@ + +> module Main where + +> import Data.IORef +> import Control.Concurrent +> --import Control.Concurrent.STM +> import System.Environment +> import Data.Time + + +> import MVarList + + +printing + +> printList :: Show a => ListHandle a -> IO () +> printList (ListHandle {headList = ptrPtr}) = +> do startptr <- ( +> do ptr <- readIORef ptrPtr +> Head {next = startptr} <- readMVar ptr +> return startptr) +> printListHelp startptr + + +> printListHelp :: Show a => MVar (List a) -> IO () +> printListHelp curNodePtr = +> do { curNode <- readMVar curNodePtr +> ; case curNode of +> Null -> putStr "Nil" +> Node {val = curval, next = curnext} -> +> do { putStr (show curval ++ " -> ") +> ; printListHelp curnext } +> DelNode {val = curval, next = curnext} -> +> do { putStr (show curval ++ "DEAD -> ") +> ; printListHelp curnext } +> } + +> cntList :: Show a => ListHandle a -> IO Int +> cntList (ListHandle {headList = ptrPtr}) = +> do startptr <- ( +> do ptr <- readIORef ptrPtr +> Head {next = startptr} <- readMVar ptr +> return startptr) +> cntListHelp startptr 0 + + +> cntListHelp :: Show a => MVar (List a) -> Int -> IO Int +> cntListHelp curNodePtr i = +> do { curNode <- readMVar curNodePtr +> ; case curNode of +> Null -> return i +> Node {val = curval, next = curnext} -> +> cntListHelp curnext (i+1) +> DelNode {val = curval, next = curnext} -> +> cntListHelp curnext (i+1) +> } + + +create List + +> createList :: Int -> IO (ListHandle Int) +> createList n = +> do nl <- newList +> mapM (addToTail nl) [1..n] +> return nl + + +> data Op a = Find a | Insert a | Delete a deriving Show + + +> createTasks :: [a] -> [Op a] +> createTasks xs = task 1 xs +> where +> insCnt = 5 -- every 5th op is insert +> delCnt = 9 -- ever 9th op is delete +> task _ [] = [] +> task cnt (x:xs) +> | (cnt `mod` insCnt) == 0 = (Insert x) : task (cnt+1) xs +> | (cnt `mod` delCnt) == 0 = (Delete x) : task (cnt+1) xs +> | otherwise = (Find x) : task (cnt+1) xs + + + +mainly finds, some deletes which will be inserted again + +> specificTask1 :: [a] -> [Op a] +> specificTask1 xs = task 1 xs [] +> where +> delCnt = 5 -- every 6th op is delete +> insCnt = 50 -- after 5 deletes we'll insert them again +> task _ [] _ = [] +> task cnt (x:xs) deletes +> | length deletes == insCnt = map Insert deletes ++ task (cnt+1) (x:xs) [] +> | (cnt `mod` delCnt) == 0 = (Delete x) : task (cnt+1) xs (x:deletes) +> | otherwise = (Find x) : task (cnt+1) xs deletes + +> executeTasks :: Eq a => ListHandle a -> [Op a] -> IO () +> executeTasks lh ops = +> do mapM (\ task -> +> case task of +> Find x -> do { find lh x; return () } +> Insert x -> do { addToTail lh x; return () } +> Delete x -> do { delete lh x; return () }) +> ops +> return () + + put number into threads buckets + +> distribution :: [Int] -> Int -> [[Int]] +> distribution no threads = +> let init = map (\ _ -> []) [1..threads] +> go :: [Int] -> Int -> [[Int]] -> [[Int]] +> go [] _ acc = acc +> go (x:xs) cnt acc = +> let idx = cnt `mod` threads +> acc' = take idx acc ++ [x : (acc !! idx)] ++ drop (idx+1) acc +> in go xs (cnt+1) acc' +> +> in go no 1 init + +> insert :: Eq a => ListHandle a -> a -> IO () +> insert = addToTail + + +runnable version + +> main = mainPar + +parallel version + +> mainPar :: IO () +> mainPar = +> do let len = 3000 +> let threads = 4 +> nl <- createList len +> let numbers = [1..len] ++ (reverse [1..len]) ++ [1..len] ++ (reverse [1..len]) +> ++ [1..len] ++ (reverse [1..len]) ++ [1..len] ++ (reverse [1..len]) +> let [d1,d2,d3,d4] = distribution numbers threads +> let t1 = d1++d2++d3++d4 +> let t2 = d2++d3++d4++d1 +> let t3 = d3++d4++d1++d2 +> let t4 = d4++d1++d2++d3 +> wait <- atomically (newTVar 0) +> putStrLn "Start" +> start <- getCurrentTime +> mapM (\ t -> forkIO (do executeTasks nl (specificTask1 t) +> atomically(do counter <- readTVar wait +> writeTVar wait (counter+1)))) +> [t1,t2,t3,t4] +> atomically ( do counter <- readTVar wait +> if counter < 4 then retry +> else return () ) +> fin <- getCurrentTime +> putStrLn "Done" +> putStrLn $ "Time: " ++ show (diffUTCTime fin start) + + +> mainPar2 :: IO () +> mainPar2 = +> do nl <- createList 5 +> let len = 5 + 200 +> cnt <- atomically (newTVar 0) +> printList nl +> mapM (\ e -> forkIO ( do insert nl e +> atomically(do i <- readTVar cnt +> writeTVar cnt (i+1)))) +> [6..len] + +> atomically ( do i <- readTVar cnt +> if i <= len-6 then retry +> else return () ) + +> printList nl +> n <- cntList nl +> putStrLn $ "Overall: " ++ show n + + +sequential version + +> mainSeq :: IO () +> mainSeq = +> do let len = 3000 +> let threads = 4 +> nl <- createList len +> let numbers = [1..len] ++ (reverse [1..len]) ++ [1..len] ++ (reverse [1..len]) +> ++ [1..len] ++ (reverse [1..len]) ++ [1..len] ++ (reverse [1..len]) +> let [d1,d2,d3,d4] = distribution numbers threads +> let t1 = d1++d2++d3++d4 +> let t2 = d2++d3++d4++d1 +> let t3 = d3++d4++d1++d2 +> let t4 = d4++d1++d2++d3 +> putStrLn "Start" +> start <- getCurrentTime +> mapM (\ t -> executeTasks nl (specificTask1 t)) [t1,t2,t3,t4] +> fin <- getCurrentTime +> putStrLn "Done" +> putStrLn $ "Time: " ++ show (diffUTCTime fin start) + + +just testing + +> mainTest2 :: IO () +> mainTest2 = +> do let len = 10 +> nl <- createList len +> printList nl +> addToTail nl 1 +> printList nl + +> mainTest :: IO () +> mainTest = +> do let len = 10 +> nl <- createList len +> printList nl + + r <- delete nl 3 + putStrLn ("Result : " ++ show r) + find nl 10 + +> insert nl 11 + +> delete nl 3 +> find nl 11 + + +> mapM (\x -> forkIO (insert nl x)) [12..50] + +> threadDelay 1000000 + +> {- +> putStrLn "Start" +> executeTasks nl $ createTasks [1..len] +> find nl (len+1) -- we try to find a non-existant element +> -- this way, in the LazyList case, we will physically delete all (logically deleted) elements +> -} +> putStrLn "End" +> printList nl diff --git a/testsuite/tests/concurrent/prog003/Makefile b/testsuite/tests/concurrent/prog003/Makefile new file mode 100644 index 0000000000..9101fbd40a --- /dev/null +++ b/testsuite/tests/concurrent/prog003/Makefile @@ -0,0 +1,3 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk diff --git a/testsuite/tests/concurrent/prog003/RefInterface.hs b/testsuite/tests/concurrent/prog003/RefInterface.hs new file mode 100644 index 0000000000..95ecbcdb49 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/RefInterface.hs @@ -0,0 +1,15 @@ +{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} + +module RefInterface where + + +import Control.Monad + + + +class Monad m => Ref r m | m -> r, r -> m where + newRef :: a -> m (r a) + readRef :: (r a) -> m a + writeRef :: (r a) -> a -> m () + atomicRef :: m a -> IO a + retryRef :: m a diff --git a/testsuite/tests/concurrent/prog003/TestData.hs b/testsuite/tests/concurrent/prog003/TestData.hs new file mode 100644 index 0000000000..4be06adcb2 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/TestData.hs @@ -0,0 +1,32 @@ + +module TestData where + +-- Test Data Data Type + +-- Operation Tokens +data Op a = Find a | Delete a | Insert a deriving Show + +-- A test Data. +-- t_name : Name of the test data. +-- t_threads : Number of concurrent threads to run +-- t_modes : Concurrent modes selected. Multiple modes +-- will be batch tested in specified sequence +-- t_repeats : Number of runs to conduct on each mode. +-- t_init_list : Elements of the initial list +-- t_tasks : Sequence of operation each node +-- executes. Note this must correspond to +-- number of threads. +data TestData a = TestData { t_name :: String + , t_threads :: Int + , t_init_list :: [a] + , t_tasks :: [[Op a]] } + +instance Show a => Show (TestData a) where + show tc = "Name: " ++ (t_name tc) ++ "\n" ++ + "Threads: " ++ (show $ t_threads tc) ++ "\n" ++ + "Initial-List:\n" ++ (show $ t_init_list tc) ++ "\n" ++ + "Tasks:\n" ++ (printOps $ t_tasks tc) + where + printOps (op:ops) = (show op) ++ "\n" ++ (printOps ops) + printOps [] = "" + diff --git a/testsuite/tests/concurrent/prog003/TestDataParser.hs b/testsuite/tests/concurrent/prog003/TestDataParser.hs new file mode 100644 index 0000000000..4a85d9576e --- /dev/null +++ b/testsuite/tests/concurrent/prog003/TestDataParser.hs @@ -0,0 +1,103 @@ + +module TestDataParser ( + parse_testdata, -- Read a => FilePath -> IO (TestData a) + write_testdata -- Show a => TestData -> IO () +) where + +import TestData + +-- Parser for parsing TestData. The following is a sample of a test data: +-- +-- +-- Name: sample +-- Threads: 4 +-- Modes: ["CAS","IO","BACK"] +-- Repeat: 6 +-- Initial-List: +-- [4,5,6,7,8,4,5,754,345,23432,6547,4] +-- Tasks: +-- [Find 3,Delete 4,Insert 34,Find 45] +-- [Delete 34,Insert 43,Delete 3,Delete 45,Find 87] +-- [Insert 3 , Find 6] +-- [Find 3,Find 67, Insert 3] +-- +-- +-- Some assumptions: +-- - Number of tasks must correspond to number of threads. +-- - Fields must come in the exact sequence specified above. + +-- Auxiliary Functions + +partitionAt :: Eq a => (a -> Bool) -> [a] -> [[a]] +partitionAt f as = + filter (/=[]) (partitionAt' f as) + where + partitionAt' _ [] = [] + partitionAt' f as = let (v,rest) = span f as + in v:(partitionAt' f (drop 1 rest)) + +is_delimit :: Char -> Bool +is_delimit ' ' = True +is_delimit '\n' = True +is_delimit _ = False + +not_delimit :: Char -> Bool +not_delimit x = not (is_delimit x) + +-- Parsing Functions + +parse_token :: String -> (String,String) +parse_token str = let str' = dropWhile is_delimit str + in span not_delimit str' + +parse_list :: String -> ([String],String) +parse_list str = + let str' = dropWhile is_delimit str + in parse_list (tail str') + where + parse_list str = let comma x = x == ',' + close x = x == ']' + commaOrClose x = or [comma x,close x] + (a,rest) = span (\x -> not $ commaOrClose x) str + in case head rest of + ',' -> let (as,rest') = parse_list (tail rest) + in (a:as,rest') + ']' -> ([a],tail rest) + +parse_list_many :: Int -> String -> ([[String]],String) +parse_list_many 0 str = ([],str) +parse_list_many n str = let (a,rest) = parse_list str + (as,rest') = parse_list_many (n-1) rest + in (a:as,rest') + +drop_token :: String -> String +drop_token str = let (_,rest) = parse_token str + in rest + +-- Main function for parseing testcases from file +parse_testdata :: Read a => FilePath -> IO (TestData a) +parse_testdata fname = do + { input <- readFile fname + ; let (name,input1) = parse_token (drop_token input) + (t,input2) = parse_token (drop_token input1) + (list,input3) = parse_list (drop_token input2) + (ops,_) = parse_list_many (read t) (drop_token input3) + ; return $ TestData { t_name = name + , t_threads = read t + , t_init_list = map read list + , t_tasks = map readops ops } } + where + readops (s:ss) = let (oper,rest) = parse_token s + (arg,_) = parse_token rest + x = read arg + op = case oper of + "Find" -> Find x + "Delete" -> Delete x + "Insert" -> Insert x + _ -> error ("parse_testdata: " ++ oper ++ "\n" ++ rest ++ "\n" ++ arg) + in op:(readops ss) + readops [] = [] + +-- Main function for writing test data to file +write_testdata :: Show a => TestData a -> IO () +write_testdata tc = writeFile (t_name tc) (show tc) diff --git a/testsuite/tests/concurrent/prog003/TestRun.hs b/testsuite/tests/concurrent/prog003/TestRun.hs new file mode 100644 index 0000000000..fd6e19de1d --- /dev/null +++ b/testsuite/tests/concurrent/prog003/TestRun.hs @@ -0,0 +1,219 @@ + +{-# LANGUAGE UndecidableInstances, PatternSignatures, FlexibleInstances, MultiParamTypeClasses #-} + +module TestRun ( + run_testdata -- FilePath -> FilePath -> IO () +) where + +import TestData +import TestDataParser +import Collection + +import Control.Monad +import GHC.Conc +import Text.Printf +import Data.List +import Data.IORef +import Control.Concurrent +--import Control.Concurrent.STM +import System.Environment +import Data.Time +import System.Mem +import System.Random +import Control.Exception + +-- the contenders +import qualified CASList as CAS +import qualified ImmList as IMM +--import qualified CASusingSTMList as CASusingSTM +import qualified MVarListLockCoupling as MLC +--import qualified MVarusingSTM as MLCusingSTM +--import qualified LazyList2 as Lazy +import qualified IOList as I +--import qualified STMList as S + + + +instance (Eq e, Show e) => Col (CAS.ListHandle e) e where + newCol = CAS.newList + insertCol c e = do CAS.addToTail c e + return () + deleteCol = CAS.delete + findCol = CAS.find + printCol = CAS.printList + cntCol = CAS.cntList + +instance (Eq e, Show e) => Col (IMM.ListHandle e) e where + newCol = IMM.newList + insertCol c e = do IMM.addToTail c e + return () + deleteCol = IMM.delete + findCol = IMM.find + printCol = IMM.printList + cntCol = IMM.cntList + +--instance (Eq e, Show e) => Col (CASusingSTM.ListHandle e) e where +-- newCol = CASusingSTM.newList +-- insertCol c e = do CASusingSTM.addToTail c e +-- return () +-- deleteCol = CASusingSTM.delete +-- findCol = CASusingSTM.find +-- printCol = CASusingSTM.printList +-- cntCol = CASusingSTM.cntList + + +--instance (Eq e, Show e) => Col (Lazy.ListHandle e) e where +-- newCol = Lazy.newList +-- insertCol c e = do Lazy.addToTail c e +-- return () +-- deleteCol = Lazy.delete +-- findCol = Lazy.find +-- printCol = Lazy.printList +-- cntCol = Lazy.cntList + + +instance (Eq e, Show e) => Col (I.ListHandle e) e where + newCol = I.newList + insertCol c e = do I.addToTail c e + return () + deleteCol = I.delete + findCol = I.find + printCol = I.printList + cntCol = I.cntList + +--instance (Eq e, Show e) => Col (MLCusingSTM.ListHandle e) e where +-- newCol = MLCusingSTM.newList +-- insertCol c e = do MLCusingSTM.addToTail c e +-- return () +-- deleteCol = MLCusingSTM.delete +-- findCol = MLCusingSTM.find +-- printCol = MLCusingSTM.printList +-- cntCol = MLCusingSTM.cntList + + +instance (Eq e, Show e) => Col (MLC.ListHandle e) e where + newCol = MLC.newList + insertCol c e = do MLC.addToTail c e + return () + deleteCol = MLC.delete + findCol = MLC.find + printCol = MLC.printList + cntCol = MLC.cntList + +--instance (Eq e, Show e) => Col (S.ListHandle e) e where +-- newCol = S.newList +-- insertCol c e = do S.addToTail c e +-- return () +-- deleteCol = S.delete +-- findCol = S.find +-- printCol = S.printList +-- cntCol = S.cntList + +-- Auxiliary functions + +createList :: Col c e => [e] -> IO c +createList n = + do nl <- newCol + mapM (insertCol nl) n + return nl + +executeTasks :: Col c e => c -> [Op e] -> IO () +executeTasks lh ops = + do mapM (\ task -> + case task of + Find x -> do { findCol lh x; return () } + Insert x -> do { insertCol lh x; return () } + Delete x -> do { deleteCol lh x; return () }) + ops + return () + +appendIORef :: IORef [a] -> a -> IO () +appendIORef ref a = do + { as <- readIORef ref + ; writeIORef ref (a:as) } + +showComma :: [String] -> String +showComma (s:ss) = "," ++ s ++ (showComma ss) +showComma [] = "" + +-- Main interface + +run_testdata :: FilePath -> String -> IO () +run_testdata testdata_fname mode = do + { tc <- parse_testdata testdata_fname + ; putStrLn "Test Initiated: " + ; let init_elems = t_init_list tc + works = t_tasks tc + ; medians <- newIORef [] + ; highlows <- newIORef [] + ; runtests mode init_elems works (medians,highlows) + } + where + runtests m elems works refs = + case m of + "CAS" -> do nl :: CAS.ListHandle Int <- createList elems + runtest m works nl refs + "IMM" -> do nl :: IMM.ListHandle Int <- createList elems + runtest m works nl refs +-- "CASusingSTM" -> do nl :: CASusingSTM.ListHandle Int <- createList elems +-- runtest m works nl refs +-- "LAZY" -> do nl :: Lazy.ListHandle Int <- createList elems +-- runtest m works nl refs + "MLC" -> do nl :: MLC.ListHandle Int <- createList elems + runtest m works nl refs +-- "MLCusingSTM" -> do nl :: MLCusingSTM.ListHandle Int <- createList elems +-- runtest m works nl refs + "IO" -> do nl :: I.ListHandle Int <- createList elems + runtest m works nl refs +-- "STM" -> do nl :: S.ListHandle Int <- createList elems +-- runtest m works nl refs + trash -> fail $ "Oi! No such concurrency mode: " ++ trash + + + runtest m works nl (medians,highlows) = do + { putStrLn $ "Test Started: " ++ m + ; performGC +-- ; wait <- atomically (newTVar 0) + ; wait <- newEmptyMVar + ; start <- getCurrentTime + ; zipWithM (\n work -> forkOnIO n (do { executeTasks nl work + ; putMVar wait () })) + --atomically(do counter <- readTVar wait +-- writeTVar wait (counter+1)) })) + [0..] works + ; replicateM_ (length works) (takeMVar wait) +-- ; atomically ( do { counter <- readTVar wait +-- ; if counter < length works then retry +-- else return () } ) + ; fin <- getCurrentTime + ; let result = diffUTCTime fin start + ; -- printf "time: %.2fs\n" (realToFrac result :: Double) + ; return () } + + output_fname = "out" + + write_output mod ms mref hlref = do + { if mod == 1 + then do { writeFile output_fname "" + ; output_header output_fname ms + ; appendFile output_fname ",," + ; output_header output_fname ms + ; appendFile output_fname "\n1Core" } + else appendFile output_fname ("\n" ++ (show mod) ++ "Cores") + ; medians <- readIORef mref + ; highlows <- readIORef hlref + ; let mstr = reverse $ map show medians + hlstr = reverse $ highlows + ; appendFile output_fname (filter (/='s') (showComma mstr)) + ; appendFile output_fname ",," + ; appendFile output_fname (filter (/='s') (showComma hlstr)) } + + output_header output_fname (m:ms) = do + { appendFile output_fname ("," ++ m) + ; output_header output_fname ms } + output_header output_fname [] = return () + + high_low results = + let fst = head results + lst = head $ drop ((length results) - 1) results + in (fst,lst) diff --git a/testsuite/tests/concurrent/prog003/all.T b/testsuite/tests/concurrent/prog003/all.T new file mode 100644 index 0000000000..fc342e9fd0 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/all.T @@ -0,0 +1,33 @@ +# This is a program for benchmarking mutable linked list +# implementations by Martin Sulzmann and Simon Marlow. The reason it +# is here is that one variant of it demonstrated a nasty bug in the +# RTS, see the patch "Fix a bug that can lead to noDuplicate# not +# working sometimes", and the comments with stg_noDuplicatzh in +# rts/PrimOps.cmm. +# +# This test won't actually demonstrate the bug since it needs -N3 or +# greater (and hence a 3-core box) and the bug only manifests very +# occasionally, but at least the test is here for posterity. + +test('concprog003', + [skip_if_fast, + extra_clean([ + 'BackList2.hi', 'BackList2.o', + 'ImmList.hi', 'ImmList.o', + 'MainMVarList.hi', 'MainMVarList.o', + 'TestDataParser.hi', 'TestDataParser.o', + 'CASList.hi', 'CASList.o', + 'IOList.hi', 'IOList.o', + 'MVarListLockCoupling.hi', 'MVarListLockCoupling.o', + 'TestRun.hi', 'TestRun.o', + 'Collate.hi', 'Collate.o', + 'LazyList2.hi', 'LazyList2.o', + 'RefInterface.hi', 'RefInterface.o', + 'Collection.hi', 'Collection.o', + 'Main.hi', 'Main.o', + 'TestData.hi', 'TestData.o' + ]), + extra_run_opts('IMM -t test-8-3000-3000-2-1-4'), + ], + multimod_compile_and_run, + ['Main','']) diff --git a/testsuite/tests/concurrent/prog003/concprog003.stdout b/testsuite/tests/concurrent/prog003/concprog003.stdout new file mode 100644 index 0000000000..2839764088 --- /dev/null +++ b/testsuite/tests/concurrent/prog003/concprog003.stdout @@ -0,0 +1,2 @@ +Test Initiated: +Test Started: IMM diff --git a/testsuite/tests/concurrent/prog003/test-8-3000-3000-2-1-4 b/testsuite/tests/concurrent/prog003/test-8-3000-3000-2-1-4 new file mode 100644 index 0000000000..c287bf71ba --- /dev/null +++ b/testsuite/tests/concurrent/prog003/test-8-3000-3000-2-1-4 @@ -0,0 +1,13 @@ +Name: test-8-3000-3000-2-1-4 +Threads: 8 +Initial-List: +[1491,2657,2846,296,1177,2063,1505,3668,1596,2341,3147,97,3426,2458,214,2118,1382,3171,2886,825,3316,930,2643,3003,3091,2858,3694,1567,2041,2984,645,50,34,3408,1694,2130,3055,1343,273,466,1327,2218,1830,3406,1806,3598,720,1758,1320,1099,3974,3122,3242,1080,3516,3499,2357,3076,2864,1997,1593,1319,3730,1669,3121,589,3723,2992,686,302,3461,788,1565,2631,949,1311,1390,3866,1685,604,3774,907,179,2943,2862,210,496,2727,1539,360,1912,857,2749,3205,2945,1507,533,1029,3944,3895,2089,1817,3147,1627,2072,2493,3537,1740,478,3191,2735,2620,225,677,1257,1620,1345,2337,2356,928,150,2383,1652,405,3875,717,1340,2426,3220,542,308,1052,674,1467,387,3250,3499,2609,367,147,2010,1358,3803,3843,1455,3638,295,699,1816,2215,246,569,3936,3578,2971,1311,3858,1564,2377,3248,3621,3033,2823,3676,3415,1719,941,554,2206,1180,2146,795,366,2786,1674,1908,501,212,628,3819,1881,950,1570,2788,3170,3207,1083,239,3888,397,1646,65,3839,996,1695,1238,3753,1326,450,2242,1056,3049,1322,577,3365,3958,2783,1811,508,2016,2360,1752,2183,3691,2454,487,2628,1539,64,3711,2275,3714,1009,3429,1297,3616,1899,3069,3161,948,3482,3817,2749,62,2907,2686,1216,2008,2985,2636,3918,243,2263,1751,2110,3451,1215,2593,3739,65,1884,3923,2080,2402,1984,1962,1884,448,1944,590,3948,1900,840,2951,1595,608,1662,458,3298,3677,3741,2995,2401,3687,1886,3811,2302,2706,2690,1184,798,3698,2269,972,3937,2248,1629,1442,3141,848,3812,3655,2161,1344,2078,3663,2949,1090,481,2540,1874,2848,20,2209,1340,1824,1139,2818,1547,3124,1476,2242,3485,1246,3331,2766,725,2393,1450,2353,3917,1884,2962,1510,603,1746,1181,288,3995,1305,3193,1871,160,2980,1879,675,2539,674,3760,2702,1561,2925,527,2595,2503,1417,3464,918,1544,2412,405,2068,1406,3406,2045,511,2065,1159,2778,199,1375,2266,580,3718,2170,756,188,682,3983,2078,1633,2509,3857,1805,742,1219,3675,1128,1228,760,2817,2310,550,1589,392,2938,2892,2296,552,2533,1477,2669,962,2189,2673,1948,650,2056,3569,2052,2270,5,1752,1192,2323,1350,322,3728,91,3109,2960,3625,3096,2472,1560,3339,183,282,1116,2386,2191,1699,346,2908,125,1923,3620,606,207,1646,3973,2168,1643,2173,2854,895,1650,3062,26,304,2993,2352,2,1118,612,20,3881,1241,728,1938,3512,2040,3185,3345,817,3599,629,3561,2735,2517,1094,3620,2043,1003,287,746,2021,1340,224,1905,931,904,2883,3790,1839,3093,100,3819,28,1895,2214,2031,2466,501,8,3190,224,2554,2164,3247,2145,111,2651,936,1434,632,3661,1358,3411,1614,723,1485,3218,900,1957,1831,3529,996,1778,2516,3840,2189,3536,2677,3842,2921,2784,3337,3664,2931,935,2829,2922,290,1266,838,3561,604,2469,1753,3277,1737,2858,2806,918,1192,1419,1859,3361,2515,3893,3538,2278,2629,531,698,539,1242,3929,1038,2552,148,518,2259,3249,2223,414,3364,1523,2496,3930,1163,3587,3154,3645,324,566,2558,2442,733,2443,1297,3325,2915,632,497,2221,3112,376,1431,3459,2394,1039,3572,1940,1521,1385,2559,1043,665,2431,926,3730,497,1599,3655,2783,2509,3589,1967,3786,1841,3703,1134,4,1375,3051,2499,18,2166,1603,834,2279,219,3083,3122,1960,2872,1843,1781,613,1822,2604,1101,1806,3422,1254,1808,166,3442,107,2956,668,2805,1302,3649,3916,432,328,2957,860,1892,3305,1266,34,1868,2250,2719,2043,1747,332,1188,3572,3917,2375,2264,2497,76,1742,280,3336,2956,807,3798,3146,1337,3927,3220,2167,297,3652,1384,1862,3612,3180,2877,2044,1446,767,2666,748,1799,451,3186,675,1619,877,2438,1201,3436,2386,3125,3615,3524,1208,2608,2060,2129,396,3761,3408,918,1823,1629,1457,3372,1943,3647,2208,2048,3181,1436,197,2457,2879,3567,3505,1480,3343,1531,1671,1318,54,60,1306,1298,2439,3673,2166,2177,1347,3101,1589,3452,1906,1194,1796,1426,372,3437,1973,7,2254,1353,861,1497,128,2323,2735,2358,1970,3279,1640,1166,1290,3864,187,3756,1022,1314,2487,2776,1890,3083,1469,1981,2101,1534,2230,1513,2826,1082,1909,2323,2343,866,3369,1447,589,2455,2103,3197,3664,1567,2356,3269,3261,2087,3615,3227,1783,2858,223,1158,3716,2073,1195,1231,3869,1413,871,2380,2702,2370,3945,686,3041,2834,2875,3002,913,2478,1180,1070,1269,2957,119,3766,622,417,2084,3129,2133,780,3666,1250,3658,1921,3346,826,1754,1457,1945,903,2435,3407,1284,2660,2394,2663,1547,2753,72,1373,3312,1926,472,120,3095,3614,1789,2487,659,2896,1757,2790,3552,145,2935,710,1542,14,2280,2861,2590,539,1436,853,1930,3142,358,12,1941,1871,3889,1191,3922,2964,1568,3128,3621,1003,1141,517,3995,1065,1029,847,3270,3765,2171,3024,2026,1325,262,622,3209,3687,2353,1242,728,1663,1784,189,1431,480,456,3161,1894,3506,1473,1603,1541,1503,248,966,2180,1815,118,3945,2684,2528,358,349,3634,1575,3211,2508,2755,237,3715,1565,3194,2200,3707,3233,871,1649,2590,1787,2671,3627,2258,1236,2268,149,1834,2779,3739,2735,1241,970,219,2659,3726,1605,1311,2710,2257,2595,530,3072,1216,3405,1856,711,3243,2356,3498,2389,1070,1285,411,2857,2838,680,1043,2874,3969,3316,554,1460,3204,551,3892,2897,2761,3199,900,1683,648,3390,1600,2737,770,1260,2469,982,3527,2945,3625,2944,3541,578,278,2400,2645,2301,3339,1458,2217,2051,2918,2415,1256,354,82,1570,2983,682,251,799,1203,1628,1632,2978,112,3778,1157,1062,1685,16,568,2917,766,3424,2109,1654,1976,1046,2939,2060,3525,2495,1845,1884,1786,1133,1866,2814,1280,1548,40,2416,3388,980,290,3885,2214,2839,792,3562,375,1815,848,265,788,1528,3985,909,986,1105,1192,3473,2396,2940,3190,2139,2,2342,495,3870,1815,3256,3095,3061,366,3481,1493,1994,1011,2635,3212,2919,2412,3235,3175,3965,1753,3564,2221,3804,1690,2139,2707,3543,1020,2292,1378,2455,2863,3486,3189,3457,3153,310,234,2971,149,3940,1470,532,3851,1472,2148,2667,3114,2622,3545,1601,3218,1599,1621,1474,2699,290,1700,2834,2680,2216,889,564,2679,1109,2669,3761,3277,3079,2852,3985,1708,3720,842,727,1751,2043,571,1508,2046,524,2895,2773,2393,1948,182,2290,188,437,235,2259,821,7,210,1278,1041,3986,3389,106,1742,3286,106,1245,2008,230,3320,1446,1364,3884,782,901,2745,3536,1593,3911,2281,1222,1380,3455,2403,3661,3612,2966,3396,205,3957,3699,2492,3449,3405,2230,3596,2297,2631,2208,241,410,2810,3717,103,1217,2933,3825,1547,3578,1075,3102,1619,1919,3161,1392,784,525,329,2929,416,679,266,2222,3557,1604,3887,342,450,2609,3271,1320,973,2652,2800,34,2428,2680,1137,3252,8,2307,1694,391,104,2550,1389,3797,2231,2165,1847,823,2735,754,1136,3421,2361,1053,3629,2651,1487,693,3799,1082,1813,1951,1710,1182,3134,3700,2977,3809,792,3528,1137,1903,683,916,1393,12,1337,116,3044,3681,2545,775,3409,3065,1466,3389,1624,3958,796,3727,2377,3942,276,3704,3016,1580,2544,3382,1190,3318,3978,2077,920,870,1860,1709,3781,1860,487,3638,989,3136,3874,3074,1717,2792,2688,2131,1630,2590,3117,1339,3036,3688,2877,2348,1930,368,2332,343,3628,410,2506,1889,3595,3143,2203,771,1290,1733,253,1084,1043,707,2919,2958,2356,946,257,1105,2969,3075,2303,1500,2752,2986,3242,310,1165,1682,1078,206,1043,3762,2893,1769,2200,3537,3588,3732,1317,1792,3993,3718,2718,1953,1501,1464,59,2771,2467,1355,620,2199,1331,2213,244,2124,2529,2432,3029,1315,2286,3834,2151,3159,2925,2345,2655,3398,1935,3365,1419,1915,3030,1906,851,857,3130,656,2441,607,395,1387,3730,668,2223,1071,401,3147,1316,519,658,2817,1606,1661,860,999,2346,996,1377,1919,1863,1179,3250,3329,2155,508,712,2241,1395,2917,2689,324,669,2855,986,2107,1157,1228,1983,3769,819,125,155,3589,1357,909,3271,3628,1601,3366,1653,1870,766,1888,3681,2815,107,2849,220,1399,1083,3314,2320,662,1986,3575,2769,2335,2747,3680,96,3090,2455,1319,2157,1372,3893,511,651,2147,2627,1835,748,2745,678,2440,2462,3522,2917,1541,2295,700,2358,1405,1835,87,1464,3882,3748,2870,1682,3435,521,3491,186,51,593,1937,24,2239,3622,2044,3025,1876,3274,1092,859,3535,3475,3816,146,3973,537,3884,645,536,3466,1617,3973,1714,3528,2535,784,982,1157,3013,30,687,3451,2269,943,59,854,1294,3727,3249,25,1147,1624,1485,354,1367,2892,166,2680,302,2155,3244,2970,346,1811,432,150,3541,2651,1667,2078,3028,2861,2657,3048,3995,1502,128,1556,3083,1609,3311,1051,3317,3082,1448,3772,997,460,9,750,1976,2632,1550,3326,10,3775,1730,370,1518,2686,156,3936,3741,70,1864,1875,2332,2192,1582,1491,1818,159,3979,1039,2928,108,2235,798,3672,985,3028,3435,2173,418,1650,2798,3665,897,256,732,2619,753,861,488,2222,1392,2897,3592,3343,3530,115,3039,3056,1818,1435,1597,2217,3225,3584,3072,1412,3517,3471,978,1324,3372,169,3981,2058,60,942,1085,115,3364,1048,1187,440,1658,2738,1443,2324,388,2859,105,2025,3692,2315,2921,45,1191,1482,93,341,3802,2529,2454,1320,1884,861,923,3829,2742,36,3192,1066,1989,2792,2348,3042,1212,3379,525,563,1172,2660,855,2761,1557,1969,3307,1305,2210,1302,22,1797,1548,2917,1464,3533,485,238,939,469,2773,2621,654,2786,801,3339,640,1710,916,2408,2794,1511,2761,544,3497,3967,917,2888,2965,3493,2664,2010,3466,1721,2855,1409,2641,175,2972,3804,119,2097,1030,2,2754,221,454,2360,3386,2895,2405,3303,1138,1271,3778,1708,324,490,2993,3446,3817,1504,671,673,3109,2920,1559,26,2718,3566,3640,1044,2899,779,2096,2184,770,3263,604,197,1685,236,1352,577,781,3953,2875,900,1185,1519,2887,1934,2377,3606,3815,2819,2615,1552,1976,1508,973,331,2855,1363,3010,2294,2181,1485,3641,1365,2440,2049,2172,3784,2885,2472,3678,2878,2282,372,3644,3887,3636,2528,773,436,217,1896,1026,18,1575,1451,2651,1921,1682,2994,2374,1301,3076,1289,596,724,1323,3,1419,854,3234,2142,317,3299,2037,2731,622,567,703,1331,516,1967,348,3834,1047,739,1974,3740,1730,3815,1868,2644,2953,3573,1398,182,2791,3258,2302,2367,3402,678,2413,1442,2007,2237,2865,2990,674,1273,333,2183,3074,589,3685,3791,110,3504,415,224,3787,2214,2045,1359,2594,802,1180,1428,1046,2317,1982,2109,1694,3437,1682,1737,2875,1783,390,1868,2117,2518,3980,3629,2136,1800,3067,130,1935,2922,2143,1620,1131,867,3880,1586,2883,1849,1576,66,1670,3698,2343,3481,2436,1007,618,3760,922,3034,203,3933,1886,1889,3199,1481,3755,747,3385,236,2269,2124,3529,2888,3628,1745,350,87,1810,1875,3425,1552,2683,3136,3350,1141,1853,2002,885,2248,3935,364,2886,1550,2624,3119,3012,2905,3854,2829,3731,2242,2961,186,1627,2052,3662,1345,3244,668,1029,1875,2614,1442,2361,2829,2237,2976,1260,2485,3128,133,3294,2769,1774,2470,1535,3819,706,1249,768,2239,2380,3580,282,1332,1526,1605,2695,888,2475,2960,451,1115,2992,3092,1257,2063,1289,303,1497,3730,3152,2223,3363,3477,3705,3724,2184,1986,1938,2522,3640,747,1957,1889,3429,2374,2987,832,2063,3515,2793,2632,2529,2385,3520,1248,751,2900,3436,3514,64,282,2006,2400,3835,3816,1788,3527,3333,918,3405,3554,2786,3736,1645,2379,3531,1702,3610,1915,1278,2245,3755,2772,809,588,1858,812,1657,248,2557,557,75,3633,757,493,1891,1595,435,3209,3348,1553,459,1769,3644,220,615,2635,1636,185,226,227,3481,2968,901,2785,1130,2569,2933,1454,2582,671,2494,1107,3824,738,3219,2534,3719,1177,208,2331,642,3983,1824,3755,970,3074,1217,914,1693,320,2866,2965,3455,3427,3990,2138,2143,1313,2270,1141,1713,1288,1273,3921,2521,13,2900,3673,3067,2418,2140,2542,2604,3927,1395,1220,3288,941,2650,475,3465,773,3398,2197,3755,3046,351,1065,1110,2890,2706,2945,1511,93,3822,1598,3094,3012,2431,2518,2617,2070,365,1902,966,875,1724,1145,3240,3789,1924,344,3332,3648,2985,3153,163,272,832,3969,93,1625,1419,495,2333,2823,3395,630,1716,1204,3563,1421,3291,2632,1147,74,2303,1980,3728,1104,3081,1960,3084,3356,983,3583,660,1703,3898,1719,3270,2365,1228,2218,384,3832,2664,2749,3789,287,2867,905,1701,3353,2587,1714,3608,3874,349,1258,453,731,1382,3615,801,2785,2462,3767,2402,2419,529,1731,2688,408,1310,1254,1050,484,3501,2883,1777,3514,3111,1128,579,2036,3539,462,3858,2318,3428,1512,1000,2767,597,3127,2432,594,3711,385,3207,2000,2685,1318,704,1065,1231,1823,3682,548,32,3771,1226,878,3331,3645,2639,1514,2533,3725,3459,2430,3253,696,3840,595,2650,372,3398,2518,889,1619,615,3986,2997,119,1689,3527,872,2879,2750,1943,1358,2815,3656,2668,83,1308,2253,936,1917,3755,792,3432,1574,146,1286,2313,2321,928,3065,2091,2419,3640,3121,1180,2460,3920,3899,1525,1466,3764,3080,1254,2878,375,3192,387,3819,1210,1672,872,2438,395,631,853,3199,2335,907,1119,2855,1925,1015,3185,3490,2962,383,1214,2161,271,3983,857,1116,1678,376,3182,2833,2969,836,2863,2837,3738,3170,1643,2122,68,34,3716,601,2303,3326,1051,2424,1155,189,131,2318,2767,2861,1683,1758,2278,3355,1628,2732,3448,2795,2108,1311,772,1402,2716,3082,3915,2582,2017,2466,3277,2309,783,1268,2992,2230,2626,1683,3560,643,2507,1463,2239,2256,1843,3038,3255,411,1353,2960,3021,1584,3094,2914,2994,3398,2515,1419,2252,2080,3994,3141,1622,3189,1819,341,610,2763,3259,3282,3983,3628,2746,112,3734,2284,2723,1112,1724,386,202,2742,601,2782,666,2061,779,313,1803,2867,3910,3216,3533,2444,1731,2426,3936,2922,120,2237,2906,1210,3082,714,95,3689,328,1832,3104,3922,3077,1711,1585,1031,2393,1739,2043,1797,1096,3353,2776,144,1044,880,2870,1558,1040,3435,878,1652,3386,1241,2569,894,2487,1526,2789,3787,1907,3114,1325,197,3867,1946,1490,1088,3014,2417,1517,398,3895,3823,3584,1501,1015,3838,3116,3176,3050,828,1832,3297,262,378,1386,2138,1589,2680,2280,166,127,2814,2521,3799,3975,3194,3056,2054,1707,2032,346,577,3401,1439,1516,3460,2259,202,67,2933,2417,1223,1614,3468,1146,3737,2366,3737,3360,76,204,515,1712,3745,3664,2168,3848,315,1973,3129,2412,3009,2943,2200,178,2617,1792,1207,3566,2910,2087,1199,896,3559,2872,2067,3805,831,238,1579,2509,901,1263,3431,632,1659,952,1794,1251,2797,3113,2945,3565,1709,2826,1905,3794,3913,3078,2745,719,1444,3325,2289,2493,1369,2481,3709,293,740,38,153,1806,3414,3664,1044,3769,3986,2792,455,20,1952,3425,1861,955,1648,1596,1407,1595,573,681,1382,2593,594,2266,510,3693,3148,3656,1066,2964,2043,2758,2353,320,2555,1565,3987,2473,3184,2300,1967,1073,2016,1972,755,246,2299,2511,2830,994,617,1569,3452,3849,3622,183,787,2804,1021,1385,774,3599,2502,1131,2770,1156,2039,1817,3287,3562,862,2622,1411,3340,2862,1662,2601,3823,1316,1517,3336,1345,1912,3306,423,3347,1893,1014,1288,2244,2287,2845,837,1183,2201,2674,1326,2059,3403,1668,2821,3945,2475,854,2133,3016,3922,567,700,2921,3327,1233,3507,3257,1654,73,3256,24,799,2890,3808,556,530,2217,1868,3265,1362,1675,496,2363,1226,3841,2961,839,1606,3673,2448,3885,2692,3143,938,2197,824,825,867,873,161,3122,2144,583,567,2107,2188,2555,1677,1921,1171,3725,3872,1835,2388,3171,1020,974,3023,1286,3421,932,220,2063,1696,1418,3592,3361,1876,1190,1554,3118,2230,1864,1849,3768,2678,627,3627,585,3542,3089,136,469,1937,2225,293,330,1040,3463,1647,3157,1828,3735,100,3310,2802,2738,2014,1638,1027,2204,1020,3834,2336,3765,3500,2364,2128,3020,452,175,3901,2957,721,1337,757,3472,433,3080,3024,1351,1555,1613,673,1062,1137,626,355,3152,1617,3700,918,1978,2322,3556,1216,3974,1795,1128,2138,3328,2275,3337,3543,1918,1090,68,3464,3772,744,3688,2007,502,1111,1101,895,1826,3958,2359,2230,933,3931,2502,2739,2971] +Tasks: +[Find 450,Find 2236,Insert 1905,Insert 2320,Delete 2544,Insert 3574,Insert 584,Find 2459,Find 3301,Insert 3005,Insert 458,Delete 1468,Insert 40,Insert 112,Insert 1177,Delete 3073,Find 645,Find 1422,Insert 3854,Insert 2305,Insert 3017,Insert 3342,Insert 3973,Insert 267,Delete 3012,Find 142,Delete 2784,Delete 563,Insert 3949,Insert 2113,Find 628,Find 3621,Insert 3814,Delete 3844,Delete 2514,Insert 3003,Insert 3066,Insert 2259,Find 3836,Insert 3550,Find 1672,Delete 2998,Delete 1243,Find 3079,Insert 1173,Insert 3893,Find 115,Insert 1542,Insert 1389,Insert 664,Insert 1500,Delete 3320,Insert 2019,Find 3373,Find 1497,Insert 2185,Find 3299,Insert 174,Insert 537,Delete 682,Insert 1612,Insert 1811,Find 831,Insert 2057,Find 180,Insert 3287,Delete 347,Insert 2939,Delete 690,Insert 1757,Insert 3102,Insert 2281,Delete 2222,Insert 3889,Insert 589,Insert 71,Find 3959,Insert 3413,Find 284,Insert 2024,Find 3996,Insert 2663,Insert 28,Find 1364,Insert 1391,Insert 2566,Find 3708,Insert 1836,Insert 1077,Delete 551,Find 1292,Find 232,Insert 1599,Find 2693,Find 2621,Find 3323,Insert 1319,Delete 3487,Insert 1644,Insert 1405,Delete 470,Insert 994,Delete 1360,Find 3695,Insert 1952,Find 828,Find 3993,Insert 907,Insert 598,Delete 2425,Insert 784,Insert 1721,Insert 3764,Insert 1041,Insert 599,Find 92,Insert 3698,Delete 3955,Insert 2944,Insert 427,Find 954,Insert 3582,Insert 1748,Insert 2709,Find 1106,Find 1377,Insert 3453,Insert 770,Insert 1187,Insert 2944,Find 3144,Insert 525,Insert 2526,Delete 3269,Find 1251,Find 2352,Insert 340,Insert 3751,Insert 2483,Insert 460,Insert 3438,Find 2167,Insert 1229,Find 2283,Find 1793,Find 1368,Insert 1113,Delete 3091,Find 3830,Find 1791,Insert 30,Find 328,Delete 3020,Insert 3763,Find 2948,Find 1831,Insert 2928,Find 2889,Find 14,Insert 3445,Insert 3341,Insert 3981,Insert 932,Insert 126,Insert 1964,Insert 3688,Delete 734,Insert 176,Insert 641,Insert 3063,Delete 3958,Insert 1371,Find 3270,Insert 1738,Insert 2960,Insert 1017,Insert 443,Insert 211,Insert 1962,Find 133,Insert 1340,Insert 2083,Find 3005,Insert 2604,Insert 1632,Insert 1876,Delete 2402,Find 456,Find 2093,Insert 1744,Insert 1872,Insert 2856,Insert 3804,Insert 683,Insert 2703,Insert 647,Insert 56,Insert 3111,Insert 1258,Insert 1786,Insert 1971,Insert 3738,Delete 2521,Insert 2046,Insert 3865,Insert 807,Find 2828,Find 1602,Find 676,Insert 3690,Insert 3148,Find 1604,Insert 1892,Delete 207,Insert 1361,Insert 2667,Find 2502,Insert 1827,Insert 732,Delete 2706,Insert 3977,Insert 1249,Find 482,Find 1575,Delete 3327,Insert 2510,Insert 3959,Find 1032,Insert 197,Insert 1722,Insert 1191,Delete 1831,Insert 1895,Insert 872,Insert 3883,Delete 214,Insert 1833,Insert 1531,Insert 3927,Insert 1626,Insert 1053,Insert 2571,Delete 3236,Insert 1708,Insert 2127,Insert 3891,Insert 1271,Find 3492,Find 2704,Insert 2349,Find 2054,Insert 3832,Find 2036,Delete 3132,Delete 291,Insert 2976,Find 2516,Delete 1012,Delete 2506,Insert 2213,Insert 1129,Insert 1686,Insert 2370,Insert 1440,Insert 3673,Delete 2163,Find 2437,Insert 1973,Find 3507,Insert 3376,Find 365,Insert 580,Insert 3306,Delete 3263,Delete 1567,Insert 1400,Insert 1636,Insert 2123,Find 642,Insert 2367,Insert 3492,Delete 1072,Insert 2175,Insert 3949,Insert 3999,Find 2849,Find 498,Delete 3653,Insert 1304,Find 1472,Find 3370,Insert 1818,Find 955,Find 1986,Insert 1743,Find 3986,Insert 328,Delete 424,Insert 3512,Delete 185,Insert 2354,Insert 221,Find 3226,Delete 2356,Delete 3701,Delete 3923,Insert 429,Delete 1173,Delete 3126,Insert 3109,Find 2867,Insert 2119,Insert 742,Insert 1473,Find 2406,Insert 2791,Insert 90,Insert 478,Find 465,Insert 2209,Find 3199,Insert 3447,Insert 997,Insert 779,Find 1671,Insert 863,Find 655,Find 1896,Find 3092,Insert 3524,Delete 1888,Insert 834,Find 991,Delete 930,Insert 742,Insert 1922,Delete 3861,Insert 3726,Find 3735,Insert 2133,Insert 1050,Insert 3423,Insert 3396,Insert 1694,Insert 1155,Insert 1867,Insert 2584,Find 2469,Insert 2490,Insert 2694,Insert 3089,Delete 646,Delete 555,Find 3564,Insert 1199,Insert 2004,Insert 2551,Insert 1061,Find 3841,Insert 3093,Insert 3529,Insert 814,Insert 2175,Insert 2275,Insert 2235,Insert 3775,Insert 326,Insert 2433,Insert 3267,Find 2195,Insert 1139,Insert 1316,Insert 2237,Insert 3623,Delete 3353,Find 2750,Find 135,Insert 2366,Insert 1331,Find 3911,Insert 944,Insert 3573,Insert 3686,Delete 2674,Insert 1927,Insert 439,Find 1891,Insert 3047,Insert 2047,Insert 1745,Insert 3524,Find 660,Insert 3153,Delete 668,Insert 3645,Insert 413,Find 494,Find 3781,Find 709,Insert 3752,Find 569,Insert 1551,Insert 3364,Insert 3971,Insert 1672,Insert 2063,Insert 3682,Insert 1752,Insert 465,Insert 3082,Find 3820,Insert 1156,Insert 3492,Insert 54,Insert 223,Delete 2728,Find 2970,Delete 1530,Insert 3963,Find 2930,Insert 3201,Insert 3262,Insert 285,Find 3275,Insert 1203,Find 1622,Insert 3289,Insert 2968,Insert 2267,Find 3036,Insert 2622,Find 3055,Find 2361,Delete 2299,Find 1906,Find 2665,Find 2207,Insert 1339,Delete 1427,Insert 3158,Insert 2075,Find 221,Insert 2714,Insert 3383,Insert 541,Insert 3385,Insert 1415,Insert 2020,Find 1911,Find 2294,Insert 3325,Insert 725,Delete 3017,Find 1537,Find 2682,Insert 3973,Find 3560,Insert 1363,Insert 2696,Find 1370,Delete 3698,Insert 2894,Insert 475,Find 2388,Insert 2620,Find 1524,Delete 775,Insert 2713,Delete 1304,Delete 391,Insert 3668,Insert 3157,Insert 1459,Find 1146,Insert 3796,Find 1795,Delete 2303,Insert 3792,Delete 3281,Insert 576,Insert 1193,Find 846,Insert 2529,Find 2585,Insert 301,Insert 814,Insert 227,Find 2070,Delete 3071,Insert 735,Find 1323,Find 1832,Find 3195,Insert 3282,Insert 3365,Find 2988,Insert 795,Delete 2220,Insert 3255,Insert 3535,Insert 780,Insert 759,Insert 522,Insert 2790,Delete 1751,Find 3634,Insert 2991,Insert 1207,Insert 2374,Insert 101,Delete 176,Insert 2934,Insert 312,Find 683,Insert 3415,Find 1981,Insert 3718,Insert 2971,Insert 2719,Delete 522,Find 3649,Find 197,Find 2461,Delete 2884,Find 896,Find 3585,Insert 3237,Find 2049,Find 1636,Insert 340,Insert 3926,Delete 414,Delete 2620,Find 344,Insert 54,Insert 1070,Delete 2707,Find 3454,Insert 171,Insert 3625,Find 2084,Insert 950,Insert 2351,Find 2469,Insert 571,Insert 411,Find 1534,Insert 3017,Insert 882,Insert 2042,Insert 487,Insert 3214,Find 1809,Find 2201,Insert 2543,Delete 653,Delete 2843,Find 580,Delete 2840,Insert 1875,Insert 711,Insert 1204,Delete 552,Insert 261,Find 2336,Insert 1016,Find 98,Find 1537,Find 3441,Find 1775,Insert 3953,Find 2547,Find 3983,Insert 3109,Insert 1662,Delete 2097,Find 1237,Insert 3294,Delete 3205,Insert 3641,Find 1322,Insert 419,Find 3935,Insert 796,Find 1399,Delete 1437,Insert 2838,Insert 3365,Insert 1280,Insert 3384,Insert 1904,Insert 755,Find 2154,Insert 813,Delete 849,Find 2408,Insert 2561,Find 66,Find 167,Find 2478,Insert 785,Insert 2682,Insert 190,Insert 3863,Delete 422,Insert 2377,Find 733,Insert 1204,Insert 1198,Insert 1802,Delete 2977,Insert 395,Delete 1364,Delete 748,Delete 2428,Find 3264,Delete 1574,Find 2826,Insert 928,Insert 3356,Insert 1210,Insert 2786,Find 2170,Find 2202,Insert 3977,Find 3013,Insert 883,Find 936,Find 113,Delete 2130,Insert 3926,Find 2712,Insert 1664,Insert 1215,Delete 2678,Find 168,Insert 1396,Insert 903,Insert 3857,Delete 3775,Find 468,Insert 3292,Find 2780,Delete 2533,Insert 243,Insert 469,Insert 2117,Insert 1602,Delete 3155,Insert 3614,Insert 3311,Insert 3804,Insert 1520,Insert 917,Insert 967,Insert 451,Insert 3802,Insert 111,Find 1265,Insert 831,Insert 3255,Insert 519,Insert 3964,Find 2145,Insert 3552,Insert 2284,Insert 825,Find 2893,Find 580,Insert 3169,Insert 2932,Delete 3008,Insert 1107,Insert 287,Delete 1933,Insert 687,Insert 222,Delete 618,Insert 2277,Insert 284,Insert 2147,Find 1778,Insert 2510,Insert 97,Delete 903,Insert 1620,Insert 2288,Find 2612,Find 2812,Insert 586,Insert 2846,Insert 867,Insert 2496,Insert 1049,Insert 676,Insert 1162,Delete 267,Insert 894,Insert 2572,Insert 2320,Insert 1100,Delete 1897,Delete 1599,Find 1380,Insert 408,Insert 2067,Insert 638,Insert 2468,Find 1206,Delete 3593,Find 260,Delete 2091,Find 3919,Delete 1535,Insert 3251,Delete 2093,Insert 3028,Delete 2344,Delete 2182,Insert 455,Insert 1457,Delete 2615,Find 2471,Insert 95,Find 1110,Insert 1853,Find 1006,Insert 1445,Insert 546,Find 1561,Insert 54,Delete 2527,Delete 2051,Insert 3166,Insert 3326,Insert 2701,Find 2409,Delete 488,Insert 2835,Insert 3892,Insert 1116,Find 2819,Find 3742,Find 3845,Find 1455,Insert 3550,Find 3500,Find 2939,Delete 926,Insert 2992,Insert 3653,Insert 3691,Insert 1482,Insert 3098,Insert 2845,Insert 2435,Insert 3265,Insert 2971,Insert 1136,Insert 2833,Insert 527,Insert 3245,Insert 1473,Insert 992,Find 2789,Insert 683,Insert 847,Delete 3619,Insert 530,Delete 2471,Insert 3405,Find 123,Insert 549,Find 2350,Insert 2774,Delete 3600,Find 2874,Find 552,Insert 3395,Find 315,Find 953,Find 1460,Insert 1648,Find 494,Insert 1181,Delete 272,Insert 830,Insert 3390,Insert 3451,Find 2474,Delete 644,Insert 108,Insert 2808,Delete 2963,Find 2330,Insert 3575,Find 399,Find 1753,Insert 1197,Insert 3403,Insert 309,Delete 2861,Insert 1987,Find 3912,Delete 979,Find 293,Insert 66,Find 2467,Delete 2113,Insert 343,Insert 2981,Insert 1788,Insert 3870,Delete 3717,Insert 1596,Insert 1329,Delete 1803,Find 1564,Insert 396,Find 2728,Delete 3049,Find 936,Find 2753,Find 867,Insert 3591,Insert 750,Insert 2140,Insert 3643,Insert 3079,Delete 2887,Insert 1467,Find 1581,Insert 1109,Find 830,Delete 2949,Find 3676,Insert 3201,Insert 3201,Insert 917,Find 3990,Insert 2187,Find 2200,Insert 9,Insert 1167,Find 1141,Insert 1424,Find 2812,Find 3087,Insert 3241,Insert 305,Find 1145,Insert 3078,Insert 175,Insert 2073,Insert 1105,Insert 2428,Insert 313,Find 975,Find 2681,Find 355,Delete 2291,Insert 1828,Insert 2154,Delete 3486,Insert 3751,Find 3820,Insert 2095,Insert 3893,Insert 14,Delete 1358,Find 1046,Insert 198,Insert 2543,Insert 69,Find 1623,Insert 208,Delete 1471,Insert 3613,Insert 2814,Find 815,Find 3239,Find 2143,Delete 1496,Insert 1600,Delete 3258,Delete 1260,Insert 3540,Delete 459,Insert 66,Find 2180,Insert 3466,Find 3485,Insert 315,Delete 449,Find 930,Find 3835,Delete 2386,Insert 2074,Find 1568,Insert 553,Insert 3409,Insert 2994,Insert 2518,Insert 820,Insert 1972,Insert 3002,Delete 782,Insert 1455,Insert 3633,Insert 1489,Insert 3037,Find 1336,Find 367,Insert 2484,Delete 178,Insert 1055,Insert 3848,Find 927,Insert 3539,Insert 3541,Insert 362,Insert 1645,Find 3400,Find 2924,Insert 2091,Find 1067,Find 2686,Insert 2778,Insert 3213,Find 483,Find 3926,Find 1786,Insert 60,Insert 439,Find 1097,Insert 247,Insert 809,Insert 3883,Insert 3150,Find 3553,Find 2679,Find 3045,Find 3242,Find 1911,Delete 38,Insert 3754,Find 286,Find 3896,Find 2835,Insert 2348,Find 3337,Insert 3219,Find 3697,Insert 3315,Insert 3119,Delete 3228,Insert 2114,Find 259,Insert 1420,Insert 3585,Insert 872,Insert 1473,Find 1951,Delete 1698,Find 2552,Insert 182,Insert 3708,Insert 2058,Find 2816,Insert 2037,Insert 3319,Insert 1760,Insert 2605,Insert 2630,Insert 2535,Insert 2291,Find 166,Insert 2431,Delete 3568,Find 3522,Insert 2154,Insert 997,Find 203,Insert 3570,Insert 987,Insert 3469,Insert 3085,Delete 1439,Insert 1742,Insert 1932,Insert 3593,Insert 1772,Insert 773,Insert 843,Insert 3047,Insert 3517,Find 876,Find 1236,Insert 3194,Delete 940,Insert 1517,Find 2556,Insert 3054,Insert 2980,Find 1454,Delete 2017,Insert 3140,Find 2409,Delete 3672,Insert 3177,Insert 2740,Find 2972,Find 2173,Insert 999,Find 3069,Insert 462,Insert 97,Find 2429,Find 3812,Delete 1602,Find 1888,Insert 2237,Insert 2255,Insert 1062,Insert 3868,Insert 1683,Insert 2227,Insert 396,Find 1538,Insert 147,Delete 2605,Insert 3722,Delete 3556,Delete 1660,Insert 1711,Find 854,Delete 3024,Insert 3433,Find 1193,Delete 55,Insert 975,Find 1110,Find 2247,Find 231,Insert 2653,Insert 464,Find 3021,Insert 2123,Insert 873,Insert 3989,Insert 1870,Insert 2732,Find 1118,Insert 1493,Insert 3311,Find 2102,Insert 3397,Find 3755,Delete 3992,Insert 3808,Delete 440,Insert 1885,Insert 1439,Find 2010,Insert 1991,Delete 1952,Delete 1556,Find 3742,Insert 3427,Find 328,Find 153,Insert 3925,Insert 521,Insert 1309,Find 679,Delete 2139,Delete 2801,Insert 3240,Find 474,Insert 2250,Find 1885,Insert 2691,Delete 3450,Insert 1439,Insert 1410,Insert 2768,Insert 1956,Insert 829,Insert 2751,Insert 3837,Find 2006,Insert 1828,Find 3834,Insert 2859,Find 1754,Insert 3373,Find 3162,Insert 396,Insert 160,Insert 129,Insert 2752,Delete 3189,Delete 2444,Insert 440,Insert 1065,Insert 1644,Insert 2852,Insert 2773,Find 2393,Delete 3112,Insert 2002,Insert 158,Insert 3553,Insert 2175,Delete 913,Delete 2542,Insert 2515,Find 622,Find 1639,Find 704,Insert 1742,Insert 1000,Find 2637,Delete 1413,Insert 3916,Insert 1761,Insert 139,Insert 391,Delete 3311,Find 1922,Delete 1568,Delete 2373,Find 1259,Find 3722,Insert 2773,Find 2653,Insert 2397,Delete 1061,Find 986,Find 589,Insert 405,Insert 601,Insert 2633,Insert 2946,Insert 1807,Delete 2547,Find 3185,Find 2995,Find 1224,Find 561,Insert 3487,Insert 903,Find 1925,Insert 3453,Delete 2020,Find 1540,Insert 2933,Insert 2467,Insert 1812,Insert 982,Find 1444,Insert 3391,Insert 426,Find 2735,Insert 2050,Insert 2964,Delete 1148,Find 1791,Insert 1170,Insert 637,Delete 3737,Insert 369,Find 3808,Delete 2033,Find 1710,Insert 3856,Insert 1401,Find 1484,Delete 2168,Insert 1787,Insert 131,Insert 2042,Insert 2248,Find 1866,Insert 3642,Insert 1964,Find 3823,Insert 3086,Find 813,Insert 767,Find 2453,Find 3338,Insert 69,Insert 1238,Find 2394,Insert 3,Insert 1965,Insert 3803,Insert 2490,Find 1267,Find 2373,Insert 3411,Find 894,Delete 1013,Find 5,Delete 1643,Insert 498,Delete 3913,Insert 469,Find 2706,Find 1539,Insert 3579,Insert 816,Find 2074,Find 2978,Insert 464,Insert 3141,Insert 1488,Find 991,Delete 1761,Insert 1201,Find 712,Insert 854,Insert 1801,Find 1797,Insert 48,Find 1102,Insert 367,Insert 2560,Insert 2364,Insert 858,Insert 1136,Insert 3577,Insert 1265,Insert 3396,Insert 3179,Find 1013,Insert 3968,Insert 1545,Insert 1727,Insert 238,Delete 2707,Insert 1305,Find 1005,Insert 3668,Insert 76,Insert 1885,Insert 3578,Insert 1256,Find 1327,Find 3004,Insert 343,Insert 1448,Delete 3503,Find 1007,Delete 1491,Insert 2445,Delete 2708,Delete 1623,Delete 3905,Delete 2169,Insert 3675,Find 2067,Delete 1737,Delete 3903,Insert 450,Find 3577,Find 2862,Insert 488,Delete 1028,Find 685,Insert 694,Insert 2343,Insert 993,Insert 2626,Find 1335,Insert 1399,Insert 925,Insert 3010,Insert 3490,Find 1755,Insert 1949,Insert 69,Find 3544,Insert 865,Find 2568,Insert 924,Insert 2336,Insert 3208,Insert 2450,Insert 1162,Find 3072,Insert 579,Find 3892,Insert 1513,Insert 2724,Delete 2626,Insert 3277,Delete 2718,Find 2806,Insert 3296,Find 1363,Insert 170,Delete 1957,Insert 3560,Find 689,Insert 71,Delete 2056,Insert 744,Find 2392,Insert 2196,Find 3061,Find 248,Insert 1446,Insert 1140,Insert 989,Insert 2007,Find 849,Find 1548,Find 941,Insert 1977,Insert 3731,Insert 3489,Find 2983,Insert 1074,Delete 908,Insert 1716,Delete 1416,Find 3855,Insert 504,Insert 1641,Delete 1789,Insert 996,Insert 2328,Insert 3119,Delete 2778,Delete 340,Delete 1427,Insert 2289,Insert 195,Find 2964,Insert 645,Insert 785,Insert 422,Insert 2311,Delete 2472,Find 3520,Insert 2426,Insert 3791,Find 2757,Insert 3434,Find 506,Find 448,Delete 2577,Insert 2861,Insert 1943,Insert 627,Find 2494,Find 1757,Insert 2042,Insert 2267,Insert 3503,Insert 451,Insert 1653,Find 3542,Delete 2824,Insert 2063,Find 3065,Insert 1412,Insert 3379,Delete 401,Insert 719,Find 3930,Delete 3310,Insert 2944,Find 3357,Insert 3819,Insert 290,Insert 3554,Delete 3474,Insert 1079,Insert 826,Insert 3440,Delete 13,Insert 578,Insert 958,Insert 2388,Insert 793,Insert 3922,Insert 255,Insert 3832,Delete 167,Find 3112,Insert 3504,Delete 954,Find 239,Insert 3054,Find 2019,Find 3168,Insert 1060,Insert 1465,Insert 3640,Insert 2557,Find 3664,Find 3410,Find 1414,Find 1960,Find 850,Insert 738,Insert 1910,Insert 1593,Insert 809,Insert 3013,Insert 2522,Delete 2710,Insert 2720,Find 2693,Insert 986,Insert 3542,Insert 1217,Find 1637,Find 1820,Insert 1476,Find 3310,Delete 1882,Insert 339,Insert 496,Insert 3707,Insert 2359,Insert 3089,Insert 3029,Delete 573,Delete 2291,Find 1570,Insert 1190,Find 3138,Delete 3247,Find 3568,Insert 1394,Insert 94,Delete 2219,Find 3257,Insert 3962,Insert 626,Find 653,Insert 3631,Insert 3726,Find 2893,Insert 2813,Insert 1994,Insert 544,Insert 2796,Delete 765,Insert 2768,Insert 2615,Find 100,Insert 1529,Find 2544,Insert 2099,Find 1202,Delete 2939,Insert 451,Insert 3149,Insert 3661,Insert 1699,Delete 2680,Insert 1596,Insert 2503,Insert 3478,Delete 2655,Delete 3909,Find 776,Find 1498,Insert 252,Find 2697,Find 131,Insert 2786,Find 1330,Insert 1733,Find 964,Insert 287,Find 968,Insert 2046,Find 3313,Find 3926,Insert 1828,Insert 3539,Find 1232,Delete 3522,Delete 2699,Find 3012,Insert 2024,Insert 443,Insert 119,Insert 2863,Find 187,Insert 1424,Insert 983,Find 328,Insert 3130,Insert 1102,Insert 2069,Find 666,Find 1411,Insert 1213,Find 1206,Delete 2061,Delete 2298,Insert 240,Find 2618,Find 3966,Insert 544,Delete 416,Find 1996,Delete 2146,Insert 2895,Find 3554,Insert 1893,Insert 1162,Find 444,Insert 3212,Insert 162,Insert 1522,Insert 1431,Insert 225,Insert 886,Insert 2036,Insert 196,Insert 3425,Find 2313,Delete 1725,Insert 3941,Insert 1936,Delete 1756,Find 678,Insert 1767,Insert 2502,Find 2813,Insert 3806,Delete 3804,Insert 3675,Find 270,Insert 2289,Find 3463,Insert 3994,Insert 3250,Insert 2717,Find 3289,Insert 3776,Find 716,Insert 2828,Insert 3132,Insert 3039,Insert 3808,Insert 3261,Find 1429,Insert 2598,Find 338,Insert 1242,Insert 562,Insert 667,Delete 1260,Insert 3592,Insert 1838,Find 169,Insert 3648,Delete 3662,Insert 1885,Insert 1981,Insert 3976,Find 2762,Insert 332,Delete 2651,Insert 1070,Insert 3676,Insert 2977,Insert 3504,Insert 753,Find 57,Insert 519,Delete 1607,Delete 3794,Find 2090,Insert 2822,Delete 2886,Delete 1918,Insert 3200,Insert 1742,Find 3314,Insert 680,Insert 2550,Find 1080,Insert 2400,Insert 2087,Insert 209,Insert 22,Find 2327,Insert 3965,Insert 1545,Delete 1161,Insert 353,Delete 1389,Insert 3166,Insert 852,Insert 906,Insert 1433,Insert 3035,Find 416,Insert 2685,Insert 1273,Insert 2965,Insert 1826,Insert 357,Find 2059,Find 1471,Insert 1784,Insert 2564,Insert 2517,Find 3445,Find 609,Find 2084,Insert 1967,Insert 1767,Insert 2251,Find 3942,Find 2380,Insert 1766,Find 2429,Delete 900,Find 1476,Insert 1760,Insert 2193,Find 2042,Find 376,Insert 3442,Delete 1367,Find 207,Find 138,Insert 3856,Delete 3731,Insert 2577,Find 1709,Insert 2875,Insert 2299,Insert 932,Insert 908,Insert 2947,Insert 1989,Insert 1732,Find 1738,Insert 937,Insert 3720,Delete 140,Find 2696,Insert 876,Insert 1360,Insert 3574,Insert 1228,Find 3748,Insert 1088,Find 3242,Insert 2183,Insert 3938,Find 3981,Insert 849,Find 2233,Find 1363,Insert 58,Insert 2685,Insert 3270,Find 2966,Insert 2365,Find 1375,Insert 3196,Insert 2339,Find 3265,Insert 321,Insert 1546,Find 2393,Insert 664,Find 428,Insert 792,Find 1227,Delete 445,Insert 1598,Insert 288,Delete 3480,Insert 3353,Find 1872,Find 157,Find 115,Find 3020,Insert 575,Insert 315,Insert 3426,Insert 3628,Insert 1637,Find 2629,Insert 2714,Insert 3884,Find 622,Insert 106,Insert 1157,Insert 2449,Insert 2948,Find 324,Insert 3047,Insert 3916,Find 2735,Delete 3796,Insert 651,Insert 712,Find 2303,Find 833,Insert 3142,Delete 2980,Delete 3272,Insert 2893,Find 1083,Find 367,Find 3290,Find 3489,Insert 2188,Find 2191,Insert 2929,Find 1184,Insert 3957,Insert 3376,Insert 2866,Insert 3903,Find 1524,Delete 1746,Insert 2066,Insert 2710,Insert 396,Insert 1931,Find 1500,Insert 608,Insert 125,Delete 2526,Insert 2366,Find 2408,Find 2241,Find 3680,Insert 2926,Insert 3966,Delete 1340,Find 174,Insert 210,Find 2318,Insert 1604,Insert 343,Insert 2610,Insert 216,Insert 3993,Insert 3893,Insert 3513,Insert 1491,Insert 2719,Find 2415,Insert 3992,Insert 3863,Find 1720,Find 1725,Insert 3266,Insert 2495,Insert 487,Insert 2244,Insert 127,Insert 985,Find 3613,Find 1179,Find 1003,Insert 3099,Insert 2113,Insert 2006,Find 502,Insert 3243,Delete 3267,Delete 1020,Insert 2491,Delete 3813,Find 3203,Insert 3626,Insert 1925,Insert 448,Insert 1205,Find 774,Insert 17,Delete 1627,Insert 2785,Insert 1799,Insert 2506,Insert 1864,Find 2671,Insert 1276,Find 262,Insert 516,Insert 659,Insert 2604,Insert 983,Find 1138,Insert 2210,Insert 1894,Find 2607,Find 2723,Insert 1415,Find 517,Insert 3955,Insert 1969,Insert 2499,Find 3759,Insert 796,Insert 3252,Insert 606,Delete 2657,Insert 2459,Delete 1398,Find 373,Insert 3846,Find 3528,Find 716,Insert 3762,Insert 2578,Insert 2584,Find 1267,Insert 3130,Delete 2463,Insert 3771,Find 752,Insert 1087,Find 1171,Insert 822,Insert 119,Insert 1263,Insert 409,Find 3282,Insert 3070,Find 2054,Insert 2096,Delete 2310,Insert 3287,Insert 2925,Find 121,Delete 649,Insert 1921,Find 3962,Find 2853,Find 1329,Insert 1454,Insert 2455,Delete 72,Insert 2725,Find 2622,Insert 310,Insert 1674,Find 428,Insert 2805,Find 1016,Find 1093,Find 3743,Insert 2815,Insert 1223,Delete 3107,Find 727,Insert 2607,Insert 1913,Find 1629,Insert 1006,Insert 1209,Insert 3749,Insert 3994,Insert 3467,Find 3708,Insert 604,Delete 3454,Find 3711,Insert 3764,Insert 1715,Insert 9,Insert 557,Insert 1406,Insert 208,Find 910,Find 6,Insert 1914,Insert 2685,Delete 1863,Insert 1102,Insert 1436,Delete 1996,Insert 3986,Delete 93,Insert 1954,Insert 2434,Delete 2878,Insert 799,Delete 306,Insert 3784,Find 1906,Insert 3290,Insert 828,Find 2802,Insert 313,Find 3501,Insert 2924,Insert 1422,Delete 2141,Insert 316,Insert 1618,Delete 3439,Delete 3792,Insert 3557,Delete 3773,Insert 1803,Insert 1985,Insert 3740,Find 1213,Delete 1330,Find 1851,Insert 2288,Insert 1160,Insert 1076,Insert 3953,Insert 205,Insert 1769,Insert 921,Insert 561,Insert 3959,Find 1135,Find 3682,Insert 2226,Insert 1622,Find 3533,Delete 2097,Insert 532,Delete 1634,Insert 1409,Insert 2731,Insert 2770,Insert 675,Delete 2521,Find 388,Insert 906,Find 3719,Insert 1995,Find 637,Delete 2056,Insert 2805,Insert 1029,Find 981,Find 3282,Insert 1416,Find 3442,Find 179,Find 1692,Find 3081,Insert 1301,Insert 1410,Find 634,Insert 1785,Insert 1680,Insert 3745,Insert 2313,Insert 2541,Delete 3904,Find 1085,Insert 1506,Delete 2190,Insert 1918,Find 3653,Insert 716,Delete 1957,Insert 2976,Insert 1338,Find 1682,Find 935,Insert 687,Insert 2863,Delete 3021,Insert 2607,Find 1475,Find 2551,Delete 805,Insert 2873,Insert 654,Delete 152,Find 626,Find 1943,Find 2119,Find 299,Insert 1703,Insert 3208,Insert 2336,Find 274,Insert 809,Delete 3371,Insert 3843,Delete 1158,Insert 2053,Insert 165,Insert 3513,Insert 3979,Find 2308,Find 3015,Insert 702,Find 1573,Insert 3991,Insert 2825,Insert 1966,Find 2203,Insert 1099,Insert 3397,Insert 3387,Insert 1349,Insert 2620,Find 2580,Insert 1079,Insert 1751,Insert 3980,Insert 3508,Delete 668,Find 1096,Find 151,Delete 2695,Insert 1492,Find 2686,Insert 2585,Insert 27,Insert 2410,Find 3696,Insert 3979,Insert 3781,Delete 3864,Insert 2658,Find 860,Insert 1827,Insert 3159,Find 2620,Insert 3248,Insert 2788,Insert 947,Insert 3576,Insert 1859,Find 1601,Insert 1574,Find 3468,Insert 3949,Insert 3200,Insert 1187,Insert 594,Insert 2467,Insert 3102,Delete 217,Insert 1414,Insert 3114,Insert 1541,Find 1921,Insert 3143,Find 573,Delete 403,Insert 3674,Find 3329,Insert 1997,Insert 3778,Insert 44,Delete 1334,Insert 3089,Insert 2760,Insert 2093,Insert 5,Insert 3565,Find 2748,Insert 3054,Insert 1612,Delete 3924,Find 2302,Insert 3019,Insert 3645,Find 3237,Insert 3583,Insert 2430,Insert 10,Find 647,Find 2856,Find 3561,Find 3333,Insert 2399,Insert 2540,Find 1642,Insert 1606,Insert 2250,Insert 3326,Insert 1497,Find 2678,Insert 1412,Find 1325,Insert 3132,Find 3775,Insert 1890,Find 443,Insert 1775,Insert 162,Delete 3429,Find 251,Insert 3035,Find 3540,Find 3604,Insert 1754,Insert 1711,Insert 2930,Insert 2351,Delete 480,Find 210,Find 1196,Insert 1772,Delete 43,Find 1073,Insert 1830,Insert 3736,Insert 751,Find 3320,Find 2862,Delete 766,Find 478,Find 3856,Insert 2036,Insert 357,Find 3669,Delete 1798,Find 3936,Insert 3526,Insert 623,Insert 3545,Find 348,Find 2072,Find 65,Insert 2049,Delete 369,Insert 1876,Insert 1552,Find 2989,Insert 716,Find 3378,Insert 2348,Find 1685,Insert 1586,Insert 976,Insert 40,Insert 1799,Find 3961,Insert 894,Delete 1665,Insert 3162,Insert 1100,Find 1219,Insert 3094,Insert 759,Delete 780,Insert 813,Insert 1647,Find 3084,Insert 3761,Insert 1744,Insert 1756,Find 621,Find 3810,Insert 1905,Find 2173,Find 1733,Insert 406,Find 1388,Find 3441,Insert 898,Insert 3161,Insert 111,Insert 481,Insert 3579,Delete 549,Insert 1361,Delete 791,Insert 1288,Delete 2425,Insert 3508,Find 2316,Delete 2449,Insert 3295,Find 1547,Delete 2325,Find 2479,Find 1649,Delete 2502,Insert 1740,Insert 1776,Find 2412,Insert 1407,Insert 2721,Insert 1649,Insert 644,Find 2401,Insert 1666,Insert 3924,Insert 939,Insert 2947,Insert 249,Insert 1975,Insert 423,Insert 3450,Delete 666,Find 1682,Find 3150,Insert 827,Insert 2523,Insert 1600,Find 419,Delete 1361,Find 2337,Insert 1211,Find 575,Delete 881,Insert 2330,Find 2092,Find 2885,Find 715,Insert 2349,Find 2116,Insert 3988,Insert 235,Insert 1762,Insert 767,Find 2870,Insert 3055,Find 832,Find 458,Delete 1052,Delete 3986,Find 2259,Insert 1621,Insert 3562,Delete 553,Insert 378,Insert 1621,Insert 34,Find 2444,Find 2298,Find 3914,Find 3264,Delete 857,Find 3355,Insert 2296,Insert 2915,Insert 1082,Insert 645,Insert 2174,Find 3512,Insert 3119,Find 1153,Delete 1792,Find 3710,Insert 94,Find 925,Insert 3931,Find 834,Insert 3323,Find 2410,Insert 2397,Find 3630,Find 1666,Insert 1062,Insert 3235,Insert 3279,Find 2473,Insert 3335,Find 1720,Insert 531,Insert 2759,Insert 1768,Delete 104,Insert 82,Insert 3559,Delete 2567,Insert 1775,Find 1649,Find 1639,Insert 2012,Insert 1448,Find 495,Insert 3507,Find 2061,Insert 3115,Find 2321,Find 2123,Find 1958,Insert 3231,Insert 1078,Find 3157,Insert 948,Insert 3849,Delete 1497,Find 3884,Insert 3026,Insert 607,Find 3402,Find 2935,Insert 1653,Find 1254,Find 295,Insert 3411,Insert 3889,Find 2342,Insert 601,Insert 2676,Insert 2959,Delete 1220,Find 1393,Insert 3948,Insert 3018,Insert 1383,Find 2572,Find 2867,Insert 1689,Insert 1550,Delete 2268,Insert 881,Insert 3590,Find 17,Insert 1738,Insert 1038,Insert 2708,Insert 817,Insert 151,Insert 443,Insert 401,Insert 1418,Insert 3346,Find 2423,Find 3577,Insert 2221,Insert 52,Insert 483,Insert 1625,Insert 795,Insert 2668,Insert 3316,Insert 1192,Insert 3667,Insert 347,Insert 1958,Delete 2982,Find 3158,Insert 3462,Insert 2855,Insert 781,Insert 1342,Find 171,Insert 1801,Insert 32,Insert 2323,Find 3546,Find 2208,Insert 973,Delete 2980,Insert 3496,Insert 214,Find 1487,Insert 300,Find 2810,Insert 1162,Insert 3358,Insert 2012,Insert 2684,Find 70,Insert 1942,Insert 1184,Find 2001,Insert 1260,Find 2080,Insert 3259,Insert 851,Insert 2054,Insert 1428,Insert 769,Insert 1686,Insert 3750,Insert 2518,Find 3007,Insert 859,Delete 2715,Insert 170,Find 1316,Insert 1088,Insert 1687,Find 3073,Find 3751,Insert 1091,Insert 3851,Insert 2524,Delete 824,Insert 309,Find 2942,Delete 1367,Insert 1208,Insert 2875,Insert 3052,Delete 505,Insert 2178,Insert 1084,Delete 1898,Find 2392,Insert 2627,Insert 2053,Insert 1060,Insert 1698,Insert 1338,Insert 109,Find 1722,Find 1829,Delete 1242,Insert 778,Insert 2865,Insert 1054,Insert 1008,Delete 73,Delete 1907,Find 1461,Insert 2755,Insert 3579,Insert 1465,Find 1048,Delete 3416,Find 402,Insert 701,Delete 1090,Find 3643,Insert 3940,Find 1477,Insert 3345,Insert 2771,Find 2107,Find 133,Insert 607,Insert 1331,Insert 1226,Insert 2889,Insert 1728,Insert 1957,Delete 2236,Find 2733,Insert 3090,Insert 2358,Insert 1296,Insert 258,Insert 3259,Find 3691,Insert 838,Insert 160,Insert 1692,Delete 1997,Insert 3495,Insert 672,Insert 3541,Insert 2916,Insert 2731,Insert 2901,Insert 29,Insert 90,Insert 3771,Insert 25,Find 1077,Delete 969,Insert 3743,Delete 1636,Insert 3879,Insert 476,Delete 1025,Find 504,Insert 2133,Insert 76,Find 2592,Insert 3011,Insert 2933,Insert 1175,Insert 2079,Insert 1978,Insert 2900,Insert 3746,Insert 125,Find 1886,Insert 137,Find 2092,Find 488,Insert 3783,Insert 3913,Insert 3137,Find 1115,Insert 1702,Insert 3954,Insert 2122,Insert 1264,Find 3052,Insert 2078,Insert 2180,Insert 2875,Insert 1979,Delete 2982,Delete 1979,Delete 2390,Insert 216,Find 2870,Find 456,Find 1766,Insert 1168,Insert 1604,Insert 1916,Insert 1269,Insert 2978,Find 2700,Insert 1165,Delete 2547,Delete 2044,Delete 1835,Find 1544,Find 1176,Insert 2230,Insert 1335,Insert 567,Insert 2834,Find 2937,Insert 2086,Insert 1612,Find 2452,Insert 3208,Insert 449,Insert 2011,Insert 1400,Insert 1849,Insert 29,Insert 3831,Insert 1590,Insert 2525,Insert 1117,Find 283,Insert 2534,Insert 1612,Insert 1240,Insert 1518,Delete 3598,Insert 1260,Find 2756,Insert 403,Find 977,Find 3212,Find 2593,Find 2556,Find 1406,Find 698,Find 2218,Insert 3000,Insert 2267,Delete 3926,Insert 1824,Insert 3570,Delete 796,Insert 552,Find 1253,Find 1035,Find 666,Insert 164,Insert 1384,Insert 3038,Insert 1599,Find 3105,Find 2015,Insert 491,Find 2419,Insert 3062,Insert 238,Find 2466,Insert 83,Delete 3778,Find 771,Find 165,Find 3553,Insert 2228,Find 1552,Insert 3469,Insert 2381,Find 1911,Insert 2564,Delete 989,Delete 1221,Find 1477,Delete 838,Insert 1304,Insert 1838,Insert 3386,Delete 555,Insert 381,Insert 1876,Insert 1302,Insert 2901,Insert 3037,Find 1881,Insert 696,Insert 1719,Insert 30,Find 1153,Find 1007,Insert 220,Insert 3847,Insert 626,Find 2954,Insert 956,Find 178,Insert 3837,Find 1119,Insert 288,Insert 2939,Insert 3283,Find 1171,Insert 2709,Insert 1793,Delete 1615,Insert 2032,Insert 3317,Delete 2971,Insert 1826,Delete 3772,Insert 3328,Insert 1978,Insert 1062,Find 3472,Insert 3020,Insert 2204,Find 3735,Delete 2225,Insert 627,Insert 1190,Delete 932,Find 1835,Insert 2107,Find 825,Find 3673,Insert 1675,Insert 2890,Insert 1233,Find 854,Insert 2674,Find 1014,Delete 1517,Find 2622,Find 1131,Find 183,Find 2511,Insert 2300,Find 2758,Insert 2266,Find 1596,Insert 2792,Insert 38,Delete 3325,Insert 2826,Insert 952,Find 238,Insert 2087,Insert 2943,Insert 3664,Insert 2366,Find 67,Find 346,Insert 2521,Delete 1386,Insert 3116,Insert 1517,Insert 1325,Delete 2569,Find 2870,Delete 2043,Insert 3104,Insert 2906,Find 3533,Insert 666,Find 2723,Insert 3259,Insert 3994,Delete 3094,Insert 1843,Insert 2626,Insert 2017,Insert 2108,Insert 1683,Find 1051,Insert 1643,Find 3182,Delete 1214,Insert 1119,Insert 872,Insert 1254,Insert 1180,Delete 2313,Find 936,Find 1943,Find 3986,Insert 595,Find 1514,Insert 548,Find 2000,Insert 2767,Insert 2036,Insert 484,Find 2419,Insert 731,Find 3353,Find 3832,Insert 1703,Find 1104,Insert 1421,Find 495,Insert 3153,Delete 1145,Find 2518,Insert 2945,Insert 2197,Delete 1220,Delete 3673,Insert 1141,Insert 2965,Find 3755,Insert 2534,Find 1454,Insert 227,Find 1769,Find 493,Find 812,Insert 1915,Find 3554,Find 2400,Delete 1248,Insert 832,Insert 2522,Insert 2223,Insert 3092,Insert 1605,Delete 1249,Find 133,Delete 1442,Delete 2052,Delete 2905,Delete 2248,Insert 1552,Delete 2888,Insert 1481,Find 3760,Find 66,Delete 1620,Insert 3629,Insert 1737,Insert 1428,Find 224,Find 2183,Insert 1442,Find 182,Insert 3740,Insert 1331,Find 2142,Insert 1289,Insert 1451,Insert 2528,Delete 2472,Insert 1485,Find 1508,Insert 1934,Find 577,Find 2184,Delete 26,Insert 3446,Insert 3303,Find 2,Insert 1409,Insert 2888,Find 2408,Insert 2621,Insert 2917,Find 1969,Insert 3379,Find 36,Delete 2529,Find 2315,Insert 2738,Find 942,Insert 3471,Find 1435,Insert 2897,Insert 256,Insert 3028,Delete 3979,Insert 1864,Find 1730,Insert 9,Find 3311,Find 2657,Delete 432,Find 166,Insert 3249,Insert 687,Insert 1714,Insert 3973,Insert 1876,Insert 51,Insert 3882,Insert 1541,Delete 1835,Insert 1319,Insert 3575,Find 2849,Insert 3366,Delete 125,Insert 2855,Insert 508,Delete 996,Find 519,Delete 1387,Insert 1906,Delete 2345,Find 2432,Insert 1355,Insert 3718,Insert 1769,Insert 310,Find 1105,Insert 1084,Find 1889,Find 2348,Find 2131,Insert 3638,Insert 2077,Delete 3704,Insert 3389,Find 116,Insert 3528,Find 1951,Insert 1053,Insert 2165,Insert 2307,Find 2652,Insert 1604,Insert 525,Insert 3578,Insert 410,Insert 3449,Insert 3661,Delete 3536,Insert 230,Find 3986,Insert 437,Insert 524,Insert 3720,Insert 1109,Insert 290,Insert 2622,Delete 3940,Insert 3486,Find 2139,Delete 3235,Find 3481,Delete 2342,Insert 1105,Find 1815,Find 980,Insert 1133,Find 1046,Insert 16,Insert 1628,Insert 354,Insert 2301,Insert 2945,Insert 3390,Insert 551,Insert 680,Insert 2356,Find 2595,Insert 970,Insert 1236,Insert 3233,Insert 2508,Insert 3945,Insert 1603,Insert 189,Find 622,Find 847,Insert 3128,Insert 12,Insert 2861,Insert 2790,Find 120,Insert 2663,Find 1457,Insert 780,Insert 2957,Delete 2834,Insert 1413,Insert 2858,Insert 1567,Insert 866,Insert 1534,Find 1314,Find 3279,Insert 1353,Find 1194,Insert 3673,Insert 1531,Find 1436,Insert 1629,Insert 2608,Insert 2438,Insert 2666,Insert 1384,Insert 3798,Insert 2264,Find 2719,Insert 2957,Find 2956,Insert 1101,Delete 3122,Delete 2499,Find 1967,Insert 926,Insert 3572,Delete 497,Insert 2558,Insert 2496,Find 148,Find 2629,Insert 1192,Insert 604,Insert 2931,Insert 2189,Find 900,Find 632,Insert 2554,Insert 1895,Insert 904,Insert 1003,Insert 3599,Insert 1241,Delete 304,Find 2168,Insert 2908,Insert 3339,Find 3728,Insert 2052,Find 2669,Find 1589,Delete 1219,Delete 682,Delete 199,Find 2068,Insert 2595,Insert 675,Insert 288,Delete 2353,Insert 2242,Find 2209,Find 3663,Insert 1442,Insert 1184,Insert 2995,Find 2951,Insert 1962,Insert 2593,Delete 2636,Delete 3817,Insert 3429,Insert 487,Insert 1811,Delete 2242,Find 65,Insert 2788,Delete 1908,Find 554,Find 3248,Find 569,Find 3843,Insert 3250,Insert 2426,Find 928,Insert 2620,Insert 1627,Insert 1507,Insert 2727,Insert 604,Find 788,Find 1669,Insert 3499,Find 1758,Insert 466,Find 50,Insert 3003,Delete 2118,Delete 3668] +[Find 1921,Insert 318,Insert 2447,Find 3844,Insert 3381,Insert 3223,Insert 611,Find 418,Insert 1256,Find 241,Insert 388,Delete 897,Insert 235,Insert 2931,Insert 2213,Insert 1008,Insert 1266,Find 543,Insert 3531,Find 3709,Insert 979,Find 1120,Insert 1365,Find 3344,Delete 1991,Insert 2522,Insert 1521,Insert 2683,Insert 1721,Insert 1422,Find 3709,Find 1375,Insert 2610,Find 1176,Insert 3924,Insert 1686,Insert 1852,Delete 3158,Insert 3195,Find 3325,Insert 2829,Insert 2861,Delete 3155,Insert 2846,Find 2540,Insert 2409,Insert 2671,Insert 3349,Insert 2035,Insert 2888,Find 646,Find 3725,Insert 131,Insert 697,Insert 1789,Delete 1654,Find 967,Find 1749,Insert 2788,Insert 2963,Find 949,Find 917,Insert 889,Find 1666,Find 1724,Delete 1877,Insert 3122,Insert 1074,Find 2214,Insert 123,Delete 513,Insert 1610,Insert 1426,Delete 986,Insert 561,Find 405,Insert 870,Delete 3646,Insert 2533,Find 3934,Delete 3550,Insert 3488,Find 3416,Insert 3621,Delete 1233,Insert 273,Insert 70,Delete 632,Find 689,Find 3051,Insert 16,Insert 2991,Insert 1540,Find 3691,Insert 130,Delete 3715,Delete 610,Delete 1885,Insert 2284,Find 1359,Delete 3143,Find 3585,Find 920,Find 3908,Find 1301,Insert 597,Find 2537,Find 2600,Find 895,Insert 400,Insert 292,Insert 1436,Find 2614,Find 2061,Delete 3206,Insert 982,Insert 383,Insert 3160,Find 710,Find 2580,Insert 3158,Insert 2121,Find 3884,Insert 3917,Delete 3940,Find 3979,Delete 79,Insert 2488,Find 2939,Delete 1498,Delete 2409,Insert 1177,Insert 2667,Insert 1234,Find 3480,Delete 3055,Insert 2622,Insert 2435,Delete 726,Insert 2096,Insert 1462,Insert 720,Insert 1563,Find 982,Insert 1593,Find 3833,Insert 3186,Delete 1715,Insert 500,Delete 179,Insert 2297,Find 839,Insert 1288,Find 343,Insert 551,Insert 1200,Insert 196,Insert 1562,Insert 1626,Insert 1345,Insert 2801,Insert 1711,Insert 3709,Delete 1240,Insert 302,Delete 1841,Insert 3516,Insert 1969,Insert 1593,Delete 2716,Find 3641,Insert 609,Insert 3131,Find 3433,Insert 2205,Insert 3913,Delete 1966,Insert 1240,Find 2947,Delete 3085,Find 3279,Find 374,Insert 2548,Insert 185,Insert 3639,Find 446,Insert 3290,Insert 591,Find 265,Insert 574,Insert 1463,Find 2933,Insert 1270,Find 2014,Find 1101,Find 2330,Delete 2077,Insert 3388,Insert 3379,Insert 982,Find 3366,Insert 1665,Insert 382,Find 453,Insert 572,Insert 3683,Insert 2868,Insert 3372,Find 2746,Insert 1936,Find 3210,Find 340,Find 145,Find 2431,Insert 2673,Insert 2416,Insert 665,Insert 1940,Delete 312,Insert 2249,Delete 1493,Insert 3719,Delete 80,Insert 1405,Insert 1077,Find 3021,Insert 3336,Find 1414,Insert 2495,Insert 7,Insert 3087,Delete 81,Insert 2770,Insert 3138,Delete 2566,Insert 887,Find 2186,Insert 2568,Find 3895,Insert 2806,Insert 2437,Insert 3803,Delete 1729,Delete 3843,Delete 2108,Insert 2940,Find 511,Find 165,Insert 2321,Insert 3665,Delete 2475,Insert 3413,Delete 2944,Insert 361,Insert 3113,Delete 3808,Find 1839,Insert 3912,Insert 2197,Insert 2561,Insert 2226,Insert 2725,Insert 2633,Insert 3059,Delete 1747,Insert 1219,Insert 3731,Find 1953,Insert 1511,Delete 3167,Find 2558,Insert 2799,Delete 1395,Delete 3481,Insert 2162,Insert 3727,Delete 1106,Insert 1262,Delete 2920,Delete 2800,Find 2967,Find 653,Insert 1830,Delete 3793,Delete 832,Insert 3301,Insert 3446,Insert 254,Insert 58,Insert 3561,Find 1977,Insert 513,Find 2172,Find 376,Insert 484,Insert 3961,Delete 1607,Insert 1157,Insert 2399,Insert 566,Insert 3263,Find 3673,Delete 976,Insert 1263,Find 2996,Find 811,Insert 1206,Insert 1814,Insert 480,Find 1113,Find 216,Insert 3601,Insert 3477,Insert 3635,Insert 2151,Insert 3652,Insert 2199,Find 3787,Find 903,Delete 721,Insert 3058,Insert 3917,Find 2445,Insert 1986,Delete 105,Delete 1826,Insert 2793,Insert 1440,Insert 1808,Find 3236,Find 842,Delete 826,Insert 3631,Find 1804,Find 1333,Insert 1352,Insert 2184,Insert 2315,Insert 2217,Insert 3760,Insert 3277,Insert 3069,Insert 2950,Insert 259,Delete 1423,Find 949,Insert 799,Insert 1409,Find 635,Find 1900,Insert 1256,Delete 1640,Delete 1435,Delete 853,Insert 862,Find 3381,Insert 1294,Insert 1008,Delete 303,Find 2946,Insert 3685,Find 1848,Insert 3867,Insert 3028,Insert 408,Insert 1168,Insert 2009,Find 183,Insert 920,Delete 2335,Insert 2167,Insert 1402,Insert 3469,Insert 1637,Insert 3306,Delete 2080,Delete 3879,Insert 590,Insert 1047,Insert 784,Insert 1002,Insert 711,Insert 2108,Delete 1125,Find 1642,Find 2953,Insert 1951,Find 3339,Find 2750,Insert 2361,Insert 813,Insert 1063,Find 1680,Find 337,Insert 2813,Find 1074,Insert 1558,Find 3092,Insert 195,Insert 1132,Find 3175,Insert 1548,Find 2212,Insert 2719,Insert 14,Find 1251,Insert 1879,Find 2345,Delete 468,Insert 3294,Find 2009,Insert 1576,Insert 148,Delete 2123,Insert 2451,Insert 2714,Insert 2718,Find 1142,Insert 448,Find 1104,Insert 3415,Insert 2038,Insert 1808,Insert 1150,Insert 2061,Find 3800,Insert 2478,Insert 1471,Insert 1757,Insert 918,Find 2710,Delete 1861,Insert 689,Insert 612,Insert 327,Find 1365,Insert 3623,Insert 449,Find 946,Insert 3223,Insert 3445,Find 2242,Find 1363,Delete 1217,Find 3944,Insert 281,Find 2817,Insert 2219,Insert 2011,Insert 2433,Find 2838,Insert 1923,Insert 821,Find 1004,Find 332,Delete 2502,Insert 3744,Find 1861,Insert 1064,Delete 2572,Insert 3882,Find 1141,Find 1893,Insert 610,Insert 1378,Insert 138,Delete 1122,Insert 1694,Find 1320,Insert 15,Insert 197,Insert 1581,Insert 3860,Insert 68,Insert 2417,Find 1982,Insert 3432,Insert 1867,Insert 3364,Delete 1898,Insert 3279,Find 2159,Insert 40,Insert 1723,Find 2353,Find 1598,Find 2769,Find 2680,Insert 3633,Insert 573,Insert 3371,Delete 2051,Insert 3812,Insert 796,Insert 522,Find 3692,Insert 1914,Find 912,Insert 1202,Insert 470,Insert 2047,Find 3046,Insert 3057,Delete 2055,Find 787,Find 854,Insert 1264,Find 1819,Find 91,Insert 1582,Insert 2498,Insert 729,Insert 1241,Insert 2489,Find 1867,Insert 1656,Insert 3429,Delete 2986,Find 2583,Delete 2061,Find 158,Find 2093,Find 115,Find 3027,Find 1844,Insert 2530,Insert 1698,Delete 1118,Delete 531,Insert 2529,Insert 1653,Delete 1993,Insert 1994,Insert 2016,Find 1487,Insert 1773,Insert 3156,Insert 3817,Insert 1248,Delete 3453,Insert 1386,Insert 3468,Delete 436,Find 2151,Delete 1942,Find 1837,Find 3981,Find 3322,Delete 609,Insert 931,Insert 3726,Find 2889,Insert 3827,Insert 2330,Insert 3719,Find 3474,Delete 3293,Insert 516,Insert 2624,Find 981,Insert 2887,Insert 1696,Insert 472,Insert 3559,Insert 3701,Insert 2750,Find 213,Insert 2631,Insert 418,Insert 312,Find 861,Insert 3114,Insert 554,Delete 326,Find 3674,Insert 3398,Find 2927,Insert 3515,Delete 1932,Delete 621,Find 1891,Insert 248,Insert 2943,Insert 2852,Insert 351,Insert 20,Insert 2617,Find 3176,Insert 803,Find 2963,Insert 1066,Insert 980,Insert 2923,Find 1507,Insert 595,Find 1891,Delete 3447,Insert 547,Delete 480,Delete 1075,Insert 3970,Find 1858,Insert 2726,Find 3739,Find 2385,Find 1621,Delete 746,Delete 3110,Find 156,Insert 683,Insert 1785,Find 3349,Insert 3412,Delete 2870,Find 1696,Insert 1557,Insert 2500,Insert 1713,Find 2050,Find 1303,Insert 2280,Find 2049,Find 349,Insert 1086,Find 3151,Find 2561,Find 1881,Insert 3481,Delete 2197,Insert 2227,Find 63,Insert 3586,Insert 1370,Find 119,Insert 3224,Find 3925,Insert 2533,Find 1853,Insert 3634,Insert 2129,Delete 1474,Insert 257,Insert 3867,Delete 2726,Insert 3905,Insert 2764,Insert 1192,Insert 1477,Insert 657,Find 836,Insert 571,Find 2035,Insert 2433,Delete 3053,Delete 2824,Find 3919,Insert 3798,Insert 1700,Find 3139,Insert 748,Find 3513,Insert 247,Insert 996,Insert 2597,Insert 6,Insert 20,Insert 69,Insert 3242,Delete 2359,Insert 3281,Insert 2201,Insert 139,Insert 1264,Insert 728,Insert 2137,Insert 2137,Find 1511,Insert 1658,Insert 3169,Insert 399,Delete 932,Find 564,Insert 1765,Insert 3335,Insert 2945,Insert 1171,Delete 319,Insert 180,Insert 769,Insert 1166,Insert 2529,Insert 3953,Insert 1611,Insert 311,Insert 1812,Find 1250,Insert 2704,Insert 2316,Delete 2172,Insert 3086,Insert 307,Insert 1180,Find 2605,Insert 3420,Find 406,Insert 2032,Find 2217,Insert 1984,Insert 2113,Insert 710,Delete 1379,Insert 1646,Insert 2303,Delete 750,Insert 1327,Delete 1482,Delete 262,Find 2189,Delete 534,Insert 2391,Insert 1613,Insert 2037,Delete 3856,Find 3303,Find 984,Find 3498,Find 2745,Insert 1740,Insert 3687,Insert 2286,Find 3146,Find 37,Find 3701,Find 1988,Insert 3787,Find 962,Delete 370,Find 2935,Insert 472,Insert 3173,Insert 696,Insert 2384,Insert 2682,Find 3954,Insert 1297,Insert 1914,Find 488,Insert 1833,Insert 13,Find 1835,Find 575,Delete 172,Insert 2003,Insert 2110,Find 2194,Delete 678,Delete 3150,Find 2099,Insert 3001,Find 1259,Insert 853,Delete 2479,Insert 499,Insert 3988,Insert 367,Find 2405,Insert 3578,Insert 1137,Insert 3290,Insert 3791,Insert 750,Insert 1830,Insert 3004,Find 1131,Find 560,Insert 2667,Delete 3576,Find 2039,Insert 2345,Delete 229,Find 3272,Insert 2301,Insert 714,Insert 3291,Insert 706,Find 3168,Find 892,Find 605,Find 912,Delete 2812,Insert 1989,Insert 1718,Insert 1788,Delete 335,Delete 2539,Find 3385,Insert 508,Insert 525,Insert 582,Insert 770,Insert 3009,Insert 1940,Delete 2214,Delete 1507,Find 3680,Insert 2177,Delete 46,Find 2921,Delete 275,Insert 1403,Insert 1593,Find 1477,Insert 3573,Insert 549,Insert 1566,Find 624,Find 44,Insert 1903,Insert 2281,Insert 1366,Find 1611,Insert 2798,Find 218,Insert 604,Insert 982,Insert 1026,Insert 2192,Insert 3714,Find 1179,Find 1023,Find 3348,Insert 1168,Insert 658,Insert 2395,Find 1405,Insert 3281,Insert 3762,Insert 786,Insert 2524,Insert 3095,Insert 3213,Insert 313,Find 3934,Delete 464,Insert 2647,Insert 496,Insert 2267,Insert 566,Insert 1121,Insert 1940,Insert 2112,Insert 2039,Insert 1780,Insert 321,Find 2860,Delete 3761,Insert 3549,Insert 3627,Insert 3659,Insert 653,Insert 1676,Find 364,Insert 282,Insert 1332,Insert 2055,Find 3937,Insert 2124,Insert 3859,Find 3163,Insert 367,Insert 3576,Find 1544,Insert 429,Find 1385,Find 93,Find 3508,Find 2680,Insert 114,Find 1729,Insert 663,Insert 1196,Insert 230,Find 825,Insert 521,Insert 2455,Insert 1947,Find 368,Insert 531,Find 6,Find 3239,Delete 1313,Insert 3124,Find 645,Find 1858,Insert 1156,Delete 1308,Insert 3789,Find 2086,Insert 3519,Find 3944,Delete 3386,Delete 1620,Find 2875,Find 594,Find 700,Insert 171,Insert 243,Delete 2183,Insert 3832,Delete 1047,Delete 2521,Insert 996,Find 903,Delete 1730,Insert 948,Insert 1721,Insert 1719,Delete 2228,Insert 199,Insert 2203,Insert 3728,Find 272,Insert 2852,Insert 2366,Insert 569,Delete 3585,Find 2061,Insert 3688,Insert 3493,Insert 3866,Delete 3206,Insert 3325,Find 1055,Delete 3210,Insert 3105,Insert 1337,Insert 3977,Insert 2645,Find 615,Find 381,Insert 192,Find 3320,Find 2365,Insert 229,Find 3816,Find 1202,Find 1329,Find 884,Insert 3845,Insert 1189,Insert 1708,Insert 458,Find 1132,Insert 257,Insert 3375,Insert 1742,Find 192,Insert 2091,Insert 3832,Find 1773,Find 3789,Insert 3306,Insert 2457,Insert 3281,Insert 1120,Delete 1843,Find 221,Delete 2279,Delete 1831,Delete 3738,Find 549,Insert 1460,Insert 466,Insert 450,Delete 1144,Find 2922,Find 266,Find 552,Delete 2259,Insert 3017,Find 2462,Insert 2451,Insert 430,Insert 3924,Delete 2316,Find 2748,Insert 2251,Insert 279,Delete 2190,Insert 2776,Insert 3318,Find 829,Delete 770,Insert 3510,Find 1361,Insert 2885,Insert 3947,Insert 1653,Insert 187,Insert 137,Insert 612,Insert 906,Delete 3680,Insert 359,Delete 1823,Delete 3741,Insert 1202,Find 3691,Find 3710,Insert 2557,Insert 3574,Find 2891,Find 1128,Insert 3568,Insert 3216,Find 935,Delete 2791,Insert 2897,Delete 488,Insert 906,Insert 3499,Insert 2996,Find 3571,Insert 29,Insert 2221,Find 3733,Insert 2714,Insert 1346,Insert 2329,Insert 3801,Insert 1408,Find 3570,Insert 1580,Find 3089,Insert 1854,Insert 1173,Insert 722,Insert 1126,Insert 201,Insert 2281,Insert 1159,Delete 2318,Find 555,Insert 431,Insert 2102,Find 1110,Insert 3616,Find 1590,Insert 181,Insert 2404,Find 3960,Insert 1162,Insert 2655,Insert 544,Find 3583,Insert 3328,Insert 3824,Insert 1303,Insert 1801,Insert 2246,Insert 411,Insert 1543,Find 2569,Find 1052,Insert 3283,Delete 3688,Insert 2352,Insert 1407,Delete 30,Insert 2300,Insert 2350,Insert 3528,Insert 3135,Insert 680,Insert 1150,Find 3449,Insert 2330,Insert 2687,Delete 1159,Find 717,Delete 453,Insert 1116,Insert 2899,Delete 351,Insert 3543,Insert 1544,Insert 595,Insert 3364,Insert 30,Insert 1907,Find 2944,Find 3530,Insert 3418,Find 3684,Delete 3370,Insert 3808,Find 3192,Insert 203,Insert 1469,Insert 432,Insert 3801,Insert 1563,Find 3049,Delete 1466,Find 3313,Find 1210,Insert 2475,Delete 3022,Insert 1906,Find 3244,Find 1613,Insert 25,Insert 434,Find 2793,Find 1265,Insert 458,Find 477,Insert 3109,Insert 606,Insert 442,Delete 1047,Insert 3695,Insert 984,Insert 1820,Find 1779,Insert 547,Insert 2797,Insert 2075,Insert 2055,Find 1215,Find 82,Find 1141,Find 2063,Find 3776,Find 1908,Insert 1306,Insert 474,Insert 1615,Find 3397,Find 2511,Insert 641,Delete 3080,Insert 1085,Delete 746,Insert 3008,Insert 859,Find 2476,Insert 594,Insert 943,Delete 349,Delete 1819,Find 2350,Find 2607,Insert 1515,Delete 3523,Insert 2559,Find 2612,Insert 1154,Insert 384,Delete 3669,Insert 2247,Delete 2274,Insert 437,Find 320,Find 3340,Find 3752,Find 497,Insert 379,Find 268,Insert 3656,Insert 2386,Delete 1123,Insert 75,Delete 3327,Insert 586,Find 2457,Insert 1672,Delete 1481,Find 1352,Insert 512,Insert 1952,Insert 3157,Find 2166,Find 1190,Insert 284,Find 3877,Insert 2688,Find 397,Delete 2360,Find 2592,Insert 3213,Find 2645,Find 392,Insert 3335,Find 3509,Insert 3409,Insert 118,Insert 3422,Find 25,Delete 3346,Insert 3301,Find 2868,Insert 2448,Insert 539,Insert 29,Find 3723,Insert 2972,Find 662,Find 3533,Insert 3227,Find 2659,Delete 2498,Insert 3812,Find 1658,Find 3404,Insert 2420,Delete 1991,Insert 3786,Insert 2972,Insert 160,Find 1669,Insert 1300,Find 2895,Insert 95,Insert 574,Insert 3380,Insert 3865,Find 1526,Delete 1064,Insert 2305,Insert 624,Insert 3999,Insert 1307,Insert 626,Insert 3088,Insert 2109,Find 332,Insert 2067,Insert 3672,Insert 1518,Insert 2013,Find 2124,Find 2642,Insert 1750,Insert 1476,Find 714,Find 3636,Insert 2069,Insert 1784,Insert 413,Insert 1876,Insert 1609,Insert 444,Insert 1484,Insert 2949,Find 3902,Insert 535,Insert 1872,Find 650,Insert 2480,Insert 3838,Delete 1345,Insert 2474,Insert 3800,Insert 2053,Delete 1070,Find 162,Insert 337,Find 366,Insert 2838,Find 2538,Find 3687,Delete 3988,Insert 2304,Delete 2919,Insert 760,Insert 3316,Insert 3922,Insert 2743,Insert 734,Find 243,Insert 1984,Find 3761,Insert 1857,Insert 1658,Insert 2301,Delete 2210,Insert 2673,Find 3406,Find 1668,Find 3587,Find 679,Insert 3953,Find 3380,Find 1611,Find 1345,Insert 2909,Insert 3395,Insert 2404,Insert 2868,Insert 2140,Insert 3997,Insert 105,Find 603,Find 2008,Insert 2518,Delete 3148,Insert 1480,Insert 550,Delete 2285,Delete 2189,Find 2724,Delete 1359,Insert 1319,Delete 656,Insert 698,Delete 1587,Delete 2669,Insert 2281,Insert 2689,Insert 1413,Insert 2655,Insert 83,Insert 2895,Insert 2654,Insert 538,Insert 3907,Insert 1413,Delete 3965,Insert 2505,Insert 1151,Insert 3318,Find 1501,Insert 3638,Insert 2999,Insert 1744,Delete 1172,Insert 3087,Insert 3138,Find 179,Insert 202,Insert 1790,Insert 1887,Find 2376,Find 2631,Delete 640,Insert 1846,Insert 3703,Insert 3379,Delete 1587,Insert 3879,Find 2631,Insert 1715,Insert 640,Find 502,Insert 3752,Find 1762,Insert 3022,Find 346,Find 1875,Insert 1219,Find 1895,Insert 512,Insert 384,Insert 935,Insert 1954,Insert 3240,Find 790,Insert 1430,Insert 826,Find 1622,Insert 2989,Find 2637,Insert 2867,Insert 3535,Find 1178,Find 2101,Insert 2230,Insert 2066,Insert 3738,Find 1782,Insert 96,Insert 3236,Insert 2247,Insert 1780,Insert 2244,Delete 1991,Insert 1919,Insert 506,Insert 1997,Find 466,Insert 3003,Insert 3559,Delete 744,Delete 2824,Insert 1318,Insert 2430,Insert 3258,Find 3052,Insert 1036,Find 848,Delete 3421,Insert 28,Insert 3174,Insert 3124,Insert 353,Find 1431,Find 1468,Insert 2015,Insert 3726,Insert 653,Insert 3821,Insert 1452,Find 3147,Insert 365,Insert 922,Insert 2496,Insert 134,Find 1563,Delete 2369,Insert 2847,Insert 1752,Find 253,Insert 1886,Insert 2303,Insert 3097,Delete 2125,Insert 130,Insert 2854,Find 377,Find 3348,Insert 1787,Insert 2323,Insert 2212,Delete 3389,Insert 2180,Insert 11,Find 3530,Delete 77,Insert 1767,Insert 1296,Delete 1460,Delete 894,Delete 378,Insert 2825,Insert 2013,Find 306,Insert 1050,Insert 1085,Delete 3131,Find 3171,Insert 923,Find 2087,Find 2704,Find 1492,Find 3693,Find 2779,Find 320,Insert 3319,Delete 3337,Delete 3992,Insert 1828,Delete 2021,Insert 2330,Delete 1287,Insert 1435,Insert 3098,Find 1549,Find 153,Delete 171,Insert 417,Find 447,Insert 2663,Insert 331,Insert 1525,Insert 2772,Find 2444,Insert 3201,Find 1693,Insert 3976,Find 339,Find 1389,Insert 3599,Delete 1508,Insert 2661,Find 1938,Insert 1892,Insert 1514,Insert 2028,Insert 1287,Delete 2787,Find 3949,Insert 1976,Delete 3430,Find 85,Delete 1729,Delete 3128,Insert 2644,Insert 1689,Insert 541,Insert 3538,Insert 2431,Insert 3091,Find 1338,Find 1700,Find 585,Insert 2390,Insert 1990,Insert 3243,Insert 3198,Insert 1798,Insert 630,Insert 2237,Insert 3609,Find 2306,Delete 1538,Delete 2670,Find 1228,Find 2540,Find 1693,Find 961,Insert 3298,Insert 1856,Find 399,Insert 1495,Insert 1647,Insert 439,Find 2467,Insert 3889,Find 249,Insert 47,Insert 2246,Insert 3533,Find 1039,Find 3344,Insert 957,Find 692,Insert 552,Insert 3471,Insert 3717,Insert 1520,Insert 2166,Insert 55,Insert 3027,Insert 3733,Insert 2094,Find 744,Find 252,Insert 1642,Insert 3031,Insert 2070,Find 505,Insert 2174,Insert 2473,Insert 2645,Find 2607,Find 3219,Insert 832,Insert 2338,Insert 3879,Insert 376,Insert 3712,Insert 225,Insert 2564,Insert 1614,Find 2690,Find 1145,Insert 2601,Insert 742,Insert 1337,Insert 2372,Find 3802,Insert 2434,Insert 1239,Insert 20,Find 2257,Insert 1116,Insert 3701,Insert 3021,Insert 3909,Find 115,Find 852,Insert 3823,Insert 2143,Insert 3577,Insert 3056,Find 880,Delete 3874,Find 3471,Insert 2971,Insert 391,Insert 549,Insert 2241,Insert 2546,Insert 258,Insert 3842,Insert 1380,Insert 3991,Find 878,Insert 2498,Insert 3655,Insert 2737,Insert 3943,Find 78,Insert 30,Insert 1940,Insert 1211,Find 3742,Delete 2521,Find 357,Find 2066,Find 710,Delete 3855,Insert 1855,Insert 801,Find 1048,Delete 2438,Insert 1786,Delete 2261,Insert 3212,Delete 2825,Insert 1515,Insert 1616,Insert 3566,Insert 2661,Find 734,Insert 3499,Delete 3982,Insert 2648,Delete 2057,Insert 1503,Find 1895,Insert 856,Insert 2128,Insert 926,Delete 2179,Find 1017,Insert 3807,Find 1806,Insert 421,Find 2590,Insert 2569,Insert 1101,Find 3826,Delete 854,Insert 3677,Delete 2552,Insert 3578,Insert 3827,Delete 2661,Find 683,Insert 1924,Find 1209,Delete 3953,Insert 1886,Find 2733,Find 925,Insert 2025,Find 3697,Find 2292,Delete 3262,Find 817,Insert 1374,Insert 1460,Insert 2373,Insert 160,Find 3657,Insert 2356,Delete 1263,Insert 1691,Insert 1042,Find 168,Delete 3587,Find 3074,Find 498,Find 2814,Insert 2146,Find 156,Insert 1367,Find 1573,Insert 1917,Find 3038,Delete 1441,Find 1838,Find 3529,Find 3158,Insert 2085,Delete 390,Insert 119,Find 517,Insert 2920,Delete 1095,Find 590,Delete 3048,Insert 2782,Insert 906,Insert 3361,Insert 3104,Find 264,Insert 3068,Insert 1785,Insert 762,Insert 2935,Delete 3322,Insert 219,Insert 882,Insert 2629,Insert 3547,Insert 2053,Delete 3348,Delete 255,Insert 1457,Insert 1391,Find 2934,Insert 1171,Find 3555,Find 2704,Insert 3494,Delete 3301,Insert 1552,Find 164,Insert 2052,Find 1615,Find 3391,Insert 1775,Find 564,Insert 2157,Find 3052,Insert 3291,Insert 2974,Insert 3917,Delete 2262,Find 2453,Insert 2151,Insert 1864,Delete 2281,Find 571,Find 2695,Insert 901,Insert 2871,Insert 1257,Insert 2190,Insert 1019,Delete 1700,Insert 2230,Insert 443,Insert 2592,Insert 803,Delete 1200,Find 1335,Find 333,Insert 1126,Find 2015,Find 2217,Insert 339,Insert 162,Insert 1640,Insert 2166,Find 1982,Insert 560,Insert 632,Insert 2528,Find 2689,Find 3045,Insert 2715,Insert 3891,Insert 3960,Insert 1797,Find 1944,Delete 3743,Insert 2613,Find 1503,Insert 410,Insert 1670,Delete 2101,Find 668,Find 2046,Insert 375,Find 527,Insert 1054,Insert 492,Delete 3841,Find 2172,Delete 227,Insert 1911,Insert 2579,Find 571,Find 2013,Delete 1524,Insert 3723,Insert 2351,Insert 1682,Insert 2600,Insert 1568,Insert 1587,Insert 3663,Find 2002,Delete 3603,Find 3025,Find 1096,Insert 767,Find 588,Insert 953,Insert 796,Find 597,Insert 2529,Insert 3147,Insert 2694,Insert 3005,Insert 1649,Find 3490,Find 1281,Delete 313,Insert 1438,Insert 1764,Insert 1738,Insert 3160,Insert 1501,Insert 1286,Find 2108,Find 3045,Insert 58,Insert 1676,Find 2624,Find 782,Insert 1774,Find 133,Insert 2981,Find 1180,Insert 350,Insert 299,Insert 1196,Insert 2242,Insert 1808,Insert 2504,Delete 108,Insert 1458,Insert 851,Find 527,Insert 1618,Delete 1227,Insert 241,Insert 347,Insert 1382,Insert 3366,Insert 1154,Insert 1124,Find 2298,Insert 2013,Insert 224,Find 3161,Insert 1696,Find 2284,Insert 3261,Find 3440,Delete 1871,Find 973,Delete 2695,Find 3802,Insert 133,Insert 3098,Insert 3674,Delete 3757,Find 1651,Insert 443,Insert 3296,Insert 1952,Insert 1919,Find 40,Delete 2228,Insert 604,Find 218,Insert 1193,Insert 2973,Insert 3025,Find 1518,Insert 3400,Insert 1864,Delete 2244,Insert 1727,Insert 976,Find 1128,Find 446,Delete 688,Insert 3975,Find 3763,Insert 3434,Find 3663,Find 2594,Find 222,Find 2123,Insert 1295,Find 1161,Find 2578,Insert 3710,Insert 995,Find 2983,Insert 1040,Insert 3781,Delete 2267,Find 816,Find 2628,Insert 1372,Insert 2902,Insert 1620,Insert 2351,Insert 3616,Insert 141,Insert 21,Find 2691,Insert 800,Find 201,Find 966,Delete 3708,Delete 330,Insert 3499,Insert 1907,Insert 3039,Find 1913,Insert 1663,Delete 3026,Find 2603,Find 3715,Find 1276,Insert 1487,Delete 626,Insert 2282,Insert 547,Insert 3664,Insert 823,Find 3871,Insert 3257,Find 534,Find 2664,Insert 2873,Insert 2685,Find 2506,Find 3535,Insert 3330,Insert 2853,Insert 1405,Insert 1792,Find 3474,Insert 2337,Find 3865,Insert 1116,Find 1293,Insert 3858,Find 2910,Find 192,Insert 613,Insert 3911,Insert 1213,Insert 168,Delete 291,Insert 3205,Insert 3303,Insert 2717,Insert 137,Delete 153,Insert 3650,Delete 2713,Delete 3091,Find 794,Insert 3758,Insert 2990,Insert 3957,Find 3138,Insert 2127,Find 310,Find 1652,Delete 1168,Find 716,Insert 2718,Find 1894,Find 942,Find 2320,Insert 2202,Insert 3792,Insert 716,Find 2020,Insert 2442,Find 3360,Insert 2591,Insert 262,Insert 1956,Insert 2853,Delete 568,Insert 670,Find 2071,Insert 2401,Delete 338,Insert 1736,Insert 1536,Delete 3933,Insert 2954,Delete 3069,Insert 3165,Find 674,Insert 2839,Insert 2629,Find 1329,Delete 3152,Insert 1081,Find 1706,Find 962,Find 807,Find 2589,Find 1359,Insert 876,Insert 2153,Insert 307,Delete 293,Insert 3509,Find 2302,Insert 1140,Delete 3416,Find 914,Insert 1021,Insert 3483,Find 99,Insert 3093,Insert 1281,Insert 177,Insert 598,Insert 1221,Find 3527,Insert 27,Insert 1417,Find 756,Insert 351,Insert 75,Insert 3004,Insert 2367,Insert 2605,Insert 2588,Find 2525,Insert 3706,Insert 2096,Delete 2991,Insert 1612,Insert 2642,Insert 3873,Delete 1357,Insert 3119,Insert 3217,Insert 1166,Find 560,Insert 3307,Insert 661,Insert 2828,Insert 357,Insert 163,Insert 10,Find 2529,Find 847,Insert 612,Insert 1025,Insert 873,Delete 3895,Delete 1166,Find 78,Insert 2573,Insert 1114,Insert 2632,Insert 1384,Delete 1901,Insert 1746,Find 3229,Find 462,Insert 117,Insert 2156,Insert 391,Insert 941,Delete 999,Insert 3853,Find 1720,Delete 3426,Insert 3506,Insert 504,Insert 1671,Insert 1024,Insert 1644,Find 3112,Delete 2226,Insert 3612,Insert 2952,Find 1503,Insert 2024,Insert 3916,Find 2618,Insert 2873,Insert 3747,Insert 829,Insert 698,Insert 2494,Insert 1196,Delete 2721,Delete 1077,Find 2174,Find 3739,Insert 3180,Insert 1497,Insert 3615,Find 2195,Insert 917,Insert 3937,Find 2711,Find 93,Find 1467,Insert 2611,Insert 3302,Insert 802,Insert 2248,Find 1252,Find 3715,Insert 344,Insert 657,Insert 1991,Insert 652,Delete 1896,Insert 1528,Find 2751,Insert 1968,Delete 3967,Insert 1699,Insert 3615,Find 2609,Insert 3332,Insert 2942,Insert 2011,Insert 3622,Delete 674,Insert 772,Insert 2793,Find 1780,Insert 2601,Insert 959,Insert 637,Insert 464,Delete 1787,Find 3455,Insert 3439,Delete 3857,Insert 3939,Insert 1934,Insert 723,Insert 1837,Insert 119,Insert 1014,Insert 840,Insert 810,Find 2369,Find 1254,Insert 62,Insert 2768,Find 3117,Delete 3940,Insert 3480,Insert 3821,Delete 3057,Find 1205,Insert 2503,Insert 514,Insert 1835,Find 2906,Insert 422,Insert 1024,Insert 2020,Insert 1845,Insert 189,Find 648,Insert 1814,Find 2839,Find 1507,Insert 3994,Insert 3407,Insert 400,Find 2049,Insert 2511,Find 1167,Delete 3796,Insert 3315,Insert 3970,Delete 3814,Delete 2791,Insert 3252,Insert 883,Insert 1010,Find 2968,Insert 113,Insert 997,Find 313,Insert 905,Find 2105,Find 2013,Insert 1044,Insert 733,Insert 2270,Delete 3803,Insert 3328,Insert 2949,Delete 3336,Find 3108,Delete 981,Delete 497,Find 2144,Delete 3203,Insert 687,Insert 2454,Find 1671,Insert 1385,Insert 175,Delete 3770,Insert 899,Delete 2353,Insert 3302,Find 3328,Insert 2260,Find 2550,Find 2081,Insert 1003,Insert 847,Insert 1901,Insert 3557,Insert 2897,Find 1509,Find 324,Find 509,Find 315,Find 3302,Insert 1581,Insert 2176,Find 1850,Insert 1558,Insert 3461,Find 503,Delete 2994,Find 1214,Insert 3642,Insert 1373,Insert 1465,Delete 2007,Insert 3082,Find 182,Find 2161,Find 790,Insert 1368,Insert 1878,Find 1550,Insert 3836,Insert 961,Find 531,Insert 2604,Insert 3803,Find 2919,Delete 3159,Insert 305,Find 2732,Delete 25,Insert 2142,Insert 464,Delete 115,Insert 2115,Insert 2009,Insert 1639,Find 849,Delete 33,Insert 2678,Insert 3293,Delete 989,Insert 381,Insert 1571,Insert 566,Find 1692,Insert 2096,Insert 2745,Insert 204,Find 3159,Find 2238,Insert 1600,Find 698,Find 747,Insert 265,Insert 1600,Insert 3810,Insert 1147,Insert 1117,Insert 739,Insert 3578,Insert 878,Find 1359,Delete 1382,Insert 2418,Insert 889,Insert 1945,Find 1882,Find 2668,Insert 2480,Delete 858,Insert 708,Find 208,Insert 3389,Insert 2437,Delete 1781,Insert 3019,Insert 1795,Insert 2946,Insert 2648,Find 3516,Insert 833,Insert 3702,Find 3290,Insert 3102,Insert 383,Insert 1675,Delete 764,Insert 3604,Find 447,Insert 87,Find 2048,Find 2826,Delete 2098,Find 365,Delete 3536,Insert 2029,Find 1465,Insert 2119,Insert 3037,Find 3843,Insert 229,Delete 3511,Insert 969,Find 1465,Insert 125,Insert 367,Insert 2027,Delete 3172,Find 1216,Insert 1865,Find 1781,Find 3898,Find 2252,Find 1169,Insert 3284,Delete 3741,Insert 298,Insert 2006,Find 2472,Insert 3186,Find 133,Find 3527,Insert 2595,Find 1271,Insert 514,Find 2210,Insert 2750,Insert 3883,Delete 2334,Find 3386,Insert 1656,Insert 3583,Delete 86,Find 2225,Insert 3536,Insert 1307,Insert 3441,Insert 3857,Insert 3586,Insert 2993,Delete 100,Insert 2211,Insert 2374,Insert 3766,Insert 3321,Delete 2181,Delete 1034,Insert 1189,Insert 2040,Find 1877,Find 606,Find 633,Insert 2393,Insert 1453,Insert 355,Insert 3295,Insert 3008,Insert 1659,Delete 867,Delete 3135,Delete 2861,Delete 2989,Find 1623,Find 3886,Delete 2370,Delete 2920,Insert 218,Find 323,Insert 897,Delete 3685,Insert 420,Delete 1908,Insert 1699,Insert 3847,Insert 145,Insert 868,Delete 1030,Find 3166,Insert 2469,Insert 881,Insert 2598,Find 3065,Delete 1526,Delete 202,Insert 232,Insert 45,Find 933,Delete 2297,Insert 2121,Insert 293,Insert 2819,Delete 315,Insert 517,Delete 792,Delete 3158,Insert 1602,Find 448,Insert 2518,Find 1256,Find 359,Insert 2053,Delete 2271,Insert 638,Find 1969,Delete 167,Insert 3697,Find 851,Insert 3415,Delete 830,Find 2889,Insert 1397,Delete 1336,Insert 3657,Insert 1931,Insert 3797,Insert 991,Insert 2454,Find 679,Insert 2971,Find 3086,Insert 1006,Insert 2393,Delete 735,Insert 2239,Insert 2938,Insert 651,Insert 136,Find 1038,Find 859,Find 891,Find 2552,Find 215,Find 1396,Insert 3359,Find 1235,Find 3880,Find 3869,Insert 2998,Insert 2608,Find 794,Delete 603,Delete 545,Delete 3822,Delete 568,Insert 3892,Delete 736,Insert 3275,Find 3741,Insert 416,Insert 2684,Insert 3832,Find 1909,Insert 2819,Find 3108,Delete 860,Insert 3029,Insert 150,Insert 831,Insert 120,Find 416,Insert 348,Find 1106,Insert 1130,Insert 1271,Find 1149,Insert 2908,Delete 1688,Insert 214,Insert 1583,Delete 3560,Insert 624,Insert 194,Find 2028,Insert 2139,Delete 2600,Delete 2413,Delete 2842,Insert 2213,Insert 3340,Find 2696,Insert 3520,Insert 1992,Insert 2819,Insert 3210,Find 1588,Find 432,Insert 1285,Find 1064,Insert 424,Find 2671,Find 812,Insert 14,Insert 53,Insert 2245,Insert 3429,Insert 3664,Insert 3933,Delete 1034,Insert 2592,Delete 2387,Insert 2810,Find 1090,Find 3188,Find 2477,Insert 3160,Insert 745,Delete 1636,Insert 3620,Find 477,Insert 916,Insert 3838,Insert 2833,Insert 3155,Insert 2069,Find 1769,Insert 1444,Insert 38,Find 2792,Insert 1958,Insert 375,Insert 1519,Delete 772,Insert 3428,Delete 1074,Find 3180,Insert 3482,Insert 984,Find 3575,Delete 1310,Insert 2879,Insert 800,Insert 2786,Find 3883,Find 3600,Find 3451,Insert 1078,Insert 1163,Delete 2900,Insert 643,Insert 555,Insert 1759,Find 1236,Insert 280,Insert 3756,Find 1437,Insert 2919,Insert 2812,Insert 3957,Insert 896,Delete 858,Insert 3468,Find 1660,Insert 3701,Find 2873,Delete 2023,Delete 1397,Insert 1904,Find 2356,Find 556,Delete 1434,Delete 3069,Insert 1152,Find 2987,Insert 2900,Find 3286,Insert 660,Insert 2054,Insert 2258,Insert 28,Find 1492,Find 3182,Insert 947,Delete 2200,Delete 2820,Find 2894,Insert 551,Insert 28,Insert 3983,Insert 30,Find 2799,Insert 3005,Insert 3536,Find 2872,Find 3096,Delete 3919,Insert 774,Find 1705,Insert 3321,Find 595,Find 50,Find 2117,Insert 3656,Insert 2223,Insert 1387,Delete 1323,Insert 3958,Find 744,Delete 2275,Find 2322,Insert 1137,Find 433,Insert 452,Delete 1020,Insert 100,Delete 293,Find 3627,Insert 1554,Insert 220,Insert 2388,Insert 2188,Insert 867,Insert 2448,Delete 496,Insert 3808,Insert 3507,Insert 2133,Find 1326,Find 1288,Find 3336,Find 1411,Insert 2770,Insert 787,Insert 2830,Insert 1967,Insert 2353,Insert 510,Insert 1407,Find 455,Find 153,Delete 2289,Insert 1905,Insert 1794,Insert 1579,Insert 1199,Find 2200,Delete 2168,Insert 3737,Insert 2933,Find 577,Insert 3799,Insert 2138,Delete 3176,Insert 398,Delete 197,Find 894,Insert 1558,Find 1797,Find 3922,Find 1210,Delete 2444,Find 2061,Delete 1112,Find 3282,Insert 3141,Find 2914,Delete 3038,Insert 1683,Insert 2466,Insert 1311,Insert 1758,Insert 2424,Insert 2122,Find 2833,Delete 2161,Insert 2855,Delete 2438,Find 2878,Find 2460,Insert 2321,Find 1917,Find 1358,Find 2997,Delete 2650,Insert 2533,Find 32,Insert 2685,Insert 597,Insert 3539,Delete 3501,Insert 529,Insert 1382,Find 2587,Insert 2664,Find 3898,Find 3081,Insert 3291,Find 2333,Insert 163,Insert 3240,Insert 2617,Delete 1511,Insert 3755,Find 3288,Delete 3067,Find 1713,Insert 3455,Insert 970,Insert 3719,Insert 2582,Find 3481,Find 3644,Find 1891,Insert 1657,Insert 1278,Insert 2786,Find 3835,Find 751,Insert 2063,Insert 3640,Insert 3363,Find 1257,Insert 2695,Insert 768,Delete 3294,Insert 2361,Find 3662,Insert 3854,Insert 3935,Insert 2683,Find 3628,Insert 3755,Insert 922,Insert 1670,Delete 1131,Insert 2136,Insert 2875,Find 1046,Find 3787,Find 3074,Insert 2007,Find 2791,Insert 1730,Insert 516,Insert 317,Insert 596,Find 2651,Insert 773,Insert 3678,Insert 3641,Insert 973,Find 2377,Find 781,Find 770,Find 2718,Insert 3817,Find 1138,Insert 2754,Insert 2641,Insert 2965,Insert 2794,Insert 654,Find 1464,Find 3307,Insert 525,Find 3192,Find 2454,Insert 2921,Find 1443,Insert 1085,Insert 978,Insert 1597,Find 3592,Insert 732,Delete 3435,Insert 1039,Insert 1875,Insert 370,Find 750,Insert 1051,Insert 3048,Insert 150,Insert 2680,Delete 25,Insert 3451,Insert 3528,Insert 537,Insert 3274,Insert 593,Insert 3748,Delete 2295,Insert 748,Find 2157,Delete 2769,Insert 220,Find 1653,Find 155,Delete 986,Insert 712,Insert 1377,Delete 658,Find 3730,Delete 851,Insert 2655,Delete 3029,Find 620,Insert 2718,Insert 2200,Insert 1165,Insert 2969,Insert 1043,Insert 3595,Find 1930,Find 1630,Insert 989,Find 920,Find 3016,Insert 1624,Insert 3044,Insert 1137,Insert 1710,Insert 3629,Delete 1847,Find 1694,Insert 2800,Insert 3887,Insert 329,Find 1075,Insert 2810,Insert 3405,Insert 3612,Insert 1593,Find 3320,Find 3389,Insert 235,Delete 2895,Insert 842,Find 2669,Find 1700,Insert 3545,Insert 1470,Find 3189,Delete 2707,Insert 3175,Insert 1493,Find 495,Insert 1192,Insert 848,Delete 290,Insert 1866,Find 2939,Delete 568,Insert 1632,Insert 82,Insert 3339,Insert 3625,Insert 1600,Insert 3892,Find 1043,Delete 3498,Find 530,Insert 219,Insert 2268,Insert 871,Insert 2755,Delete 2684,Insert 1541,Find 1431,Insert 3209,Insert 3270,Delete 3621,Insert 1941,Find 2590,Insert 3552,Delete 3095,Find 1547,Insert 1945,Delete 3666,Find 119,Insert 2875,Delete 871,Insert 223,Insert 2356,Insert 3369,Insert 2230,Insert 2487,Find 1640,Delete 861,Find 1796,Insert 2166,Find 1671,Delete 197,Find 1457,Find 2060,Delete 1201,Find 748,Insert 1862,Delete 3146,Delete 2497,Insert 2043,Insert 860,Insert 668,Insert 1806,Insert 1960,Insert 18,Find 3786,Find 3730,Delete 1940,Insert 2221,Delete 2442,Insert 3930,Delete 518,Insert 531,Insert 1419,Insert 2469,Insert 935,Insert 3536,Find 1957,Insert 3661,Insert 2164,Insert 2214,Insert 2883,Find 287,Insert 629,Insert 728,Insert 2993,Insert 1643,Insert 125,Insert 183,Insert 91,Insert 2270,Find 962,Find 392,Find 3675,Insert 3983,Find 1375,Delete 1406,Insert 2503,Insert 2539,Insert 3995,Find 3917,Find 3485,Delete 1340,Insert 2949,Find 3141,Find 798,Insert 2401,Insert 1595,Insert 1884,Insert 3739,Insert 3918,Delete 2749,Insert 1297,Insert 2628,Delete 508,Insert 1056,Insert 3839,Insert 3170,Insert 501,Insert 2206,Find 3621,Insert 3936,Insert 1455,Insert 3499,Find 3220,Insert 150,Find 225,Insert 2072,Insert 533,Insert 1539,Find 3774,Find 1565,Find 3121,Delete 2357,Insert 1320,Find 1327,Find 34,Find 3091,Insert 1382,Delete 1596,Insert 1491] +[Find 826,Insert 49,Insert 3620,Insert 1816,Insert 517,Delete 1676,Find 2943,Insert 93,Insert 3559,Insert 1683,Delete 1123,Insert 1627,Insert 3387,Insert 2784,Insert 3774,Insert 2816,Find 254,Find 430,Insert 2044,Insert 2641,Insert 1059,Delete 1539,Insert 432,Delete 1181,Insert 3730,Delete 1688,Insert 1866,Delete 572,Insert 2170,Insert 3785,Insert 3763,Find 2271,Find 1364,Insert 3699,Find 1926,Insert 3407,Insert 2309,Insert 2518,Insert 3547,Insert 2111,Delete 3743,Insert 3651,Find 3332,Insert 3009,Delete 1223,Insert 2077,Insert 2843,Insert 3108,Delete 975,Insert 816,Insert 1095,Find 249,Insert 2268,Insert 3572,Find 366,Insert 789,Delete 2384,Find 2835,Delete 2736,Insert 1250,Insert 3763,Insert 2337,Find 2976,Insert 3114,Insert 2513,Insert 3025,Insert 2704,Insert 490,Insert 2991,Insert 2850,Insert 3168,Insert 3219,Insert 3709,Insert 195,Insert 3892,Insert 3992,Find 1986,Insert 1933,Find 1322,Find 3447,Find 3728,Delete 1047,Insert 1998,Find 1149,Insert 308,Insert 3198,Insert 2193,Insert 373,Delete 3957,Delete 1153,Insert 1641,Insert 3933,Delete 201,Find 2132,Insert 1048,Find 3615,Insert 2751,Insert 1635,Insert 2444,Insert 2045,Insert 2345,Insert 3355,Insert 417,Find 3265,Find 2652,Delete 2131,Insert 1568,Insert 2933,Find 2899,Delete 1786,Insert 1148,Find 1978,Insert 2731,Find 2875,Insert 2416,Find 1101,Insert 3266,Find 769,Delete 393,Find 3419,Find 1444,Delete 79,Find 3838,Find 1648,Delete 2380,Find 2114,Find 3335,Find 3521,Insert 1018,Find 2644,Insert 795,Insert 1429,Insert 3639,Find 127,Insert 1184,Find 825,Insert 987,Insert 2412,Insert 3070,Find 684,Delete 661,Insert 3724,Insert 3045,Insert 1596,Insert 1581,Insert 3754,Find 1786,Find 1307,Insert 3994,Find 1694,Delete 3846,Insert 2130,Insert 3729,Insert 1085,Insert 2260,Find 3897,Insert 1031,Insert 1715,Insert 1430,Insert 3168,Delete 1633,Insert 623,Find 3620,Delete 3471,Insert 2468,Insert 3398,Insert 494,Find 221,Find 1282,Insert 1411,Insert 3700,Find 3097,Find 3418,Insert 2770,Delete 1219,Find 3801,Insert 75,Find 3342,Insert 769,Find 1006,Insert 3760,Insert 2945,Delete 2451,Find 2994,Find 3989,Insert 2404,Insert 1995,Find 1948,Insert 3070,Insert 2907,Insert 1776,Insert 3595,Insert 3528,Insert 3186,Insert 2308,Find 3076,Insert 3770,Insert 2093,Insert 3456,Insert 3747,Delete 2271,Insert 1556,Insert 1375,Insert 3240,Insert 2068,Find 2854,Insert 880,Insert 3091,Insert 3060,Find 462,Insert 2219,Find 3214,Insert 3736,Find 203,Insert 2829,Insert 3225,Insert 1635,Insert 875,Delete 3743,Insert 2418,Insert 2841,Insert 3820,Find 1334,Insert 3195,Insert 3041,Find 2633,Insert 3810,Delete 2271,Find 3109,Insert 3491,Insert 3375,Find 2137,Insert 570,Find 450,Insert 1360,Delete 2623,Insert 3173,Find 1834,Find 3081,Insert 181,Find 1149,Insert 2027,Insert 1286,Insert 594,Insert 2843,Find 300,Insert 3472,Insert 982,Find 2925,Find 2311,Insert 331,Insert 2671,Insert 1549,Find 3722,Insert 2828,Find 960,Insert 2357,Insert 3912,Insert 155,Insert 811,Insert 1807,Insert 3492,Delete 1282,Insert 3823,Insert 3088,Insert 3289,Find 1139,Delete 2274,Find 3466,Insert 2804,Insert 3466,Find 589,Delete 2998,Find 109,Delete 2635,Find 3092,Find 1754,Insert 675,Find 1784,Insert 2904,Insert 3571,Find 854,Insert 3182,Find 280,Insert 3071,Insert 1007,Find 3226,Insert 1509,Delete 406,Find 3056,Delete 2091,Insert 3822,Insert 1604,Delete 3644,Insert 1711,Insert 25,Insert 1449,Insert 1357,Find 2287,Find 1230,Delete 2511,Insert 3237,Find 1743,Find 909,Insert 2823,Insert 2161,Insert 2964,Delete 496,Insert 3990,Insert 3791,Insert 2728,Insert 1242,Insert 2486,Insert 2254,Insert 1060,Delete 616,Insert 2416,Insert 362,Insert 3985,Delete 3859,Find 465,Insert 2656,Insert 3608,Insert 1310,Find 2969,Insert 3440,Find 3111,Insert 3993,Insert 837,Find 396,Delete 1509,Find 1641,Find 1844,Insert 3336,Insert 3953,Insert 3921,Find 2473,Delete 3574,Insert 3293,Insert 1792,Delete 3842,Find 604,Insert 1170,Find 2075,Find 319,Insert 1898,Insert 430,Insert 3478,Insert 1275,Find 2509,Find 3894,Insert 911,Insert 2870,Find 346,Insert 2337,Find 710,Find 3121,Insert 3787,Insert 1699,Delete 2537,Find 849,Insert 3626,Find 1709,Insert 2972,Find 2553,Insert 2244,Delete 2008,Insert 315,Find 170,Delete 2913,Insert 3306,Find 704,Insert 3957,Delete 337,Insert 2349,Insert 1694,Insert 2967,Delete 640,Insert 3662,Delete 351,Delete 3794,Insert 166,Delete 201,Insert 2128,Delete 448,Delete 1416,Delete 1401,Insert 2573,Find 313,Insert 1585,Insert 2406,Delete 3571,Find 1469,Insert 492,Insert 3097,Find 3798,Insert 1479,Insert 223,Find 3896,Insert 3142,Insert 1569,Delete 1182,Insert 29,Insert 2429,Find 821,Insert 1845,Find 1774,Find 3996,Delete 1312,Insert 2616,Insert 3835,Insert 1746,Insert 3401,Find 3997,Insert 3747,Insert 2086,Insert 3222,Find 3693,Find 2984,Insert 1320,Insert 2897,Insert 1447,Insert 905,Find 910,Insert 773,Insert 1271,Insert 326,Insert 649,Find 3713,Find 3360,Insert 2905,Insert 1466,Find 3382,Delete 80,Insert 2705,Find 888,Find 50,Find 240,Delete 3763,Find 262,Find 3207,Find 3747,Insert 456,Insert 896,Find 3676,Insert 185,Insert 3978,Insert 2113,Find 3859,Insert 2971,Insert 671,Insert 1918,Insert 2519,Find 200,Insert 768,Insert 1348,Insert 3332,Insert 1173,Insert 3493,Find 3921,Delete 279,Insert 2029,Insert 3503,Insert 518,Insert 259,Delete 2239,Find 128,Insert 1100,Insert 3573,Delete 2633,Find 2797,Find 2115,Insert 2728,Insert 2104,Insert 3202,Insert 665,Delete 1499,Insert 1044,Delete 3265,Insert 2753,Delete 1769,Insert 3626,Insert 1697,Insert 1410,Delete 3420,Find 2049,Find 3457,Insert 2840,Insert 788,Insert 3793,Insert 1273,Insert 2230,Insert 1496,Insert 2173,Find 2636,Insert 2091,Insert 755,Insert 2364,Find 885,Insert 3103,Insert 17,Insert 717,Delete 315,Find 1537,Insert 654,Find 133,Find 824,Delete 3023,Insert 598,Insert 2996,Insert 3641,Find 3422,Insert 2371,Insert 2778,Delete 1636,Find 212,Insert 3132,Insert 2958,Delete 1510,Insert 2556,Find 3714,Insert 2575,Delete 841,Insert 1618,Insert 3310,Delete 3580,Find 1342,Insert 371,Insert 39,Delete 428,Find 2197,Insert 963,Insert 1146,Insert 2098,Insert 2658,Insert 3305,Insert 8,Insert 920,Find 2508,Insert 1459,Delete 2592,Insert 3356,Insert 443,Delete 784,Find 2720,Insert 1402,Insert 3682,Find 3639,Insert 3504,Insert 2357,Delete 846,Find 2032,Delete 1191,Insert 3891,Find 759,Insert 3277,Insert 1607,Insert 2471,Insert 3474,Insert 1434,Delete 2848,Find 1879,Find 1765,Insert 1859,Find 171,Insert 684,Find 3863,Find 3125,Insert 691,Insert 401,Insert 2359,Find 2354,Insert 3903,Find 469,Insert 1805,Insert 1272,Find 2046,Delete 2979,Insert 1106,Insert 881,Insert 1854,Insert 1153,Insert 3139,Find 1817,Insert 160,Insert 913,Insert 2734,Insert 2066,Insert 2038,Delete 912,Find 2517,Insert 3662,Find 3225,Find 2246,Insert 2187,Insert 1887,Insert 2923,Delete 3661,Find 1294,Insert 3757,Delete 93,Delete 487,Find 1613,Delete 2846,Insert 2074,Find 150,Insert 2073,Find 2165,Find 3270,Delete 3535,Delete 2710,Find 1935,Insert 467,Insert 687,Insert 2021,Insert 1506,Find 3444,Delete 24,Insert 1174,Delete 3195,Find 1818,Find 709,Insert 2010,Insert 2024,Find 1686,Find 1713,Find 2215,Find 5,Insert 1052,Insert 2809,Find 1898,Find 3420,Delete 1489,Insert 2729,Insert 1090,Insert 526,Insert 3567,Insert 3050,Find 36,Find 3690,Find 1443,Find 2125,Insert 1822,Delete 1069,Insert 347,Delete 2626,Delete 878,Insert 2175,Insert 3547,Insert 3299,Insert 2278,Delete 1750,Insert 253,Insert 2064,Find 3923,Insert 652,Insert 1334,Insert 3147,Find 3630,Insert 1246,Insert 2937,Insert 1591,Delete 2282,Delete 3244,Insert 106,Insert 2536,Delete 2526,Find 2433,Insert 785,Insert 456,Insert 3204,Find 2252,Insert 2399,Find 243,Insert 3554,Find 1834,Insert 3951,Delete 1065,Insert 367,Delete 3144,Insert 799,Insert 419,Insert 600,Find 517,Find 455,Find 3614,Insert 3238,Insert 1101,Insert 2567,Insert 793,Find 1103,Find 722,Insert 81,Delete 3755,Find 2357,Find 1237,Insert 1139,Insert 3207,Insert 3782,Insert 3118,Insert 1229,Insert 736,Insert 308,Find 262,Find 2132,Insert 973,Find 156,Delete 3628,Delete 1770,Insert 3541,Insert 1121,Find 2730,Find 3894,Insert 3769,Find 1538,Find 2608,Insert 962,Find 902,Delete 1002,Find 3849,Find 2745,Insert 1815,Delete 1027,Find 1380,Find 2523,Delete 3876,Delete 1013,Insert 3897,Insert 3193,Insert 3844,Insert 3452,Delete 2112,Delete 1644,Find 518,Insert 1052,Insert 3280,Insert 2379,Insert 3981,Insert 1749,Delete 2234,Delete 3726,Insert 3314,Insert 1503,Insert 305,Find 3791,Insert 2579,Insert 3629,Find 262,Insert 1051,Find 2535,Insert 3298,Insert 105,Delete 1543,Delete 17,Delete 1547,Insert 3487,Delete 1894,Insert 2580,Insert 3117,Insert 1020,Find 3294,Find 2464,Delete 1485,Insert 3529,Find 1070,Delete 1742,Find 216,Insert 3387,Find 1405,Insert 3505,Insert 1813,Find 3002,Insert 3894,Find 1792,Insert 1243,Find 1434,Insert 96,Find 3873,Find 3605,Find 584,Insert 3237,Insert 2105,Find 1613,Insert 3265,Delete 3864,Delete 402,Insert 3649,Find 3549,Insert 2545,Insert 1952,Delete 2784,Insert 2992,Insert 3703,Find 3637,Insert 512,Delete 2585,Delete 1022,Find 1290,Insert 579,Find 3857,Delete 2478,Insert 2605,Find 3923,Insert 1591,Insert 3277,Delete 3532,Find 1069,Delete 1700,Delete 153,Delete 3881,Find 477,Insert 74,Insert 48,Insert 3353,Insert 2459,Delete 2230,Insert 2618,Find 762,Find 3069,Insert 1545,Insert 1327,Insert 3220,Find 3650,Find 2777,Delete 3241,Find 1167,Find 1611,Delete 3987,Insert 2844,Insert 2316,Insert 3649,Find 1258,Insert 3829,Find 3943,Find 355,Insert 1157,Find 3829,Delete 1225,Insert 3368,Find 3809,Insert 3118,Find 3615,Insert 845,Find 248,Insert 1564,Insert 2069,Insert 2667,Find 2091,Insert 2112,Find 2971,Find 2527,Find 2777,Find 3417,Insert 2836,Find 3151,Find 3692,Insert 1854,Delete 3435,Insert 2773,Insert 1255,Insert 3769,Insert 2289,Insert 248,Find 3961,Find 3817,Insert 1835,Delete 224,Find 374,Insert 1848,Find 2333,Find 3817,Find 2105,Insert 1363,Find 136,Delete 3159,Insert 2940,Find 1040,Insert 1623,Insert 3184,Insert 2892,Insert 3224,Insert 2654,Insert 3728,Insert 2606,Insert 1107,Insert 3584,Insert 2336,Insert 3545,Insert 662,Delete 1112,Find 2398,Insert 3433,Insert 1155,Find 263,Insert 1230,Insert 2638,Find 987,Insert 1867,Insert 3370,Insert 3838,Find 2475,Insert 1971,Insert 339,Insert 1586,Insert 2151,Find 3480,Insert 7,Insert 2208,Insert 3780,Find 2414,Insert 421,Insert 838,Delete 271,Insert 75,Insert 2160,Find 1010,Insert 1930,Find 3732,Insert 3724,Insert 3571,Find 2386,Insert 2389,Insert 2147,Insert 1544,Insert 3075,Insert 2826,Insert 3182,Insert 53,Insert 2068,Insert 257,Insert 3782,Delete 2567,Insert 1825,Insert 1817,Find 1939,Insert 3413,Insert 3447,Find 3330,Insert 193,Insert 3872,Insert 251,Find 3464,Insert 1808,Find 1661,Insert 2189,Insert 3507,Insert 2764,Insert 2552,Insert 288,Insert 101,Insert 198,Find 1728,Delete 914,Insert 562,Insert 1786,Find 795,Insert 2964,Insert 3097,Insert 1756,Insert 499,Find 491,Insert 789,Insert 3007,Find 51,Insert 3365,Delete 1812,Insert 2130,Insert 35,Insert 2953,Find 480,Insert 601,Find 3151,Delete 570,Delete 2949,Find 2626,Insert 2410,Insert 1865,Find 1014,Insert 1807,Insert 1342,Find 1974,Insert 313,Insert 2832,Find 1352,Find 3914,Find 1933,Find 1165,Insert 3071,Find 2731,Insert 2507,Delete 674,Insert 992,Delete 876,Insert 2599,Find 296,Insert 2874,Insert 41,Insert 3555,Find 840,Find 2552,Insert 2252,Insert 1579,Insert 2693,Delete 2847,Find 1167,Insert 1689,Insert 1257,Find 2512,Find 2073,Insert 1351,Find 3838,Insert 3744,Insert 2685,Insert 2991,Insert 3526,Insert 1986,Insert 443,Insert 2538,Find 1956,Insert 846,Insert 3355,Find 3711,Insert 1941,Find 2914,Find 2301,Find 3697,Insert 2884,Insert 2231,Delete 1578,Delete 2278,Insert 2033,Insert 153,Insert 1827,Insert 3286,Insert 768,Delete 558,Insert 979,Insert 48,Insert 1728,Insert 313,Insert 1518,Insert 1921,Insert 3477,Insert 3956,Insert 1607,Insert 492,Insert 2868,Insert 3078,Delete 3773,Insert 1499,Find 2000,Insert 31,Insert 1588,Find 3109,Insert 1205,Find 3950,Find 3329,Insert 1507,Find 2699,Delete 1903,Find 3565,Delete 3179,Find 2297,Insert 72,Find 2928,Insert 175,Insert 3056,Find 3655,Insert 3780,Insert 456,Delete 3137,Delete 3940,Insert 923,Find 782,Insert 2903,Insert 2420,Delete 281,Insert 1235,Delete 1716,Insert 1615,Insert 1185,Insert 1114,Find 416,Delete 1929,Delete 3267,Delete 3179,Delete 273,Insert 2982,Insert 2121,Find 1024,Insert 439,Insert 3505,Insert 3950,Insert 3555,Find 434,Insert 872,Insert 487,Find 699,Insert 1692,Insert 2703,Insert 1648,Insert 3983,Delete 486,Find 2789,Insert 3135,Insert 3255,Insert 3887,Insert 3491,Find 2682,Find 1063,Insert 48,Insert 1053,Insert 2135,Insert 974,Find 6,Insert 3436,Insert 723,Insert 3504,Insert 3399,Find 2308,Delete 890,Insert 2716,Insert 2367,Insert 88,Insert 468,Find 1899,Delete 3505,Find 2139,Insert 2958,Find 2599,Find 900,Find 3747,Insert 2654,Insert 507,Insert 730,Find 2277,Delete 397,Find 1329,Insert 3696,Find 135,Insert 2771,Insert 1135,Insert 3932,Insert 1119,Insert 1861,Insert 3772,Insert 50,Delete 3071,Insert 3261,Insert 2672,Insert 2956,Insert 3451,Insert 802,Find 3792,Find 1619,Insert 1837,Find 1078,Insert 1621,Insert 4000,Insert 3086,Insert 2286,Insert 985,Insert 433,Find 1131,Delete 2424,Find 1841,Insert 2295,Insert 2749,Insert 3014,Insert 2196,Find 2562,Insert 3337,Insert 1507,Insert 1103,Delete 64,Insert 214,Insert 1389,Insert 3597,Find 272,Find 1545,Insert 3101,Delete 1037,Insert 882,Insert 3951,Insert 506,Insert 116,Find 3755,Find 782,Delete 498,Delete 1256,Find 186,Find 3340,Insert 354,Delete 3247,Find 459,Find 3189,Find 1927,Insert 1375,Delete 2577,Insert 2035,Find 1021,Insert 1896,Find 1778,Insert 1306,Delete 459,Insert 3206,Insert 1958,Insert 354,Insert 798,Insert 377,Delete 3735,Insert 2465,Delete 3483,Insert 3013,Insert 3895,Find 239,Delete 1288,Insert 2833,Delete 3149,Insert 2957,Delete 1595,Insert 31,Insert 1054,Insert 3913,Insert 1908,Insert 3815,Delete 981,Insert 2061,Insert 115,Find 1506,Delete 3217,Insert 76,Delete 362,Insert 1368,Delete 1893,Delete 3501,Find 2744,Find 393,Insert 3062,Insert 305,Insert 1663,Find 3042,Delete 524,Find 1510,Delete 742,Insert 1490,Insert 527,Insert 2400,Insert 698,Insert 577,Find 3208,Insert 517,Insert 3168,Insert 2760,Insert 356,Insert 3790,Find 3328,Delete 516,Insert 1075,Find 106,Insert 3920,Find 1281,Find 3942,Insert 3479,Insert 1531,Insert 3053,Find 2906,Find 3478,Find 956,Find 167,Insert 969,Delete 2868,Delete 1132,Insert 1932,Insert 3196,Find 210,Insert 2665,Delete 109,Delete 599,Delete 396,Insert 53,Insert 33,Insert 2900,Delete 399,Find 3571,Insert 2791,Delete 1970,Insert 881,Find 3174,Find 309,Insert 2335,Delete 1936,Insert 2901,Insert 2173,Insert 1786,Insert 3267,Find 53,Delete 824,Insert 3415,Find 1438,Insert 1753,Insert 1375,Insert 534,Insert 3543,Find 3297,Find 2165,Insert 390,Insert 694,Find 163,Insert 2984,Insert 2810,Delete 962,Insert 1529,Find 2603,Delete 2465,Insert 3106,Insert 3252,Insert 2463,Find 3121,Find 2323,Insert 2389,Find 1131,Find 3081,Insert 549,Insert 112,Find 2414,Insert 1340,Insert 2768,Find 2622,Find 3641,Insert 51,Insert 3835,Find 3305,Insert 272,Insert 3643,Delete 2593,Find 529,Find 1625,Delete 3551,Delete 2684,Insert 3737,Insert 2036,Insert 308,Delete 2759,Insert 1395,Delete 2895,Insert 2159,Insert 436,Insert 3004,Insert 3794,Insert 1081,Insert 1703,Find 2689,Insert 3617,Find 860,Insert 793,Insert 3508,Insert 1745,Insert 2449,Insert 698,Insert 1310,Insert 3773,Insert 1379,Find 99,Delete 536,Insert 1151,Insert 522,Insert 1223,Insert 2817,Insert 2457,Insert 2037,Insert 3859,Insert 1648,Find 3535,Find 3195,Insert 876,Find 3224,Insert 1222,Find 997,Insert 3261,Delete 3468,Find 561,Find 1232,Insert 807,Find 2837,Find 1934,Find 3698,Find 385,Insert 1036,Insert 72,Insert 2197,Find 2818,Insert 2775,Insert 3127,Find 2561,Insert 1464,Find 3328,Insert 2894,Find 759,Delete 1533,Find 1006,Insert 673,Insert 1657,Insert 2909,Insert 3467,Find 1054,Insert 786,Find 2237,Insert 3,Insert 857,Insert 1526,Delete 3316,Delete 1373,Find 37,Insert 2176,Insert 10,Insert 788,Find 1902,Find 386,Insert 3612,Insert 2465,Find 3432,Delete 1841,Find 2521,Insert 693,Insert 163,Find 3568,Insert 505,Find 3607,Delete 671,Find 2858,Find 1037,Insert 3751,Delete 1911,Insert 3408,Insert 2580,Insert 2727,Delete 1168,Insert 1676,Delete 1647,Insert 3766,Insert 1186,Insert 1799,Find 1622,Delete 1503,Insert 3502,Insert 15,Insert 87,Insert 759,Insert 2545,Insert 304,Find 1300,Delete 1872,Find 369,Insert 1911,Insert 2464,Find 1353,Find 837,Insert 754,Delete 2578,Insert 623,Delete 3500,Insert 2961,Find 3832,Find 2080,Delete 243,Insert 3876,Insert 1593,Find 2331,Insert 2321,Insert 3752,Insert 1487,Insert 3458,Insert 2619,Insert 2302,Insert 2177,Delete 1202,Delete 3844,Find 78,Insert 221,Insert 3337,Find 2886,Delete 2911,Find 79,Insert 3194,Insert 3274,Find 12,Find 3190,Insert 2111,Delete 235,Find 1996,Insert 3629,Insert 2444,Insert 3858,Find 1857,Insert 1042,Delete 2172,Find 244,Find 1310,Find 1235,Insert 610,Insert 1749,Find 239,Find 2544,Insert 734,Insert 2220,Insert 1319,Find 383,Insert 1451,Insert 3603,Delete 350,Delete 3498,Delete 3973,Find 315,Insert 3220,Find 3424,Find 3534,Insert 1028,Find 3108,Insert 3063,Insert 292,Insert 3950,Insert 2762,Insert 1074,Insert 1913,Insert 1124,Insert 3980,Insert 3451,Insert 362,Find 2338,Insert 1452,Insert 2588,Find 105,Find 3058,Delete 858,Find 685,Delete 483,Insert 228,Insert 1884,Find 2781,Insert 763,Find 1268,Delete 103,Find 1255,Insert 3118,Delete 2312,Insert 1347,Find 2308,Insert 865,Insert 1276,Find 405,Find 3305,Insert 3114,Insert 3866,Delete 1966,Find 3010,Insert 2070,Insert 1889,Find 2189,Find 3325,Insert 3384,Insert 3250,Insert 2729,Insert 2609,Find 3906,Find 1828,Insert 1499,Insert 1099,Find 2696,Find 1304,Insert 1732,Insert 1203,Insert 15,Find 3527,Insert 3299,Insert 1391,Insert 3648,Insert 891,Insert 858,Insert 3045,Find 498,Insert 2879,Delete 483,Insert 3879,Find 83,Insert 2665,Insert 2765,Insert 2967,Insert 480,Insert 2267,Insert 1031,Find 3915,Find 1702,Delete 3306,Insert 241,Insert 3702,Find 2428,Insert 716,Insert 1159,Insert 3383,Insert 1197,Find 2183,Insert 481,Insert 2393,Insert 905,Insert 671,Find 902,Insert 1072,Delete 3584,Insert 3583,Find 3719,Find 687,Insert 1378,Find 3807,Delete 509,Insert 2977,Find 2761,Insert 3176,Delete 2653,Find 3837,Insert 512,Insert 2901,Insert 690,Delete 525,Insert 3732,Delete 1725,Find 1469,Insert 3797,Delete 1745,Insert 3640,Insert 15,Insert 3173,Insert 394,Insert 960,Insert 3308,Find 425,Delete 3969,Find 2022,Insert 904,Insert 1907,Delete 3302,Find 1220,Insert 253,Insert 2805,Insert 2435,Insert 3234,Insert 2110,Find 3380,Insert 192,Find 970,Insert 3494,Find 1867,Insert 2037,Insert 3306,Find 2448,Find 3406,Insert 3050,Find 1746,Insert 1765,Insert 3252,Delete 1345,Insert 2676,Insert 2699,Insert 1916,Find 2140,Insert 2468,Find 292,Find 427,Delete 1027,Insert 1675,Insert 264,Find 700,Insert 3830,Delete 1323,Delete 776,Insert 1626,Delete 294,Insert 1923,Delete 1650,Find 3101,Delete 2058,Insert 1776,Delete 2328,Find 770,Find 3278,Insert 2858,Find 250,Insert 1515,Delete 2583,Insert 3735,Insert 3708,Insert 904,Insert 256,Delete 3363,Insert 1736,Delete 224,Insert 1710,Insert 3037,Find 2987,Insert 2972,Insert 2894,Delete 1740,Delete 2137,Insert 2197,Insert 645,Delete 464,Insert 2025,Insert 1765,Find 31,Find 1390,Find 3821,Find 1873,Insert 2673,Insert 3386,Insert 2634,Delete 2726,Insert 452,Insert 2573,Insert 3777,Insert 746,Delete 577,Insert 1770,Insert 2013,Delete 1164,Find 1425,Insert 1327,Insert 476,Delete 832,Insert 3863,Insert 3558,Insert 1861,Find 125,Insert 1701,Insert 606,Insert 3738,Find 2913,Find 948,Insert 1110,Delete 3162,Insert 1186,Find 1982,Insert 2496,Insert 336,Insert 674,Find 277,Insert 2010,Find 775,Insert 251,Insert 899,Find 3709,Insert 534,Insert 318,Insert 3198,Insert 746,Insert 1275,Delete 3370,Find 3554,Find 65,Insert 3406,Find 1806,Delete 3247,Find 2055,Find 2068,Insert 639,Find 3987,Insert 3223,Insert 1202,Delete 2425,Insert 2492,Insert 419,Delete 3839,Insert 3068,Delete 1028,Insert 2399,Find 2656,Insert 3325,Delete 1652,Insert 528,Insert 477,Find 973,Insert 3803,Find 3448,Insert 3788,Find 1651,Insert 388,Insert 2787,Insert 1558,Find 1048,Delete 37,Find 1642,Insert 3829,Insert 718,Delete 435,Delete 388,Insert 1994,Delete 1568,Insert 573,Insert 3508,Delete 3452,Find 3881,Insert 1715,Find 445,Delete 3802,Insert 631,Insert 971,Insert 3985,Delete 1085,Insert 580,Insert 1930,Insert 1335,Delete 3804,Find 3820,Insert 2973,Insert 2369,Find 1374,Find 1442,Delete 854,Insert 3279,Find 3871,Find 2962,Find 1822,Insert 2691,Insert 800,Delete 3498,Insert 2519,Insert 2833,Insert 2418,Find 681,Find 941,Insert 1678,Insert 1595,Insert 1449,Find 1046,Insert 1608,Find 1078,Find 1627,Insert 1535,Find 1561,Insert 2258,Insert 416,Insert 2684,Delete 3043,Insert 3989,Find 1259,Insert 327,Insert 3948,Find 1288,Find 2465,Insert 1618,Insert 2517,Insert 1048,Insert 803,Delete 2997,Find 2933,Insert 2853,Find 2478,Insert 2672,Insert 1866,Delete 2334,Find 1078,Insert 3342,Insert 507,Find 1379,Insert 3787,Find 3054,Find 2095,Insert 1425,Insert 2281,Delete 625,Insert 2617,Insert 2729,Find 3794,Find 2187,Insert 1686,Insert 690,Insert 2491,Find 2724,Insert 1647,Insert 2473,Delete 1450,Insert 2244,Insert 3042,Insert 1533,Insert 1047,Delete 3210,Insert 2293,Insert 2060,Find 2192,Delete 311,Insert 1173,Delete 3949,Find 3688,Insert 2636,Insert 2321,Insert 2329,Find 3724,Insert 3254,Find 641,Insert 2309,Insert 188,Find 2130,Insert 1817,Insert 43,Delete 545,Find 2782,Insert 335,Delete 3145,Insert 1993,Find 3459,Find 3477,Find 2742,Insert 1803,Insert 3670,Find 1950,Insert 923,Insert 2790,Insert 1649,Insert 533,Insert 2038,Insert 975,Find 2956,Find 861,Find 2058,Insert 1261,Insert 3857,Find 1128,Insert 1954,Insert 730,Delete 1365,Find 2870,Insert 643,Find 947,Insert 991,Insert 2668,Find 178,Insert 332,Find 464,Insert 2177,Delete 3536,Insert 2865,Find 1573,Find 3446,Insert 289,Delete 3571,Insert 3595,Insert 1677,Insert 3247,Insert 2065,Insert 2807,Delete 2873,Insert 2323,Delete 560,Insert 3108,Insert 80,Insert 102,Insert 3625,Find 3081,Insert 1158,Insert 3227,Find 2441,Delete 3707,Delete 1764,Delete 2510,Find 2691,Find 3642,Insert 2163,Find 2406,Insert 2910,Find 1530,Delete 2721,Insert 2680,Find 1026,Insert 2639,Delete 2027,Find 2156,Insert 3894,Insert 3376,Insert 398,Find 2925,Insert 2640,Insert 2186,Delete 692,Insert 2836,Insert 1021,Delete 1327,Insert 812,Insert 537,Insert 493,Insert 3991,Insert 2091,Insert 3916,Insert 1746,Insert 210,Insert 3920,Insert 1175,Insert 931,Insert 1472,Insert 1323,Find 254,Insert 2015,Insert 1282,Insert 294,Find 3285,Insert 763,Insert 1620,Find 1725,Insert 266,Insert 2881,Insert 741,Insert 2775,Insert 1188,Insert 1292,Insert 3328,Delete 1895,Insert 1206,Delete 1448,Insert 3299,Insert 1124,Find 956,Find 2674,Insert 3579,Delete 2068,Insert 1238,Insert 1039,Find 2085,Insert 3173,Find 2544,Insert 1211,Insert 2362,Insert 3700,Delete 2141,Find 3892,Find 1185,Insert 870,Insert 2552,Insert 1277,Insert 3478,Insert 3526,Find 1377,Delete 446,Insert 1172,Insert 3214,Insert 2372,Find 397,Insert 3385,Insert 2144,Find 1972,Find 1274,Insert 3391,Insert 32,Insert 2956,Insert 3176,Insert 3967,Insert 1874,Insert 2133,Insert 2762,Insert 1260,Delete 2818,Delete 1564,Find 3588,Delete 24,Find 260,Find 2933,Insert 1849,Delete 1574,Delete 2045,Insert 527,Insert 3536,Insert 2202,Find 3258,Insert 2903,Delete 1123,Find 2824,Find 3446,Insert 1333,Insert 578,Delete 2317,Delete 2049,Insert 3018,Find 2578,Find 1199,Insert 396,Find 2184,Delete 3614,Find 3088,Delete 1450,Delete 2272,Delete 1462,Delete 1789,Insert 1492,Insert 3279,Insert 2534,Insert 1103,Find 2842,Insert 829,Find 2990,Find 1193,Insert 1722,Find 557,Find 1912,Insert 3311,Delete 3195,Find 2454,Find 364,Insert 3266,Insert 1692,Delete 2328,Delete 489,Insert 572,Find 2072,Insert 3684,Insert 887,Insert 1511,Insert 3843,Insert 2549,Insert 197,Insert 2707,Insert 3794,Delete 2821,Insert 1903,Insert 2893,Find 290,Insert 2996,Insert 1383,Insert 970,Insert 2610,Insert 327,Find 199,Insert 403,Insert 2946,Insert 170,Insert 861,Find 1732,Find 3658,Insert 2988,Insert 29,Insert 398,Delete 3939,Insert 1356,Insert 2361,Insert 1082,Delete 2308,Find 3121,Insert 555,Insert 1354,Insert 2988,Insert 1339,Insert 124,Delete 2924,Find 2047,Find 154,Insert 2698,Find 2868,Insert 1028,Find 2811,Insert 627,Insert 3152,Find 840,Insert 2507,Insert 2453,Insert 352,Insert 3420,Delete 0,Find 3553,Insert 3200,Find 2181,Find 2475,Delete 3325,Insert 405,Insert 1459,Find 2507,Insert 845,Insert 2428,Insert 2215,Delete 376,Insert 1264,Find 2948,Insert 2627,Insert 1656,Insert 1017,Insert 798,Insert 3237,Insert 2597,Insert 3636,Find 1513,Insert 243,Insert 2775,Delete 3303,Insert 663,Insert 2606,Insert 3281,Insert 811,Insert 2843,Insert 1575,Find 1999,Insert 546,Insert 2402,Insert 783,Delete 2502,Delete 3189,Insert 3628,Delete 1345,Find 1264,Insert 1353,Delete 201,Insert 468,Delete 243,Insert 2705,Find 1538,Insert 2460,Delete 107,Find 672,Insert 548,Find 2275,Insert 441,Find 2581,Find 2573,Find 267,Insert 3951,Find 286,Insert 512,Insert 181,Insert 1789,Insert 2485,Find 3125,Insert 2157,Insert 2621,Insert 296,Insert 3514,Insert 2975,Insert 2384,Insert 2793,Insert 270,Delete 3491,Insert 3657,Insert 1709,Insert 3009,Insert 1571,Find 3017,Insert 2925,Find 2508,Insert 3286,Find 49,Insert 2426,Insert 2175,Insert 654,Find 789,Insert 3282,Find 3772,Insert 1899,Find 1448,Find 1601,Delete 1776,Insert 1250,Find 1951,Find 869,Find 3695,Insert 3516,Find 155,Find 3766,Find 3366,Find 2038,Find 1329,Insert 6,Find 36,Find 2396,Insert 247,Insert 3801,Find 2879,Insert 437,Delete 1728,Insert 3330,Insert 1671,Insert 1029,Insert 2743,Insert 3528,Insert 1983,Insert 1565,Insert 975,Delete 3239,Find 712,Insert 1698,Find 3341,Find 3229,Insert 1810,Insert 3956,Insert 3315,Insert 2897,Insert 2578,Insert 2793,Insert 269,Insert 2503,Insert 3658,Find 631,Delete 3474,Insert 946,Insert 3436,Insert 3143,Insert 1429,Insert 3241,Insert 187,Insert 1882,Insert 1746,Insert 2638,Insert 2516,Find 1772,Insert 2690,Delete 717,Find 1571,Insert 2756,Find 658,Delete 2429,Insert 3619,Insert 2152,Insert 3540,Find 2484,Insert 2887,Find 1929,Insert 852,Find 1903,Insert 1829,Insert 1917,Insert 1205,Find 1921,Delete 306,Insert 2906,Find 516,Insert 969,Find 3734,Delete 3992,Delete 3801,Insert 3592,Delete 3872,Delete 2349,Delete 1284,Insert 3205,Delete 3144,Delete 326,Find 152,Insert 3003,Insert 3800,Insert 1002,Delete 1250,Insert 97,Find 2136,Delete 1952,Find 1532,Insert 2145,Find 1126,Delete 1453,Delete 2440,Insert 1478,Insert 333,Insert 2721,Find 1015,Find 863,Delete 2292,Find 3868,Insert 1278,Insert 3928,Insert 333,Find 3871,Insert 3001,Insert 1620,Insert 3168,Find 882,Find 1125,Insert 1860,Delete 1400,Insert 3826,Insert 2465,Insert 1824,Insert 2258,Insert 3324,Insert 282,Find 2410,Insert 714,Find 683,Insert 2643,Delete 1423,Delete 695,Insert 815,Insert 1148,Delete 3575,Insert 1394,Insert 3413,Find 2892,Insert 3169,Insert 792,Insert 913,Find 2470,Insert 1024,Insert 807,Find 2854,Insert 3141,Insert 2819,Insert 3938,Insert 852,Delete 563,Find 3956,Insert 575,Find 1194,Delete 1025,Delete 673,Insert 117,Insert 1632,Find 3751,Insert 1584,Delete 671,Insert 3106,Insert 633,Insert 3731,Find 2587,Insert 2811,Insert 2906,Insert 2402,Insert 1595,Insert 2966,Find 3980,Insert 308,Insert 1413,Insert 3921,Insert 399,Insert 2152,Insert 1980,Insert 3840,Insert 3215,Insert 1739,Insert 1307,Insert 2879,Delete 993,Insert 3689,Delete 3845,Delete 1819,Insert 3796,Insert 2763,Insert 790,Insert 3581,Delete 2174,Find 874,Insert 1619,Insert 1457,Insert 1627,Find 3838,Insert 1828,Insert 3282,Insert 2591,Find 2954,Insert 2912,Find 2003,Find 3932,Find 3996,Delete 1994,Insert 1150,Insert 2755,Delete 2818,Insert 1883,Delete 2251,Insert 1627,Insert 2786,Insert 2335,Insert 1875,Delete 560,Delete 2370,Find 1669,Insert 2377,Insert 871,Find 1382,Insert 11,Insert 2469,Insert 1192,Insert 3353,Insert 2947,Insert 1919,Insert 2754,Find 2236,Insert 3816,Find 2186,Insert 2362,Insert 1007,Find 172,Insert 887,Delete 2579,Find 1602,Insert 3386,Insert 517,Insert 903,Insert 3057,Insert 1903,Insert 3853,Insert 2884,Insert 1834,Delete 1092,Find 2081,Insert 2989,Delete 2773,Insert 1081,Insert 2918,Delete 3621,Insert 1554,Insert 105,Insert 3491,Find 781,Insert 175,Insert 2136,Find 1166,Insert 2394,Find 1121,Insert 3387,Insert 385,Insert 2613,Insert 1249,Find 247,Insert 2609,Find 3128,Insert 589,Delete 2259,Find 2659,Find 2587,Insert 1437,Insert 61,Find 1551,Find 1988,Find 3527,Insert 3334,Find 493,Insert 2234,Insert 2188,Find 2315,Insert 1062,Delete 3607,Insert 811,Insert 708,Insert 816,Find 57,Insert 2495,Insert 2682,Insert 1224,Delete 1503,Delete 2198,Insert 2270,Delete 1710,Insert 2157,Insert 3458,Insert 470,Delete 1508,Find 525,Delete 3897,Insert 3330,Find 111,Insert 1658,Find 3919,Insert 1959,Find 2206,Insert 2474,Delete 2644,Insert 3618,Insert 3066,Insert 552,Find 733,Find 1646,Delete 1406,Delete 2161,Find 3974,Find 477,Insert 3390,Find 1701,Insert 1987,Delete 1264,Find 3507,Insert 3522,Find 3936,Find 1676,Insert 386,Insert 2117,Insert 1591,Insert 850,Delete 847,Insert 668,Insert 2718,Find 1878,Insert 328,Insert 1127,Insert 3293,Delete 1164,Find 2888,Insert 2409,Insert 3129,Insert 1349,Find 219,Delete 3241,Insert 3604,Insert 114,Insert 227,Insert 408,Insert 2807,Find 875,Insert 3762,Delete 830,Insert 1321,Insert 2553,Insert 64,Insert 289,Delete 3665,Delete 2245,Insert 1682,Insert 483,Delete 1049,Insert 518,Find 2779,Insert 38,Find 2774,Insert 3505,Insert 2017,Insert 2438,Insert 556,Delete 1329,Insert 3932,Find 3479,Insert 1070,Insert 2629,Insert 2136,Find 818,Delete 2161,Insert 2614,Delete 2359,Find 3688,Delete 3337,Insert 3556,Insert 626,Insert 3080,Find 175,Insert 3834,Insert 3310,Find 330,Insert 585,Find 3118,Delete 2063,Delete 3171,Insert 2555,Insert 873,Find 3885,Delete 2363,Insert 556,Find 3257,Find 3016,Find 2059,Insert 2244,Insert 1345,Insert 3340,Find 1156,Find 2804,Insert 994,Find 1073,Insert 320,Insert 3693,Insert 1595,Insert 20,Insert 1806,Find 2493,Insert 3794,Delete 1251,Insert 2509,Insert 896,Find 178,Insert 3848,Insert 3360,Insert 2417,Insert 3401,Insert 3975,Insert 1589,Find 3050,Insert 3895,Delete 3867,Delete 2487,Insert 1040,Insert 1096,Insert 3077,Find 3082,Insert 1731,Insert 779,Insert 1724,Find 3983,Find 1622,Insert 2994,Find 3255,Insert 3560,Insert 3277,Insert 772,Find 2278,Insert 1155,Find 68,Delete 2969,Insert 271,Delete 1925,Insert 395,Delete 375,Insert 3920,Find 928,Find 3755,Insert 2815,Find 119,Find 372,Insert 3725,Find 3771,Insert 1318,Insert 3127,Insert 462,Insert 2883,Insert 1731,Delete 3615,Insert 1714,Insert 2749,Insert 1719,Insert 1960,Insert 2632,Insert 2823,Insert 272,Insert 3789,Find 2070,Find 93,Insert 3046,Insert 941,Insert 2418,Find 1288,Delete 3427,Find 3074,Insert 1177,Find 671,Find 2968,Insert 220,Insert 1595,Insert 248,Delete 2245,Delete 3736,Insert 3816,Find 2900,Insert 3515,Insert 747,Find 3477,Insert 2063,Insert 888,Insert 2239,Insert 2769,Find 2829,Insert 1345,Delete 2829,Insert 364,Find 3136,Insert 1745,Insert 747,Find 3034,Find 3698,Find 867,Find 1800,Insert 1783,Insert 2317,Find 2214,Find 589,Insert 2237,Delete 3258,Insert 3815,Insert 1967,Insert 3299,Insert 724,Find 1921,Find 436,Insert 2878,Insert 1365,Delete 331,Find 3606,Insert 3953,Insert 3263,Insert 3566,Insert 1504,Insert 1271,Find 221,Find 175,Delete 3493,Insert 1511,Find 2786,Insert 3533,Insert 1305,Delete 563,Delete 1066,Find 1320,Insert 45,Insert 2324,Find 115,Find 1324,Insert 2217,Insert 3343,Find 2619,Find 2173,Delete 2928,Insert 2332,Find 1518,Delete 1976,Find 3317,Insert 3995,Insert 3541,Find 302,Insert 1147,Insert 2269,Insert 2535,Find 3884,Insert 1092,Insert 1937,Insert 2870,Insert 700,Insert 2745,Insert 1372,Insert 2335,Insert 1399,Find 1870,Delete 3589,Find 2107,Delete 2241,Insert 1919,Insert 2817,Find 668,Insert 857,Insert 3398,Insert 1315,Insert 2199,Find 1953,Insert 3537,Insert 1682,Insert 3075,Insert 707,Insert 3143,Insert 368,Insert 2590,Find 3136,Find 870,Insert 1580,Find 3958,Find 3681,Insert 1903,Find 1182,Insert 2651,Insert 823,Insert 391,Insert 34,Insert 342,Insert 2929,Insert 3102,Delete 3717,Delete 2230,Insert 2966,Find 3911,Find 1446,Insert 106,Delete 2259,Delete 2773,Insert 727,Insert 3761,Insert 2834,Delete 1601,Insert 532,Insert 3457,Delete 3543,Insert 3965,Insert 1994,Insert 3870,Insert 3473,Insert 265,Insert 3885,Delete 2814,Insert 2060,Insert 2917,Delete 2978,Insert 1570,Insert 1458,Insert 2944,Insert 2737,Insert 2897,Insert 2874,Insert 2389,Insert 3072,Delete 2659,Insert 149,Insert 1649,Insert 237,Insert 2528,Insert 1503,Insert 480,Insert 3687,Find 3765,Insert 1003,Insert 1871,Find 539,Delete 145,Insert 3614,Delete 2753,Insert 903,Insert 1250,Find 3766,Insert 3002,Insert 2380,Find 1158,Delete 3269,Insert 1447,Find 1513,Insert 2776,Find 1166,Insert 1497,Insert 1426,Delete 2177,Insert 1318,Insert 2457,Insert 3372,Insert 2129,Insert 3436,Insert 1799,Find 3612,Insert 1337,Insert 76,Delete 1747,Insert 1892,Find 2805,Find 3422,Insert 2872,Delete 2166,Insert 1841,Insert 497,Find 1521,Find 3112,Insert 733,Find 1163,Find 2259,Find 698,Delete 1859,Find 1753,Insert 2829,Find 2677,Insert 1831,Find 1358,Delete 3247,Insert 2031,Find 3790,Find 746,Insert 3561,Delete 1938,Find 2352,Delete 2173,Insert 1923,Delete 282,Delete 3109,Delete 5,Insert 2189,Delete 2938,Insert 1128,Insert 2078,Delete 2266,Delete 3406,Find 1417,Insert 674,Delete 1305,Insert 1884,Insert 1246,Find 1824,Insert 1090,Find 848,Find 3698,Insert 3687,Insert 608,Insert 448,Find 65,Insert 243,Insert 62,Insert 3616,Insert 1539,Insert 2016,Delete 3049,Insert 996,Insert 3207,Find 212,Insert 1180,Find 3033,Insert 3578,Insert 3638,Delete 2609,Find 542,Delete 2383,Find 677,Find 2493,Find 1029,Find 360,Insert 907,Find 2631,Delete 589,Insert 3076,Insert 1099,Insert 2218,Insert 3408,Insert 2858,Delete 3171,Delete 2341,Insert 2657] +[Insert 148,Find 1166,Find 1772,Insert 2042,Insert 3157,Find 1572,Insert 3462,Find 3157,Insert 538,Find 2634,Find 1111,Insert 143,Find 3537,Insert 3246,Insert 1107,Find 2524,Insert 2407,Find 161,Insert 1321,Insert 3525,Insert 3636,Insert 2173,Delete 2301,Insert 516,Insert 1557,Delete 3458,Insert 3497,Find 339,Find 314,Find 2185,Insert 864,Insert 358,Delete 86,Insert 863,Insert 360,Insert 582,Insert 1798,Insert 2677,Insert 1391,Find 2942,Insert 3928,Insert 685,Find 187,Find 266,Insert 756,Insert 319,Insert 2814,Delete 2271,Insert 2752,Insert 597,Insert 506,Insert 3823,Delete 2903,Insert 2625,Insert 3776,Delete 2870,Find 1343,Insert 3461,Insert 2852,Insert 1086,Find 3397,Insert 2822,Insert 1775,Delete 3787,Find 3903,Find 2336,Delete 254,Insert 410,Insert 3167,Insert 845,Find 243,Insert 1735,Find 2104,Insert 3072,Insert 1389,Find 3630,Insert 22,Find 2074,Insert 2557,Insert 2466,Insert 543,Delete 3575,Find 954,Insert 247,Insert 3209,Insert 1514,Insert 2561,Insert 3577,Insert 358,Insert 2772,Insert 1059,Insert 1860,Delete 1902,Insert 2403,Delete 894,Delete 421,Find 2165,Insert 3809,Insert 187,Find 1441,Find 3310,Insert 2020,Delete 1909,Insert 1591,Insert 395,Find 3672,Find 1587,Insert 1990,Delete 3744,Insert 3366,Find 3835,Delete 2399,Insert 3873,Find 546,Insert 3550,Insert 2577,Delete 980,Insert 2953,Find 1282,Insert 3720,Insert 991,Insert 2097,Delete 2355,Insert 784,Insert 2300,Find 760,Insert 1878,Find 2731,Find 26,Insert 2771,Find 3890,Delete 1185,Find 1052,Insert 3295,Insert 2545,Insert 1849,Find 3622,Insert 965,Insert 1309,Find 1312,Insert 1363,Insert 2239,Insert 1532,Find 1233,Find 3202,Insert 634,Insert 1928,Insert 928,Insert 749,Insert 2406,Insert 2581,Find 2791,Insert 2220,Insert 3102,Find 1951,Find 1045,Insert 3653,Insert 2415,Find 257,Find 2080,Insert 2286,Insert 1740,Find 415,Find 1679,Insert 3244,Insert 360,Insert 3669,Find 3572,Find 60,Find 2233,Insert 2752,Insert 2297,Insert 2427,Insert 2600,Find 1628,Find 1029,Insert 2113,Insert 3747,Insert 1180,Find 612,Insert 1914,Insert 764,Delete 3687,Find 1170,Insert 51,Insert 1129,Insert 1041,Insert 2798,Find 2581,Insert 212,Find 2890,Find 3542,Insert 3285,Insert 592,Insert 2615,Insert 2589,Find 1901,Insert 2811,Delete 103,Insert 1502,Insert 352,Insert 160,Find 1454,Insert 2624,Find 200,Delete 1113,Insert 1629,Insert 1220,Find 904,Find 2663,Insert 3781,Insert 146,Insert 1108,Find 2689,Find 116,Insert 2490,Insert 1113,Insert 2031,Delete 2835,Insert 877,Find 2748,Insert 2265,Insert 3448,Delete 3549,Delete 2202,Insert 1278,Insert 1741,Find 1778,Insert 432,Insert 2293,Delete 706,Insert 2049,Insert 1569,Insert 3364,Find 124,Insert 2124,Find 2430,Insert 777,Insert 2484,Insert 3883,Insert 1748,Delete 684,Insert 3819,Find 1692,Insert 3151,Insert 1394,Insert 1957,Delete 2927,Insert 524,Insert 685,Insert 2600,Find 2552,Insert 36,Delete 3247,Insert 2424,Insert 1825,Find 2782,Delete 3620,Delete 3784,Find 1646,Delete 2456,Insert 744,Insert 3113,Insert 2760,Insert 3903,Insert 3312,Insert 796,Find 2741,Insert 2688,Find 2400,Insert 2044,Delete 2741,Insert 2001,Insert 848,Insert 2293,Find 1023,Insert 1897,Insert 2080,Find 751,Find 1113,Delete 1301,Insert 3111,Insert 1225,Delete 2904,Find 2454,Insert 3161,Find 2286,Insert 1622,Delete 1693,Insert 3310,Delete 1892,Insert 1709,Find 3481,Find 251,Find 2963,Insert 1339,Insert 2315,Insert 1089,Find 2132,Insert 2766,Insert 1260,Insert 1337,Insert 2973,Insert 2057,Insert 1003,Find 3937,Insert 2999,Delete 2159,Insert 633,Find 2595,Find 2691,Insert 2848,Find 3955,Delete 1938,Find 3600,Delete 2423,Insert 499,Insert 1256,Delete 3675,Insert 172,Insert 1831,Insert 3726,Delete 1132,Insert 828,Insert 3460,Insert 3280,Insert 1075,Delete 3749,Delete 313,Find 1030,Insert 1042,Insert 1121,Find 1838,Insert 1219,Insert 720,Insert 277,Insert 212,Insert 3399,Insert 332,Insert 2540,Insert 3419,Insert 1072,Find 2388,Insert 464,Insert 2700,Insert 1270,Insert 2724,Delete 3634,Insert 1650,Insert 2520,Insert 549,Find 1649,Insert 1762,Insert 3398,Insert 3093,Insert 1483,Insert 1029,Delete 978,Insert 3348,Delete 1460,Find 1709,Delete 2214,Insert 3963,Insert 1518,Insert 222,Insert 965,Find 773,Delete 711,Delete 3008,Insert 2639,Find 560,Insert 1776,Delete 820,Insert 3245,Insert 673,Insert 241,Find 3427,Insert 3948,Insert 134,Find 1312,Insert 1522,Insert 1316,Insert 3322,Find 1678,Insert 1299,Insert 301,Delete 723,Insert 3726,Find 961,Find 651,Insert 314,Insert 3056,Insert 1029,Delete 97,Find 2464,Insert 3443,Insert 3302,Insert 500,Find 1259,Insert 3081,Find 1088,Insert 985,Insert 1460,Insert 3936,Insert 3754,Insert 246,Find 1455,Insert 243,Insert 1685,Insert 1071,Delete 3550,Insert 3176,Insert 289,Insert 3162,Insert 501,Insert 789,Insert 747,Find 2030,Insert 1025,Find 3932,Delete 1141,Insert 3069,Find 138,Find 968,Insert 3992,Insert 3671,Insert 1621,Insert 3090,Insert 557,Delete 2072,Insert 2784,Insert 337,Delete 3760,Insert 641,Find 2192,Find 511,Insert 2040,Find 782,Delete 3992,Find 2230,Find 3141,Insert 838,Delete 646,Insert 303,Find 2994,Insert 3225,Find 1365,Find 1519,Find 814,Find 1323,Find 2466,Insert 1079,Insert 437,Find 109,Delete 3862,Insert 3194,Insert 2892,Delete 576,Delete 2412,Insert 1435,Find 807,Find 2601,Insert 3683,Find 1833,Insert 999,Find 3710,Insert 2065,Insert 455,Delete 1261,Insert 1019,Insert 1554,Insert 1343,Find 3068,Insert 3514,Find 2282,Delete 2274,Delete 2540,Insert 3593,Delete 3668,Insert 1183,Insert 2616,Delete 2324,Delete 1835,Find 3322,Find 165,Find 3084,Insert 2425,Insert 1104,Insert 3138,Find 2206,Insert 376,Insert 2613,Insert 474,Insert 1504,Insert 3253,Insert 3654,Insert 3569,Delete 2574,Insert 1478,Insert 1296,Insert 3186,Find 2261,Insert 2473,Insert 1144,Insert 1871,Insert 3092,Insert 3089,Insert 173,Insert 1433,Insert 2051,Insert 3495,Insert 3753,Delete 801,Delete 1655,Insert 526,Insert 3979,Insert 1574,Insert 928,Insert 2589,Delete 1415,Find 122,Delete 1279,Insert 3248,Find 569,Insert 1400,Find 3091,Insert 2151,Insert 2781,Insert 3357,Insert 429,Insert 3135,Find 926,Delete 3988,Insert 3357,Insert 2747,Insert 2131,Insert 2634,Find 34,Insert 3381,Insert 2380,Insert 2256,Find 3126,Insert 1430,Insert 1780,Insert 2816,Insert 3182,Insert 3315,Find 1175,Insert 3057,Insert 2452,Find 1875,Insert 3316,Find 1926,Delete 3374,Insert 3547,Insert 1693,Insert 2939,Insert 3226,Insert 3725,Find 1162,Delete 1693,Insert 1828,Insert 1643,Delete 1287,Insert 1243,Insert 703,Insert 1748,Insert 1957,Insert 1293,Find 330,Insert 3981,Find 2603,Find 17,Insert 52,Delete 153,Find 2729,Delete 2459,Find 2376,Find 950,Find 1653,Insert 3175,Insert 2357,Insert 3553,Delete 1693,Insert 2526,Insert 644,Insert 2753,Insert 2580,Find 3072,Find 2470,Find 627,Insert 3550,Insert 311,Insert 3559,Insert 1596,Insert 657,Insert 2590,Insert 1059,Find 1799,Insert 1720,Find 940,Insert 2628,Insert 2645,Insert 707,Insert 687,Insert 1781,Insert 2922,Find 1947,Find 485,Delete 561,Insert 1234,Insert 1841,Insert 1965,Insert 1128,Find 875,Find 869,Insert 3723,Insert 3115,Delete 30,Find 313,Find 1547,Delete 1747,Find 2460,Insert 600,Insert 2008,Find 1474,Find 1473,Insert 18,Insert 1440,Insert 1266,Find 1066,Insert 1109,Insert 3183,Find 1639,Insert 2357,Insert 3553,Insert 3516,Insert 1882,Insert 1741,Insert 2913,Insert 57,Insert 2411,Delete 328,Insert 943,Insert 784,Find 3081,Insert 1121,Find 1572,Delete 393,Insert 1753,Insert 1018,Insert 3225,Insert 931,Find 1373,Find 532,Find 107,Find 1948,Find 1716,Insert 2866,Find 941,Find 2887,Insert 2487,Delete 149,Find 3568,Find 118,Delete 2983,Find 100,Insert 3393,Find 2166,Insert 3713,Insert 2132,Delete 549,Insert 3325,Delete 2987,Insert 2761,Insert 845,Find 860,Find 2894,Insert 3068,Find 52,Insert 2595,Insert 883,Insert 3615,Insert 3749,Find 3603,Find 387,Insert 2279,Insert 3038,Insert 2276,Insert 1840,Delete 1754,Insert 3626,Find 1351,Insert 598,Insert 3470,Find 1486,Insert 666,Insert 3797,Insert 3896,Delete 3283,Insert 740,Find 2111,Insert 1175,Insert 1427,Insert 555,Insert 1989,Find 1957,Insert 2057,Insert 51,Delete 3044,Insert 966,Insert 2138,Find 3737,Insert 3065,Find 2002,Insert 1896,Find 3767,Insert 310,Find 1738,Delete 827,Insert 1817,Insert 1809,Find 208,Insert 2394,Insert 2568,Find 2767,Insert 156,Find 879,Find 3577,Find 367,Find 2700,Find 1208,Insert 2266,Insert 530,Delete 229,Insert 52,Find 3507,Insert 984,Find 596,Delete 2869,Insert 1032,Find 1180,Delete 621,Insert 2192,Find 788,Delete 2319,Find 3719,Find 1716,Insert 2194,Find 1854,Insert 2376,Find 2074,Find 2745,Find 496,Find 3988,Insert 1189,Insert 1483,Delete 3634,Find 213,Delete 561,Insert 652,Insert 3501,Insert 3121,Find 3860,Insert 243,Insert 1183,Insert 3390,Insert 185,Insert 1125,Insert 3313,Insert 3586,Insert 442,Insert 477,Insert 1039,Find 3138,Insert 1781,Insert 3115,Insert 2700,Delete 1672,Find 1011,Insert 3835,Delete 77,Insert 2112,Find 659,Insert 2822,Delete 3413,Find 1980,Find 1264,Delete 2643,Insert 1977,Find 2587,Insert 3607,Insert 2660,Insert 3344,Find 2051,Insert 2052,Insert 3540,Insert 1975,Insert 2652,Find 499,Insert 1932,Insert 2980,Delete 2089,Insert 427,Delete 2095,Insert 2577,Find 3866,Insert 1350,Insert 1177,Delete 3514,Insert 355,Insert 3511,Insert 3531,Find 3744,Delete 2463,Insert 1062,Insert 2494,Find 3621,Find 1652,Insert 3945,Find 1922,Insert 3102,Insert 1352,Insert 1549,Find 1507,Delete 2454,Delete 2014,Insert 705,Insert 501,Find 1520,Find 912,Insert 1485,Insert 3536,Insert 2142,Insert 662,Insert 237,Delete 3797,Insert 3686,Find 2850,Find 1640,Find 3811,Insert 1105,Insert 1859,Insert 3533,Insert 1584,Find 1872,Find 1031,Insert 1679,Insert 2333,Insert 1639,Find 188,Insert 2372,Insert 12,Insert 2204,Insert 1562,Insert 1084,Insert 2468,Find 81,Delete 1938,Insert 3276,Insert 1191,Insert 2624,Find 823,Delete 811,Delete 538,Find 3474,Insert 3901,Delete 3617,Insert 1523,Insert 3458,Insert 531,Insert 2638,Insert 425,Find 3745,Insert 689,Find 2939,Insert 3930,Find 1794,Delete 3415,Insert 461,Insert 1686,Insert 2479,Insert 241,Insert 47,Insert 2572,Insert 887,Insert 53,Find 2261,Insert 2698,Insert 3064,Insert 3788,Insert 2941,Insert 2176,Find 2161,Find 788,Insert 2884,Insert 1094,Find 2801,Insert 2710,Find 1476,Find 2739,Find 1799,Insert 3419,Delete 2044,Insert 3944,Insert 1491,Find 1915,Find 1580,Insert 3337,Insert 2890,Insert 1436,Insert 1452,Delete 3666,Find 3454,Find 3607,Insert 1913,Find 1202,Insert 708,Insert 380,Insert 862,Insert 297,Insert 2076,Insert 1175,Insert 91,Insert 3849,Insert 1364,Find 1358,Insert 2324,Find 3352,Find 2999,Insert 3944,Find 3296,Delete 3611,Find 3482,Insert 1857,Insert 2411,Insert 1099,Delete 2676,Find 2771,Insert 3548,Insert 3601,Insert 564,Insert 866,Insert 1387,Insert 235,Delete 1432,Find 2588,Find 1630,Delete 2116,Delete 3910,Find 165,Insert 3930,Insert 1789,Insert 2141,Insert 3187,Insert 225,Find 3333,Insert 1854,Insert 1528,Insert 2945,Delete 2315,Insert 715,Insert 707,Find 3967,Insert 1216,Delete 2831,Delete 1172,Delete 112,Find 3391,Find 1548,Delete 2163,Find 3156,Insert 3795,Insert 3688,Delete 90,Insert 2881,Insert 2956,Insert 653,Find 242,Insert 3143,Find 3797,Insert 2343,Insert 2559,Insert 993,Find 2160,Insert 3238,Insert 1766,Insert 1712,Insert 1345,Insert 560,Find 1789,Insert 2068,Find 401,Insert 801,Insert 1261,Insert 3331,Find 312,Find 1428,Insert 519,Insert 3805,Insert 3824,Delete 434,Find 593,Find 3508,Find 226,Insert 2952,Insert 2495,Insert 1752,Find 954,Insert 1744,Find 3665,Insert 1137,Insert 3032,Insert 3844,Insert 2335,Find 917,Insert 52,Insert 2862,Delete 813,Find 1283,Insert 829,Insert 252,Delete 1162,Find 2279,Insert 3858,Insert 299,Insert 3728,Find 926,Insert 3931,Insert 2353,Find 2214,Find 1576,Insert 3201,Delete 77,Delete 2599,Insert 3870,Insert 548,Delete 146,Insert 184,Insert 1342,Insert 3604,Insert 3116,Insert 990,Delete 2905,Find 886,Insert 3583,Insert 3630,Find 1152,Insert 2395,Insert 2095,Find 3383,Find 1426,Delete 1026,Delete 2886,Delete 966,Find 3026,Find 2139,Insert 1427,Insert 2620,Insert 1666,Insert 2665,Insert 2146,Delete 912,Delete 1619,Insert 2054,Find 3734,Insert 2761,Find 978,Insert 2049,Find 1216,Delete 3906,Insert 2898,Delete 4,Find 3235,Insert 227,Delete 1223,Insert 304,Find 3733,Insert 3305,Insert 656,Insert 904,Insert 3876,Find 2717,Insert 1363,Insert 3378,Delete 1381,Find 1461,Insert 2195,Insert 1406,Find 1929,Find 3170,Insert 220,Delete 2418,Insert 3162,Insert 1529,Delete 730,Insert 3794,Insert 1957,Delete 3107,Delete 1983,Insert 3499,Insert 2418,Delete 2383,Find 1252,Insert 1629,Find 72,Find 3904,Find 191,Insert 2491,Insert 2624,Insert 217,Find 479,Insert 3160,Find 2864,Insert 4000,Insert 2693,Delete 1509,Find 765,Insert 3587,Insert 2963,Insert 1616,Insert 3871,Insert 649,Insert 2901,Insert 3717,Insert 1426,Find 3224,Insert 2090,Find 3242,Insert 3408,Find 1094,Find 2832,Insert 480,Insert 1859,Find 1413,Delete 2705,Insert 143,Find 3033,Insert 3360,Insert 2225,Insert 2257,Insert 88,Find 2320,Delete 1885,Insert 2480,Find 3421,Insert 2113,Insert 948,Delete 541,Find 2751,Insert 1356,Insert 1118,Insert 1810,Insert 53,Insert 1235,Delete 2859,Find 3955,Insert 3928,Insert 2053,Insert 941,Find 3324,Insert 411,Insert 3950,Insert 3646,Find 3396,Find 2898,Insert 1167,Insert 365,Find 864,Find 2711,Delete 1829,Insert 2658,Find 1004,Delete 1345,Insert 2775,Insert 3129,Insert 2879,Delete 2696,Insert 1299,Insert 108,Find 2187,Find 189,Insert 3821,Insert 1836,Insert 2117,Find 3795,Delete 1991,Insert 1552,Find 3189,Insert 2558,Find 2959,Find 1948,Insert 1555,Insert 2665,Insert 2376,Find 2308,Insert 2987,Delete 3270,Insert 3147,Insert 3586,Find 2733,Find 2183,Insert 471,Insert 2189,Insert 2596,Insert 576,Insert 2545,Insert 2027,Insert 582,Insert 241,Delete 3562,Find 276,Insert 1513,Insert 2099,Find 1516,Find 3130,Find 3050,Find 82,Find 1557,Insert 3559,Find 3679,Find 978,Delete 403,Insert 3572,Insert 1298,Find 2316,Delete 3047,Find 1501,Insert 2350,Insert 3459,Insert 3374,Find 3272,Find 2941,Insert 2280,Insert 3203,Insert 1292,Find 1268,Delete 1682,Insert 2315,Insert 2647,Find 805,Insert 1728,Insert 439,Delete 2772,Insert 1115,Insert 690,Insert 231,Insert 3806,Insert 2629,Insert 1178,Insert 1728,Find 2090,Find 3551,Insert 1172,Insert 3114,Find 1187,Insert 1326,Insert 3353,Insert 2776,Find 1665,Insert 2250,Find 1765,Insert 1440,Find 954,Find 3078,Insert 817,Insert 463,Delete 2545,Insert 2393,Insert 2888,Insert 943,Insert 202,Insert 339,Delete 1732,Delete 3548,Delete 1259,Insert 2727,Insert 1449,Find 1042,Delete 60,Delete 2978,Find 764,Find 1103,Find 3033,Insert 4,Find 2572,Insert 1469,Delete 1236,Find 2113,Find 1694,Delete 1910,Insert 3168,Insert 1473,Insert 3294,Insert 1264,Insert 764,Insert 3794,Insert 1210,Insert 2796,Insert 2361,Insert 452,Find 1789,Insert 3911,Find 3852,Insert 2387,Insert 1701,Find 251,Insert 1467,Insert 409,Insert 232,Insert 1081,Insert 3776,Insert 3821,Find 2145,Insert 1535,Insert 4000,Insert 1463,Find 430,Delete 3743,Insert 1021,Insert 1123,Insert 75,Delete 1782,Find 3746,Insert 2405,Insert 2080,Insert 1042,Find 3061,Insert 3917,Insert 2455,Find 1161,Insert 766,Find 1574,Insert 858,Insert 2054,Find 2211,Insert 1987,Insert 649,Insert 178,Insert 3931,Find 2573,Insert 1991,Delete 1604,Find 2995,Find 3305,Insert 101,Insert 3660,Insert 1695,Insert 2332,Insert 3665,Insert 1055,Insert 1221,Insert 300,Delete 1536,Find 2142,Delete 1913,Insert 365,Find 1055,Insert 2835,Insert 1062,Find 3353,Find 2286,Delete 3254,Find 1433,Insert 3481,Insert 3977,Delete 2180,Insert 649,Find 324,Insert 424,Find 2105,Find 3449,Insert 270,Insert 359,Delete 2860,Insert 2842,Find 82,Insert 547,Insert 3727,Insert 3141,Insert 3439,Find 2531,Insert 3053,Insert 227,Insert 1767,Insert 1067,Insert 1399,Delete 685,Find 257,Insert 2600,Find 2753,Find 2205,Insert 95,Insert 676,Insert 3354,Delete 1007,Find 597,Find 3853,Insert 687,Insert 206,Find 2323,Insert 2929,Find 2877,Delete 900,Insert 3210,Find 246,Insert 1575,Find 1177,Insert 638,Insert 2928,Insert 1664,Delete 262,Insert 3739,Insert 0,Insert 1275,Insert 1807,Insert 3228,Find 3438,Find 3766,Insert 3319,Insert 3348,Insert 2681,Find 2874,Insert 2733,Insert 1377,Delete 272,Delete 1922,Insert 3613,Insert 3012,Insert 3772,Insert 1350,Find 3709,Insert 1457,Delete 3806,Insert 53,Insert 580,Delete 3546,Insert 1918,Insert 554,Insert 236,Find 843,Delete 2473,Insert 2689,Insert 1535,Insert 3861,Find 3861,Insert 322,Insert 3094,Insert 1038,Find 756,Insert 1748,Insert 3976,Insert 3853,Insert 654,Delete 2971,Find 836,Find 1328,Insert 3304,Insert 1436,Find 2240,Insert 1608,Insert 713,Insert 1319,Insert 764,Delete 2901,Find 3251,Insert 1695,Insert 1624,Delete 3450,Insert 1755,Insert 810,Insert 2358,Delete 3904,Insert 2916,Insert 50,Find 3844,Delete 1337,Insert 502,Insert 950,Insert 3459,Insert 151,Find 1386,Delete 2326,Find 1250,Delete 1744,Find 2479,Insert 2253,Insert 1031,Delete 2073,Insert 1700,Insert 3718,Find 3688,Insert 106,Insert 3525,Delete 2710,Find 3861,Insert 3119,Delete 1443,Insert 1654,Find 3223,Insert 2308,Insert 1350,Insert 201,Insert 3084,Find 2697,Insert 2523,Delete 2585,Find 474,Delete 3494,Find 1139,Find 3414,Insert 3837,Insert 3039,Insert 2083,Insert 292,Find 2778,Insert 608,Delete 1278,Insert 3304,Delete 534,Find 646,Insert 752,Delete 28,Insert 3759,Find 2783,Find 2775,Insert 1399,Insert 1802,Insert 2590,Insert 977,Find 531,Insert 2457,Delete 474,Insert 1489,Find 2357,Find 2315,Delete 3934,Insert 1950,Insert 3316,Insert 2461,Find 3489,Insert 285,Insert 487,Delete 3616,Delete 1150,Insert 390,Find 573,Insert 3646,Insert 2780,Insert 608,Find 2369,Find 147,Find 2895,Insert 2315,Delete 3902,Insert 2828,Delete 2610,Insert 3342,Insert 2691,Find 2313,Find 2018,Insert 2930,Insert 978,Find 679,Insert 426,Find 1787,Insert 3605,Insert 3177,Find 899,Find 505,Insert 3485,Find 3320,Find 3513,Delete 3470,Insert 3430,Insert 416,Insert 2580,Delete 2948,Find 411,Delete 1813,Insert 1803,Find 1902,Find 2254,Find 3107,Insert 3692,Insert 179,Insert 814,Insert 2853,Find 3956,Insert 1444,Find 206,Insert 1478,Delete 187,Find 3785,Insert 2100,Insert 3726,Insert 1058,Insert 500,Delete 2057,Insert 8,Insert 863,Find 1400,Delete 498,Insert 3118,Delete 2356,Find 2983,Find 308,Find 2424,Insert 252,Insert 1848,Insert 1474,Find 1661,Find 2945,Insert 1551,Find 566,Delete 483,Find 3980,Insert 325,Delete 3268,Delete 1395,Find 285,Delete 547,Find 3995,Insert 1012,Insert 2382,Insert 2825,Find 3068,Insert 172,Insert 3644,Insert 1309,Find 1561,Insert 602,Find 1629,Find 2762,Insert 1687,Find 2969,Find 18,Delete 3683,Insert 1524,Insert 3634,Insert 895,Find 2255,Delete 3076,Insert 2033,Insert 2242,Find 2762,Insert 3321,Find 1652,Insert 138,Insert 1591,Delete 1025,Insert 3952,Find 1768,Insert 3783,Find 3141,Find 616,Find 168,Insert 3625,Find 1989,Insert 2960,Find 1033,Find 1974,Insert 3741,Find 340,Find 1572,Insert 3256,Insert 3686,Find 2565,Insert 3971,Insert 3755,Insert 2740,Find 1789,Insert 1722,Insert 1812,Find 3155,Insert 1597,Insert 3843,Find 2644,Insert 387,Insert 1607,Insert 1221,Insert 146,Insert 3190,Insert 64,Insert 2035,Delete 3257,Delete 1756,Insert 1489,Insert 899,Find 346,Find 1405,Insert 3265,Find 425,Delete 3202,Insert 3406,Find 2361,Find 353,Insert 9,Insert 2393,Insert 810,Find 1176,Insert 1389,Delete 3414,Insert 2553,Delete 3965,Find 3686,Insert 1657,Find 2844,Find 3273,Find 314,Find 3002,Insert 3751,Insert 2809,Insert 1494,Insert 1799,Find 1413,Find 1222,Insert 2081,Find 19,Find 350,Delete 2196,Insert 3587,Insert 146,Insert 1010,Insert 3054,Insert 1786,Insert 399,Insert 503,Insert 1082,Insert 3168,Insert 3476,Insert 2573,Insert 2370,Insert 2889,Insert 3334,Insert 2514,Insert 2437,Find 3577,Insert 3492,Find 384,Find 3420,Insert 651,Find 3671,Find 1512,Insert 3985,Insert 1613,Insert 1149,Find 2843,Delete 601,Find 1969,Find 130,Insert 2816,Insert 2527,Insert 2675,Find 3401,Insert 1359,Insert 3150,Insert 2922,Find 3571,Delete 1937,Find 2182,Insert 1648,Insert 3564,Insert 423,Delete 2525,Find 2655,Insert 810,Insert 3645,Insert 2601,Insert 2712,Find 1864,Insert 1224,Delete 951,Find 2018,Insert 1540,Insert 2958,Insert 2863,Insert 3529,Insert 1368,Find 823,Delete 2307,Delete 1501,Insert 3396,Delete 3317,Insert 2702,Insert 523,Insert 1577,Insert 1435,Insert 1434,Find 1305,Insert 2829,Insert 1572,Find 3237,Insert 688,Find 1011,Insert 2232,Delete 1834,Insert 3306,Delete 78,Insert 3591,Insert 2215,Find 1410,Find 944,Insert 292,Insert 3427,Insert 2786,Insert 277,Insert 1710,Find 1416,Insert 1818,Insert 2357,Insert 3008,Insert 2089,Delete 499,Insert 744,Delete 2193,Find 2459,Find 3549,Insert 444,Find 1922,Find 820,Insert 3258,Insert 392,Find 3721,Insert 1881,Delete 1275,Insert 3629,Delete 2576,Insert 1699,Insert 3756,Insert 148,Delete 1868,Insert 1501,Insert 3820,Find 3829,Find 1657,Find 3306,Insert 2740,Insert 826,Insert 2762,Insert 2073,Insert 1680,Insert 2177,Find 1967,Insert 2793,Insert 1313,Find 35,Insert 2747,Find 2248,Find 569,Find 2434,Delete 511,Insert 1291,Insert 3301,Insert 605,Insert 1694,Insert 3102,Insert 372,Find 3924,Insert 564,Insert 3368,Delete 3841,Insert 2420,Insert 1886,Insert 3825,Find 668,Find 594,Delete 504,Insert 2270,Insert 2060,Find 3224,Insert 2971,Find 95,Delete 1038,Delete 312,Delete 735,Insert 1445,Insert 3822,Insert 68,Insert 1598,Insert 2448,Insert 1092,Insert 156,Delete 2451,Insert 3287,Insert 1736,Insert 3974,Find 1632,Insert 1969,Insert 1696,Delete 2518,Insert 3368,Find 2631,Insert 3544,Insert 3608,Insert 857,Find 465,Find 1774,Insert 852,Find 3000,Insert 2352,Find 1339,Find 3857,Insert 2849,Find 775,Delete 3928,Insert 2419,Find 983,Insert 1346,Delete 1040,Insert 1773,Insert 3319,Insert 473,Insert 926,Find 3818,Find 3937,Find 3266,Insert 939,Insert 2535,Delete 2267,Insert 985,Insert 3993,Delete 1482,Insert 3417,Find 3110,Insert 3193,Insert 406,Insert 3734,Delete 1629,Find 3623,Insert 2602,Insert 1516,Insert 2284,Insert 763,Insert 1946,Delete 352,Find 2053,Insert 1421,Delete 2866,Find 3697,Find 663,Insert 1545,Insert 2299,Insert 2242,Insert 3187,Find 3628,Insert 3841,Insert 1432,Delete 3840,Delete 1571,Delete 3958,Insert 1160,Insert 3409,Insert 3872,Insert 634,Find 1424,Delete 2101,Insert 2750,Insert 3672,Insert 2447,Delete 108,Insert 683,Insert 424,Insert 3434,Find 3406,Find 279,Delete 2205,Insert 1550,Insert 610,Delete 3998,Insert 2393,Insert 1316,Insert 1924,Insert 532,Delete 2014,Insert 1892,Delete 743,Insert 2155,Insert 1528,Insert 1967,Insert 2361,Delete 2029,Find 3529,Delete 3726,Insert 606,Insert 1709,Insert 3603,Insert 971,Delete 1095,Insert 3806,Delete 2953,Delete 3288,Find 3545,Insert 676,Insert 2513,Insert 486,Insert 3653,Insert 3479,Insert 1537,Find 1118,Insert 3710,Insert 3994,Insert 2727,Find 3781,Insert 3449,Find 3441,Insert 3893,Insert 2691,Find 227,Insert 3919,Delete 2866,Delete 752,Insert 2721,Find 3681,Insert 2680,Find 1777,Insert 2713,Delete 3409,Insert 2962,Insert 3384,Insert 899,Find 3197,Delete 3776,Find 2376,Insert 3476,Find 888,Find 1539,Insert 3053,Find 3160,Insert 3673,Delete 739,Insert 2770,Delete 2936,Find 1131,Insert 1594,Insert 3278,Delete 3590,Find 2597,Find 3941,Insert 3277,Insert 3412,Delete 2995,Delete 1656,Insert 1274,Find 2447,Delete 1938,Insert 202,Insert 3657,Insert 1228,Insert 2934,Insert 1424,Insert 2100,Delete 2047,Insert 2714,Delete 903,Find 1061,Insert 658,Insert 3673,Find 2177,Insert 2057,Find 1181,Insert 2726,Insert 3289,Insert 522,Delete 770,Insert 2855,Find 3791,Insert 124,Insert 2626,Find 1906,Insert 2724,Insert 1250,Insert 1720,Insert 3409,Find 3300,Find 1020,Insert 701,Insert 1230,Insert 3315,Find 3803,Insert 299,Find 725,Insert 3015,Delete 210,Insert 3878,Find 1138,Find 802,Insert 3095,Insert 1942,Insert 2118,Find 3330,Insert 3994,Insert 3443,Insert 2670,Find 3216,Insert 1145,Find 3363,Insert 3276,Delete 2738,Insert 2279,Find 3719,Find 2637,Find 139,Insert 430,Insert 2083,Insert 307,Insert 1267,Insert 1355,Find 334,Find 1104,Find 1240,Insert 3914,Find 442,Insert 2338,Insert 384,Insert 2521,Insert 2070,Insert 1355,Delete 3532,Delete 3928,Find 2884,Find 68,Insert 2802,Insert 1797,Insert 1818,Find 3452,Delete 929,Insert 2253,Insert 2548,Insert 612,Insert 2848,Insert 2090,Find 3691,Insert 819,Insert 3929,Insert 2531,Insert 420,Delete 2750,Insert 1235,Insert 1092,Find 2481,Find 3460,Delete 2623,Find 667,Insert 3831,Insert 518,Delete 2720,Delete 1703,Insert 3035,Insert 3688,Insert 224,Insert 2066,Insert 1212,Insert 2024,Insert 3110,Find 954,Insert 1193,Find 712,Find 2986,Delete 1280,Insert 126,Insert 693,Find 2735,Insert 1869,Delete 391,Find 1769,Insert 2122,Insert 1740,Find 3932,Find 1909,Insert 1543,Find 668,Insert 1217,Find 2298,Insert 2907,Delete 1296,Insert 954,Delete 1501,Delete 1707,Insert 2903,Insert 3958,Delete 3095,Insert 1243,Insert 3450,Find 2766,Insert 2415,Insert 2654,Insert 1584,Insert 2935,Insert 160,Find 1704,Find 2752,Insert 862,Insert 465,Find 3363,Find 3472,Insert 2727,Insert 2306,Find 3035,Insert 2231,Insert 3365,Find 2983,Insert 354,Insert 109,Find 3571,Insert 3373,Insert 2094,Find 3678,Find 2520,Find 1685,Find 3372,Insert 1289,Delete 2825,Insert 2091,Insert 3912,Insert 2566,Delete 688,Insert 550,Find 2995,Find 2958,Insert 3854,Find 2329,Insert 1744,Insert 3974,Find 1507,Insert 3819,Insert 2226,Insert 3951,Delete 3368,Insert 3798,Insert 672,Insert 1467,Insert 3622,Insert 1633,Find 2893,Find 1789,Insert 3725,Insert 1986,Find 1509,Insert 2912,Insert 2830,Insert 1135,Insert 1368,Insert 846,Delete 3535,Insert 364,Insert 998,Insert 1014,Insert 1154,Delete 1527,Insert 204,Insert 3405,Find 3156,Find 1864,Insert 2712,Insert 2376,Insert 2620,Find 3986,Delete 3644,Delete 1758,Insert 3298,Find 1904,Insert 1101,Insert 1840,Find 3914,Delete 3581,Insert 2935,Insert 3164,Find 3975,Find 915,Delete 3999,Insert 3723,Delete 758,Insert 234,Insert 1324,Delete 1891,Find 2659,Find 2801,Insert 2131,Insert 826,Insert 2370,Insert 1120,Find 2444,Insert 3490,Insert 2219,Insert 1214,Insert 3723,Insert 2392,Find 2650,Delete 1979,Insert 3042,Insert 1237,Find 1570,Insert 793,Delete 2952,Insert 2325,Find 775,Find 2778,Delete 187,Find 71,Find 3923,Find 884,Insert 3112,Find 1295,Insert 1088,Insert 2659,Insert 1588,Insert 279,Insert 2808,Insert 2426,Insert 1757,Find 3042,Find 3903,Insert 153,Insert 3717,Delete 2248,Delete 653,Insert 792,Find 3945,Insert 2262,Find 2857,Insert 470,Insert 2736,Insert 442,Find 2590,Insert 3590,Insert 3256,Insert 1898,Find 3787,Insert 2866,Delete 3731,Find 325,Insert 3178,Find 2950,Find 2896,Insert 3733,Insert 2197,Insert 3836,Delete 2427,Insert 194,Delete 41,Insert 3607,Insert 64,Insert 1357,Find 605,Find 1522,Delete 153,Insert 3334,Insert 2020,Find 2800,Insert 1505,Delete 3918,Insert 3284,Find 2441,Find 1712,Insert 1223,Find 2523,Insert 69,Find 489,Insert 3265,Insert 95,Insert 1496,Insert 2274,Insert 1930,Delete 529,Find 2735,Find 820,Insert 1326,Insert 1014,Insert 583,Insert 631,Find 2352,Insert 462,Insert 3063,Insert 3857,Insert 539,Find 184,Find 2757,Insert 2205,Insert 3365,Find 2107,Find 2453,Insert 3063,Delete 662,Insert 3775,Find 3482,Find 808,Find 1051,Delete 3341,Find 267,Find 3990,Insert 79,Insert 2196,Find 997,Find 3615,Find 2615,Insert 3740,Delete 3655,Find 2632,Insert 977,Insert 549,Insert 3329,Find 3885,Find 651,Insert 3603,Find 1629,Find 1225,Insert 1885,Find 2583,Insert 2180,Find 2952,Insert 254,Delete 2654,Insert 1008,Insert 2305,Find 1581,Insert 3068,Insert 2451,Insert 816,Insert 1588,Insert 2088,Insert 1900,Insert 3178,Insert 2641,Insert 570,Delete 3616,Delete 3099,Insert 3459,Insert 2055,Find 63,Insert 871,Insert 3087,Insert 1063,Insert 117,Find 3483,Insert 572,Insert 2503,Find 186,Delete 274,Insert 227,Find 2332,Insert 1413,Insert 1480,Find 1188,Insert 1134,Delete 1568,Insert 597,Insert 989,Find 211,Insert 3046,Insert 22,Insert 1093,Insert 3554,Delete 836,Insert 3753,Delete 1521,Find 3337,Delete 1367,Insert 2925,Insert 2069,Find 2565,Insert 2607,Insert 1575,Insert 2024,Insert 3052,Insert 590,Insert 2904,Delete 3779,Find 2693,Insert 393,Find 85,Delete 807,Find 3265,Insert 2103,Find 2146,Insert 761,Insert 1696,Insert 2420,Find 3936,Find 2568,Find 3305,Find 2110,Insert 960,Insert 2843,Delete 3505,Insert 1482,Insert 3504,Insert 3658,Insert 3350,Delete 1963,Find 715,Find 1812,Insert 1546,Insert 957,Delete 2229,Find 3036,Insert 1679,Insert 3008,Find 1611,Insert 2962,Find 1567,Insert 1450,Insert 3194,Insert 620,Find 1268,Insert 2540,Insert 2984,Find 3017,Insert 3613,Insert 3490,Insert 1954,Insert 2639,Find 2737,Find 1886,Find 2883,Delete 456,Find 3897,Insert 226,Delete 1739,Insert 1690,Find 1838,Delete 1160,Delete 999,Delete 3423,Insert 2430,Delete 2850,Insert 2148,Find 3132,Find 1404,Insert 521,Find 1173,Insert 1703,Insert 0,Find 2513,Insert 2154,Find 1750,Insert 2907,Find 2357,Delete 2000,Find 68,Find 2568,Insert 403,Insert 3107,Insert 1063,Find 3517,Find 396,Insert 500,Insert 1330,Insert 3684,Find 459,Find 272,Insert 1790,Insert 1417,Find 3211,Delete 77,Delete 3664,Find 990,Insert 1108,Find 1552,Find 1323,Insert 2176,Insert 1449,Delete 2126,Insert 1151,Delete 434,Insert 1980,Delete 3399,Insert 3242,Insert 1022,Delete 3387,Find 1732,Insert 2978,Insert 2093,Delete 2956,Insert 3415,Insert 674,Find 3702,Find 3703,Insert 2501,Insert 221,Find 1156,Delete 222,Delete 1822,Find 614,Insert 307,Find 1157,Find 3510,Insert 3599,Insert 2140,Find 2898,Insert 137,Find 2434,Find 189,Insert 3388,Insert 2132,Insert 1714,Find 1886,Find 2219,Delete 1523,Insert 2975,Insert 2843,Delete 47,Find 786,Find 2358,Insert 1433,Find 1375,Insert 1671,Delete 3724,Insert 2956,Insert 2670,Insert 244,Find 3290,Insert 1717,Insert 603,Insert 2474,Find 2142,Find 2749,Delete 1316,Find 329,Insert 54,Insert 1901,Delete 1680,Delete 3672,Insert 3636,Insert 1966,Insert 2230,Find 2007,Insert 3543,Delete 1216,Insert 355,Find 3024,Insert 3901,Insert 2336,Delete 2802,Insert 1040,Find 3542,Insert 2230,Find 1696,Insert 1020,Insert 1677,Insert 161,Find 2692,Delete 1226,Insert 530,Find 1654,Insert 3922,Insert 3403,Insert 2287,Insert 1912,Find 2862,Find 2039,Delete 1021,Insert 617,Find 2016,Insert 2555,Find 3148,Find 573,Insert 1952,Insert 3414,Insert 1369,Insert 3913,Find 2797,Find 901,Insert 3559,Insert 2617,Insert 315,Insert 76,Insert 1223,Insert 1439,Insert 3194,Insert 2680,Insert 828,Insert 3823,Insert 1946,Find 1526,Delete 3435,Insert 3353,Insert 1711,Find 714,Delete 2426,Insert 313,Find 386,Find 3628,Find 3189,Insert 3398,Insert 411,Insert 643,Find 2309,Insert 1402,Find 3355,Find 189,Insert 34,Insert 836,Find 3983,Find 1015,Insert 631,Insert 3192,Delete 3899,Find 3065,Insert 792,Delete 3656,Find 1689,Insert 3398,Insert 3459,Find 1226,Find 704,Insert 2432,Insert 3858,Insert 1777,Insert 2688,Find 801,Insert 3608,Find 3789,Delete 3270,Find 3084,Delete 1147,Insert 3395,Insert 832,Insert 1924,Insert 365,Insert 3822,Delete 351,Insert 2650,Insert 2140,Insert 1273,Delete 3990,Insert 1217,Delete 208,Delete 2494,Find 901,Insert 615,Insert 435,Insert 2557,Insert 3755,Delete 1645,Insert 1788,Insert 3436,Insert 2793,Find 1957,Find 3705,Find 1289,Insert 2475,Insert 2380,Find 1774,Delete 2237,Find 3244,Find 3731,Delete 2886,Find 3350,Insert 350,Find 3385,Insert 203,Insert 2343,Insert 3880,Insert 3067,Insert 390,Insert 1982,Find 2045,Insert 3685,Find 2865,Find 2302,Delete 1868,Insert 348,Insert 2037,Insert 1323,Delete 1682,Find 217,Insert 2282,Find 2440,Insert 2855,Insert 3815,Find 2875,Delete 604,Find 3640,Insert 671,Insert 3778,Find 454,Insert 2972,Insert 2664,Insert 2761,Find 801,Delete 485,Insert 2210,Find 1172,Insert 1989,Insert 1884,Insert 1191,Insert 388,Insert 3364,Delete 3372,Insert 3225,Insert 3530,Insert 753,Insert 418,Insert 108,Find 2192,Insert 2686,Insert 2632,Insert 3082,Insert 1502,Insert 2651,Insert 2155,Insert 1624,Find 943,Insert 784,Delete 645,Insert 859,Delete 24,Delete 1682,Find 2358,Insert 678,Insert 3893,Find 2747,Delete 1083,Find 766,Insert 1357,Find 1157,Insert 1395,Insert 1863,Delete 1606,Delete 2223,Insert 3130,Insert 1935,Insert 2286,Find 1331,Insert 1501,Insert 3588,Find 1078,Insert 2303,Insert 2919,Insert 2203,Delete 2332,Find 3117,Delete 3874,Insert 1860,Find 2544,Insert 796,Insert 2545,Find 683,Find 3134,Insert 1487,Insert 2735,Insert 104,Delete 2428,Delete 450,Insert 416,Find 1619,Insert 103,Insert 3596,Insert 3396,Insert 2281,Insert 1364,Find 1742,Insert 821,Find 2393,Insert 1751,Insert 3277,Find 2680,Find 3218,Insert 3851,Delete 3153,Insert 1020,Find 1753,Insert 1011,Find 1815,Delete 2396,Insert 788,Delete 2214,Delete 1280,Insert 3525,Delete 766,Find 112,Delete 2983,Find 2217,Find 3541,Find 770,Find 2761,Insert 3969,Find 1070,Find 1216,Insert 3726,Find 1834,Delete 2590,Insert 3715,Find 358,Insert 248,Insert 456,Insert 2353,Insert 2171,Find 1141,Insert 3889,Find 1436,Find 2935,Insert 1789,Insert 72,Insert 2435,Insert 3658,Delete 622,Insert 913,Delete 2702,Insert 3716,Delete 3261,Insert 589,Delete 2826,Find 1890,Insert 1290,Insert 128,Find 372,Insert 1347,Find 54,Insert 2879,Insert 1943,Insert 396,Insert 2386,Insert 451,Insert 3180,Insert 3927,Find 1742,Insert 332,Insert 3305,Find 1302,Delete 1254,Insert 1843,Insert 1603,Insert 3703,Find 1599,Insert 1385,Find 376,Insert 2443,Delete 3587,Find 3249,Insert 539,Find 3361,Insert 3277,Insert 2922,Insert 3842,Delete 3529,Insert 3411,Find 2145,Delete 2466,Find 1839,Insert 2021,Insert 2735,Insert 3512,Insert 2,Find 2854,Find 3620,Find 1116,Find 2960,Find 1752,Insert 2673,Insert 2892,Find 1228,Insert 1633,Find 580,Find 2045,Find 3464,Find 3760,Insert 3193,Insert 2962,Find 3331,Insert 1139,Delete 481,Insert 3812,Delete 2269,Find 1886,Insert 1662,Insert 1944,Find 1884,Find 2263,Insert 2907,Insert 1899,Insert 64,Find 2360,Insert 1322,Insert 1695,Insert 1083,Find 628,Delete 2146,Insert 2823,Insert 2971,Insert 295,Delete 367,Insert 308,Delete 1652,Insert 1257,Find 3537,Find 3944,Insert 1912,Find 179,Insert 949,Insert 3723,Insert 2864,Find 3974,Find 1830,Find 1694,Insert 3694,Insert 2886,Insert 3147,Find 2846] +[Insert 2149,Insert 492,Insert 3713,Insert 3909,Find 899,Insert 2191,Find 3520,Find 1317,Insert 2705,Insert 213,Delete 3056,Insert 1862,Insert 1386,Find 3878,Find 3447,Insert 2340,Insert 3635,Insert 1434,Find 3705,Insert 908,Insert 2151,Insert 1191,Insert 2027,Insert 2191,Find 1374,Insert 924,Insert 3741,Insert 728,Insert 3293,Insert 241,Find 3431,Find 423,Insert 2788,Insert 1296,Find 604,Insert 3140,Insert 1758,Insert 1171,Find 1928,Delete 464,Delete 3456,Insert 2213,Delete 3363,Insert 1406,Find 3973,Find 2375,Find 3117,Find 932,Insert 2002,Find 2858,Insert 2862,Delete 3885,Insert 3010,Insert 3784,Insert 772,Insert 2387,Insert 2793,Insert 839,Insert 929,Insert 2513,Insert 1482,Find 3575,Insert 522,Insert 1741,Insert 1904,Insert 3757,Insert 2189,Insert 2262,Find 1982,Delete 3873,Insert 1959,Insert 3920,Insert 2519,Insert 3690,Delete 3537,Insert 915,Delete 3373,Insert 3716,Insert 2534,Find 922,Insert 3788,Insert 2592,Insert 2150,Delete 124,Insert 756,Insert 1877,Insert 66,Insert 1632,Find 1193,Find 3106,Find 2465,Delete 29,Find 852,Find 1388,Delete 1401,Find 3027,Find 728,Delete 84,Insert 274,Insert 1819,Insert 936,Insert 3764,Find 3807,Insert 2519,Find 2806,Insert 3244,Insert 773,Insert 2885,Insert 2725,Insert 2360,Insert 627,Find 1687,Delete 480,Insert 3895,Delete 3437,Find 3977,Insert 3846,Delete 6,Insert 3765,Insert 2576,Find 3894,Insert 271,Find 3409,Find 3003,Insert 3960,Insert 1724,Insert 1503,Delete 1586,Delete 2186,Find 728,Insert 2264,Insert 2868,Find 436,Insert 454,Insert 1439,Delete 2144,Insert 398,Delete 3326,Delete 538,Insert 2318,Find 1248,Insert 3604,Insert 1946,Insert 540,Find 2900,Delete 2466,Find 3606,Find 772,Insert 3505,Find 3805,Find 453,Find 1081,Insert 2504,Insert 1113,Insert 1704,Find 3765,Insert 1187,Insert 2732,Insert 3317,Insert 991,Delete 3592,Find 3547,Delete 3180,Delete 3076,Insert 1902,Find 3020,Find 796,Insert 1786,Insert 840,Insert 3615,Insert 1071,Delete 1726,Insert 2062,Insert 2306,Delete 3420,Find 3087,Find 3080,Insert 111,Delete 2737,Find 865,Find 403,Insert 214,Insert 2452,Insert 2984,Find 1078,Delete 1874,Insert 776,Insert 631,Find 854,Find 2642,Insert 143,Find 953,Insert 236,Insert 2588,Insert 2975,Insert 1461,Find 3153,Insert 2510,Find 1855,Find 3539,Delete 3504,Delete 2928,Insert 1383,Insert 1768,Insert 386,Delete 1356,Find 2759,Find 2304,Find 3163,Insert 605,Insert 2158,Find 3135,Insert 3787,Insert 3166,Find 1557,Delete 3554,Delete 3677,Insert 1669,Find 923,Insert 647,Insert 234,Find 2211,Insert 1745,Insert 2116,Find 2893,Delete 3000,Insert 1789,Delete 2292,Insert 1963,Delete 3488,Insert 3196,Insert 2628,Insert 1158,Insert 257,Insert 992,Insert 1518,Find 1804,Insert 2,Insert 2175,Insert 636,Insert 197,Delete 338,Insert 3099,Insert 2146,Insert 3365,Insert 2301,Insert 2275,Insert 2889,Find 3536,Insert 836,Insert 167,Insert 1227,Delete 716,Find 3037,Find 2833,Insert 91,Insert 1830,Insert 2297,Insert 2643,Insert 2700,Delete 438,Delete 2044,Delete 3086,Insert 3198,Insert 107,Find 3576,Insert 1133,Insert 1712,Find 438,Delete 3991,Insert 2548,Find 808,Find 256,Insert 2399,Insert 2403,Find 2980,Find 3790,Find 97,Insert 2278,Insert 3881,Insert 341,Delete 2226,Insert 2179,Insert 481,Insert 436,Insert 2040,Insert 2025,Find 1996,Insert 3319,Find 1405,Find 2492,Find 2731,Insert 770,Find 3448,Find 269,Find 2322,Find 488,Insert 3757,Delete 2434,Find 1621,Insert 2526,Find 715,Find 3568,Insert 1097,Find 3293,Insert 1578,Insert 424,Insert 1624,Insert 2500,Insert 1203,Find 3482,Delete 2591,Insert 3946,Find 1296,Insert 1562,Find 2035,Insert 3975,Insert 224,Delete 1918,Insert 3123,Insert 609,Insert 3783,Insert 2690,Find 921,Insert 3266,Insert 25,Insert 2271,Insert 2529,Insert 1836,Insert 3253,Find 348,Insert 2464,Insert 1434,Find 1160,Insert 2510,Find 1790,Find 62,Insert 3690,Insert 3890,Find 1948,Delete 2363,Insert 1244,Insert 3002,Insert 418,Find 3477,Find 2912,Insert 267,Insert 677,Find 1693,Find 718,Insert 104,Insert 1607,Insert 2474,Insert 1493,Find 1887,Insert 3780,Find 1530,Insert 334,Insert 1162,Insert 1612,Insert 2848,Insert 3600,Insert 207,Insert 1105,Insert 1019,Find 357,Insert 260,Find 912,Find 2406,Delete 391,Insert 2822,Find 3119,Insert 1363,Find 1063,Insert 1630,Find 3433,Delete 527,Delete 889,Find 3103,Insert 3788,Insert 2093,Insert 2611,Find 1110,Insert 450,Find 2832,Find 106,Insert 1424,Delete 3240,Insert 1739,Insert 1254,Insert 629,Insert 910,Find 2581,Insert 1763,Insert 1152,Find 1155,Insert 1693,Insert 72,Delete 781,Find 2323,Insert 2997,Find 1387,Delete 2541,Insert 1800,Find 3830,Find 3,Insert 3920,Insert 2825,Insert 1165,Delete 954,Insert 311,Find 3413,Delete 3493,Insert 848,Insert 2173,Insert 2917,Delete 2556,Insert 1250,Find 3493,Delete 308,Insert 293,Find 3750,Find 1971,Find 203,Insert 3797,Find 2253,Delete 382,Insert 1799,Delete 1276,Delete 1938,Insert 3040,Delete 1565,Find 1996,Insert 3664,Insert 612,Insert 553,Insert 2883,Delete 3625,Find 898,Insert 3958,Insert 163,Insert 3086,Insert 3732,Insert 2992,Insert 2384,Insert 315,Find 1445,Insert 910,Delete 1796,Find 184,Insert 437,Insert 2210,Delete 915,Insert 3489,Insert 644,Insert 170,Insert 1080,Find 2733,Find 2404,Insert 3601,Delete 2324,Insert 384,Insert 1105,Insert 1038,Insert 1934,Insert 655,Delete 1727,Insert 2671,Find 2586,Insert 2064,Insert 1719,Find 516,Insert 1076,Insert 2596,Insert 778,Insert 3473,Insert 2257,Insert 3981,Insert 2586,Insert 3104,Find 1846,Insert 2859,Insert 3195,Find 3536,Insert 1614,Insert 2020,Find 3402,Insert 3894,Insert 3423,Find 1865,Insert 2231,Delete 3881,Insert 1328,Delete 298,Find 440,Insert 3825,Delete 3911,Insert 3488,Insert 1380,Insert 661,Insert 1398,Insert 3517,Delete 862,Find 3549,Find 1713,Insert 37,Find 2860,Find 1488,Insert 1234,Delete 3655,Insert 2795,Insert 1112,Insert 3996,Insert 3699,Find 2210,Insert 316,Find 301,Find 1763,Insert 3775,Find 1405,Insert 475,Insert 294,Insert 874,Insert 924,Find 3944,Insert 2591,Insert 112,Find 1828,Insert 2660,Insert 1719,Insert 2407,Delete 959,Insert 366,Insert 962,Insert 3952,Insert 206,Insert 1052,Insert 2633,Delete 1354,Insert 1992,Delete 309,Insert 3590,Find 1338,Insert 466,Find 1870,Insert 2184,Insert 1564,Insert 132,Insert 3702,Find 3837,Insert 630,Insert 1265,Delete 2331,Find 2254,Insert 2515,Insert 3190,Insert 3109,Delete 1559,Insert 515,Insert 177,Delete 3377,Insert 556,Insert 2650,Find 2202,Insert 1087,Insert 1318,Insert 1245,Insert 2165,Find 2442,Find 747,Insert 1427,Find 557,Insert 2274,Insert 2757,Insert 785,Insert 1939,Insert 3311,Delete 955,Insert 2057,Find 2158,Find 3727,Find 3360,Insert 89,Insert 96,Insert 2274,Delete 732,Find 2245,Find 3385,Insert 1695,Insert 3775,Delete 3495,Insert 3173,Insert 1631,Insert 1116,Insert 3291,Find 2724,Find 3094,Insert 782,Insert 2005,Insert 2819,Insert 1114,Delete 1273,Find 142,Insert 2930,Delete 699,Insert 1491,Find 686,Insert 1176,Find 114,Insert 2208,Insert 1658,Insert 415,Insert 12,Insert 3850,Insert 2127,Find 3741,Insert 3559,Insert 2498,Insert 3391,Insert 995,Find 292,Insert 3001,Insert 3489,Insert 425,Delete 3375,Insert 2232,Find 590,Insert 2718,Insert 3658,Insert 2323,Insert 2518,Insert 1700,Insert 1583,Find 564,Find 1950,Insert 429,Insert 2134,Insert 3219,Insert 854,Delete 3120,Find 1256,Insert 871,Insert 35,Delete 95,Insert 1606,Delete 812,Find 1396,Find 1499,Insert 3922,Insert 396,Delete 1670,Find 956,Find 581,Insert 535,Insert 3259,Find 3774,Find 3590,Delete 3208,Insert 3657,Delete 2616,Delete 3321,Delete 2301,Insert 87,Find 2819,Delete 3377,Insert 2876,Find 2156,Insert 516,Find 3251,Insert 1345,Insert 1685,Insert 1463,Insert 3553,Find 1984,Insert 3571,Find 1882,Find 3487,Find 2368,Delete 3130,Insert 2641,Insert 1580,Insert 3738,Insert 1863,Find 52,Find 2434,Delete 3074,Find 415,Delete 3568,Insert 2949,Delete 3193,Insert 1081,Insert 3586,Insert 2619,Insert 685,Insert 2513,Find 805,Delete 3294,Find 2086,Find 3370,Find 3518,Insert 188,Delete 974,Insert 2015,Insert 490,Insert 2221,Insert 741,Find 3858,Insert 1170,Insert 1915,Insert 3736,Insert 1611,Delete 384,Find 3760,Find 2952,Find 45,Find 935,Delete 3225,Insert 2379,Find 2086,Delete 810,Delete 1021,Insert 94,Delete 1426,Delete 3350,Insert 331,Find 1287,Insert 543,Insert 3398,Insert 2234,Find 2930,Insert 3957,Insert 2859,Find 584,Insert 2497,Find 659,Find 3701,Delete 3607,Find 2159,Delete 2743,Find 47,Find 153,Insert 14,Insert 729,Insert 3770,Delete 559,Delete 1333,Insert 672,Insert 2359,Insert 1547,Insert 3922,Delete 77,Find 1177,Insert 1662,Delete 3023,Find 2531,Insert 655,Insert 3321,Find 7,Find 2321,Insert 775,Insert 3657,Delete 1718,Insert 1421,Insert 1670,Insert 1395,Insert 64,Insert 2957,Find 1827,Find 1024,Insert 1793,Insert 1097,Insert 1151,Insert 324,Delete 2681,Insert 1595,Find 3119,Find 1821,Find 1850,Insert 1178,Insert 2234,Insert 264,Insert 3804,Find 206,Insert 2561,Find 3553,Find 1156,Delete 3579,Insert 2581,Insert 477,Delete 2620,Insert 3693,Insert 3299,Find 1474,Delete 942,Find 639,Insert 1875,Insert 633,Find 313,Insert 2565,Insert 3506,Insert 2820,Delete 2748,Insert 1573,Find 685,Find 2049,Find 3680,Find 3148,Insert 2920,Insert 3128,Insert 3993,Insert 3774,Insert 2785,Insert 750,Find 748,Insert 2130,Delete 3252,Find 1763,Insert 1190,Find 974,Find 838,Delete 2394,Insert 89,Insert 3792,Insert 1871,Insert 2284,Find 3796,Insert 3672,Find 1650,Insert 3509,Insert 596,Insert 2090,Find 2910,Insert 3285,Insert 2122,Insert 1736,Insert 3715,Insert 3447,Insert 2104,Find 336,Insert 2464,Find 791,Delete 2742,Insert 2733,Insert 598,Insert 1240,Find 3749,Insert 2930,Find 2829,Insert 3924,Insert 804,Insert 2086,Insert 338,Delete 633,Find 2641,Insert 3090,Insert 3542,Insert 1357,Delete 1463,Delete 1933,Insert 604,Insert 455,Insert 665,Insert 3638,Insert 3229,Insert 1049,Delete 1319,Insert 989,Insert 724,Insert 3059,Delete 3100,Insert 1693,Find 2570,Insert 2040,Insert 1400,Find 2940,Find 3444,Insert 2284,Insert 2132,Insert 427,Insert 1815,Find 1428,Insert 1295,Insert 1442,Find 2059,Find 1604,Insert 332,Find 2323,Delete 3792,Insert 922,Insert 1318,Find 1290,Insert 255,Insert 641,Insert 536,Find 3814,Insert 1078,Insert 3994,Insert 3248,Insert 3028,Find 3510,Find 1186,Insert 3636,Find 3991,Delete 2396,Find 1443,Insert 3863,Insert 3491,Insert 1252,Insert 3079,Find 1089,Find 388,Find 582,Insert 2683,Insert 2769,Delete 3833,Find 2812,Insert 3729,Insert 3816,Delete 1910,Insert 1992,Insert 1459,Insert 2136,Insert 1256,Insert 766,Delete 1845,Find 1925,Insert 3548,Delete 1706,Find 2161,Insert 913,Insert 1749,Find 1247,Insert 2625,Delete 3889,Insert 252,Delete 402,Insert 1193,Insert 2504,Insert 1552,Find 3444,Insert 1497,Find 3581,Insert 584,Insert 2082,Insert 2672,Find 2472,Delete 3825,Insert 162,Insert 3709,Find 473,Insert 2954,Insert 3391,Delete 965,Insert 4,Insert 1232,Insert 74,Insert 2260,Find 2978,Find 3338,Find 1891,Insert 3069,Insert 1990,Insert 296,Insert 2054,Find 1735,Insert 2376,Find 370,Insert 3125,Delete 3465,Insert 2444,Insert 206,Delete 3197,Find 380,Find 3778,Delete 735,Insert 1144,Insert 2806,Find 3775,Find 1847,Insert 3683,Find 1764,Delete 717,Insert 1458,Insert 1067,Insert 59,Insert 2938,Find 2716,Delete 79,Insert 553,Insert 3641,Insert 2964,Find 1194,Insert 568,Find 3529,Insert 109,Insert 2334,Find 1179,Delete 2549,Delete 3008,Find 2738,Insert 3526,Find 216,Insert 2202,Find 2344,Find 3774,Insert 3056,Insert 2312,Insert 2765,Insert 71,Insert 2356,Insert 3602,Delete 1161,Insert 768,Insert 127,Insert 1204,Insert 2043,Find 2184,Insert 3828,Insert 453,Insert 1512,Insert 3892,Insert 1646,Insert 2680,Insert 1749,Insert 3670,Insert 2090,Find 1902,Insert 2368,Delete 3537,Insert 3764,Find 3565,Insert 3732,Insert 1199,Find 3503,Insert 3752,Find 3320,Delete 1227,Insert 1087,Find 2296,Find 1463,Insert 3492,Insert 2302,Insert 153,Find 125,Insert 1014,Insert 2968,Insert 502,Insert 420,Insert 3473,Find 1693,Find 1179,Find 106,Insert 1356,Find 3348,Insert 2190,Insert 3427,Insert 3305,Find 3422,Insert 2601,Insert 771,Insert 132,Find 1255,Delete 1547,Delete 2478,Insert 3998,Insert 2261,Insert 1145,Delete 812,Insert 945,Find 923,Insert 2755,Find 1244,Find 516,Find 1362,Insert 3467,Find 528,Delete 610,Insert 2030,Insert 558,Find 2260,Insert 3645,Insert 2252,Delete 2002,Find 3645,Insert 1673,Delete 3257,Delete 3390,Insert 2100,Insert 616,Insert 419,Find 3525,Delete 3799,Insert 3369,Insert 768,Find 1812,Insert 3654,Insert 1170,Find 350,Insert 1317,Delete 2171,Insert 2802,Insert 2554,Delete 3379,Find 2553,Delete 2069,Delete 896,Find 1057,Insert 3094,Insert 1354,Insert 2435,Insert 3322,Insert 618,Insert 813,Find 1782,Insert 238,Insert 3205,Find 2099,Delete 833,Insert 1940,Find 565,Find 3392,Find 447,Insert 2325,Find 3531,Delete 479,Insert 20,Find 2813,Insert 1718,Insert 1990,Find 3746,Insert 3031,Insert 3432,Insert 26,Find 1240,Insert 2963,Insert 2913,Find 607,Insert 2221,Insert 3770,Insert 634,Find 1280,Insert 3992,Insert 2570,Find 2291,Insert 3292,Insert 3525,Insert 3170,Insert 3016,Find 2196,Insert 2916,Insert 52,Insert 497,Insert 3496,Insert 1487,Insert 2689,Insert 783,Insert 356,Insert 880,Insert 1051,Insert 2547,Delete 876,Insert 244,Find 2362,Delete 1927,Insert 2373,Find 3152,Find 987,Insert 745,Insert 2265,Insert 410,Delete 2659,Find 935,Insert 2556,Insert 1505,Find 1989,Insert 726,Insert 2023,Insert 915,Insert 2953,Find 3949,Insert 3008,Insert 1683,Delete 3372,Insert 2328,Delete 1249,Insert 1213,Find 239,Insert 153,Insert 3293,Insert 60,Insert 2115,Insert 1833,Insert 818,Insert 1732,Insert 1338,Delete 143,Insert 42,Find 3314,Insert 2977,Insert 953,Find 1955,Insert 1121,Insert 7,Delete 3536,Insert 757,Find 3234,Insert 2595,Insert 3751,Insert 92,Insert 3939,Find 1611,Find 2676,Insert 2160,Insert 645,Delete 163,Insert 3050,Insert 3680,Insert 1330,Insert 570,Find 1327,Find 1566,Insert 2633,Insert 3929,Insert 3743,Find 591,Delete 3526,Find 1060,Insert 328,Insert 3902,Insert 1557,Find 2779,Find 1265,Insert 1902,Find 709,Insert 360,Insert 2055,Insert 3529,Insert 676,Insert 170,Insert 657,Delete 1547,Insert 1669,Delete 1829,Insert 864,Insert 3976,Find 619,Find 2611,Insert 2462,Insert 229,Insert 1016,Insert 883,Insert 3612,Insert 471,Insert 1400,Delete 1312,Delete 1657,Insert 3926,Delete 1096,Find 338,Delete 376,Insert 3044,Delete 3664,Delete 3032,Insert 3851,Insert 356,Insert 3046,Find 2806,Insert 1477,Insert 1127,Find 3177,Insert 905,Insert 1680,Find 2276,Insert 860,Find 1925,Insert 1814,Find 2890,Insert 1659,Insert 81,Insert 1166,Find 3053,Delete 3422,Find 2482,Insert 475,Delete 1430,Insert 3704,Insert 2325,Delete 3854,Insert 760,Delete 539,Insert 1551,Find 59,Find 3153,Insert 349,Find 2589,Insert 888,Insert 747,Insert 433,Find 2383,Insert 685,Delete 3331,Insert 1194,Find 3086,Find 31,Insert 3,Find 2089,Find 3662,Find 158,Delete 279,Insert 2050,Insert 1604,Insert 3607,Find 3866,Find 3257,Insert 2464,Find 10,Delete 3626,Insert 2593,Insert 2275,Insert 940,Insert 1018,Insert 2039,Delete 153,Insert 3452,Insert 1513,Insert 1473,Delete 2995,Insert 819,Insert 1032,Insert 3516,Insert 1226,Delete 1656,Delete 380,Insert 350,Insert 1746,Insert 763,Find 1527,Find 3919,Insert 3704,Insert 3995,Delete 1850,Delete 1218,Find 3492,Find 2932,Insert 2459,Find 189,Find 2453,Insert 3117,Insert 3062,Insert 2090,Find 3887,Find 3438,Insert 1953,Delete 3288,Insert 2018,Find 1176,Insert 514,Find 2262,Delete 850,Find 3163,Insert 2163,Insert 1110,Delete 1999,Insert 918,Insert 3528,Delete 196,Insert 262,Insert 3440,Delete 1595,Insert 1597,Find 3300,Find 692,Insert 2966,Insert 3065,Insert 2454,Find 82,Insert 1520,Delete 1485,Insert 2200,Insert 2627,Insert 2842,Insert 561,Insert 658,Insert 3916,Insert 2105,Find 2448,Delete 1626,Find 2491,Find 2843,Insert 551,Insert 1044,Insert 2778,Insert 2720,Insert 3769,Find 1978,Delete 2884,Find 1958,Find 3341,Insert 3827,Delete 2243,Insert 1615,Find 446,Find 997,Insert 95,Insert 2925,Find 1975,Find 12,Insert 424,Find 2685,Insert 2274,Find 2661,Find 2106,Delete 2190,Insert 1158,Insert 3487,Find 290,Insert 3580,Insert 3446,Find 2238,Insert 1926,Insert 3893,Delete 1203,Find 2318,Find 3028,Find 2885,Insert 978,Delete 2857,Insert 1206,Delete 3937,Insert 3819,Insert 2143,Insert 2798,Find 3596,Insert 1095,Find 1964,Insert 2304,Delete 661,Insert 2808,Insert 3619,Find 1051,Find 2867,Insert 3018,Insert 3884,Find 2185,Delete 486,Insert 2311,Find 1223,Find 1059,Insert 160,Find 1564,Insert 273,Find 2364,Delete 3763,Find 3082,Insert 3037,Insert 1701,Find 623,Insert 521,Insert 1807,Insert 3389,Find 339,Find 3571,Insert 1808,Delete 448,Insert 843,Insert 1010,Delete 3736,Find 3042,Find 3957,Find 2555,Insert 1197,Delete 3519,Insert 546,Insert 2573,Find 2797,Find 1186,Find 1615,Insert 1461,Find 3884,Insert 63,Insert 2451,Insert 1304,Find 3702,Delete 3449,Find 2592,Find 2400,Insert 3791,Find 1436,Delete 1629,Find 1127,Insert 3972,Find 2685,Find 1870,Find 3772,Delete 717,Find 2669,Find 2684,Insert 3679,Insert 2162,Insert 3671,Insert 3695,Insert 2017,Delete 3162,Insert 1320,Insert 3350,Insert 2687,Insert 3894,Find 1721,Find 267,Insert 2756,Insert 3717,Insert 3473,Insert 2557,Find 479,Insert 1904,Insert 1149,Delete 3572,Insert 3571,Delete 1777,Delete 1801,Delete 947,Find 3484,Delete 2253,Find 2148,Insert 2989,Find 3919,Find 3836,Find 1395,Delete 509,Insert 1232,Find 3929,Insert 1584,Find 579,Insert 1166,Insert 3282,Insert 2777,Find 1598,Insert 2883,Insert 2338,Find 1202,Find 1583,Find 2586,Find 3047,Delete 3264,Delete 3968,Insert 1245,Find 1389,Insert 151,Insert 2939,Insert 2878,Delete 561,Delete 1534,Insert 1461,Delete 1569,Find 2805,Find 1179,Find 1170,Insert 698,Insert 2672,Insert 89,Insert 242,Insert 3831,Find 906,Delete 866,Insert 1243,Find 1245,Insert 1656,Insert 879,Insert 2994,Insert 316,Find 69,Insert 3260,Find 989,Insert 2720,Insert 3261,Delete 1510,Insert 220,Find 2911,Insert 483,Insert 1835,Insert 3314,Insert 1079,Insert 474,Insert 1069,Delete 2877,Find 568,Insert 1590,Insert 1818,Insert 2570,Find 3687,Insert 1328,Find 1701,Insert 1484,Find 587,Delete 357,Insert 3392,Delete 2848,Delete 1757,Insert 440,Find 241,Insert 2779,Find 104,Insert 3962,Insert 1659,Insert 294,Delete 1033,Insert 1176,Insert 2911,Insert 3673,Insert 127,Insert 53,Find 731,Find 956,Insert 2460,Insert 1598,Find 1738,Insert 3549,Insert 983,Find 1278,Delete 2930,Insert 1487,Insert 3417,Delete 816,Delete 2159,Find 162,Insert 350,Insert 3507,Delete 2508,Insert 3491,Insert 833,Find 1037,Find 792,Delete 3431,Insert 3978,Insert 134,Find 438,Insert 1174,Insert 987,Delete 3280,Find 2766,Find 628,Find 393,Insert 905,Delete 752,Insert 1318,Find 2877,Find 2493,Insert 1347,Insert 455,Find 226,Insert 3084,Find 2732,Insert 3942,Delete 717,Insert 2442,Insert 1423,Find 439,Find 740,Insert 121,Insert 1512,Find 882,Insert 939,Find 1957,Find 640,Delete 215,Insert 2179,Find 3582,Insert 1299,Insert 2576,Insert 1663,Find 912,Find 3574,Insert 942,Insert 3855,Insert 929,Insert 3628,Insert 1083,Find 1,Delete 2395,Delete 2973,Insert 3668,Insert 1228,Insert 912,Find 941,Delete 897,Delete 3639,Delete 6,Find 1403,Delete 2995,Find 3595,Insert 3073,Insert 687,Delete 437,Delete 3159,Insert 1040,Insert 1038,Delete 2189,Insert 3150,Find 2609,Find 2056,Insert 3883,Delete 2708,Insert 3512,Insert 3424,Insert 1357,Insert 3851,Delete 299,Insert 3964,Insert 3471,Find 1476,Insert 1220,Insert 3294,Insert 2453,Insert 1733,Find 2775,Find 2896,Insert 3603,Find 95,Insert 2695,Insert 252,Insert 1343,Insert 1434,Delete 349,Insert 3773,Insert 152,Find 456,Find 1945,Insert 3736,Insert 3875,Delete 1248,Find 3368,Insert 3658,Delete 2246,Delete 2992,Find 1285,Insert 2632,Delete 3835,Delete 513,Delete 1141,Insert 2297,Insert 3880,Insert 824,Find 166,Insert 2779,Find 2931,Insert 385,Delete 1037,Find 1879,Insert 1857,Find 2498,Find 2038,Insert 1331,Insert 1900,Insert 3119,Insert 377,Delete 3567,Insert 571,Insert 485,Insert 1108,Insert 3640,Insert 3316,Delete 2881,Insert 3965,Find 834,Insert 772,Delete 2734,Insert 3062,Insert 169,Find 1568,Find 1667,Insert 3048,Find 3214,Find 2976,Find 2702,Insert 1041,Insert 3010,Delete 1555,Insert 322,Find 1770,Find 1887,Delete 2646,Insert 2796,Find 698,Insert 3756,Delete 838,Find 2202,Delete 3539,Find 3682,Insert 2149,Delete 349,Find 2383,Find 1687,Insert 151,Insert 671,Delete 3547,Insert 1277,Delete 288,Insert 3131,Find 1948,Insert 1413,Delete 1528,Insert 3641,Insert 703,Insert 1460,Find 3243,Insert 2513,Insert 910,Insert 606,Find 3404,Insert 1508,Insert 1742,Insert 2263,Insert 1586,Find 3950,Find 690,Delete 893,Find 1173,Find 16,Find 2543,Insert 495,Insert 3962,Delete 3342,Insert 827,Insert 2462,Insert 2904,Insert 1771,Insert 864,Insert 445,Insert 1950,Delete 2842,Insert 3045,Insert 717,Insert 1456,Insert 758,Insert 1436,Find 1417,Insert 660,Insert 2708,Insert 600,Delete 2485,Find 2457,Find 2014,Insert 461,Find 3308,Insert 379,Insert 2367,Insert 1923,Insert 1199,Insert 2740,Find 35,Insert 2488,Insert 1890,Insert 1385,Insert 369,Find 749,Find 3237,Insert 2743,Insert 2002,Insert 3764,Insert 2525,Insert 2978,Find 3471,Insert 206,Delete 1011,Find 1942,Insert 1828,Insert 3455,Insert 2996,Insert 2714,Delete 3511,Insert 841,Insert 953,Insert 1414,Insert 479,Insert 1613,Find 1275,Delete 1777,Find 1893,Find 3198,Find 771,Delete 3788,Find 3152,Find 3709,Insert 2507,Insert 3941,Delete 1093,Find 3900,Delete 2659,Insert 2933,Insert 3373,Insert 3692,Insert 2556,Find 530,Delete 917,Insert 93,Find 2246,Insert 2321,Find 1547,Find 3085,Find 233,Insert 2526,Insert 47,Delete 2255,Insert 60,Insert 3649,Insert 536,Insert 3286,Insert 182,Find 209,Insert 1705,Insert 1512,Insert 3802,Find 3928,Find 3952,Insert 3693,Find 32,Delete 767,Insert 1285,Find 2859,Find 2626,Insert 3835,Find 2616,Insert 3232,Find 3339,Find 3380,Find 2791,Delete 2297,Find 2015,Insert 3067,Find 1803,Find 2401,Find 3478,Insert 758,Find 3276,Find 153,Insert 3760,Insert 2328,Find 473,Insert 3640,Insert 3969,Insert 2035,Delete 843,Find 1923,Insert 2261,Insert 1015,Insert 3248,Delete 1087,Find 534,Insert 1707,Find 1531,Insert 3127,Delete 3106,Delete 1423,Delete 2893,Insert 1039,Find 1661,Find 2153,Find 2598,Find 85,Insert 2677,Find 3088,Delete 472,Insert 828,Delete 1354,Find 1248,Delete 3259,Insert 1245,Delete 3123,Find 2774,Find 293,Insert 2588,Insert 2942,Insert 3616,Insert 1640,Insert 3997,Insert 294,Find 2315,Insert 743,Insert 808,Insert 241,Insert 892,Insert 1350,Insert 3962,Find 3983,Find 3153,Delete 3451,Insert 1615,Insert 2764,Insert 2190,Delete 2892,Find 3444,Insert 266,Insert 1011,Insert 3269,Delete 1185,Insert 892,Delete 2676,Insert 3177,Insert 1913,Insert 1638,Delete 2613,Insert 305,Insert 2385,Delete 734,Find 2274,Find 607,Find 997,Find 887,Find 3740,Delete 3176,Delete 388,Delete 3440,Insert 1599,Find 2778,Find 196,Insert 878,Find 1195,Insert 1056,Insert 905,Insert 3334,Find 3987,Delete 816,Find 1116,Insert 1206,Find 3275,Delete 2503,Find 1153,Insert 1865,Insert 2631,Insert 203,Insert 1205,Insert 775,Find 27,Delete 1917,Find 3540,Insert 3778,Delete 84,Delete 205,Find 242,Find 3614,Insert 805,Delete 2243,Delete 1010,Delete 2955,Insert 2284,Insert 3353,Delete 2319,Insert 1280,Insert 2498,Find 1248,Insert 1736,Delete 194,Find 1411,Insert 216,Find 2628,Insert 3058,Insert 3603,Find 3457,Insert 2320,Find 482,Find 3917,Insert 439,Delete 1796,Insert 90,Find 748,Insert 2576,Insert 3510,Insert 3364,Delete 1537,Insert 3141,Insert 3398,Find 405,Find 2776,Insert 1655,Insert 3373,Find 3853,Insert 1734,Insert 2129,Delete 2799,Insert 2502,Delete 3007,Find 923,Find 884,Insert 3212,Find 2864,Find 869,Find 1823,Insert 2386,Find 3926,Insert 565,Insert 881,Find 2966,Insert 2121,Insert 1962,Find 471,Delete 549,Find 845,Insert 2555,Find 3138,Find 920,Find 1495,Find 662,Insert 741,Insert 2828,Insert 1601,Insert 1723,Insert 3805,Insert 1812,Insert 2796,Insert 548,Insert 1629,Insert 267,Insert 624,Find 211,Delete 102,Find 3690,Find 1696,Insert 677,Find 2826,Insert 83,Insert 3835,Find 3371,Insert 937,Insert 1351,Find 218,Insert 950,Delete 3713,Find 1488,Insert 3835,Delete 1251,Insert 578,Insert 474,Insert 2469,Insert 72,Insert 3424,Find 1964,Find 3510,Find 1151,Insert 0,Find 3266,Find 527,Insert 2520,Find 3343,Delete 2980,Insert 1075,Delete 2871,Insert 2832,Insert 350,Insert 1406,Insert 2520,Delete 2963,Insert 3360,Insert 1284,Insert 1175,Find 3806,Find 2123,Find 2168,Insert 577,Find 3797,Insert 536,Delete 425,Find 3299,Find 2197,Insert 2955,Find 1643,Insert 3970,Find 2016,Insert 1040,Find 3449,Find 3347,Delete 454,Insert 1252,Insert 232,Insert 3777,Insert 1505,Insert 2396,Find 3265,Delete 2771,Insert 1736,Insert 3049,Insert 1860,Delete 236,Find 277,Insert 213,Find 2320,Insert 3820,Delete 1644,Delete 160,Insert 1915,Insert 3138,Insert 834,Insert 2369,Find 1172,Insert 3245,Insert 1833,Insert 823,Insert 1594,Insert 73,Insert 2199,Delete 965,Find 1991,Find 111,Find 3683,Insert 2572,Delete 995,Find 3603,Delete 3467,Insert 551,Insert 1044,Find 150,Delete 3235,Find 3438,Find 1836,Find 771,Insert 3077,Find 3414,Find 705,Insert 3474,Find 3197,Insert 132,Insert 3298,Delete 3767,Find 3632,Insert 1297,Insert 6,Find 2676,Find 2581,Insert 2452,Find 2783,Insert 343,Insert 2174,Insert 565,Delete 232,Find 1546,Delete 3849,Insert 2837,Find 3414,Insert 498,Insert 1775,Insert 1093,Find 2875,Find 1326,Insert 3639,Find 2187,Insert 3670,Delete 2084,Insert 1590,Insert 2155,Find 231,Insert 1308,Insert 3929,Find 2235,Insert 3383,Insert 2248,Find 1245,Find 3305,Insert 2252,Find 2913,Find 258,Insert 236,Delete 2256,Insert 407,Insert 975,Delete 2318,Insert 909,Find 1378,Find 3961,Insert 2271,Insert 618,Find 593,Insert 114,Find 1919,Find 3010,Insert 2341,Insert 2531,Insert 3863,Insert 3079,Find 2277,Insert 1145,Find 2078,Find 2943,Find 158,Insert 3181,Find 3291,Find 3553,Find 1993,Insert 635,Find 2590,Delete 483,Find 835,Insert 3524,Insert 2419,Insert 3352,Find 3014,Delete 2202,Insert 2014,Find 363,Find 1039,Insert 1780,Delete 3760,Insert 1935,Delete 2397,Insert 3181,Insert 2374,Delete 3012,Insert 346,Insert 2521,Delete 3216,Insert 2116,Delete 102,Insert 2397,Find 2093,Delete 3758,Delete 584,Insert 3074,Insert 1015,Insert 1842,Insert 2964,Insert 1304,Insert 458,Find 2670,Insert 3656,Insert 1919,Insert 2612,Insert 356,Find 1142,Insert 2482,Delete 3359,Delete 2724,Insert 3340,Find 915,Insert 1756,Find 1497,Insert 2862,Insert 448,Insert 2539,Insert 2930,Find 1884,Delete 3413,Insert 2918,Find 2309,Find 379,Insert 702,Find 3752,Insert 2986,Delete 3395,Insert 2410,Insert 1508,Insert 3335,Insert 3608,Insert 2824,Insert 313,Insert 1888,Delete 1747,Find 3120,Find 2121,Insert 3717,Insert 2145,Insert 1432,Insert 3253,Insert 423,Delete 1838,Insert 2042,Insert 1356,Insert 1298,Find 3098,Insert 1967,Delete 1541,Find 2498,Insert 49,Insert 3375,Insert 1470,Insert 933,Insert 523,Find 2598,Insert 773,Find 20,Insert 2464,Insert 3320,Insert 1405,Insert 3416,Insert 3537,Insert 352,Insert 3442,Delete 3503,Delete 175,Insert 428,Delete 3250,Find 102,Find 3001,Delete 92,Insert 973,Insert 333,Delete 2921,Find 1447,Find 1752,Find 3605,Find 3530,Insert 2211,Find 3744,Insert 1091,Insert 52,Insert 715,Find 1088,Insert 2119,Delete 816,Find 1817,Insert 2153,Find 3710,Insert 1860,Insert 743,Insert 3755,Insert 1013,Find 11,Insert 1033,Insert 1013,Find 3336,Insert 3306,Insert 1166,Insert 3671,Insert 2944,Find 3139,Insert 2713,Find 1059,Insert 1087,Insert 2321,Insert 1339,Find 2164,Insert 113,Insert 1571,Find 2919,Insert 3543,Find 690,Insert 717,Insert 3286,Insert 413,Insert 700,Insert 932,Insert 1335,Find 1112,Delete 1371,Find 18,Insert 2452,Find 604,Find 887,Delete 2467,Find 1482,Find 1258,Find 102,Insert 749,Insert 3112,Insert 1201,Insert 49,Insert 2379,Find 1338,Insert 2937,Insert 2658,Find 621,Find 2374,Find 3436,Insert 2665,Insert 3082,Find 918,Find 88,Delete 849,Insert 368,Insert 3632,Insert 132,Delete 1405,Insert 2034,Insert 1811,Insert 879,Insert 1518,Find 2670,Insert 2065,Insert 2483,Find 3815,Find 3199,Find 3794,Insert 1655,Find 357,Find 2372,Delete 3526,Insert 732,Find 257,Insert 3839,Insert 220,Find 2103,Insert 1756,Delete 3518,Find 1998,Insert 3422,Find 2076,Find 793,Insert 46,Insert 3718,Delete 1723,Insert 781,Delete 1089,Insert 1724,Insert 1866,Find 1115,Find 3244,Insert 207,Find 3498,Insert 3564,Insert 2332,Find 3719,Delete 901,Find 2716,Insert 3775,Find 1216,Find 884,Find 2631,Insert 2449,Find 3441,Insert 537,Insert 3500,Find 2945,Find 3116,Find 1374,Find 2067,Find 2791,Find 18,Delete 1060,Find 269,Insert 1274,Find 1015,Insert 2630,Delete 624,Find 764,Find 2132,Insert 3736,Delete 2880,Find 664,Insert 1430,Insert 1998,Insert 2639,Find 1016,Find 1258,Insert 200,Insert 343,Insert 1759,Insert 14,Insert 2967,Find 1121,Insert 650,Insert 896,Insert 3541,Insert 945,Insert 3049,Insert 3571,Insert 1838,Insert 3169,Delete 3088,Delete 1073,Find 3064,Insert 3224,Find 166,Find 3931,Insert 2870,Delete 1579,Insert 2889,Find 2764,Delete 1349,Insert 3432,Find 3520,Delete 3398,Insert 510,Find 645,Delete 247,Find 1742,Find 1188,Find 1143,Insert 1723,Insert 2983,Insert 3038,Find 3788,Find 2367,Insert 1428,Delete 3122,Insert 3855,Insert 1355,Insert 1671,Insert 3300,Find 2531,Insert 3079,Insert 2451,Find 2301,Insert 400,Delete 1700,Delete 1175,Find 942,Find 3922,Delete 2544,Insert 1291,Find 1565,Find 426,Insert 2303,Insert 1104,Find 1107,Find 1377,Insert 3915,Insert 1792,Insert 2863,Insert 886,Find 2855,Delete 1603,Insert 647,Insert 35,Insert 186,Find 3105,Delete 105,Delete 3316,Insert 562,Insert 3312,Find 633,Insert 2993,Delete 2089,Insert 1667,Find 1067,Insert 3063,Find 188,Find 3755,Insert 2088,Find 933,Insert 502,Insert 1918,Insert 3974,Insert 3152,Delete 1351,Insert 2957,Insert 3765,Delete 2738,Delete 3463,Insert 3089,Find 1864,Find 1418,Insert 974,Insert 1921,Find 3122,Insert 3143,Insert 3841,Delete 2217,Find 73,Insert 567,Insert 1668,Insert 2845,Insert 3306,Insert 1662,Insert 1817,Delete 1385,Insert 1569,Insert 1972,Insert 1565,Delete 3656,Insert 681,Find 3425,Insert 3664,Find 2481,Find 3078,Find 3113,Find 1263,Insert 2872,Insert 1792,Insert 1973,Insert 204,Insert 1614,Insert 1516,Insert 3056,Find 2280,Find 1832,Find 3584,Find 1490,Find 2789,Delete 878,Insert 2776,Insert 1585,Insert 95,Insert 3936,Find 1803,Insert 202,Find 2746,Insert 1819,Insert 2515,Insert 1353,Insert 2507,Insert 783,Insert 2716,Delete 1628,Find 131,Find 3716,Delete 2863,Find 857,Delete 3185,Insert 853,Insert 387,Insert 1525,Insert 2091,Insert 3432,Insert 2668,Insert 3527,Insert 2518,Insert 2430,Insert 878,Insert 1065,Find 594,Insert 2318,Insert 3514,Insert 408,Insert 2785,Find 3874,Delete 287,Delete 2365,Insert 3356,Insert 74,Find 630,Insert 3969,Insert 344,Insert 1902,Find 1598,Find 1065,Insert 475,Insert 2542,Delete 3921,Find 2138,Insert 914,Find 2331,Find 1107,Insert 2785,Find 2635,Delete 3209,Insert 557,Delete 2772,Find 2379,Insert 3527,Find 3514,Delete 2632,Find 1889,Find 3724,Delete 303,Find 2960,Find 3580,Delete 2470,Insert 2976,Find 668,Insert 2242,Delete 1550,Find 1141,Delete 87,Find 236,Insert 3933,Find 3481,Insert 1586,Insert 130,Insert 1868,Find 2109,Insert 1359,Find 3791,Find 2990,Find 2367,Insert 2644,Insert 3834,Insert 2731,Insert 3,Insert 2994,Insert 1896,Find 372,Insert 2049,Insert 1363,Insert 2819,Insert 900,Insert 197,Insert 1044,Find 673,Find 1708,Insert 2360,Delete 3804,Insert 2010,Delete 544,Insert 3339,Insert 238,Insert 1302,Insert 2660,Find 2792,Insert 861,Delete 1482,Insert 2859,Delete 1048,Find 169,Insert 3584,Insert 115,Find 861,Insert 1650,Find 2235,Find 1582,Delete 156,Find 1550,Find 1448,Insert 128,Insert 1667,Insert 3244,Insert 1485,Insert 59,Insert 982,Find 536,Insert 3535,Insert 2239,Find 3435,Find 1405,Find 2440,Insert 511,Find 3680,Insert 3314,Insert 1888,Find 909,Find 1228,Insert 2917,Insert 1179,Find 1661,Insert 1071,Insert 656,Delete 3365,Insert 3834,Find 2213,Insert 1464,Insert 3732,Find 206,Insert 1500,Insert 2958,Find 771,Delete 343,Insert 1339,Find 3074,Insert 1709,Insert 3382,Find 3727,Insert 775,Delete 916,Find 3700,Find 693,Find 754,Delete 2550,Delete 2680,Insert 2609,Find 679,Find 1919,Insert 1217,Find 2297,Insert 205,Find 1222,Insert 3884,Insert 3286,Delete 7,Insert 1948,Insert 2043,Find 3079,Insert 2216,Insert 1599,Delete 1472,Insert 310,Insert 2292,Insert 3564,Find 2635,Insert 3256,Insert 2940,Find 1528,Find 2839,Insert 1548,Delete 2495,Insert 3424,Insert 3778,Insert 682,Find 2051,Insert 578,Find 1260,Insert 3199,Find 3316,Insert 1285,Find 3405,Find 1605,Insert 2779,Insert 1787,Insert 1565,Insert 349,Delete 966,Find 3161,Insert 1242,Insert 3024,Find 517,Insert 1191,Delete 853,Insert 710,Insert 2487,Insert 1373,Find 3407,Insert 1921,Insert 417,Delete 2478,Insert 2370,Delete 2073,Insert 2087,Find 2455,Insert 1082,Insert 3083,Find 3864,Insert 2323,Find 3437,Insert 3101,Insert 60,Insert 3567,Insert 3647,Insert 3761,Insert 3125,Delete 3186,Insert 2877,Delete 3220,Insert 280,Insert 1188,Find 1266,Find 3649,Insert 1808,Find 1781,Find 834,Insert 1134,Insert 3655,Find 2559,Find 1431,Delete 1297,Find 3154,Insert 2223,Insert 1242,Insert 2515,Insert 1737,Insert 290,Find 2921,Find 996,Insert 1614,Insert 111,Find 501,Find 3093,Insert 1340,Find 2517,Delete 2040,Insert 1118,Insert 895,Insert 606,Insert 2386,Insert 3625,Find 1192,Find 1948,Insert 2296,Insert 760,Find 2509,Insert 3718,Insert 511,Insert 918,Insert 2702,Insert 1871,Delete 1510,Insert 2766,Find 2818,Find 2540,Insert 3655,Insert 972,Insert 3811,Insert 458,Insert 590,Insert 3923,Insert 1751,Delete 2686,Find 3069,Find 3711,Find 1752,Find 577,Delete 1238,Insert 239,Insert 3819,Find 795,Insert 3676,Insert 1311,Delete 699,Insert 147,Delete 1052,Insert 405,Insert 1620,Insert 1740,Insert 3895,Delete 857,Insert 2943,Insert 1311,Find 2992,Insert 1997,Delete 3122,Insert 3406,Find 2130,Delete 1567,Insert 825,Find 97,Find 296] +[Find 2428,Find 3647,Insert 896,Insert 1151,Insert 2663,Insert 2716,Insert 273,Find 3780,Insert 1258,Delete 3028,Find 254,Find 3971,Insert 3642,Insert 3548,Find 898,Delete 3768,Insert 1742,Find 1378,Insert 161,Insert 2907,Find 2538,Insert 484,Insert 1928,Find 885,Insert 2731,Find 3537,Find 346,Delete 2910,Find 53,Find 1941,Insert 3014,Insert 2850,Find 2453,Delete 1025,Find 1659,Insert 1211,Insert 2017,Insert 3357,Insert 2248,Find 2794,Find 1726,Delete 1521,Find 3048,Find 1736,Insert 253,Find 801,Insert 1258,Find 1562,Insert 2245,Insert 1018,Insert 3063,Find 3117,Delete 2394,Insert 2345,Insert 3598,Insert 1121,Find 61,Delete 1492,Delete 3718,Insert 1224,Find 314,Find 1384,Insert 1358,Find 184,Find 3736,Find 3148,Find 2138,Insert 3250,Insert 1733,Insert 614,Insert 2892,Insert 1726,Insert 1477,Insert 2451,Find 196,Insert 605,Find 1114,Insert 2617,Insert 623,Insert 991,Insert 1404,Insert 703,Find 549,Insert 1404,Insert 3116,Delete 2667,Insert 1590,Find 3219,Find 2328,Insert 644,Delete 871,Find 2096,Insert 1878,Delete 1242,Find 3792,Insert 2624,Insert 2160,Insert 1514,Find 3342,Insert 1659,Find 2582,Insert 3374,Insert 2649,Insert 2512,Insert 2007,Insert 2957,Find 792,Insert 2744,Insert 1430,Insert 1121,Insert 1800,Insert 1611,Insert 3486,Insert 1461,Insert 2095,Insert 2933,Delete 1704,Find 2988,Delete 3787,Delete 3491,Insert 3270,Insert 1329,Insert 1764,Find 3751,Insert 1760,Find 2329,Insert 3285,Find 3819,Find 1246,Insert 2711,Insert 3513,Find 1179,Insert 1294,Insert 2568,Insert 918,Find 284,Insert 1978,Delete 1044,Find 627,Insert 1664,Insert 854,Find 2787,Find 282,Delete 3387,Insert 1962,Insert 3947,Find 636,Insert 937,Insert 2256,Insert 2430,Find 293,Insert 2714,Insert 3389,Delete 3202,Delete 23,Insert 3750,Find 3360,Delete 771,Find 942,Delete 261,Find 293,Find 193,Insert 1112,Insert 3427,Delete 2051,Find 17,Find 3669,Insert 1357,Insert 3110,Insert 2427,Delete 3021,Find 3716,Insert 846,Insert 959,Delete 797,Insert 2487,Find 2805,Insert 2456,Insert 2517,Insert 3943,Find 1313,Insert 1310,Find 2033,Insert 2100,Insert 2997,Insert 3418,Insert 95,Insert 1592,Find 1171,Delete 3068,Find 2550,Find 827,Insert 468,Delete 890,Find 2917,Find 1592,Find 414,Insert 973,Insert 3383,Insert 2171,Delete 237,Insert 2283,Find 1601,Insert 1011,Insert 127,Delete 3532,Insert 397,Insert 1229,Insert 1004,Insert 592,Insert 1013,Insert 2272,Insert 2208,Delete 1522,Insert 2510,Find 199,Insert 1931,Delete 725,Insert 3344,Insert 2075,Insert 860,Delete 1879,Insert 1407,Find 3059,Find 3246,Delete 2748,Insert 2181,Insert 1556,Delete 28,Delete 2270,Insert 3619,Find 147,Insert 551,Delete 2122,Delete 796,Find 3950,Insert 2022,Insert 2288,Delete 3010,Insert 2281,Insert 3644,Insert 2008,Insert 50,Insert 563,Find 2828,Delete 87,Insert 3310,Insert 3324,Find 2838,Find 3965,Insert 2193,Insert 1657,Find 2816,Insert 1298,Insert 3692,Delete 2018,Find 3796,Find 794,Insert 863,Find 1737,Insert 1166,Insert 3421,Find 24,Insert 2823,Insert 135,Insert 3005,Insert 945,Insert 1635,Insert 3213,Insert 3861,Find 984,Find 1228,Delete 1413,Insert 2711,Find 314,Delete 3460,Find 1920,Find 2102,Find 1207,Insert 2788,Delete 1339,Delete 3800,Insert 2537,Find 3303,Find 1731,Insert 194,Find 430,Find 1559,Find 1058,Insert 2996,Insert 3881,Delete 2325,Insert 3426,Find 1451,Find 2569,Find 1445,Insert 3362,Insert 2733,Insert 2385,Delete 1047,Insert 3832,Insert 1059,Find 2694,Find 1275,Insert 2738,Insert 1084,Insert 1537,Find 656,Insert 3905,Find 1959,Insert 1901,Find 68,Find 961,Insert 3616,Find 2632,Insert 576,Insert 946,Find 213,Delete 3780,Insert 2001,Insert 528,Insert 1836,Delete 1204,Insert 3266,Insert 3925,Insert 1433,Find 3502,Insert 1708,Insert 2421,Insert 3695,Find 2472,Insert 1692,Find 71,Insert 3277,Delete 1108,Insert 3453,Insert 2947,Insert 3100,Find 3276,Find 2048,Find 1468,Insert 3636,Insert 1592,Delete 3846,Find 1716,Insert 1970,Insert 1563,Find 2359,Find 1145,Find 3621,Insert 3779,Find 1021,Insert 2329,Find 3869,Insert 1379,Insert 1278,Insert 2742,Find 831,Delete 2486,Find 1823,Insert 1290,Find 3314,Insert 117,Insert 85,Insert 1734,Find 1453,Insert 2615,Find 3432,Insert 3583,Insert 1200,Find 3080,Find 3907,Insert 1333,Insert 1563,Delete 2662,Delete 476,Delete 318,Insert 757,Insert 2543,Insert 2720,Delete 3745,Insert 1204,Find 1480,Find 3380,Insert 2131,Insert 3149,Delete 2011,Find 2357,Find 2933,Insert 1333,Insert 2846,Insert 1068,Insert 3293,Insert 3324,Find 1987,Find 1505,Find 2471,Delete 1148,Find 2279,Insert 834,Find 1659,Insert 3053,Find 2568,Insert 1223,Find 3799,Find 1317,Find 3074,Insert 3975,Insert 3999,Insert 0,Insert 318,Insert 2122,Insert 2216,Insert 2632,Find 1507,Insert 1467,Insert 956,Find 1890,Insert 1168,Insert 1710,Delete 612,Find 1572,Insert 3448,Insert 374,Find 899,Insert 1306,Insert 2772,Insert 3096,Find 2772,Insert 456,Insert 1285,Insert 795,Find 1772,Insert 3475,Insert 252,Insert 2953,Find 2575,Insert 1708,Insert 17,Delete 3068,Insert 1001,Find 1394,Find 477,Insert 1141,Delete 2205,Insert 1458,Find 505,Insert 3266,Insert 1844,Find 2100,Find 379,Find 2999,Find 1251,Insert 325,Find 1948,Insert 3287,Insert 2108,Find 1614,Find 2221,Insert 3616,Insert 2757,Insert 46,Insert 1398,Delete 1887,Insert 3252,Insert 852,Insert 1331,Find 3268,Delete 3054,Delete 319,Find 2500,Insert 2971,Delete 2526,Insert 3915,Insert 2118,Insert 243,Find 3805,Delete 3323,Insert 2300,Delete 223,Insert 940,Find 1625,Find 399,Insert 466,Insert 3443,Find 3187,Insert 835,Insert 2712,Insert 2852,Find 2854,Delete 822,Insert 1101,Insert 3117,Insert 3578,Find 286,Delete 3584,Insert 2379,Insert 2229,Delete 3460,Find 2869,Find 55,Insert 2182,Insert 1063,Insert 975,Insert 1508,Insert 692,Insert 1719,Delete 1811,Find 3311,Delete 3241,Find 2342,Find 1975,Insert 3552,Insert 3920,Find 2723,Find 2877,Find 3516,Delete 299,Insert 1896,Insert 2160,Insert 3199,Find 3876,Delete 789,Insert 3196,Delete 2677,Insert 703,Insert 3423,Insert 3086,Delete 1513,Insert 105,Delete 2580,Find 849,Find 2574,Find 421,Find 1306,Delete 2625,Insert 2077,Insert 3458,Insert 2746,Insert 675,Find 3500,Insert 1930,Insert 3984,Insert 3035,Insert 1029,Insert 3486,Insert 409,Insert 5,Insert 3820,Find 726,Insert 2445,Insert 3850,Insert 1192,Delete 278,Delete 875,Delete 1282,Insert 3218,Insert 1054,Find 2383,Find 3457,Find 1278,Insert 2936,Find 1259,Delete 2275,Insert 3147,Find 1851,Insert 637,Delete 782,Insert 709,Insert 3750,Insert 2299,Find 682,Find 3138,Delete 3408,Insert 1211,Find 2605,Find 2336,Delete 1920,Insert 3440,Insert 2835,Insert 3213,Delete 472,Find 1163,Insert 1577,Insert 517,Insert 2534,Insert 1042,Find 2915,Insert 763,Delete 1618,Find 3735,Insert 1185,Find 1545,Insert 1226,Insert 3970,Delete 3933,Find 1351,Insert 2915,Insert 2529,Insert 346,Insert 81,Find 496,Insert 2308,Find 3839,Insert 974,Find 2753,Insert 1675,Insert 465,Insert 1475,Find 1593,Insert 2476,Find 3799,Insert 1490,Find 3124,Insert 388,Insert 52,Delete 3247,Insert 1505,Insert 2245,Insert 323,Insert 3077,Find 714,Find 1970,Insert 812,Insert 3017,Delete 2700,Find 3035,Insert 2229,Insert 14,Delete 2856,Insert 1644,Find 2883,Delete 2437,Find 2415,Find 1587,Insert 306,Find 3478,Find 2805,Insert 2397,Insert 566,Insert 3543,Delete 1471,Find 1277,Insert 739,Insert 3752,Insert 698,Find 3877,Delete 1444,Find 3237,Insert 2248,Find 2191,Delete 2613,Find 1455,Insert 468,Insert 37,Insert 3868,Delete 3553,Find 3428,Find 1459,Delete 2286,Insert 2882,Find 959,Insert 3956,Insert 3422,Insert 623,Find 246,Delete 1404,Insert 1609,Delete 3522,Insert 1103,Insert 489,Find 1859,Insert 2590,Insert 1872,Find 3504,Insert 2044,Find 2533,Delete 3057,Delete 3736,Insert 3020,Insert 3536,Find 212,Insert 2916,Insert 2256,Delete 490,Find 1503,Delete 1525,Insert 1004,Insert 2290,Insert 3868,Insert 3340,Delete 1235,Insert 503,Find 1113,Delete 3149,Find 1268,Find 237,Insert 2568,Find 3082,Find 1099,Delete 1760,Insert 669,Delete 3492,Find 3759,Insert 781,Insert 2187,Insert 1331,Insert 3387,Insert 1736,Delete 3140,Insert 3709,Insert 214,Insert 3543,Insert 1731,Insert 1877,Insert 1110,Delete 626,Find 1957,Insert 1812,Insert 784,Insert 1812,Insert 1281,Find 2461,Insert 2356,Find 3748,Insert 3660,Find 2893,Find 2594,Find 281,Delete 1016,Insert 1949,Insert 948,Delete 2891,Insert 521,Insert 3409,Insert 1958,Insert 1400,Insert 3307,Find 3586,Insert 3918,Insert 968,Find 92,Find 1831,Insert 706,Insert 2251,Delete 3177,Find 916,Find 1133,Insert 404,Insert 1742,Find 3658,Find 1257,Insert 3094,Find 2030,Insert 2504,Find 1944,Insert 7,Insert 3883,Find 3162,Insert 2135,Insert 3433,Insert 3267,Insert 1131,Insert 2071,Insert 2788,Find 3947,Delete 988,Insert 3573,Insert 3878,Find 2873,Insert 3171,Insert 167,Find 2253,Insert 1359,Find 2330,Insert 3093,Find 2494,Insert 3180,Insert 2222,Delete 421,Find 864,Find 3591,Find 2283,Insert 3125,Insert 1289,Insert 1254,Insert 3122,Find 2843,Insert 379,Insert 1682,Find 2852,Find 2947,Insert 1803,Find 3879,Insert 972,Find 3887,Delete 819,Delete 3317,Find 110,Find 1179,Delete 406,Insert 1614,Insert 1499,Delete 3946,Find 2222,Insert 3496,Find 852,Insert 267,Insert 1730,Insert 3277,Insert 2888,Insert 1221,Insert 2764,Insert 2951,Insert 1386,Find 723,Find 1680,Insert 1171,Insert 3766,Delete 3380,Insert 3450,Find 1421,Delete 2056,Insert 1736,Delete 2321,Delete 206,Insert 3897,Find 3125,Insert 997,Insert 3622,Delete 3312,Insert 3519,Delete 343,Find 206,Delete 2451,Find 2766,Find 100,Find 1422,Insert 380,Insert 2340,Find 1338,Insert 205,Delete 1889,Insert 2027,Insert 1990,Insert 2025,Insert 1640,Insert 1147,Find 1173,Delete 1441,Insert 3798,Find 2360,Insert 3824,Delete 957,Insert 3207,Insert 2706,Delete 2677,Insert 20,Insert 2780,Insert 1057,Delete 1063,Insert 375,Insert 732,Insert 3160,Find 2719,Insert 3904,Insert 1163,Find 2209,Find 3497,Insert 2594,Insert 597,Find 2414,Insert 1734,Insert 1143,Insert 3963,Find 3595,Insert 1172,Insert 2214,Find 1540,Insert 541,Find 2135,Insert 1090,Find 2012,Find 1258,Insert 3304,Find 279,Find 692,Insert 2408,Insert 1284,Find 3903,Find 2967,Insert 833,Delete 2571,Insert 2328,Insert 2518,Insert 421,Insert 3784,Find 3982,Find 714,Insert 1447,Insert 1391,Insert 3284,Find 3334,Delete 784,Insert 3673,Find 3948,Insert 956,Insert 222,Find 3440,Find 2051,Insert 1907,Insert 186,Insert 188,Delete 3406,Insert 1091,Insert 3728,Insert 1532,Find 3610,Insert 1882,Insert 1727,Insert 25,Delete 2005,Delete 3840,Delete 3588,Insert 2901,Find 1939,Delete 2752,Insert 800,Insert 991,Insert 3915,Find 2100,Insert 249,Insert 1778,Insert 3137,Insert 529,Find 1233,Insert 2265,Find 37,Delete 2498,Insert 3100,Insert 3922,Find 2224,Insert 3585,Insert 1318,Insert 2931,Insert 3328,Find 2720,Insert 1609,Insert 899,Insert 209,Insert 3422,Insert 3230,Find 3474,Find 1180,Insert 2828,Insert 2242,Find 3650,Insert 1162,Delete 3909,Delete 202,Find 3202,Insert 40,Insert 669,Delete 291,Insert 1140,Insert 1460,Insert 3242,Insert 367,Insert 1966,Find 393,Find 385,Find 1109,Insert 1078,Insert 656,Insert 1279,Delete 3984,Insert 2326,Insert 3753,Find 1137,Insert 1594,Find 2766,Find 2495,Insert 811,Delete 3403,Find 238,Find 2788,Find 2070,Delete 2465,Insert 1649,Insert 2337,Delete 3832,Insert 706,Find 3128,Find 3540,Find 763,Find 3557,Insert 3950,Find 2493,Find 301,Insert 1260,Delete 2333,Find 2301,Insert 28,Delete 3852,Find 1114,Find 3753,Find 3963,Find 2935,Insert 1177,Find 3468,Find 690,Find 2928,Insert 3143,Delete 2745,Insert 1590,Insert 3352,Delete 2564,Find 2041,Find 688,Find 3492,Find 1133,Delete 142,Find 2330,Insert 3479,Insert 3353,Find 2703,Find 1594,Find 915,Insert 2685,Insert 2365,Insert 3666,Insert 2797,Delete 2268,Insert 2550,Insert 3800,Insert 3589,Find 2453,Insert 2411,Insert 1656,Insert 1240,Delete 103,Find 1983,Find 651,Delete 1918,Insert 1972,Find 481,Find 1408,Delete 1422,Insert 2111,Find 620,Insert 2365,Insert 1811,Find 782,Delete 394,Insert 451,Insert 3816,Insert 2866,Insert 390,Find 261,Delete 3271,Insert 1017,Insert 1250,Insert 2018,Insert 892,Find 2513,Insert 2255,Insert 3291,Delete 129,Find 2937,Insert 710,Insert 3746,Insert 165,Insert 2758,Delete 3243,Insert 2029,Insert 2514,Insert 384,Insert 1068,Insert 841,Find 3837,Find 691,Delete 2032,Find 1066,Delete 2290,Find 1010,Insert 1398,Find 2446,Insert 3413,Insert 3123,Find 3685,Find 1506,Find 3174,Insert 2388,Insert 539,Delete 393,Insert 2397,Insert 3749,Delete 1864,Find 1737,Find 53,Find 1872,Insert 419,Insert 3428,Find 1369,Delete 3317,Insert 2536,Insert 1510,Insert 133,Insert 2255,Find 2276,Insert 3567,Find 1381,Insert 3228,Insert 1302,Find 2331,Find 2049,Insert 73,Find 2950,Insert 283,Insert 2382,Delete 2388,Find 1775,Insert 1408,Insert 1564,Find 27,Insert 1502,Find 325,Find 189,Insert 115,Delete 3360,Insert 3042,Insert 2481,Insert 748,Insert 1173,Insert 2199,Find 3178,Delete 1137,Delete 346,Insert 1845,Find 3394,Find 1138,Insert 3513,Insert 1639,Insert 3985,Insert 180,Insert 1260,Find 999,Insert 1478,Insert 3555,Insert 3021,Insert 1995,Insert 594,Delete 2232,Find 1850,Insert 3361,Insert 3637,Find 3792,Find 3715,Insert 687,Insert 3579,Insert 3657,Delete 1082,Find 2612,Insert 1043,Find 509,Find 2625,Delete 3408,Delete 3486,Insert 750,Insert 3132,Find 3761,Insert 2268,Find 3158,Find 739,Find 2169,Find 117,Find 2109,Insert 1522,Insert 1495,Insert 1466,Find 620,Delete 1058,Insert 2077,Insert 3908,Insert 584,Insert 970,Insert 3473,Insert 3889,Insert 1449,Insert 3186,Insert 2215,Delete 3956,Find 884,Delete 2214,Find 2238,Insert 2411,Find 623,Insert 2808,Find 3611,Insert 830,Delete 1626,Find 3793,Insert 3614,Delete 3968,Insert 1224,Insert 3969,Insert 1357,Insert 1880,Insert 945,Insert 2537,Insert 1082,Insert 2522,Insert 2980,Find 370,Insert 1522,Insert 2267,Insert 1854,Delete 954,Insert 1290,Insert 3031,Insert 1071,Insert 510,Delete 730,Find 674,Insert 547,Insert 2652,Find 3607,Insert 3269,Find 3602,Insert 3799,Find 588,Find 1466,Insert 3217,Find 396,Insert 897,Delete 3350,Insert 3971,Insert 967,Insert 1263,Insert 910,Insert 1018,Find 2502,Find 1972,Insert 341,Insert 26,Delete 3873,Find 2552,Delete 3047,Insert 1039,Find 251,Find 749,Delete 3999,Delete 3781,Insert 939,Insert 760,Delete 2454,Insert 3939,Find 2136,Insert 3197,Find 970,Insert 690,Insert 3787,Insert 3840,Find 564,Insert 1740,Insert 1844,Insert 1887,Find 1805,Find 2663,Find 3215,Delete 404,Insert 826,Delete 1064,Delete 3771,Find 2953,Insert 4,Delete 3579,Insert 1332,Insert 1909,Find 1547,Insert 1834,Find 3685,Find 1797,Delete 3389,Delete 2325,Insert 2126,Insert 2142,Insert 1926,Find 3501,Insert 2624,Find 3542,Insert 3640,Delete 1466,Find 2740,Insert 928,Insert 2389,Delete 2993,Insert 148,Insert 1783,Insert 938,Find 2456,Find 1939,Insert 2245,Find 3564,Find 3862,Find 128,Insert 3686,Insert 2480,Find 2028,Insert 2757,Find 949,Find 459,Insert 875,Find 3865,Insert 3678,Insert 294,Insert 2034,Insert 54,Insert 2739,Delete 843,Insert 1276,Insert 1386,Insert 297,Insert 2949,Find 2214,Find 2591,Insert 3486,Insert 3084,Insert 2707,Insert 59,Delete 1727,Insert 325,Delete 933,Delete 553,Find 2294,Find 256,Insert 398,Insert 3145,Insert 333,Insert 1308,Insert 91,Insert 2261,Insert 1932,Insert 317,Find 1781,Find 2128,Insert 1109,Insert 1373,Insert 2540,Find 3638,Insert 828,Insert 2747,Insert 3062,Insert 2773,Find 1129,Find 2661,Find 3051,Insert 1149,Find 2621,Delete 1945,Find 2685,Find 2747,Insert 3998,Insert 1896,Insert 3111,Find 946,Insert 3872,Delete 3025,Insert 2398,Find 3585,Delete 769,Insert 369,Insert 1927,Insert 1587,Insert 3030,Insert 3258,Find 2739,Find 1399,Insert 3737,Insert 957,Delete 3725,Insert 3321,Insert 1860,Find 1858,Insert 426,Delete 2286,Find 3755,Insert 1996,Find 2923,Find 1040,Insert 908,Find 3298,Insert 623,Insert 3651,Delete 2008,Insert 1888,Find 843,Insert 3886,Insert 2844,Find 3005,Find 3762,Find 2727,Insert 2197,Insert 2320,Insert 978,Delete 3536,Insert 3553,Insert 1742,Find 2173,Insert 3003,Insert 2207,Insert 1203,Find 914,Insert 688,Insert 3852,Insert 2468,Find 3367,Insert 1944,Delete 3408,Insert 3750,Insert 1539,Find 1395,Delete 1066,Find 1630,Insert 3194,Insert 3033,Delete 571,Find 429,Insert 1566,Find 496,Find 2577,Insert 641,Delete 2713,Insert 2502,Insert 2542,Insert 3678,Insert 1149,Insert 1270,Find 1545,Insert 943,Find 531,Insert 516,Delete 3262,Insert 1306,Find 431,Insert 419,Find 2861,Find 2510,Find 1663,Find 3522,Find 2275,Find 3821,Insert 191,Insert 223,Find 1167,Delete 3116,Insert 206,Find 2700,Find 319,Insert 1202,Find 3217,Insert 363,Find 2693,Find 517,Insert 407,Insert 2055,Delete 220,Insert 1402,Find 2933,Insert 1504,Delete 3138,Delete 55,Find 958,Insert 1307,Insert 2687,Insert 480,Insert 1911,Insert 1908,Find 3344,Insert 2848,Delete 1485,Insert 3888,Find 1813,Insert 1049,Insert 3070,Find 2146,Delete 1715,Delete 183,Insert 735,Delete 2282,Find 1050,Delete 2640,Insert 2262,Insert 717,Insert 332,Insert 3656,Find 3077,Find 1897,Find 1407,Insert 2619,Insert 2539,Delete 2155,Insert 3267,Find 1580,Find 2792,Insert 424,Insert 881,Insert 3644,Find 2692,Insert 876,Insert 1971,Delete 249,Find 3329,Insert 3798,Find 3096,Insert 2604,Insert 1054,Insert 517,Insert 3886,Insert 2817,Delete 1125,Find 3101,Insert 793,Insert 2019,Insert 2248,Delete 421,Insert 1624,Delete 2702,Find 1802,Insert 510,Insert 3337,Find 2871,Find 1537,Insert 2661,Insert 839,Insert 1157,Insert 2367,Insert 466,Delete 1497,Find 302,Insert 3641,Insert 318,Insert 1756,Insert 657,Delete 3411,Find 3318,Find 3502,Insert 3994,Insert 2055,Delete 1789,Find 3326,Delete 459,Insert 1182,Insert 2000,Delete 3019,Find 2493,Find 2259,Insert 692,Delete 3979,Insert 984,Delete 2885,Delete 1410,Find 2705,Delete 1534,Delete 2182,Delete 632,Insert 1650,Find 732,Insert 1949,Insert 1422,Find 2909,Insert 2325,Insert 2991,Find 3486,Delete 33,Insert 2699,Insert 3417,Delete 3268,Insert 2029,Delete 2449,Insert 2279,Insert 3510,Find 1528,Find 3572,Insert 1960,Insert 161,Insert 446,Find 2833,Find 3026,Find 739,Insert 3523,Insert 1188,Insert 3711,Insert 3102,Insert 3162,Delete 1848,Delete 2389,Find 3758,Find 529,Insert 1652,Insert 2761,Insert 2946,Insert 1476,Insert 1387,Insert 1904,Insert 2316,Find 746,Insert 1750,Find 2909,Insert 3622,Insert 1328,Insert 2093,Find 169,Insert 2828,Insert 2645,Insert 2176,Insert 3192,Insert 2937,Find 2828,Insert 1158,Insert 249,Insert 1164,Find 1639,Insert 1728,Find 1654,Insert 878,Insert 1036,Find 918,Find 1605,Insert 2379,Insert 3792,Delete 3085,Delete 2166,Insert 3145,Find 2382,Insert 3830,Insert 2347,Insert 3299,Insert 3526,Delete 3977,Find 1879,Insert 224,Find 3807,Insert 553,Insert 3522,Insert 1299,Delete 985,Insert 1224,Find 3974,Delete 2048,Delete 3322,Insert 1765,Find 3727,Delete 3961,Insert 618,Insert 2956,Insert 2044,Delete 772,Insert 2589,Find 2044,Delete 1855,Find 3907,Delete 2794,Find 3118,Insert 3944,Insert 2854,Insert 403,Insert 2213,Insert 532,Find 2139,Insert 1000,Insert 289,Find 175,Find 1958,Delete 1566,Insert 2691,Insert 2622,Insert 3589,Insert 3258,Find 1177,Insert 446,Find 3013,Find 3114,Insert 673,Insert 312,Insert 3345,Delete 3978,Insert 458,Insert 262,Insert 1093,Insert 1024,Find 2001,Insert 728,Insert 2534,Insert 3083,Delete 2250,Insert 1273,Insert 962,Insert 1234,Delete 2135,Delete 2374,Insert 1937,Delete 3205,Delete 247,Insert 2467,Find 2901,Insert 173,Delete 3791,Insert 1793,Insert 3152,Find 3862,Insert 1575,Insert 1897,Delete 1095,Insert 17,Find 1342,Delete 1876,Insert 1562,Find 288,Insert 125,Find 3146,Find 1941,Insert 1600,Insert 1483,Find 2044,Insert 3842,Delete 2747,Find 305,Insert 1110,Insert 1292,Delete 3349,Insert 2691,Find 1273,Insert 1011,Delete 372,Delete 1362,Insert 2838,Find 3312,Find 2151,Delete 2455,Insert 268,Insert 1056,Insert 2932,Find 907,Insert 838,Insert 1424,Find 3265,Insert 3718,Insert 1714,Insert 653,Insert 1617,Delete 1390,Insert 3457,Insert 2125,Insert 2358,Find 2015,Delete 765,Find 3693,Find 3676,Insert 625,Insert 3602,Delete 2318,Delete 1008,Insert 3732,Insert 516,Find 3614,Insert 1814,Find 422,Insert 3462,Delete 2749,Insert 577,Find 1699,Insert 3816,Find 3525,Insert 3835,Find 2791,Find 3051,Find 2504,Delete 1618,Find 2213,Insert 55,Find 3110,Find 2542,Delete 502,Insert 459,Insert 3375,Insert 458,Insert 2982,Insert 3538,Find 2782,Insert 1431,Insert 2428,Insert 1034,Insert 1436,Insert 3247,Find 2967,Insert 1044,Insert 390,Insert 2987,Insert 3395,Insert 103,Insert 2539,Delete 2165,Insert 1832,Delete 996,Insert 235,Find 768,Find 2727,Find 704,Find 3701,Find 2651,Find 1886,Insert 2831,Insert 3449,Insert 559,Insert 2709,Find 1508,Insert 3008,Find 1499,Delete 2048,Insert 1255,Insert 3603,Insert 177,Delete 1072,Insert 10,Insert 2375,Insert 2969,Insert 3569,Find 1019,Find 2261,Delete 1068,Delete 272,Find 3245,Find 1154,Find 2449,Insert 2638,Insert 3753,Find 645,Insert 2744,Delete 3946,Find 3107,Find 1019,Insert 3537,Insert 1391,Insert 361,Insert 252,Insert 1633,Insert 2079,Find 1113,Insert 378,Find 2478,Insert 2297,Find 1394,Find 861,Insert 943,Insert 3876,Insert 1095,Find 1167,Delete 3054,Find 2999,Find 3118,Insert 3876,Insert 2366,Find 3191,Insert 1566,Insert 3702,Delete 1133,Insert 2815,Insert 2511,Insert 33,Delete 2832,Insert 1454,Find 3585,Insert 584,Insert 3892,Insert 3143,Find 2258,Insert 1406,Insert 2724,Insert 1983,Find 458,Find 2962,Find 3290,Delete 1677,Find 3823,Insert 1355,Delete 1735,Find 2140,Insert 1579,Insert 529,Insert 2064,Insert 906,Insert 1069,Delete 1258,Insert 589,Insert 3976,Insert 1501,Insert 853,Find 3846,Insert 1750,Insert 2800,Insert 2082,Find 3761,Insert 1177,Insert 2456,Insert 3017,Insert 5,Insert 2915,Insert 506,Find 1727,Insert 591,Insert 960,Find 2399,Insert 540,Insert 3586,Insert 2377,Find 637,Find 3671,Find 2766,Insert 2112,Insert 3037,Delete 3934,Insert 2594,Insert 3502,Insert 2680,Delete 1733,Insert 3953,Insert 2393,Find 910,Find 3010,Insert 3118,Insert 1817,Delete 1016,Insert 23,Find 2413,Insert 3138,Insert 2536,Find 75,Insert 2036,Find 3122,Insert 3222,Insert 2659,Delete 2625,Insert 1630,Insert 1906,Delete 2684,Delete 2694,Delete 1097,Insert 1664,Insert 270,Delete 3014,Find 868,Insert 719,Find 2063,Find 1284,Insert 1756,Find 2733,Delete 160,Insert 3033,Insert 3360,Insert 3522,Insert 3681,Find 1720,Insert 1224,Find 1130,Insert 2520,Insert 1597,Delete 514,Find 1210,Find 1541,Insert 3179,Find 2287,Insert 35,Insert 280,Delete 2051,Find 2532,Insert 3280,Find 245,Insert 2644,Insert 2261,Insert 3070,Insert 2413,Insert 3159,Find 2461,Insert 2207,Insert 2963,Insert 515,Insert 167,Find 3677,Insert 2897,Find 2907,Insert 3136,Insert 1602,Insert 3881,Insert 2067,Find 2398,Delete 3168,Insert 1549,Insert 164,Insert 1425,Insert 3272,Delete 1853,Insert 2753,Find 1718,Insert 3176,Find 1079,Find 38,Insert 3931,Insert 1777,Insert 800,Delete 369,Insert 3604,Insert 1023,Insert 3719,Insert 3099,Insert 3730,Insert 3922,Insert 1311,Insert 3066,Find 2018,Insert 388,Delete 1466,Insert 3468,Insert 1014,Insert 376,Find 2316,Insert 269,Insert 3908,Delete 2666,Delete 3991,Insert 1495,Insert 845,Insert 958,Insert 263,Insert 1315,Insert 2638,Insert 2324,Insert 2112,Insert 1877,Find 1656,Insert 2437,Find 2769,Insert 3773,Find 2878,Insert 1298,Find 2514,Insert 3461,Delete 1637,Delete 3402,Insert 846,Find 2998,Insert 1338,Find 3926,Find 3473,Delete 2324,Find 3739,Insert 3624,Insert 1659,Find 900,Delete 2561,Insert 1339,Insert 2698,Find 484,Insert 1642,Insert 1208,Find 3955,Delete 1555,Insert 3609,Insert 2712,Insert 2623,Insert 720,Find 1955,Insert 2821,Insert 1884,Insert 21,Insert 1414,Insert 1399,Insert 3172,Insert 1580,Insert 3751,Insert 812,Find 190,Find 773,Insert 3793,Insert 3815,Delete 1065,Insert 2995,Delete 3524,Insert 3270,Insert 3656,Delete 813,Insert 3005,Find 2327,Insert 3509,Insert 583,Insert 546,Find 2507,Insert 848,Insert 1300,Insert 3936,Insert 2494,Find 1004,Insert 3761,Insert 1468,Insert 1628,Insert 839,Insert 988,Find 2563,Insert 459,Insert 852,Insert 2170,Find 2953,Insert 3634,Find 3802,Find 2777,Delete 384,Find 3015,Find 550,Insert 638,Insert 2213,Insert 3983,Insert 277,Insert 3357,Insert 1845,Insert 2284,Insert 266,Find 1127,Find 1396,Find 1176,Delete 3393,Find 3148,Find 383,Delete 3728,Find 3191,Find 3188,Insert 1681,Delete 2686,Find 226,Find 2975,Find 2581,Find 3888,Insert 3249,Insert 3565,Insert 1011,Insert 1660,Insert 3277,Delete 1736,Find 1409,Find 79,Find 3251,Insert 266,Insert 3022,Delete 1016,Insert 3424,Find 523,Find 1060,Insert 3015,Insert 3519,Insert 2124,Insert 3364,Delete 1131,Find 340,Insert 1136,Find 2982,Insert 337,Find 429,Insert 2881,Find 3032,Insert 2464,Insert 3850,Insert 17,Insert 575,Insert 2571,Insert 235,Insert 1606,Insert 3585,Insert 3227,Insert 3591,Insert 3463,Insert 2066,Insert 3397,Delete 3195,Delete 2268,Delete 3426,Insert 177,Insert 484,Insert 120,Insert 1494,Insert 1527,Insert 1937,Insert 1918,Insert 931,Find 1068,Insert 771,Insert 210,Find 3326,Insert 2004,Insert 1718,Find 2210,Insert 920,Find 1688,Insert 1307,Insert 894,Insert 3558,Delete 187,Insert 1802,Insert 3084,Insert 2633,Find 3299,Find 3549,Insert 1593,Find 308,Find 608,Insert 1964,Insert 290,Insert 2927,Find 14,Find 868,Find 3602,Delete 2830,Insert 2365,Find 354,Insert 2599,Insert 1438,Find 2902,Find 2345,Insert 3517,Insert 2198,Insert 2381,Delete 2699,Insert 1436,Insert 745,Insert 3186,Find 1080,Insert 168,Delete 3953,Insert 2900,Insert 2300,Insert 2680,Insert 3832,Find 1084,Insert 3719,Find 2335,Delete 429,Find 3517,Find 3452,Find 563,Insert 2759,Delete 534,Insert 2106,Insert 2225,Find 614,Insert 504,Find 1200,Find 1011,Insert 216,Insert 2818,Find 3075,Insert 3266,Insert 151,Insert 2012,Insert 96,Find 974,Insert 1402,Insert 3220,Find 2062,Insert 2332,Find 1210,Insert 3292,Insert 3426,Delete 28,Find 3830,Find 2278,Delete 3593,Insert 1694,Insert 2718,Delete 2371,Insert 3651,Insert 637,Delete 3271,Insert 3072,Find 716,Delete 2324,Insert 3310,Find 1085,Insert 600,Find 1840,Delete 39,Insert 3195,Delete 761,Find 1529,Insert 275,Find 3033,Delete 1842,Find 137,Delete 568,Insert 3412,Delete 2334,Insert 150,Find 2252,Find 2225,Insert 3760,Insert 176,Insert 2527,Find 1128,Find 1146,Insert 2324,Find 3396,Find 1618,Insert 2500,Insert 320,Insert 3897,Insert 1498,Insert 2813,Insert 109,Delete 3019,Insert 334,Insert 3385,Insert 3480,Insert 1307,Find 3645,Find 3309,Insert 1984,Insert 1175,Find 1393,Insert 993,Delete 2956,Insert 2246,Insert 2000,Insert 3814,Find 2928,Delete 3482,Find 794,Insert 2217,Insert 3315,Delete 2377,Find 2732,Insert 403,Insert 567,Insert 3699,Insert 2012,Find 506,Find 935,Delete 708,Insert 3885,Insert 3339,Find 3907,Insert 2730,Insert 3397,Insert 3136,Insert 193,Insert 518,Delete 1309,Delete 2933,Insert 747,Insert 263,Insert 2413,Find 1057,Insert 3933,Insert 3747,Insert 3028,Delete 2995,Insert 2373,Insert 2183,Insert 2693,Insert 3226,Insert 3745,Insert 2199,Insert 190,Find 3910,Insert 2000,Insert 2453,Find 1506,Insert 916,Insert 0,Find 781,Insert 271,Delete 942,Insert 1195,Delete 3530,Find 931,Insert 532,Find 634,Find 1192,Find 1996,Find 1705,Insert 1102,Insert 3558,Insert 438,Find 2226,Insert 2231,Insert 1060,Find 4000,Insert 3665,Find 787,Insert 3641,Find 2637,Insert 746,Insert 3512,Insert 104,Insert 2042,Insert 3122,Find 1315,Find 3134,Delete 1814,Insert 1365,Delete 2,Insert 3501,Insert 2965,Insert 3638,Delete 3935,Find 206,Insert 3014,Find 3672,Find 2166,Insert 555,Find 3510,Insert 1536,Insert 3405,Insert 25,Find 2039,Insert 1396,Delete 706,Find 1388,Insert 3389,Delete 1958,Insert 3797,Find 3738,Find 737,Find 3775,Insert 917,Insert 1073,Insert 1471,Insert 1146,Insert 2360,Insert 2412,Delete 259,Insert 2534,Find 3795,Insert 1650,Find 2058,Insert 3946,Find 2681,Find 134,Delete 1826,Insert 2586,Delete 3975,Delete 3302,Find 2101,Delete 2392,Insert 288,Delete 492,Find 2166,Find 726,Insert 3989,Delete 886,Insert 1090,Insert 1416,Insert 1691,Find 244,Find 2990,Find 811,Insert 425,Insert 2662,Insert 2659,Delete 1888,Insert 504,Insert 1422,Find 1009,Delete 1436,Insert 1389,Insert 3897,Find 307,Find 845,Insert 2775,Insert 2357,Find 728,Insert 261,Insert 63,Insert 1520,Insert 341,Delete 2179,Insert 3075,Insert 3110,Find 2819,Insert 2777,Find 1630,Insert 1545,Find 1532,Insert 1065,Find 796,Delete 2044,Insert 587,Find 1313,Insert 2789,Insert 2912,Insert 2471,Insert 291,Insert 2236,Find 2709,Find 3969,Insert 857,Insert 1000,Insert 1956,Insert 1598,Insert 2631,Delete 2968,Find 3372,Delete 1889,Find 2516,Find 3269,Delete 1010,Insert 3942,Insert 2409,Insert 3490,Find 2777,Insert 992,Insert 1161,Insert 2045,Find 896,Find 2350,Insert 3578,Find 1050,Find 154,Find 760,Find 2413,Find 282,Insert 1705,Insert 3933,Find 251,Insert 550,Insert 634,Delete 1199,Insert 1102,Find 1239,Find 1750,Delete 767,Insert 2824,Insert 952,Insert 2121,Delete 2621,Find 1067,Find 978,Delete 181,Find 1391,Insert 537,Find 1718,Insert 572,Insert 2089,Insert 342,Find 1214,Find 1677,Insert 1453,Insert 3183,Insert 3579,Insert 1519,Insert 1585,Delete 556,Find 2099,Find 1457,Insert 1670,Insert 3432,Insert 3428,Find 829,Delete 1801,Delete 807,Find 914,Find 1714,Insert 1405,Insert 1869,Insert 189,Delete 2360,Delete 904,Insert 1472,Find 3156,Insert 3648,Insert 3877,Delete 2464,Delete 2715,Delete 1101,Find 1790,Insert 1651,Insert 1819,Insert 3081,Find 497,Insert 130,Find 2774,Find 2073,Delete 930,Insert 1328,Delete 529,Insert 3753,Insert 3071,Insert 984,Find 1046,Insert 1967,Find 1622,Find 347,Insert 2577,Find 1216,Find 2672,Insert 427,Insert 980,Find 559,Insert 2132,Insert 2583,Insert 1679,Find 3473,Insert 3668,Insert 1868,Insert 526,Find 303,Find 384,Insert 3591,Insert 416,Insert 2091,Insert 2362,Find 285,Find 1287,Insert 3486,Insert 2135,Delete 2554,Find 1815,Insert 3040,Find 824,Insert 3931,Find 1111,Insert 1090,Insert 1795,Insert 1617,Find 1555,Delete 721,Delete 3500,Insert 2014,Insert 1647,Insert 136,Delete 1849,Insert 3592,Insert 3023,Find 1171,Find 2144,Find 938,Find 2961,Insert 1868,Insert 3256,Find 700,Insert 2821,Delete 837,Insert 423,Insert 2601,Insert 3287,Find 774,Find 3452,Insert 755,Insert 3987,Find 1066,Insert 1382,Delete 1861,Find 1044,Insert 3709,Insert 2745,Find 2945,Find 3431,Insert 2067,Insert 1207,Insert 3129,Insert 515,Delete 3468,Delete 3460,Delete 2054,Insert 166,Insert 3297,Insert 1501,Find 1088,Delete 3787,Insert 1652,Insert 144,Insert 1031,Find 3689,Insert 2922,Insert 2867,Insert 2742,Insert 112,Find 341,Insert 1419,Find 2960,Find 1463,Insert 1268,Insert 3082,Find 2732,Insert 2318,Delete 601,Insert 2837,Find 1116,Insert 3490,Delete 3199,Find 3819,Find 1466,Insert 2419,Find 1574,Find 83,Delete 872,Find 889,Insert 3253,Insert 3331,Find 1231,Insert 3711,Insert 3428,Find 3111,Insert 1310,Delete 2462,Find 349,Insert 2867,Find 1228,Insert 983,Find 2303,Insert 1716,Insert 93,Find 3332,Insert 966,Insert 3094,Find 1110,Insert 3465,Find 2604,Find 2521,Insert 2143,Insert 1693,Find 642,Insert 3824,Find 1130,Insert 1636,Delete 3348,Insert 75,Insert 809,Insert 3531,Insert 3333,Delete 64,Find 2529,Insert 3429,Insert 2184,Insert 1497,Insert 451,Insert 282,Insert 1535,Insert 1260,Delete 1029,Find 2961,Delete 2624,Find 1853,Find 1810,Insert 2269,Insert 1886,Insert 2436,Find 2883,Insert 1935,Insert 2117,Insert 1694,Insert 2594,Insert 110,Insert 674,Find 3402,Insert 2953,Insert 1047,Insert 622,Insert 1419,Find 2374,Find 1026,Delete 3644,Insert 2172,Delete 3010,Insert 2615,Find 1185,Find 1685,Find 2899,Insert 3109,Find 324,Find 3386,Insert 119,Insert 3466,Insert 3497,Find 640,Insert 939,Insert 22,Insert 855,Find 2348,Insert 923,Insert 93,Insert 105,Find 1187,Delete 3981,Insert 3072,Insert 3039,Insert 488,Find 2798,Find 798,Insert 1491,Find 3936,Delete 3326,Insert 3772,Find 1556,Insert 2078,Insert 2970,Insert 354,Find 854,Insert 1157,Insert 3466,Find 3475,Find 3622,Insert 521,Delete 1835,Find 2462,Insert 651,Insert 96,Find 2320,Find 3681,Insert 3271,Find 1983,Insert 2689,Find 3250,Find 860,Insert 401,Insert 2441,Insert 1419,Find 2151,Find 244,Delete 59,Find 1317,Insert 1043,Find 2752,Find 2356,Delete 1290,Insert 3628,Find 3036,Insert 1717,Delete 3781,Find 1190,Insert 2377,Delete 3409,Insert 1393,Find 2977,Insert 3799,Find 1136,Insert 1389,Delete 1137,Insert 3271,Delete 266,Insert 3161,Insert 2933,Find 2631,Insert 3957,Find 1380,Insert 782,Insert 106,Delete 210,Insert 182,Insert 571,Find 2852,Insert 889,Insert 1621,Insert 2148,Insert 234,Find 1378,Insert 2221,Find 3212,Insert 3095,Insert 3190,Insert 3985,Find 792,Delete 40,Insert 1845,Delete 2109,Delete 1157,Insert 251,Insert 2918,Delete 278,Insert 2469,Insert 900,Insert 554,Insert 411,Find 1856,Delete 1311,Find 3739,Insert 2671,Find 3194,Insert 3634,Insert 2180,Insert 1894,Find 728,Find 2026,Insert 3995,Insert 3922,Delete 1930,Insert 1542,Insert 659,Insert 3312,Delete 1284,Find 3346,Find 2084,Find 1180,Insert 3945,Insert 1195,Insert 3615,Insert 2103,Insert 1909,Insert 1469,Insert 187,Insert 2735,Insert 1973,Delete 1589,Find 1306,Insert 3505,Insert 2208,Insert 3408,Insert 3615,Insert 675,Insert 2044,Delete 2167,Insert 3336,Delete 3572,Insert 34,Insert 3916,Find 166,Insert 613,Insert 2279,Insert 4,Insert 2783,Insert 1043,Delete 3459,Insert 3325,Delete 3645,Insert 414,Insert 3929,Find 3893,Find 2858,Insert 1266,Insert 2784,Insert 1778,Find 723,Insert 2651,Insert 8,Find 100,Find 224,Insert 1094,Find 3185,Find 612,Insert 1650,Delete 207,Insert 2191,Find 3096,Insert 2323,Delete 650,Delete 552,Find 2817,Insert 3857,Insert 2170,Insert 2065,Find 1544,Delete 1561,Insert 160,Insert 603,Insert 725,Insert 1547,Insert 1874,Insert 2161,Insert 3937,Find 2302,Delete 3298,Insert 3948,Delete 2080,Find 2110,Find 1216,Insert 3161,Insert 2275,Insert 2183,Delete 3365,Insert 3753,Insert 3888,Find 1881,Insert 366,Insert 3415,Find 3858,Delete 1816,Find 2010,Insert 674,Insert 3875,Insert 1345,Find 478,Insert 2089,Insert 2749,Insert 2862,Insert 1390,Insert 686,Delete 1593,Insert 3242,Insert 1806,Insert 3055,Insert 2041,Insert 3316,Find 3426,Insert 1177] +[Find 3862,Insert 599,Delete 2914,Insert 2113,Find 3397,Insert 686,Find 1640,Delete 3845,Insert 3548,Insert 1340,Find 2427,Delete 815,Delete 3341,Insert 1510,Find 1503,Insert 3750,Insert 2358,Insert 448,Find 1830,Insert 1213,Find 1753,Insert 913,Insert 2336,Insert 3581,Insert 1813,Insert 187,Insert 3377,Insert 1322,Insert 3875,Insert 3067,Find 1126,Insert 261,Find 2230,Insert 2219,Insert 3031,Find 1484,Insert 910,Insert 3014,Insert 303,Find 2073,Find 2260,Delete 61,Insert 3969,Insert 2523,Insert 1087,Insert 233,Insert 3764,Insert 3506,Insert 3548,Insert 3362,Insert 3694,Insert 1503,Find 3734,Insert 2703,Find 2217,Insert 898,Find 1854,Insert 1194,Insert 2330,Insert 3223,Insert 1638,Delete 3390,Insert 1853,Insert 1050,Find 1844,Find 3192,Find 3579,Insert 3472,Delete 364,Find 977,Insert 309,Find 1349,Insert 3126,Find 3835,Insert 1926,Find 3559,Insert 3484,Delete 2964,Insert 30,Insert 3564,Delete 824,Insert 3921,Insert 3443,Insert 3692,Find 438,Find 3108,Insert 36,Insert 3156,Insert 3500,Find 1626,Insert 2007,Delete 3801,Insert 347,Insert 1702,Find 1975,Delete 3335,Insert 1717,Delete 1871,Insert 731,Insert 2209,Insert 2376,Insert 1958,Insert 1683,Delete 3362,Find 2200,Insert 97,Find 1283,Find 1496,Insert 1427,Insert 1262,Insert 2938,Insert 2470,Insert 1470,Delete 3388,Insert 949,Insert 100,Delete 429,Insert 3969,Insert 331,Delete 2259,Insert 1786,Insert 175,Insert 2573,Insert 3938,Find 453,Find 1281,Find 1231,Insert 938,Delete 928,Find 1632,Insert 242,Insert 914,Insert 2987,Find 1753,Insert 2083,Insert 1954,Insert 1971,Insert 2404,Insert 614,Insert 401,Insert 2434,Insert 3008,Insert 2528,Delete 936,Find 2395,Insert 2451,Insert 1842,Find 3341,Insert 864,Insert 195,Insert 3318,Insert 2062,Find 1893,Insert 810,Find 2975,Find 2981,Insert 3428,Insert 3012,Find 1795,Insert 1867,Insert 2822,Insert 3957,Insert 447,Delete 2786,Insert 1716,Insert 664,Find 2437,Delete 1115,Insert 2891,Insert 2198,Find 982,Insert 821,Delete 222,Find 904,Insert 2642,Insert 970,Insert 1961,Insert 2200,Find 917,Delete 3461,Insert 538,Insert 1093,Delete 2440,Insert 3663,Insert 2973,Insert 961,Insert 3588,Insert 99,Insert 1144,Find 3065,Find 2968,Insert 1459,Insert 2638,Find 174,Find 100,Insert 3778,Insert 2847,Insert 1125,Delete 2993,Insert 2658,Delete 1057,Delete 157,Insert 3682,Delete 2222,Find 2291,Find 1957,Insert 3126,Delete 1652,Insert 3102,Delete 1484,Find 3291,Insert 2928,Insert 227,Find 910,Insert 213,Find 302,Insert 2760,Find 2366,Find 2476,Insert 300,Insert 608,Delete 1916,Insert 32,Insert 3702,Insert 1403,Insert 1213,Insert 3723,Find 1785,Find 3274,Insert 2618,Insert 1476,Delete 2569,Find 387,Delete 2516,Insert 377,Delete 1812,Delete 1319,Insert 3543,Delete 2829,Insert 2888,Insert 541,Insert 3895,Delete 1269,Find 946,Find 139,Insert 3122,Insert 978,Delete 3504,Find 288,Delete 224,Insert 3027,Delete 2283,Insert 3725,Find 1255,Find 3243,Insert 1125,Delete 2980,Insert 3552,Find 2424,Delete 3983,Insert 895,Insert 908,Delete 3088,Find 2570,Insert 3613,Insert 482,Insert 1651,Insert 3727,Insert 3247,Delete 14,Find 1691,Insert 358,Find 3810,Insert 1038,Insert 3142,Find 2841,Insert 486,Find 931,Find 2869,Insert 53,Insert 543,Insert 2883,Find 3733,Find 3189,Find 207,Delete 2445,Insert 2615,Delete 2126,Find 1730,Insert 2750,Find 688,Insert 2743,Insert 946,Delete 2044,Find 747,Insert 622,Delete 1084,Insert 1483,Delete 1590,Delete 990,Find 223,Insert 1611,Insert 2405,Find 2445,Insert 3279,Delete 3373,Insert 465,Delete 1720,Insert 651,Find 1757,Insert 2083,Insert 3054,Insert 3853,Find 36,Insert 3197,Delete 903,Delete 3399,Insert 1940,Insert 194,Find 3819,Insert 1441,Find 2346,Find 2961,Delete 12,Find 3932,Find 1217,Insert 3024,Insert 2637,Delete 2284,Insert 2080,Insert 1813,Insert 1531,Delete 390,Delete 1931,Delete 1416,Insert 3633,Insert 1076,Find 1992,Find 1942,Delete 3066,Insert 932,Find 1069,Insert 1400,Insert 2857,Find 3912,Insert 1047,Insert 3385,Delete 3601,Delete 2973,Insert 3222,Find 166,Delete 1335,Insert 2226,Find 2702,Insert 3548,Delete 3845,Insert 521,Insert 1492,Insert 2886,Insert 1884,Find 2579,Insert 1671,Insert 940,Insert 3421,Insert 3961,Insert 80,Delete 391,Insert 1895,Insert 1782,Insert 1884,Insert 478,Insert 410,Insert 1200,Find 2958,Insert 2636,Find 541,Insert 181,Insert 1515,Insert 998,Insert 3788,Insert 173,Insert 1946,Find 402,Find 3267,Insert 487,Insert 52,Insert 2032,Insert 1714,Insert 3800,Insert 2214,Insert 2741,Insert 2852,Insert 644,Insert 3987,Insert 1890,Insert 2868,Find 109,Insert 3063,Insert 2006,Insert 1936,Find 3083,Find 2720,Find 619,Insert 58,Find 1882,Insert 196,Insert 3426,Insert 1001,Insert 327,Insert 1463,Find 2384,Insert 336,Delete 571,Insert 1597,Delete 3474,Find 2527,Insert 2378,Delete 1779,Insert 2216,Insert 2661,Insert 3959,Insert 2644,Find 2293,Insert 2622,Insert 668,Find 303,Insert 159,Insert 3909,Delete 964,Insert 2756,Find 1685,Find 1656,Find 1822,Insert 3433,Insert 1229,Find 139,Delete 1657,Insert 3112,Insert 3105,Find 2795,Insert 2188,Delete 2314,Insert 3614,Insert 1404,Insert 3638,Find 2847,Insert 1916,Insert 3118,Find 876,Insert 197,Insert 2630,Delete 3101,Insert 2406,Delete 338,Delete 2893,Insert 1746,Insert 508,Find 1673,Insert 3168,Insert 2273,Insert 423,Insert 3024,Insert 1108,Insert 2683,Insert 263,Insert 925,Insert 3762,Find 3953,Insert 3772,Find 531,Insert 744,Insert 3901,Find 399,Delete 215,Delete 836,Insert 2512,Insert 567,Insert 3701,Delete 985,Insert 1396,Insert 2094,Find 1240,Insert 145,Insert 233,Insert 904,Insert 1133,Insert 1536,Delete 3853,Delete 36,Find 1912,Find 1681,Insert 3774,Insert 3328,Insert 422,Insert 404,Find 2881,Insert 689,Insert 1060,Delete 61,Insert 2543,Find 1222,Insert 972,Find 2502,Find 344,Insert 2475,Insert 306,Insert 3898,Insert 248,Insert 2123,Insert 1981,Insert 3072,Insert 3054,Find 1907,Insert 3365,Insert 1289,Insert 209,Delete 2847,Insert 3280,Delete 1962,Find 2839,Insert 1495,Insert 674,Insert 1473,Insert 943,Insert 1738,Insert 2417,Delete 518,Find 2354,Delete 273,Delete 2667,Find 2025,Find 2416,Insert 2000,Insert 2568,Find 248,Find 476,Insert 2259,Find 369,Insert 529,Insert 486,Insert 65,Delete 3205,Insert 622,Find 2736,Insert 252,Delete 218,Find 291,Find 1404,Insert 2466,Insert 3167,Insert 163,Insert 488,Find 95,Insert 3304,Delete 1831,Delete 88,Insert 1342,Insert 3968,Insert 431,Insert 3235,Delete 1300,Find 2662,Insert 2193,Insert 311,Insert 245,Insert 3989,Insert 909,Find 311,Insert 2355,Insert 3428,Insert 1441,Find 3278,Insert 2546,Insert 1462,Find 36,Find 1336,Delete 2249,Insert 1463,Insert 2912,Find 638,Insert 2675,Insert 3316,Find 658,Delete 1913,Delete 3537,Insert 862,Find 627,Find 2915,Insert 3767,Find 2478,Insert 357,Insert 287,Insert 1356,Insert 2144,Delete 199,Delete 1065,Insert 2039,Insert 827,Insert 465,Find 3335,Insert 1374,Find 2416,Insert 2688,Insert 2772,Insert 1212,Insert 3334,Find 3763,Find 70,Insert 2352,Delete 356,Insert 1540,Find 2639,Insert 1714,Insert 1487,Insert 1828,Insert 3051,Find 3371,Insert 657,Find 1647,Find 1548,Delete 1277,Find 1638,Find 3324,Find 3752,Delete 1290,Delete 1358,Insert 1314,Insert 1764,Find 1051,Insert 165,Insert 2072,Find 2957,Insert 526,Delete 2657,Insert 3235,Insert 260,Insert 3711,Find 834,Insert 3286,Find 96,Find 1066,Delete 3492,Find 1854,Insert 3016,Find 1138,Find 2929,Insert 3966,Insert 2070,Insert 3004,Insert 3630,Insert 1470,Delete 39,Insert 1639,Find 707,Insert 1336,Insert 3781,Insert 3002,Delete 2018,Insert 602,Delete 1028,Find 1192,Insert 3124,Find 3883,Find 2024,Insert 833,Insert 1777,Insert 650,Delete 2833,Insert 3357,Insert 2871,Find 2379,Insert 2227,Insert 2013,Insert 1816,Delete 3293,Insert 239,Insert 2558,Insert 2413,Find 2597,Insert 1444,Delete 1633,Find 1696,Find 2198,Find 3319,Find 1671,Insert 1623,Insert 570,Insert 3254,Find 1,Find 689,Find 559,Insert 3231,Insert 2021,Insert 2926,Insert 2513,Insert 3343,Insert 1745,Insert 3639,Insert 3141,Delete 3254,Insert 1637,Find 614,Find 1257,Find 1443,Insert 836,Find 2698,Insert 2723,Insert 1019,Insert 2705,Insert 1433,Find 3846,Find 3355,Insert 2197,Delete 2216,Insert 1278,Find 3877,Insert 3601,Insert 1468,Insert 3382,Find 1154,Find 1793,Insert 1445,Insert 902,Insert 2664,Insert 802,Delete 2,Find 3201,Insert 606,Delete 861,Insert 1019,Insert 703,Insert 2152,Find 3928,Insert 3983,Delete 337,Insert 1110,Insert 3610,Insert 261,Insert 2451,Find 408,Insert 2372,Delete 3227,Insert 1175,Insert 651,Find 3701,Find 32,Delete 3691,Insert 3677,Delete 1904,Insert 2898,Insert 3107,Insert 2616,Delete 3966,Insert 3942,Delete 1318,Insert 3399,Find 854,Delete 3024,Insert 375,Find 3314,Delete 2999,Insert 3682,Insert 443,Delete 2845,Find 2623,Insert 476,Insert 2638,Insert 860,Insert 3240,Insert 3005,Insert 16,Insert 1071,Find 751,Insert 2449,Delete 836,Insert 353,Find 297,Insert 317,Insert 41,Insert 923,Find 1736,Delete 346,Delete 2641,Insert 2874,Delete 3185,Insert 2327,Find 926,Find 3001,Delete 3029,Find 2788,Insert 1878,Insert 2355,Find 1436,Find 1122,Insert 387,Delete 3472,Delete 1335,Insert 2227,Insert 3703,Insert 45,Insert 3645,Delete 1608,Insert 1958,Insert 2622,Insert 3674,Insert 1742,Find 3983,Find 2551,Find 3457,Insert 4,Insert 1318,Insert 589,Find 2598,Find 2754,Delete 2383,Find 198,Insert 901,Delete 3828,Find 2881,Find 1810,Find 3756,Insert 3465,Delete 2142,Find 2749,Insert 2252,Delete 3721,Find 491,Insert 999,Insert 1582,Insert 2081,Insert 1422,Insert 751,Insert 790,Delete 296,Insert 1498,Find 731,Insert 584,Insert 2268,Find 2955,Delete 927,Delete 500,Insert 1152,Find 2771,Delete 1509,Find 2865,Find 3963,Find 1837,Delete 2551,Delete 601,Insert 1845,Delete 905,Insert 2904,Find 552,Insert 3350,Find 965,Insert 3381,Insert 3285,Insert 1425,Insert 3320,Find 1815,Insert 665,Insert 3411,Insert 3112,Insert 3765,Find 2133,Find 118,Delete 2665,Find 842,Find 2321,Insert 594,Insert 1017,Insert 3775,Delete 3716,Insert 3202,Insert 780,Insert 2768,Insert 2681,Insert 60,Insert 2341,Insert 2898,Insert 3145,Insert 2587,Insert 583,Insert 1514,Insert 1079,Insert 3031,Insert 46,Insert 1424,Insert 6,Find 2888,Insert 3387,Insert 3490,Find 1632,Find 1165,Insert 2086,Insert 1065,Delete 2316,Find 2930,Insert 2130,Insert 435,Insert 417,Insert 1028,Insert 3271,Insert 1649,Insert 1174,Find 2717,Insert 2040,Insert 3718,Insert 1333,Find 1265,Insert 711,Insert 755,Find 1249,Find 3553,Insert 1767,Insert 3916,Find 1210,Insert 954,Insert 198,Insert 3457,Insert 1339,Insert 1981,Delete 284,Insert 2110,Insert 1359,Find 1904,Insert 3808,Find 2520,Insert 956,Delete 3209,Insert 65,Insert 3609,Insert 3938,Delete 751,Insert 2428,Delete 3712,Find 1565,Insert 1701,Insert 830,Delete 3658,Delete 3034,Insert 977,Delete 2604,Find 1494,Insert 3579,Insert 3951,Find 1385,Find 525,Insert 2578,Find 3229,Find 1767,Insert 2169,Insert 1745,Insert 284,Insert 2816,Insert 553,Delete 2287,Find 188,Find 1165,Insert 2717,Delete 3332,Insert 1794,Insert 3173,Find 1424,Find 495,Find 2903,Find 1947,Insert 2690,Insert 104,Insert 3180,Find 697,Insert 1641,Find 378,Insert 3029,Insert 2921,Insert 580,Insert 3756,Insert 2494,Delete 236,Find 394,Insert 1468,Insert 3598,Insert 3013,Insert 2192,Find 1350,Insert 2673,Find 38,Insert 1423,Insert 2990,Insert 630,Find 3572,Find 414,Insert 1883,Delete 2504,Delete 349,Insert 3986,Find 3733,Insert 2486,Insert 3014,Find 1101,Find 1936,Insert 3395,Delete 3166,Insert 395,Insert 135,Insert 1185,Find 1903,Insert 2784,Find 140,Find 2023,Insert 1784,Insert 2840,Delete 1560,Delete 2227,Delete 605,Insert 3564,Find 347,Insert 2581,Find 1913,Insert 3129,Insert 477,Insert 1361,Find 3124,Insert 3261,Insert 1488,Insert 275,Insert 2665,Insert 2670,Delete 1461,Insert 827,Find 2193,Insert 3975,Insert 2786,Insert 149,Insert 901,Insert 3125,Find 3266,Find 3209,Insert 3473,Insert 1874,Insert 3109,Insert 2674,Insert 2135,Find 3074,Find 3421,Insert 1299,Insert 31,Find 3754,Find 3069,Insert 3485,Insert 1979,Insert 1292,Find 2007,Find 2508,Insert 3999,Delete 806,Insert 2919,Insert 566,Insert 1121,Insert 2896,Insert 3232,Insert 215,Insert 243,Find 1334,Delete 1947,Insert 3070,Find 3710,Insert 650,Insert 1132,Insert 2927,Insert 1014,Delete 374,Insert 2102,Find 271,Insert 3735,Find 1091,Find 3290,Insert 3739,Insert 2124,Delete 464,Insert 2794,Find 2891,Insert 3758,Insert 3639,Find 3422,Delete 2426,Insert 2812,Insert 1022,Insert 3039,Find 3571,Find 86,Insert 2110,Insert 3572,Insert 487,Insert 3983,Insert 3078,Insert 1067,Find 1933,Delete 3489,Insert 2556,Insert 9,Delete 1978,Insert 253,Delete 634,Insert 1107,Find 3092,Insert 3156,Find 2781,Insert 2780,Insert 2830,Insert 2890,Insert 1566,Find 3108,Insert 3804,Find 2958,Find 1436,Find 2037,Delete 1167,Insert 85,Find 2809,Find 3512,Insert 3521,Insert 3773,Insert 3360,Find 2859,Find 2763,Find 627,Insert 1288,Find 1703,Find 3604,Delete 1535,Insert 3808,Find 1488,Find 983,Insert 2213,Insert 1203,Insert 3278,Insert 2936,Insert 2978,Find 2084,Insert 3164,Find 1238,Delete 856,Find 1334,Insert 298,Find 3850,Delete 1248,Find 591,Find 559,Insert 3124,Insert 2510,Insert 3576,Insert 3302,Insert 3746,Insert 3918,Insert 847,Find 1334,Find 592,Insert 316,Delete 3022,Insert 419,Delete 3796,Find 763,Insert 3905,Find 414,Find 2552,Insert 2358,Find 2480,Delete 2349,Delete 2650,Find 1810,Find 276,Insert 3348,Insert 3009,Insert 746,Insert 220,Delete 1361,Delete 2729,Find 1090,Insert 1938,Insert 3038,Insert 1671,Insert 1188,Insert 2979,Find 3627,Find 41,Insert 2425,Insert 891,Insert 791,Delete 750,Find 3400,Delete 1433,Insert 2290,Insert 1794,Insert 1015,Insert 86,Insert 3061,Delete 531,Find 1017,Insert 799,Delete 1124,Insert 2347,Insert 310,Insert 361,Insert 579,Insert 1326,Insert 3635,Delete 2732,Find 3867,Find 2697,Find 2110,Insert 2442,Find 560,Insert 2461,Insert 1039,Insert 1433,Find 3058,Insert 3674,Insert 3969,Find 860,Find 945,Insert 3355,Insert 136,Insert 240,Find 3978,Insert 3144,Insert 164,Insert 790,Insert 662,Insert 713,Delete 2860,Insert 2326,Insert 2033,Find 2343,Insert 3611,Insert 499,Find 3943,Find 1667,Find 1923,Insert 385,Find 483,Find 3078,Insert 1222,Insert 3075,Insert 3751,Delete 2150,Insert 3708,Insert 691,Find 3556,Find 1854,Insert 958,Insert 3759,Insert 11,Find 1278,Insert 1358,Find 3224,Find 2139,Insert 2878,Find 3728,Insert 3609,Insert 2291,Insert 221,Find 1051,Insert 581,Find 18,Insert 2053,Delete 1697,Insert 1767,Delete 1803,Insert 497,Find 2450,Insert 1362,Find 602,Find 1390,Insert 1323,Insert 284,Find 1855,Delete 119,Insert 3817,Insert 937,Insert 1827,Find 3813,Insert 2026,Find 1758,Insert 3238,Insert 237,Find 1668,Insert 3297,Find 3882,Insert 3582,Find 1046,Insert 1367,Delete 1725,Find 3445,Insert 722,Find 1827,Insert 3289,Insert 535,Find 755,Insert 3784,Insert 3395,Insert 1358,Insert 660,Find 3076,Find 2473,Insert 253,Insert 680,Insert 1218,Insert 3573,Insert 1941,Insert 1563,Insert 3067,Insert 3623,Insert 3169,Insert 2581,Find 1381,Find 973,Delete 1159,Insert 2698,Insert 307,Find 1590,Insert 1271,Find 1730,Insert 2525,Find 2959,Insert 778,Insert 1359,Insert 432,Insert 2470,Insert 3827,Insert 2935,Insert 1955,Insert 1023,Insert 3065,Delete 2251,Insert 2788,Delete 2702,Find 168,Insert 3629,Find 2180,Find 991,Insert 3569,Insert 2467,Find 1465,Find 3335,Insert 2092,Insert 2839,Find 589,Find 3071,Insert 764,Insert 3761,Insert 302,Insert 1136,Find 1549,Insert 149,Insert 2973,Insert 2020,Insert 1002,Delete 1133,Insert 1470,Insert 3123,Insert 3736,Insert 858,Insert 78,Insert 1036,Insert 941,Insert 972,Insert 282,Delete 8,Insert 3305,Insert 1018,Insert 1012,Insert 250,Insert 71,Insert 1262,Find 3019,Find 769,Insert 560,Insert 1641,Find 603,Insert 3017,Find 2638,Find 2899,Insert 1845,Find 1843,Insert 2995,Find 1759,Insert 2947,Insert 2290,Insert 2506,Insert 59,Insert 670,Find 2729,Insert 1157,Find 500,Find 2447,Insert 1922,Insert 677,Insert 3982,Delete 781,Insert 1976,Insert 3998,Delete 1996,Delete 1168,Find 861,Insert 3943,Insert 722,Insert 2122,Insert 3962,Insert 1032,Insert 660,Insert 1196,Insert 3528,Find 1485,Find 3022,Delete 104,Insert 2410,Insert 3609,Insert 2765,Insert 1097,Delete 2562,Find 1756,Insert 3522,Insert 879,Insert 263,Find 3984,Insert 3620,Find 2195,Find 2277,Delete 2679,Find 2452,Insert 1693,Find 2256,Insert 1380,Insert 2419,Insert 3461,Insert 3482,Find 1135,Insert 332,Insert 1128,Insert 3104,Find 1423,Find 3598,Find 2103,Delete 394,Insert 1978,Insert 3798,Insert 820,Insert 3939,Delete 3738,Delete 648,Insert 702,Insert 2149,Find 931,Insert 2516,Delete 1474,Delete 3645,Insert 3759,Insert 2533,Delete 1219,Find 3372,Insert 1457,Insert 1004,Insert 3332,Insert 2976,Insert 945,Find 22,Find 2611,Find 286,Find 2330,Delete 1968,Insert 3801,Insert 516,Insert 1961,Find 693,Delete 743,Delete 682,Find 2702,Find 656,Insert 2170,Insert 1955,Insert 2256,Find 2927,Find 1675,Find 921,Insert 1720,Delete 3922,Insert 3207,Find 2763,Find 928,Insert 2780,Delete 552,Insert 2138,Find 3559,Find 2156,Insert 3677,Find 1694,Find 706,Find 3471,Insert 3681,Delete 3536,Delete 2905,Insert 735,Insert 3118,Find 655,Find 569,Insert 1642,Find 2040,Insert 3505,Insert 3666,Find 1743,Insert 2466,Insert 314,Delete 3896,Insert 2887,Insert 3231,Find 3715,Insert 2632,Insert 926,Find 2125,Insert 277,Insert 3680,Find 3156,Delete 2778,Insert 3287,Find 1077,Insert 642,Delete 2513,Delete 2713,Insert 1499,Find 1480,Insert 313,Delete 2254,Insert 1019,Insert 1085,Delete 2894,Insert 717,Find 2050,Delete 1497,Insert 3904,Find 3125,Insert 3713,Insert 159,Insert 2177,Insert 3373,Delete 720,Insert 3621,Insert 3645,Insert 3715,Insert 2095,Insert 2785,Find 546,Delete 1747,Insert 2945,Insert 3395,Delete 432,Insert 348,Insert 3711,Find 1229,Insert 1963,Insert 2851,Insert 486,Insert 360,Insert 1978,Insert 2676,Insert 3604,Find 1828,Find 2711,Insert 3901,Delete 3555,Insert 2629,Insert 206,Delete 3840,Delete 2600,Insert 1057,Insert 1526,Insert 1058,Delete 1354,Delete 754,Insert 254,Insert 3237,Find 3818,Find 2190,Insert 2643,Delete 365,Delete 3360,Insert 3236,Insert 3133,Find 747,Find 2837,Delete 1350,Delete 707,Insert 2490,Delete 194,Insert 3800,Insert 3633,Insert 3076,Insert 3857,Insert 3850,Insert 226,Find 2566,Insert 3596,Insert 3706,Find 3505,Insert 3768,Insert 226,Delete 778,Find 2356,Insert 3432,Delete 1084,Find 2020,Insert 1609,Insert 1778,Find 693,Insert 109,Insert 2892,Insert 3912,Find 2545,Insert 1639,Delete 2058,Find 2241,Find 1187,Find 3675,Insert 470,Insert 1502,Insert 551,Insert 2183,Insert 2004,Insert 3377,Insert 1538,Insert 3001,Insert 3833,Delete 94,Find 1460,Insert 3439,Insert 3033,Insert 1815,Insert 3844,Insert 2495,Insert 3706,Insert 768,Insert 2229,Find 3258,Insert 1597,Insert 3520,Insert 3888,Delete 1295,Find 269,Insert 2565,Delete 236,Find 81,Find 2834,Insert 2288,Insert 849,Delete 3381,Insert 2307,Find 2419,Find 1515,Delete 1286,Insert 3578,Insert 1300,Find 2104,Delete 1702,Insert 3645,Insert 752,Find 965,Insert 2430,Find 2246,Delete 3716,Insert 3266,Insert 1632,Delete 2678,Insert 2189,Insert 3428,Delete 3491,Insert 1520,Find 2535,Find 1914,Insert 3264,Insert 1658,Find 2811,Find 2209,Insert 1233,Find 2637,Insert 2061,Find 1565,Insert 28,Find 2194,Insert 2515,Delete 1255,Insert 453,Insert 3299,Insert 3663,Insert 1272,Delete 3794,Insert 1619,Insert 2844,Insert 2934,Insert 3718,Insert 669,Insert 2696,Insert 128,Find 420,Insert 1127,Find 2735,Insert 2724,Insert 1160,Delete 2305,Delete 2712,Insert 2960,Insert 467,Insert 246,Find 2882,Insert 3906,Insert 3764,Insert 686,Insert 2757,Insert 3752,Insert 987,Find 348,Find 3039,Find 3163,Find 1378,Insert 2013,Find 334,Insert 399,Find 2721,Insert 2851,Find 1337,Find 328,Delete 397,Find 3862,Insert 2141,Find 970,Find 151,Insert 557,Find 1008,Insert 3536,Delete 994,Insert 955,Insert 1634,Insert 1571,Find 3355,Insert 3295,Insert 3077,Delete 1390,Find 2164,Insert 3380,Delete 2376,Insert 880,Insert 1018,Insert 3263,Insert 3904,Insert 1411,Find 3960,Insert 2267,Insert 67,Insert 1902,Delete 3126,Insert 1431,Insert 1230,Find 893,Find 3622,Find 2430,Insert 3644,Insert 2033,Delete 2045,Insert 151,Insert 262,Find 3436,Insert 2014,Insert 1088,Insert 1521,Insert 373,Insert 3924,Find 1675,Delete 3549,Insert 1154,Find 1542,Insert 1470,Find 3544,Insert 3327,Find 2372,Insert 3985,Delete 2720,Find 676,Insert 278,Insert 3228,Insert 2348,Insert 2456,Find 1637,Insert 1829,Find 2633,Delete 3909,Find 958,Insert 2315,Insert 314,Find 3278,Find 2757,Insert 2585,Find 3431,Find 404,Insert 3432,Insert 2822,Insert 3625,Insert 1152,Insert 328,Insert 3246,Insert 2892,Find 3986,Insert 1483,Insert 3928,Find 308,Find 3094,Insert 772,Insert 329,Insert 1330,Insert 1593,Insert 2404,Find 891,Insert 715,Find 505,Delete 3915,Insert 3001,Insert 3441,Insert 1700,Find 3665,Insert 826,Find 1426,Insert 2696,Insert 2960,Insert 3130,Find 2360,Find 1728,Find 2130,Insert 2531,Find 191,Insert 1322,Delete 3212,Insert 324,Find 588,Find 1545,Find 503,Insert 3208,Insert 640,Insert 3752,Delete 265,Insert 1646,Find 818,Insert 3404,Insert 1449,Insert 378,Insert 3884,Find 2155,Insert 985,Insert 974,Delete 2061,Insert 1364,Delete 1747,Find 2018,Find 947,Insert 179,Find 2593,Insert 445,Insert 958,Insert 3323,Insert 896,Delete 553,Insert 2660,Insert 3565,Insert 3874,Find 3048,Insert 3334,Insert 2031,Insert 2418,Find 471,Find 3923,Find 3762,Insert 1876,Insert 3417,Find 3567,Insert 1291,Insert 2713,Insert 3350,Delete 1376,Insert 796,Insert 1464,Insert 314,Insert 839,Insert 2807,Insert 1537,Find 3352,Insert 3306,Insert 2190,Find 2321,Insert 1796,Insert 2365,Insert 524,Find 2234,Find 1280,Insert 2646,Insert 1704,Find 3421,Insert 1708,Insert 2670,Insert 3024,Insert 2078,Insert 1620,Delete 2290,Insert 3857,Delete 686,Find 3834,Insert 2355,Find 3059,Delete 3130,Insert 1286,Find 1371,Insert 2338,Insert 323,Insert 1131,Delete 2747,Insert 1110,Insert 1404,Delete 3341,Insert 2015,Insert 2577,Insert 1754,Insert 3255,Insert 1609,Find 2964,Insert 2097,Find 838,Find 3487,Insert 2523,Insert 1573,Insert 3502,Insert 3351,Insert 2873,Insert 548,Insert 3362,Delete 1911,Insert 1478,Delete 3587,Delete 885,Insert 1962,Insert 343,Insert 767,Insert 91,Delete 2205,Delete 2034,Insert 3404,Find 3083,Insert 3751,Find 2414,Find 3235,Insert 2383,Find 133,Insert 2034,Insert 3315,Insert 2729,Find 3561,Delete 740,Insert 341,Find 3806,Insert 1624,Insert 2096,Find 3743,Find 1737,Insert 3669,Find 1411,Find 468,Delete 19,Find 795,Insert 1338,Find 2740,Insert 837,Delete 425,Find 1968,Delete 3226,Find 2668,Insert 3078,Insert 1252,Insert 785,Insert 693,Find 2786,Insert 2246,Find 2173,Insert 2608,Find 1207,Find 3860,Find 2990,Delete 2855,Insert 2376,Insert 3067,Insert 1492,Insert 403,Insert 2147,Insert 3251,Find 1181,Find 243,Insert 3540,Insert 1359,Delete 3602,Insert 2319,Find 1688,Insert 3490,Find 271,Insert 2845,Insert 1587,Delete 743,Find 755,Delete 3042,Insert 2746,Find 3655,Find 1770,Insert 2468,Insert 982,Insert 2302,Insert 2303,Insert 3258,Insert 3531,Find 1039,Insert 3254,Insert 1931,Insert 902,Insert 1335,Find 3431,Find 2005,Find 1706,Insert 1178,Insert 2913,Insert 1396,Find 1719,Find 2048,Insert 2532,Delete 3154,Insert 3659,Delete 2290,Insert 1499,Find 1473,Find 922,Delete 2518,Insert 3241,Delete 3789,Insert 1866,Insert 713,Insert 1973,Find 1637,Delete 2838,Find 1958,Insert 2797,Delete 3646,Delete 3813,Delete 1119,Insert 3859,Delete 2036,Insert 1398,Delete 2677,Insert 559,Delete 3489,Delete 20,Delete 3050,Find 300,Insert 1725,Insert 1768,Insert 3446,Insert 2837,Insert 3042,Insert 3278,Insert 138,Insert 3864,Find 3280,Insert 3079,Delete 2849,Insert 3272,Insert 817,Find 1589,Find 465,Find 3963,Insert 1620,Insert 815,Insert 1085,Insert 679,Insert 840,Insert 1282,Delete 569,Find 1362,Insert 2586,Insert 3077,Find 3902,Insert 2815,Delete 388,Insert 775,Delete 2517,Insert 177,Find 611,Insert 86,Insert 1700,Insert 2454,Delete 3222,Find 3707,Insert 2156,Find 1166,Delete 267,Find 3540,Insert 2050,Insert 1838,Insert 2826,Insert 3532,Insert 343,Insert 1755,Insert 2477,Insert 2119,Delete 3891,Insert 1800,Insert 3859,Insert 2806,Find 1620,Find 3054,Insert 855,Insert 3240,Find 3493,Insert 2936,Find 3186,Insert 792,Delete 3744,Insert 68,Delete 2486,Insert 698,Delete 3577,Delete 2391,Insert 3375,Insert 2484,Insert 3043,Insert 570,Find 1538,Find 95,Insert 3997,Insert 2000,Insert 171,Insert 1791,Insert 1687,Insert 1579,Delete 1311,Insert 3873,Insert 3142,Delete 2632,Insert 2839,Insert 1400,Insert 941,Find 165,Delete 2829,Find 2488,Insert 2726,Find 606,Delete 84,Insert 1701,Delete 3490,Find 2821,Find 3460,Find 2875,Find 1046,Find 958,Delete 1639,Insert 2055,Insert 1734,Insert 2958,Find 2867,Find 3612,Find 2189,Insert 3145,Find 195,Delete 3232,Insert 1959,Find 1915,Find 2258,Delete 441,Insert 3181,Insert 448,Insert 3510,Insert 2763,Delete 3495,Insert 2115,Insert 3137,Insert 1037,Insert 1126,Delete 118,Insert 1539,Insert 2360,Find 3507,Find 800,Find 3020,Insert 218,Insert 229,Insert 2169,Insert 2761,Find 1893,Find 2129,Insert 3142,Insert 2147,Insert 315,Delete 3251,Find 1473,Delete 1541,Delete 3697,Insert 1203,Delete 626,Find 3401,Insert 3113,Delete 3374,Find 476,Insert 2736,Find 2695,Insert 350,Find 3840,Insert 1258,Insert 554,Insert 2499,Delete 3818,Find 3434,Insert 3283,Delete 1759,Insert 3921,Insert 3771,Insert 3276,Delete 3118,Insert 2659,Insert 3328,Insert 284,Insert 3971,Insert 2273,Insert 1913,Delete 1076,Insert 2602,Find 3065,Delete 3468,Delete 1782,Delete 3187,Insert 1372,Insert 1931,Find 3493,Find 3178,Insert 2083,Insert 3612,Insert 3241,Insert 3386,Insert 2119,Delete 2741,Insert 3439,Insert 398,Insert 285,Insert 1612,Insert 1596,Insert 1124,Find 2343,Insert 748,Insert 951,Insert 860,Insert 2969,Find 1226,Insert 350,Insert 2753,Delete 2407,Find 2300,Insert 3293,Insert 2555,Insert 2289,Delete 3647,Find 1360,Delete 1490,Find 3488,Insert 1142,Insert 150,Insert 3000,Find 484,Delete 3503,Insert 548,Insert 4000,Find 1931,Find 2641,Delete 3965,Insert 83,Insert 2576,Insert 1985,Insert 755,Delete 1882,Find 493,Find 908,Insert 2452,Delete 3931,Insert 1464,Find 1628,Delete 2156,Insert 808,Find 3265,Delete 2059,Delete 671,Find 2757,Insert 3569,Find 20,Insert 3463,Insert 304,Insert 1081,Delete 3766,Find 577,Insert 1614,Insert 1155,Find 3084,Insert 2834,Find 2556,Delete 56,Insert 3310,Insert 1128,Find 1582,Delete 2714,Insert 159,Insert 582,Insert 3616,Find 232,Insert 3790,Insert 1333,Delete 2092,Find 1830,Insert 2855,Insert 327,Insert 520,Insert 2190,Delete 235,Delete 456,Insert 2060,Insert 1378,Insert 535,Insert 2137,Delete 996,Insert 2053,Find 1998,Insert 1139,Find 1988,Insert 3718,Insert 2439,Insert 296,Delete 2291,Find 386,Insert 3236,Insert 3361,Find 1361,Insert 2952,Insert 2636,Delete 3241,Insert 2094,Insert 65,Find 2852,Find 2773,Insert 1474,Insert 295,Insert 2206,Insert 1316,Find 1207,Insert 2654,Insert 544,Insert 631,Find 3500,Find 358,Find 2163,Find 1441,Insert 504,Find 3031,Delete 1740,Find 2409,Find 535,Delete 2338,Delete 3860,Insert 1571,Find 1790,Delete 817,Insert 2597,Insert 3874,Find 400,Insert 590,Find 966,Delete 2975,Insert 170,Find 2039,Insert 1254,Insert 1745,Delete 3635,Find 1819,Find 3106,Insert 2413,Find 1397,Insert 2822,Insert 3483,Delete 2928,Find 1893,Insert 1393,Find 3275,Insert 1447,Insert 837,Insert 3541,Insert 111,Find 2215,Find 700,Insert 642,Insert 1898,Find 2699,Insert 3376,Find 2228,Find 3777,Delete 3141,Insert 1129,Find 495,Find 3130,Delete 1450,Insert 1832,Insert 1440,Delete 489,Insert 2757,Delete 210,Insert 209,Insert 3217,Insert 2463,Insert 3697,Delete 3356,Insert 1862,Find 3012,Insert 946,Insert 2729,Insert 1281,Find 2641,Insert 3570,Find 1780,Find 345,Delete 2476,Insert 3063,Insert 1184,Find 1135,Delete 3175,Delete 250,Delete 2687,Insert 665,Insert 2143,Delete 3679,Insert 1043,Insert 509,Insert 2191,Insert 1615,Insert 2528,Insert 2192,Insert 3318,Insert 2940,Find 201,Insert 2446,Insert 1215,Insert 186,Delete 1152,Insert 3953,Insert 1150,Find 1832,Find 114,Delete 529,Insert 1079,Insert 818,Find 3766,Insert 12,Insert 545,Find 141,Insert 893,Find 2360,Delete 2020,Insert 1635,Insert 3696,Insert 1516,Delete 1541,Insert 2891,Find 2908,Insert 2822,Find 3700,Find 1403,Delete 3016,Insert 3451,Insert 3677,Find 1105,Insert 1447,Insert 2319,Find 1822,Find 3082,Insert 2329,Find 2761,Delete 1176,Insert 2150,Find 2483,Delete 3726,Find 1441,Insert 1150,Insert 1898,Insert 3604,Insert 2392,Insert 1307,Insert 3711,Insert 1023,Find 427,Insert 565,Insert 2095,Find 1513,Delete 2530,Find 3843,Find 2110,Insert 1506,Find 1534,Insert 1442,Insert 1170,Insert 2047,Find 480,Delete 709,Insert 1976,Insert 3866,Insert 938,Find 3939,Find 1272,Delete 1855,Insert 2327,Delete 1210,Insert 3092,Insert 3183,Insert 1050,Insert 402,Insert 1047,Delete 1155,Insert 1619,Find 3181,Find 3158,Insert 570,Insert 1695,Find 960,Find 889,Insert 2620,Insert 1116,Insert 3966,Find 3081,Insert 783,Insert 1789,Insert 38,Find 3679,Insert 2174,Find 3042,Insert 2475,Find 2493,Delete 1889,Insert 1907,Insert 1173,Find 1609,Insert 630,Insert 3635,Insert 2999,Delete 1898,Insert 2257,Insert 1283,Find 3231,Find 2359,Delete 1798,Insert 590,Find 1983,Insert 573,Insert 1326,Delete 660,Insert 3562,Insert 1218,Delete 2714,Find 1072,Insert 3171,Insert 2200,Find 3663,Insert 852,Insert 2529,Find 3680,Find 1037,Insert 2770,Insert 1395,Insert 1118,Insert 3574,Find 1347,Find 3709,Find 1634,Insert 538,Insert 3693,Insert 2602,Insert 574,Insert 1926,Insert 395,Insert 32,Find 1740,Insert 879,Insert 3232,Delete 1301,Insert 1696,Insert 3960,Insert 3193,Insert 167,Insert 2804,Delete 1731,Insert 3812,Delete 2492,Insert 1962,Insert 1700,Delete 3050,Delete 2680,Insert 2731,Insert 809,Insert 3246,Delete 192,Find 3497,Insert 68,Find 1317,Insert 2398,Find 3150,Insert 1418,Insert 3290,Delete 1556,Insert 3752,Insert 2061,Find 2448,Insert 1575,Find 1220,Insert 3051,Find 532,Insert 2502,Insert 1101,Find 68,Insert 1128,Find 3700,Insert 1613,Find 1337,Insert 2364,Delete 1638,Delete 3157,Insert 469,Find 3768,Insert 3361,Insert 1286,Find 3725,Find 583,Find 2197,Insert 839,Find 3265,Insert 24,Find 2921,Insert 3945,Insert 1183,Insert 3347,Insert 3823,Find 3562,Insert 3599,Insert 3849,Insert 246,Insert 2473,Find 2964,Find 2593,Insert 955,Find 3769,Insert 293,Find 719,Delete 3565,Insert 632,Find 3805,Insert 3566,Insert 2412,Insert 1712,Find 1146,Insert 2259,Insert 1707,Insert 127,Insert 262,Find 1015,Find 3014,Find 1907,Insert 3386,Insert 1044,Insert 2393,Insert 328,Delete 120,Insert 3910,Insert 601,Insert 3734,Insert 610,Insert 2252,Insert 3021,Find 2239,Insert 2992,Delete 3915,Insert 3448,Find 2767,Find 2303,Insert 3738,Find 1678,Insert 2962,Insert 2335,Delete 1210,Insert 3764,Insert 3640,Find 146,Insert 1308,Find 2879,Find 1619,Insert 696,Find 3645,Find 1823,Insert 385,Insert 1512,Insert 1128,Insert 1254,Insert 3767,Find 1258,Delete 905,Insert 2218,Delete 3583,Insert 1980,Insert 1204,Find 1625,Insert 3648,Insert 875,Find 3012,Insert 2890,Find 773,Insert 3927,Insert 13,Insert 1313,Insert 320,Insert 3983,Insert 738,Insert 2569,Insert 185,Delete 1553,Find 3633,Insert 588,Find 1702,Find 918,Find 282,Find 2385,Insert 2374,Insert 1986,Find 3730,Find 1115,Insert 1332,Delete 3819,Find 2485,Insert 1875,Insert 186,Insert 3119,Find 2002,Delete 1875,Find 2124,Delete 1889,Insert 1007,Delete 1849,Find 2922,Insert 2518,Find 3437,Insert 802,Find 3504,Insert 1273,Find 678,Insert 3573,Insert 739,Delete 567,Delete 854,Find 1301,Insert 18,Find 3887,Find 3784,Find 2294,Find 1552,Insert 1519,Insert 236,Find 779,Insert 2920,Insert 490,Find 2895,Delete 2097,Delete 1721,Delete 3967,Insert 1710,Find 469,Insert 1797,Delete 2761,Find 3042,Find 3829,Insert 341,Insert 2025,Find 440,Insert 2058,Insert 1412,Find 3056,Find 2222,Find 3665,Insert 3672,Insert 1818,Insert 3741,Insert 10,Insert 997,Insert 3083,Insert 3028,Insert 346,Insert 1367,Insert 1294,Find 3013,Find 1617,Insert 3816,Find 2044,Find 3491,Find 87,Insert 3522,Insert 2147,Find 3090,Find 662,Insert 2815,Insert 3628,Insert 3769,Insert 324,Insert 3329,Insert 999,Insert 3147,Insert 607,Insert 1915,Insert 3159,Insert 2124,Insert 2771,Insert 1792,Insert 3762,Insert 2986,Insert 946,Find 1733,Insert 410,Find 3688,Insert 2792,Insert 1860,Insert 3318,Find 3942,Find 3065,Delete 12,Insert 3809,Insert 1082,Insert 3421,Insert 3797,Insert 3252,Insert 1320,Find 2222,Delete 1392,Insert 3825,Find 2208,Find 3699,Find 3455,Insert 901,Insert 1245,Insert 1278,Insert 2290,Delete 1508,Insert 3985,Find 564,Find 1474,Find 2667,Find 2971,Insert 2455,Delete 3804,Insert 2919,Insert 3061,Insert 2139,Insert 909,Find 3562,Find 2416,Insert 1884,Insert 1654,Insert 1062,Insert 799,Insert 2415,Insert 2400,Insert 982,Find 1683,Insert 1460,Insert 2857,Insert 711,Find 2710,Find 2735,Find 3627,Delete 2200,Insert 1575,Insert 1815,Insert 3506,Insert 1663,Delete 1325,Insert 1065,Delete 2964,Insert 3142,Find 14,Insert 2896,Insert 1926,Insert 2660,Insert 826,Find 3129,Insert 1070,Insert 686,Find 1231,Find 3227,Insert 3197,Insert 2323,Find 1981,Insert 3756,Find 2358,Find 7,Insert 3452,Insert 1298,Insert 1480,Find 2048,Find 918,Insert 3524,Insert 1619,Delete 1446,Find 297,Find 2956,Find 3917,Find 1868,Insert 432,Insert 3442,Find 1822,Insert 219,Find 1375,Delete 2509,Find 665,Insert 2394,Find 2915,Insert 324,Delete 3364,Delete 1038,Insert 3538,Find 2806,Insert 838,Insert 3337,Insert 2516,Insert 1485,Delete 936,Insert 3190,Delete 3819,Insert 1905,Insert 3620,Insert 3345,Insert 20,Delete 3062,Insert 1646,Insert 1699,Insert 2472,Insert 1350,Insert 2056,Insert 2533,Insert 2310,Insert 1805,Insert 756,Insert 1159,Find 2412,Find 2925,Find 2980,Insert 1746,Insert 2393,Insert 3124,Insert 2848,Insert 1344,Insert 2248,Insert 2706,Find 3677,Insert 1900,Insert 2402,Find 3451,Insert 2008,Insert 948,Insert 3714,Delete 3691,Insert 3958,Insert 1326,Insert 397,Find 950,Insert 2786,Find 1719,Insert 1564,Insert 2215,Find 1358,Find 1467,Find 717,Insert 2337,Find 3191,Insert 1817,Find 3205,Find 210,Delete 3866,Find 302,Insert 1319,Insert 1080,Find 3598,Insert 1343,Insert 2984,Find 930,Insert 2458,Insert 2063] +[Find 452,Delete 1744,Insert 910,Insert 3160,Delete 890,Insert 1265,Find 2219,Insert 1309,Insert 2785,Insert 3400,Insert 1085,Find 2959,Find 1459,Insert 1228,Insert 1381,Insert 480,Insert 3332,Insert 3359,Insert 1430,Insert 3572,Insert 3694,Find 311,Insert 3342,Delete 2464,Insert 1221,Insert 2280,Find 3228,Insert 3749,Insert 3809,Insert 3934,Delete 2886,Delete 3363,Insert 377,Insert 578,Insert 2459,Insert 2486,Insert 2730,Insert 2906,Find 3106,Insert 3435,Delete 170,Insert 1750,Find 1873,Delete 1972,Insert 2450,Find 174,Insert 1097,Find 240,Insert 1414,Insert 3308,Find 3748,Insert 641,Insert 2262,Insert 737,Insert 1654,Delete 6,Delete 2223,Insert 3683,Insert 1095,Delete 17,Insert 1604,Find 3623,Delete 1955,Find 3436,Insert 2736,Find 2838,Find 2043,Find 1783,Insert 488,Insert 2879,Find 2167,Insert 2009,Insert 630,Find 2785,Insert 3576,Delete 3424,Find 997,Find 1554,Find 94,Insert 879,Insert 394,Insert 2599,Insert 675,Find 361,Insert 490,Insert 1254,Find 1777,Find 434,Insert 3849,Insert 3920,Delete 245,Insert 95,Find 2054,Delete 1450,Delete 233,Find 2201,Insert 3588,Find 731,Find 2636,Insert 1746,Delete 1227,Find 1169,Find 2842,Insert 1645,Insert 3926,Insert 2354,Insert 926,Insert 1915,Delete 708,Insert 3460,Delete 1713,Delete 1080,Delete 1987,Insert 923,Insert 871,Insert 2873,Find 3381,Delete 533,Find 2697,Insert 3015,Insert 2427,Find 2149,Find 1529,Delete 3368,Find 3913,Insert 3189,Insert 171,Insert 3071,Find 2666,Insert 1858,Delete 2926,Delete 3555,Insert 862,Find 3987,Find 203,Find 2679,Find 2064,Find 1007,Delete 3104,Insert 2924,Insert 1388,Insert 1402,Insert 2360,Insert 3904,Insert 2071,Insert 934,Find 674,Insert 1578,Insert 2222,Insert 1825,Insert 998,Insert 313,Insert 3689,Delete 685,Insert 858,Insert 781,Insert 3284,Insert 1925,Delete 3249,Insert 1492,Insert 3343,Delete 2584,Find 1732,Insert 2151,Insert 2091,Find 556,Insert 1046,Insert 2584,Insert 142,Insert 920,Insert 1397,Delete 78,Insert 579,Insert 1800,Insert 3942,Insert 3500,Find 580,Insert 1679,Insert 2433,Insert 2680,Insert 2955,Find 2239,Find 1146,Find 392,Delete 2009,Delete 822,Insert 2309,Insert 206,Insert 1534,Delete 1170,Insert 962,Insert 3493,Find 1306,Find 1671,Insert 1998,Delete 3917,Delete 3200,Delete 2275,Insert 2880,Find 3753,Find 3880,Find 3788,Insert 945,Find 3550,Delete 3814,Insert 2549,Insert 276,Delete 3857,Insert 3807,Find 1993,Find 341,Find 2297,Find 1923,Find 3834,Insert 3836,Delete 3387,Find 3029,Insert 1808,Insert 3933,Insert 1143,Insert 324,Find 519,Find 1374,Find 483,Find 3504,Delete 3810,Insert 989,Find 941,Insert 2060,Insert 1294,Insert 2092,Find 1725,Find 3692,Find 2291,Insert 620,Insert 2331,Insert 174,Insert 1553,Insert 503,Find 3212,Delete 2903,Find 1551,Find 3461,Find 42,Insert 3785,Find 30,Insert 98,Find 438,Delete 1599,Delete 3172,Insert 2993,Insert 2046,Insert 2075,Insert 168,Insert 530,Find 2179,Find 3128,Insert 2384,Find 555,Find 3510,Delete 910,Find 2524,Delete 3725,Insert 3332,Find 1128,Find 1828,Insert 1856,Insert 1240,Insert 3727,Find 2718,Insert 1379,Insert 2655,Insert 2275,Insert 589,Insert 2882,Insert 2949,Find 940,Insert 1674,Insert 2154,Find 273,Insert 2694,Insert 1690,Find 66,Delete 2394,Delete 842,Insert 3086,Delete 555,Delete 1539,Insert 1195,Insert 1308,Insert 2136,Insert 3591,Delete 2746,Insert 625,Insert 1618,Delete 3291,Insert 2071,Delete 3994,Delete 702,Insert 2695,Insert 891,Find 3002,Insert 1869,Delete 325,Delete 643,Insert 1877,Insert 1373,Insert 3871,Insert 116,Find 700,Find 1658,Find 2693,Insert 75,Find 1232,Insert 3489,Insert 1270,Insert 1998,Find 1401,Insert 720,Insert 3819,Insert 2039,Find 2503,Insert 3497,Insert 1077,Insert 3893,Insert 534,Insert 2123,Insert 3727,Find 2094,Insert 712,Insert 625,Find 2357,Insert 2157,Insert 852,Find 612,Find 3852,Insert 2999,Find 3313,Insert 1870,Delete 2666,Delete 607,Find 1116,Insert 3540,Insert 3377,Insert 1114,Insert 2326,Find 3346,Insert 3989,Delete 89,Find 877,Find 1618,Find 2266,Insert 671,Insert 896,Insert 823,Find 3314,Insert 127,Find 1086,Insert 2295,Insert 2793,Find 2432,Insert 131,Insert 3637,Insert 3452,Insert 483,Find 2275,Insert 3823,Delete 1103,Find 3091,Insert 316,Find 948,Delete 51,Find 3955,Insert 574,Insert 3682,Insert 1,Insert 3862,Insert 3580,Find 1049,Insert 941,Find 1353,Insert 3201,Delete 3716,Delete 2926,Delete 1565,Find 2040,Insert 975,Insert 697,Insert 3942,Delete 3226,Insert 424,Find 646,Insert 482,Find 144,Insert 1316,Delete 1594,Insert 1226,Insert 3540,Find 1183,Insert 1648,Find 1363,Find 157,Insert 1425,Insert 3693,Insert 434,Find 715,Insert 1529,Delete 1494,Insert 210,Find 1383,Insert 34,Insert 1402,Insert 1529,Delete 2018,Insert 493,Find 909,Insert 3939,Find 722,Insert 3910,Insert 3355,Delete 2543,Insert 918,Insert 2232,Insert 887,Insert 3390,Insert 1774,Insert 3307,Insert 1637,Find 400,Find 2614,Delete 3397,Insert 360,Delete 3784,Delete 1963,Insert 1295,Insert 2077,Find 1199,Insert 2911,Delete 1913,Insert 3881,Insert 1893,Insert 1676,Insert 225,Insert 1889,Find 2594,Insert 3383,Insert 1973,Insert 1148,Insert 1774,Find 3757,Find 2102,Insert 139,Find 430,Delete 2551,Insert 872,Find 3413,Insert 1090,Insert 1945,Delete 3975,Delete 2856,Find 2058,Find 1594,Delete 3190,Insert 2528,Insert 1727,Insert 3953,Find 3720,Insert 1777,Insert 2414,Find 1267,Insert 1955,Find 1376,Delete 1042,Find 758,Find 2541,Insert 3971,Insert 2143,Insert 2956,Insert 2832,Insert 2211,Delete 2252,Insert 2967,Find 1387,Find 3150,Insert 1441,Find 1117,Insert 3642,Find 1889,Insert 2117,Insert 316,Insert 3568,Insert 3778,Insert 2430,Insert 595,Insert 3887,Insert 73,Delete 57,Insert 703,Insert 21,Insert 2802,Insert 2037,Find 3286,Find 443,Insert 2639,Insert 144,Insert 2769,Insert 1965,Find 1109,Insert 3670,Insert 2737,Insert 3783,Find 3767,Insert 1501,Find 2372,Delete 3898,Find 2776,Insert 2232,Insert 2631,Find 1829,Find 1450,Find 2600,Find 2619,Find 2485,Find 2148,Insert 1282,Insert 1847,Find 1111,Insert 2967,Insert 634,Delete 2378,Insert 1650,Find 2013,Insert 2195,Insert 512,Insert 695,Find 2773,Find 1384,Delete 965,Insert 1837,Insert 488,Insert 3824,Insert 3702,Insert 853,Insert 111,Insert 2620,Insert 1440,Insert 2984,Insert 3874,Insert 1382,Find 597,Insert 616,Insert 1285,Find 3923,Insert 3192,Insert 3945,Insert 2558,Find 614,Insert 3387,Insert 936,Insert 1265,Delete 227,Find 697,Find 894,Insert 1359,Delete 1213,Delete 1484,Delete 3377,Find 37,Find 3550,Insert 384,Delete 1564,Find 456,Insert 483,Insert 3930,Delete 3070,Insert 1940,Find 2128,Insert 1953,Insert 1657,Insert 915,Find 2456,Delete 3337,Insert 1624,Insert 1674,Insert 2268,Delete 1853,Insert 888,Insert 3415,Find 263,Insert 1487,Insert 1448,Find 1719,Insert 3081,Insert 1739,Insert 596,Insert 1894,Insert 1630,Insert 120,Find 557,Find 491,Find 1762,Insert 205,Find 942,Insert 3347,Insert 3807,Insert 2089,Find 2748,Find 2707,Insert 964,Insert 3535,Insert 2432,Find 2483,Insert 1971,Find 1716,Insert 2707,Insert 417,Find 2714,Insert 1554,Insert 245,Find 3296,Insert 266,Insert 3681,Find 1836,Insert 3289,Insert 1478,Insert 543,Delete 2414,Insert 3596,Find 2687,Insert 2024,Insert 1847,Find 10,Insert 571,Insert 3154,Insert 1358,Insert 3879,Find 2745,Insert 2456,Insert 3865,Insert 1828,Find 2447,Delete 2305,Insert 1775,Insert 143,Insert 3789,Delete 1016,Insert 485,Insert 1558,Find 2470,Insert 3849,Insert 336,Insert 605,Find 1425,Insert 1932,Insert 1244,Insert 3470,Insert 2600,Insert 2416,Insert 1034,Insert 2381,Insert 3600,Find 1812,Insert 849,Find 3155,Insert 1079,Delete 3920,Insert 1339,Insert 2557,Insert 3761,Find 2192,Insert 837,Insert 269,Insert 2875,Delete 2719,Find 447,Insert 809,Insert 1300,Insert 1251,Find 3182,Find 3161,Find 3,Insert 732,Insert 2669,Find 2090,Insert 3709,Insert 95,Insert 474,Insert 2242,Insert 1192,Insert 2801,Find 970,Insert 2686,Insert 2660,Insert 2619,Insert 2962,Insert 3014,Find 3082,Insert 3073,Find 1987,Find 1733,Find 3498,Insert 868,Insert 1383,Insert 753,Find 431,Find 3697,Insert 3015,Insert 2711,Find 3800,Insert 1843,Delete 3223,Insert 1335,Insert 3435,Insert 102,Delete 3644,Delete 1207,Insert 1386,Insert 1331,Find 3347,Insert 1837,Insert 3096,Insert 3569,Insert 965,Insert 2787,Insert 138,Find 3718,Insert 2082,Find 2562,Insert 1949,Delete 3926,Insert 3934,Insert 1305,Insert 3528,Insert 1221,Insert 1269,Find 846,Insert 3531,Insert 3951,Insert 96,Insert 301,Find 2359,Insert 2961,Delete 2103,Insert 561,Delete 3109,Find 3280,Find 420,Find 81,Delete 3210,Find 1712,Delete 3545,Insert 1158,Delete 2197,Insert 1674,Insert 2320,Find 1369,Find 1622,Insert 1699,Insert 2168,Find 2967,Insert 2750,Insert 529,Insert 2946,Insert 14,Insert 2243,Find 1645,Find 591,Delete 3694,Find 1592,Insert 3061,Insert 3972,Insert 1157,Find 2588,Find 2355,Find 3067,Insert 2545,Insert 2189,Insert 1941,Insert 825,Delete 3374,Find 412,Insert 2308,Insert 2454,Find 859,Insert 1707,Insert 2168,Insert 3382,Insert 1001,Delete 1997,Find 955,Insert 3876,Insert 425,Insert 3532,Insert 1365,Insert 1981,Find 788,Insert 96,Insert 2409,Insert 3974,Insert 779,Insert 419,Delete 1731,Insert 41,Find 670,Delete 1722,Find 492,Delete 2261,Insert 2491,Find 1919,Insert 1321,Find 2000,Find 3254,Insert 421,Insert 3082,Find 177,Find 1598,Insert 852,Delete 1963,Insert 2452,Find 2462,Insert 3849,Insert 2733,Delete 3878,Insert 3349,Find 18,Find 2005,Insert 1671,Delete 3418,Insert 3119,Insert 3083,Find 2399,Insert 1512,Find 2867,Insert 155,Find 1866,Find 1697,Delete 1829,Find 3162,Insert 1676,Delete 1240,Insert 1336,Insert 120,Find 941,Insert 1585,Delete 3413,Delete 2943,Insert 1087,Insert 1553,Insert 339,Delete 1935,Delete 1084,Find 2388,Delete 1112,Insert 3454,Find 3992,Find 224,Delete 1245,Insert 1852,Delete 1488,Insert 1875,Insert 439,Delete 920,Insert 3039,Insert 2910,Find 581,Find 1791,Insert 2640,Find 3124,Find 1088,Insert 1482,Insert 1841,Insert 1805,Find 2421,Insert 3253,Find 1681,Insert 751,Insert 1971,Find 1487,Delete 3281,Delete 3084,Find 800,Insert 1368,Delete 1458,Find 3418,Delete 266,Insert 3134,Insert 3195,Find 3839,Insert 1768,Delete 2661,Insert 1286,Find 315,Insert 2434,Find 2184,Insert 2551,Insert 589,Find 3882,Insert 2820,Insert 498,Delete 2651,Insert 2861,Insert 2280,Find 3003,Delete 3036,Insert 2140,Find 1216,Find 2500,Find 2588,Insert 3397,Find 1222,Find 1054,Delete 59,Insert 2190,Insert 248,Insert 3975,Find 3200,Insert 919,Insert 506,Insert 1704,Insert 200,Insert 3632,Delete 105,Find 803,Insert 2624,Insert 3604,Insert 3708,Insert 3669,Insert 674,Find 1558,Find 3084,Find 2846,Insert 428,Insert 991,Insert 2179,Insert 801,Insert 2725,Insert 453,Insert 2319,Insert 2403,Insert 2966,Delete 3196,Insert 3565,Find 3834,Insert 3915,Insert 2031,Find 310,Insert 1854,Find 659,Insert 2731,Insert 393,Find 3158,Insert 2352,Insert 3033,Insert 3336,Find 151,Insert 2325,Insert 3108,Delete 1923,Insert 3853,Find 2959,Delete 1742,Insert 2826,Delete 3216,Insert 3999,Delete 3447,Insert 989,Insert 3083,Find 659,Delete 1018,Find 1052,Find 2420,Insert 2639,Insert 1635,Insert 3998,Insert 182,Insert 635,Insert 564,Insert 3483,Insert 1636,Insert 1648,Insert 3288,Find 3791,Delete 3222,Insert 1586,Find 1096,Insert 1073,Insert 550,Insert 3838,Find 2601,Find 1313,Find 2633,Find 3285,Insert 2495,Insert 3764,Find 2487,Find 2627,Delete 2639,Find 226,Find 2124,Insert 2486,Insert 828,Insert 3239,Insert 3231,Delete 2822,Delete 3101,Insert 1238,Find 1072,Insert 1344,Insert 2820,Delete 209,Find 1981,Delete 3861,Find 3368,Insert 2672,Find 3788,Insert 2533,Find 778,Insert 2001,Find 615,Insert 2926,Insert 1616,Insert 2444,Delete 1051,Find 2895,Insert 3274,Insert 2851,Find 2379,Find 1601,Find 103,Insert 636,Insert 164,Delete 2550,Find 3452,Insert 3152,Find 3790,Delete 2530,Find 3192,Delete 1398,Find 549,Insert 506,Insert 1469,Find 6,Insert 1844,Insert 806,Find 2846,Insert 3574,Delete 674,Find 945,Insert 2944,Delete 3206,Insert 168,Delete 3387,Find 3844,Insert 2665,Insert 512,Insert 3285,Insert 923,Insert 3152,Insert 2375,Insert 3125,Insert 2665,Insert 431,Insert 574,Insert 2204,Insert 2005,Insert 248,Insert 505,Delete 1693,Insert 247,Insert 1408,Delete 2496,Insert 3694,Insert 2736,Insert 2791,Find 2696,Delete 3242,Find 3025,Find 3675,Insert 3616,Insert 1159,Find 1457,Find 58,Insert 410,Find 3939,Find 2645,Find 1975,Insert 3772,Delete 1778,Insert 663,Insert 801,Insert 2810,Insert 2742,Insert 3411,Find 1796,Insert 434,Insert 18,Insert 107,Insert 471,Delete 1322,Insert 643,Insert 2554,Insert 1090,Insert 1,Find 2231,Find 734,Delete 3879,Insert 2033,Insert 3206,Insert 1678,Insert 3822,Insert 1766,Insert 3565,Insert 823,Insert 3032,Insert 480,Insert 2551,Find 2865,Find 1528,Find 3538,Delete 3217,Insert 2376,Insert 2009,Find 3574,Insert 3741,Delete 1521,Insert 513,Insert 769,Insert 3881,Insert 651,Find 3042,Insert 2839,Insert 1338,Find 178,Insert 657,Find 770,Delete 3721,Insert 1736,Insert 2835,Insert 3308,Insert 193,Find 2707,Find 3768,Insert 3752,Insert 1524,Insert 1868,Find 2085,Insert 2247,Find 1131,Insert 897,Find 416,Insert 1387,Find 101,Insert 260,Find 3299,Find 739,Delete 406,Insert 53,Insert 3911,Find 2491,Find 3545,Delete 3068,Find 562,Insert 991,Insert 2264,Insert 3594,Find 3871,Delete 1596,Insert 108,Delete 3747,Insert 934,Insert 1822,Find 2188,Insert 1230,Insert 3918,Insert 2472,Insert 2549,Delete 955,Insert 3905,Insert 3269,Insert 2358,Find 3621,Find 3900,Insert 2293,Find 3266,Insert 3395,Insert 3828,Insert 3738,Find 2885,Find 2963,Delete 716,Find 1582,Insert 428,Find 1833,Insert 81,Find 2693,Insert 548,Insert 1755,Insert 2515,Insert 2279,Insert 1560,Insert 3301,Find 3434,Find 2148,Insert 306,Delete 2541,Find 1190,Insert 679,Insert 1182,Find 1405,Delete 2571,Find 683,Insert 3631,Find 859,Insert 1832,Insert 1790,Insert 3068,Find 1649,Find 1998,Insert 2545,Find 1271,Insert 1509,Insert 1998,Insert 1618,Find 719,Delete 86,Insert 3521,Find 2713,Find 1507,Insert 1847,Insert 2819,Insert 2904,Delete 469,Find 316,Insert 3999,Insert 2694,Insert 1188,Insert 3830,Insert 2548,Find 521,Insert 1344,Insert 2573,Insert 2319,Insert 3262,Insert 2886,Insert 155,Find 1094,Insert 1826,Delete 3956,Find 1455,Find 1735,Find 524,Find 3504,Find 1509,Insert 1228,Delete 497,Find 1900,Insert 1567,Insert 2873,Insert 3370,Insert 194,Find 3171,Insert 1930,Insert 255,Insert 1079,Insert 370,Insert 3094,Insert 1095,Find 692,Insert 1773,Insert 3464,Insert 1238,Delete 1065,Find 750,Find 2615,Insert 2719,Find 265,Find 3361,Insert 1267,Find 3726,Insert 2223,Find 3636,Delete 2690,Insert 1588,Insert 3190,Find 1775,Find 2177,Insert 59,Find 1219,Insert 1491,Insert 514,Insert 1641,Find 3362,Insert 2866,Insert 1764,Delete 1191,Insert 3780,Insert 860,Insert 1373,Insert 2720,Insert 369,Insert 1637,Insert 2055,Insert 1173,Find 1896,Delete 243,Insert 3303,Find 30,Insert 2412,Find 221,Insert 3212,Delete 9,Find 133,Insert 1640,Insert 1219,Insert 103,Find 2905,Find 1301,Insert 855,Insert 2675,Delete 450,Find 1163,Insert 3555,Delete 3009,Insert 2859,Insert 2072,Find 1433,Insert 3274,Find 2413,Find 2642,Insert 1497,Insert 1192,Find 1061,Find 2251,Delete 1678,Insert 2758,Delete 825,Insert 2648,Insert 2326,Insert 1953,Find 1052,Insert 1827,Insert 2678,Find 3535,Insert 3530,Delete 3326,Find 1961,Insert 3718,Insert 2914,Insert 3412,Insert 1175,Insert 2594,Find 1011,Delete 2627,Insert 3238,Insert 58,Insert 769,Find 882,Insert 3024,Find 1929,Insert 443,Find 3827,Find 2859,Find 1993,Find 407,Insert 2437,Insert 703,Insert 1959,Insert 1085,Find 1316,Insert 3623,Insert 2144,Find 3574,Insert 3069,Insert 832,Insert 1959,Insert 1475,Find 1806,Insert 2155,Insert 3088,Delete 3625,Find 3885,Find 826,Insert 209,Insert 3093,Delete 2378,Insert 1590,Delete 3278,Insert 3594,Find 89,Find 190,Insert 1443,Find 3927,Insert 1664,Insert 3476,Find 916,Find 1674,Find 2576,Insert 3376,Insert 2053,Insert 214,Insert 1833,Delete 1672,Find 923,Find 3559,Insert 386,Insert 2501,Find 1749,Insert 487,Insert 3362,Find 2366,Insert 1853,Find 1061,Insert 3966,Find 1495,Find 1858,Insert 3859,Find 2071,Insert 2377,Insert 3212,Insert 436,Insert 3944,Insert 1386,Insert 893,Insert 1683,Insert 3492,Insert 2413,Insert 2339,Insert 1947,Delete 2693,Insert 1340,Find 715,Delete 2360,Insert 3602,Insert 1618,Insert 2606,Insert 2505,Find 1246,Insert 190,Find 2843,Insert 3102,Insert 3052,Find 1010,Insert 927,Find 482,Insert 1915,Insert 1970,Find 930,Find 3723,Find 3990,Find 2327,Insert 1492,Find 2754,Insert 329,Insert 2208,Insert 2706,Find 2752,Insert 2865,Delete 2664,Delete 3570,Find 3391,Insert 1169,Insert 788,Find 3797,Find 1370,Insert 3499,Find 3558,Find 3540,Find 2935,Insert 2191,Delete 3336,Find 3672,Find 980,Insert 689,Insert 921,Insert 1244,Insert 456,Delete 3079,Insert 3619,Insert 2021,Delete 222,Find 2026,Insert 3500,Find 1952,Delete 1756,Insert 3690,Insert 2649,Insert 1856,Insert 695,Insert 2096,Delete 3458,Insert 2953,Insert 3664,Insert 2786,Delete 699,Find 1904,Find 1183,Find 956,Find 1819,Delete 2901,Find 670,Find 1476,Insert 46,Delete 3088,Insert 680,Delete 1119,Insert 1830,Delete 258,Find 2574,Insert 1215,Find 2408,Find 1006,Delete 3054,Delete 1099,Insert 1575,Insert 2369,Delete 3249,Insert 1521,Insert 364,Insert 2692,Insert 389,Insert 2289,Find 737,Insert 3674,Find 3416,Find 3366,Insert 2294,Find 952,Insert 1098,Find 2180,Insert 3646,Find 1376,Insert 2956,Insert 1080,Insert 3566,Find 2536,Find 1953,Find 3507,Insert 1713,Insert 1566,Insert 3090,Insert 862,Insert 3751,Insert 2063,Insert 633,Insert 1560,Insert 2376,Find 2002,Insert 1226,Insert 2252,Insert 2647,Find 2369,Insert 954,Delete 2632,Find 3196,Insert 3331,Insert 388,Find 2294,Insert 412,Delete 914,Insert 3428,Insert 1738,Insert 2291,Insert 2177,Insert 1717,Delete 3201,Delete 3008,Find 3124,Insert 1906,Insert 2932,Delete 1339,Insert 671,Insert 224,Insert 3345,Insert 180,Delete 3674,Insert 1855,Find 647,Find 68,Insert 2938,Find 3981,Find 2216,Insert 393,Insert 1912,Insert 2400,Insert 1523,Delete 1646,Find 925,Find 1375,Delete 1352,Insert 1505,Delete 3546,Insert 362,Delete 3006,Insert 3004,Insert 1947,Delete 55,Insert 2634,Insert 280,Find 3526,Delete 2638,Insert 597,Find 3984,Insert 190,Find 2017,Find 3592,Insert 3699,Insert 2378,Find 973,Find 1164,Delete 3238,Insert 1888,Find 1955,Insert 3086,Insert 2086,Insert 2053,Insert 1038,Insert 2035,Insert 953,Find 3189,Insert 2524,Find 3037,Delete 3948,Find 3726,Delete 3511,Insert 1509,Find 1378,Insert 1816,Delete 1233,Delete 1274,Find 2178,Insert 2692,Find 268,Find 2781,Find 1411,Find 3858,Insert 1851,Insert 91,Find 1209,Find 2930,Insert 1159,Find 1752,Find 3872,Insert 679,Find 2571,Delete 2023,Insert 1155,Insert 2071,Delete 1739,Insert 234,Insert 159,Insert 764,Insert 3674,Insert 3780,Insert 3071,Delete 21,Insert 1096,Insert 669,Insert 1017,Insert 3971,Insert 2130,Insert 3858,Find 2793,Insert 1222,Insert 9,Find 2179,Insert 230,Insert 1907,Delete 3758,Insert 666,Insert 3917,Find 3950,Find 301,Insert 1180,Find 1116,Find 3314,Insert 3293,Find 1685,Insert 2527,Find 4000,Find 3725,Find 2024,Find 1159,Insert 1280,Insert 1261,Insert 915,Insert 2493,Insert 3878,Delete 2515,Find 2743,Find 1162,Delete 1124,Find 547,Insert 2570,Insert 1590,Insert 1074,Find 1623,Delete 1821,Find 3718,Insert 2263,Insert 3443,Delete 308,Delete 103,Find 3234,Delete 3153,Insert 1312,Insert 3627,Insert 84,Insert 2344,Find 1161,Find 1692,Find 3118,Insert 552,Insert 3336,Insert 2763,Insert 3094,Insert 1111,Delete 1434,Insert 74,Insert 1028,Insert 972,Insert 3626,Insert 3702,Find 608,Insert 2853,Insert 2127,Insert 3355,Insert 2984,Insert 2048,Insert 3001,Delete 511,Insert 297,Delete 2389,Find 3638,Insert 3270,Insert 1268,Delete 2058,Insert 2265,Insert 2878,Insert 304,Find 3742,Insert 266,Insert 2656,Insert 2474,Insert 714,Find 1415,Insert 847,Delete 2123,Insert 832,Delete 707,Delete 139,Find 994,Insert 458,Find 1809,Insert 1153,Delete 1587,Insert 876,Insert 645,Find 931,Insert 715,Insert 2679,Insert 316,Insert 1909,Insert 3169,Insert 926,Insert 3715,Insert 986,Insert 1669,Find 563,Insert 1801,Find 1302,Insert 1891,Insert 1813,Find 2343,Find 2320,Find 1553,Insert 365,Find 1119,Find 3331,Find 2157,Insert 540,Find 3024,Delete 3552,Find 1741,Delete 3982,Insert 1991,Insert 2013,Insert 3536,Insert 1140,Insert 389,Insert 1765,Find 576,Delete 3087,Find 288,Find 3042,Insert 247,Insert 23,Find 218,Delete 1930,Insert 1662,Insert 2319,Insert 3163,Insert 2126,Delete 106,Insert 3563,Insert 640,Delete 983,Find 981,Delete 573,Insert 871,Find 73,Delete 2218,Insert 2060,Insert 2664,Find 1238,Delete 2099,Insert 2915,Insert 3361,Delete 3130,Find 662,Insert 3199,Insert 311,Find 619,Find 441,Insert 2038,Delete 1177,Insert 545,Insert 733,Insert 1832,Insert 3529,Find 1239,Insert 2675,Find 782,Insert 310,Insert 697,Find 3803,Delete 3845,Insert 2489,Insert 474,Insert 739,Insert 364,Insert 3241,Insert 2266,Insert 1494,Find 1828,Delete 1648,Insert 3740,Delete 3051,Insert 1078,Insert 2684,Insert 2198,Insert 1518,Delete 3967,Insert 1098,Find 718,Delete 504,Insert 3887,Find 3675,Insert 1575,Insert 2768,Insert 3568,Insert 2083,Delete 2696,Insert 2375,Delete 2888,Insert 543,Find 2645,Find 3931,Find 2403,Find 304,Delete 1175,Insert 2413,Insert 2363,Insert 2635,Find 3664,Delete 3380,Insert 1956,Insert 3510,Insert 1630,Find 358,Insert 1882,Insert 2690,Delete 2925,Find 3960,Insert 3862,Insert 429,Find 2267,Insert 1679,Insert 1597,Delete 2290,Insert 709,Insert 82,Find 2059,Insert 1793,Delete 1958,Insert 1105,Insert 2112,Insert 1420,Find 1730,Find 44,Find 1826,Find 3088,Insert 863,Find 1213,Delete 3475,Insert 1945,Insert 3485,Find 593,Find 3343,Insert 823,Insert 2600,Insert 1213,Insert 2185,Find 2686,Insert 2036,Find 1917,Insert 2230,Find 2932,Insert 3918,Insert 2918,Insert 2348,Find 1245,Find 845,Insert 3269,Insert 2566,Insert 2254,Delete 2196,Insert 3165,Delete 1825,Insert 315,Insert 759,Insert 2061,Find 3390,Insert 3330,Find 2621,Insert 3748,Insert 3956,Insert 3472,Insert 2985,Insert 2284,Insert 59,Insert 1092,Delete 2075,Insert 828,Insert 2222,Find 1276,Find 3109,Insert 3468,Insert 1115,Find 2480,Insert 2570,Find 2533,Insert 881,Insert 3722,Find 260,Find 2634,Insert 2603,Delete 2137,Insert 986,Insert 3650,Find 1053,Insert 945,Insert 3833,Find 75,Find 3585,Find 1524,Insert 1684,Find 3001,Delete 2385,Insert 943,Insert 3144,Insert 93,Find 916,Delete 1315,Delete 50,Delete 1545,Insert 48,Delete 1397,Insert 1363,Insert 888,Find 3131,Find 1000,Insert 3635,Insert 1259,Find 190,Insert 3908,Insert 284,Insert 1327,Insert 903,Insert 3755,Insert 1916,Delete 2062,Insert 605,Insert 3197,Find 1469,Find 3335,Find 3799,Insert 3225,Insert 1706,Insert 3721,Insert 237,Find 2996,Find 2929,Insert 1968,Find 2103,Insert 1408,Find 1816,Delete 2306,Insert 314,Insert 1856,Delete 1027,Insert 1935,Insert 855,Delete 2777,Insert 285,Delete 2427,Insert 962,Insert 1372,Delete 1943,Insert 2193,Insert 292,Insert 1620,Insert 2242,Insert 326,Insert 2531,Delete 128,Insert 119,Insert 3350,Insert 1381,Insert 75,Insert 1814,Find 2455,Insert 2282,Find 668,Find 685,Insert 1140,Insert 2937,Insert 1311,Insert 954,Insert 1843,Insert 3207,Insert 362,Insert 1747,Find 3602,Insert 1084,Insert 495,Insert 687,Find 627,Delete 2695,Insert 3743,Delete 1082,Insert 3190,Insert 2470,Insert 1299,Insert 2334,Insert 2774,Insert 3782,Insert 3055,Insert 93,Insert 3527,Find 234,Find 1292,Insert 2365,Delete 2358,Delete 1879,Insert 3570,Insert 2306,Delete 2260,Insert 2729,Insert 788,Find 1286,Find 241,Insert 3556,Find 3631,Insert 2260,Insert 3311,Insert 2672,Insert 2198,Insert 775,Delete 2921,Insert 3063,Insert 3407,Insert 1668,Insert 1120,Find 3022,Delete 2975,Delete 3393,Insert 1890,Delete 3483,Insert 665,Insert 1793,Find 6,Delete 2720,Insert 2388,Insert 3535,Insert 3441,Find 3747,Insert 3968,Insert 2849,Insert 3599,Insert 1467,Find 513,Find 3486,Insert 762,Insert 1193,Insert 39,Insert 185,Insert 2077,Insert 3385,Find 3804,Insert 563,Insert 2306,Insert 220,Find 3400,Find 1770,Insert 1061,Insert 538,Insert 1772,Find 1401,Find 815,Insert 32,Insert 3593,Insert 556,Insert 2672,Find 1294,Insert 132,Find 603,Insert 3483,Delete 1690,Insert 3787,Delete 3658,Delete 1746,Insert 1797,Insert 3047,Insert 1460,Insert 768,Insert 578,Delete 1301,Find 1162,Insert 549,Insert 2799,Delete 1207,Find 612,Insert 1461,Find 2057,Delete 2520,Insert 2790,Insert 2312,Insert 2488,Insert 2196,Insert 3817,Find 2432,Insert 767,Insert 2100,Insert 1409,Delete 1982,Insert 1306,Insert 1320,Find 249,Insert 1551,Insert 3656,Delete 24,Delete 2262,Insert 3752,Find 1455,Delete 3616,Delete 1168,Insert 1979,Find 1947,Find 1207,Insert 3209,Insert 1021,Delete 2324,Insert 2750,Delete 387,Insert 1488,Insert 1617,Find 937,Find 1582,Insert 2174,Find 3419,Insert 3957,Find 352,Find 2505,Insert 2353,Insert 156,Delete 467,Insert 3977,Find 1748,Insert 3774,Find 79,Insert 1626,Delete 1960,Delete 2604,Insert 2344,Insert 2070,Find 2261,Insert 1226,Insert 2591,Insert 3886,Delete 1570,Find 1879,Find 2344,Delete 1474,Find 1824,Insert 1438,Delete 1293,Insert 2019,Insert 3545,Insert 2061,Find 2405,Delete 1580,Find 1170,Insert 115,Insert 2086,Insert 1027,Insert 3388,Insert 1961,Insert 3884,Find 2860,Find 3079,Find 2912,Insert 3955,Delete 381,Insert 2363,Insert 1678,Insert 2579,Delete 2650,Find 1326,Insert 2602,Delete 260,Find 1048,Insert 1903,Insert 2419,Insert 1354,Find 892,Delete 502,Find 485,Insert 2515,Insert 283,Insert 1545,Find 3603,Delete 3932,Insert 3945,Delete 3756,Insert 3311,Insert 2814,Insert 3008,Insert 209,Insert 691,Find 1099,Find 2660,Insert 105,Insert 604,Insert 1493,Insert 1936,Insert 727,Insert 1649,Delete 2370,Insert 3598,Find 3465,Insert 38,Insert 3426,Find 3059,Find 2743,Find 2764,Insert 409,Insert 3231,Insert 1390,Find 1068,Find 2222,Insert 2990,Insert 2799,Insert 2839,Find 813,Insert 1628,Insert 2117,Insert 3509,Find 1281,Insert 1576,Delete 1842,Insert 20,Insert 178,Insert 1499,Insert 1626,Delete 2087,Insert 194,Insert 2682,Insert 3277,Insert 316,Insert 2309,Find 173,Insert 2731,Delete 1429,Insert 2182,Insert 1372,Insert 1995,Find 2385,Insert 3706,Find 563,Find 1303,Find 3725,Insert 3116,Delete 2477,Find 3270,Find 2264,Insert 595,Insert 1558,Insert 831,Insert 3787,Find 3770,Insert 2987,Insert 3843,Insert 3803,Delete 3355,Insert 364,Find 1863,Insert 182,Find 2585,Insert 1274,Find 1511,Insert 1797,Insert 2090,Insert 2886,Find 1092,Find 2982,Insert 1313,Find 1177,Delete 1191,Insert 2402,Find 3793,Find 2315,Delete 2140,Insert 1084,Insert 3155,Insert 3393,Delete 490,Delete 3733,Insert 3399,Insert 3599,Delete 1209,Insert 3329,Find 496,Insert 1249,Insert 3328,Delete 3552,Insert 2604,Find 2815,Insert 3632,Find 45,Find 1961,Insert 3244,Insert 236,Find 1844,Find 2238,Delete 2742,Insert 589,Insert 791,Find 1897,Insert 1724,Delete 3650,Insert 408,Insert 2189,Insert 3631,Find 1946,Insert 2974,Find 1752,Insert 1690,Find 2904,Delete 2706,Find 2901,Delete 569,Delete 1231,Insert 1486,Delete 2806,Insert 1964,Insert 580,Find 1367,Insert 916,Find 3256,Find 3161,Insert 207,Delete 1783,Insert 997,Find 1767,Delete 2727,Find 614,Delete 2760,Delete 2781,Insert 3521,Insert 1679,Insert 2848,Insert 3747,Find 3998,Find 3321,Insert 389,Insert 347,Insert 2629,Insert 267,Insert 435,Insert 3434,Insert 917,Insert 2465,Find 979,Insert 649,Insert 2141,Insert 2487,Insert 1361,Insert 1091,Delete 146,Insert 3363,Insert 324,Find 1155,Find 2250,Find 1799,Find 2362,Insert 830,Insert 3311,Insert 239,Delete 3121,Find 3775,Find 2182,Find 785,Find 669,Insert 2879,Find 3355,Insert 2735,Insert 312,Find 1852,Delete 3704,Insert 3616,Delete 2398,Delete 183,Insert 415,Find 3282,Insert 1391,Find 3906,Delete 3730,Insert 2231,Find 3091,Insert 1348,Insert 725,Insert 1670,Insert 3008,Find 178,Find 3366,Insert 1213,Insert 2924,Insert 2252,Insert 1506,Insert 309,Insert 1748,Insert 1425,Delete 3256,Insert 3632,Insert 2940,Insert 1254,Find 136,Insert 3883,Insert 1795,Insert 1621,Insert 2058,Insert 2130,Insert 3688,Insert 1829,Delete 1337,Insert 2221,Insert 43,Delete 1960,Delete 2500,Delete 3443,Find 233,Insert 3577,Insert 3168,Find 3040,Insert 1818,Delete 894,Insert 3479,Insert 2861,Delete 224,Delete 1887,Find 3238,Find 1952,Insert 1771,Insert 1668,Insert 581,Insert 685,Insert 2700,Insert 2332,Insert 3784,Find 1791,Insert 459,Delete 2420,Find 2719,Find 3816,Find 342,Insert 299,Insert 1645,Insert 925,Delete 3932,Find 2449,Insert 2403,Find 1811,Insert 210,Insert 1155,Insert 317,Insert 3238,Insert 2976,Insert 3540,Insert 916,Insert 3751,Insert 121,Insert 2453,Insert 2705,Delete 839,Insert 2540,Insert 2838,Find 697,Find 3187,Find 2992,Insert 342,Find 1918,Insert 642,Find 3907,Insert 3666,Insert 1000,Insert 3600,Delete 279,Insert 2630,Delete 1328,Find 1861,Find 541,Insert 1513,Delete 197,Find 3679,Insert 3375,Find 1405,Find 2051,Insert 3938,Insert 2008,Delete 994,Delete 3720,Insert 2452,Insert 3390,Insert 216,Find 1907,Insert 809,Insert 1068,Insert 3402,Insert 2265,Insert 2176,Find 1860,Insert 2923,Insert 1913,Insert 1564,Insert 3047,Insert 562,Insert 1505,Find 2659,Insert 687,Insert 754,Find 2923,Insert 705,Find 2301,Insert 1323,Delete 3993,Find 2749,Insert 2629,Insert 158,Find 3554,Delete 1319,Insert 3451,Insert 2510,Delete 3362,Insert 789,Insert 2026,Find 832,Insert 3923,Find 3254,Insert 1605,Delete 2055,Insert 1958,Insert 3436,Insert 1766,Insert 3085,Insert 2680,Find 611,Find 2620,Insert 3151,Find 990,Find 1920,Insert 24,Insert 629,Delete 3483,Insert 2770,Insert 973,Find 1701,Insert 3707,Find 1849,Insert 3246,Insert 3641,Delete 3814,Insert 2360,Insert 2651,Insert 908,Find 2864,Insert 966,Insert 2391,Delete 2830,Find 1348,Find 859,Insert 2584,Find 1062,Find 2186,Insert 3714,Find 2987,Delete 2765,Find 739,Find 593,Insert 3653,Delete 3355,Find 1277,Insert 2848,Find 2717,Insert 547,Insert 1644,Insert 2739,Delete 895,Delete 3464,Find 2138,Insert 918,Insert 673,Find 757,Insert 2128,Insert 1027,Insert 1828,Insert 1937,Insert 2678,Insert 1876,Find 3421,Insert 3872,Insert 567,Insert 824,Insert 1606,Insert 1362,Find 799,Insert 3327,Insert 2475,Insert 2201,Insert 1893,Insert 1316,Find 862,Insert 2502,Find 3622,Find 2299,Delete 3184,Insert 2043,Insert 594,Find 1648,Insert 3986,Insert 740,Insert 1444,Find 1709,Find 1659,Delete 831,Find 2910,Insert 3009,Insert 3745,Insert 3737,Insert 202,Insert 2032,Delete 2814,Find 378,Insert 3838,Find 2417,Delete 3114,Insert 1241,Delete 880,Find 1739,Insert 1832,Insert 2237,Insert 3216,Find 2782,Find 2284,Delete 2763,Delete 2080,Find 1584,Insert 2256,Find 2230,Insert 2582,Insert 2795,Delete 2861,Insert 3326,Insert 3170,Insert 376,Insert 383,Insert 907,Find 1672,Find 3080,Find 3121,Insert 1286,Delete 2253,Find 2750,Insert 615,Find 3840,Insert 2639,Insert 3682,Delete 3207,Insert 1000,Find 579,Insert 1050,Insert 2402,Delete 453,Insert 1701,Find 384,Insert 660,Insert 3728,Insert 3563,Find 1419,Insert 2985,Find 1724,Find 2431,Delete 2706,Insert 3398,Find 1395,Insert 2900,Insert 2270,Insert 2866,Find 1824,Insert 3219,Insert 2933,Insert 226,Insert 459,Insert 757,Insert 1858,Insert 3610,Insert 3405,Insert 2006,Insert 3520,Insert 2987,Find 1938,Insert 3152,Insert 2992,Find 1526,Insert 706,Insert 3128,Insert 2614,Find 1627,Delete 3012,Insert 885,Find 3425,Insert 3529,Insert 3199,Delete 618,Insert 1576,Find 2143,Insert 3980,Insert 1682,Find 1180,Find 415,Find 333,Insert 2413,Delete 1398,Insert 1974,Find 703,Insert 3234,Delete 3076,Find 1575,Find 3636,Find 2885,Insert 2181,Insert 1976,Insert 2887,Insert 1352,Find 2096,Insert 1559,Find 2993,Insert 2405,Insert 1030,Insert 2855,Delete 917,Insert 916,Delete 2773,Delete 1548,Insert 1557,Find 1212,Insert 2742,Insert 3802,Insert 3692,Insert 1658,Find 60,Delete 3517,Insert 1818,Delete 1392,Insert 897,Find 985,Insert 159,Delete 70,Find 3775,Find 460,Insert 1609,Delete 2861,Delete 1811,Insert 2892,Insert 3727,Find 30,Find 3973,Insert 146,Insert 3025,Find 186,Insert 1464,Insert 2917,Insert 2627,Insert 2455,Insert 1986,Insert 107,Insert 1601,Insert 819,Delete 669,Insert 2155,Find 2346,Find 1316,Insert 395,Insert 3030,Insert 2925,Insert 2529,Insert 2467,Find 3993,Find 2893,Delete 3242,Insert 257,Find 253,Find 2506,Find 2877,Find 2688,Insert 487,Insert 3978,Insert 276,Find 1466,Insert 1337,Insert 792,Insert 1813,Insert 2361,Delete 2231,Delete 8,Find 973,Insert 3557,Insert 784,Insert 1547,Insert 241,Insert 2492,Insert 2403,Insert 2745,Insert 2008,Find 1041,Delete 188,Find 2046,Find 1708,Delete 2679,Delete 2699,Find 3114,Find 149,Insert 2863,Insert 1690,Insert 2412,Delete 366,Insert 2,Find 986,Insert 375,Insert 3388,Insert 1786,Find 1976,Insert 1685,Insert 1203,Delete 1256,Insert 2645,Insert 3527,Find 648,Insert 3204,Insert 2838,Insert 3243,Find 2257,Find 1241,Insert 2258,Find 3707,Insert 3211,Insert 118,Insert 1473,Find 1784,Insert 262,Insert 1029,Delete 1568,Insert 358,Insert 2280,Find 1757,Insert 472,Insert 2394,Find 1754,Find 2133,Insert 1269,Find 3041,Insert 3869,Find 1783,Find 3664,Insert 2343,Insert 2101,Delete 1022,Find 1970,Delete 2254,Insert 1906,Find 2439,Delete 3343,Insert 3181,Insert 1823,Find 1208,Insert 877,Insert 767,Delete 3652,Insert 807,Find 2375,Find 2250,Insert 328,Delete 107,Find 2604,Find 3083,Insert 3051,Delete 3589,Find 2431,Find 1039,Insert 632,Find 566,Find 1523,Insert 2552,Insert 2278,Find 918,Delete 3561,Find 3664,Insert 3840,Insert 3218,Insert 1434,Find 224,Insert 28,Insert 931,Insert 2043,Delete 817,Insert 3881,Insert 26,Delete 3973,Insert 346,Find 1560,Delete 322,Insert 3569,Delete 1477,Delete 550,Delete 742,Insert 188,Find 2778,Find 405,Insert 527,Insert 1879,Insert 1181,Insert 1450,Find 1476,Find 20,Insert 2078,Find 1629,Insert 2690,Find 3741,Insert 840,Insert 1984,Find 1215,Delete 2985,Find 3482,Insert 1009,Insert 2454,Insert 2783,Insert 450,Insert 1646,Insert 1570,Insert 1674,Insert 941,Find 2377,Insert 246,Delete 3803,Insert 387,Insert 1340,Insert 2356,Find 2735,Insert 3147,Insert 2945,Insert 496,Insert 1685,Insert 3461,Insert 3730,Insert 3516,Delete 720,Find 273,Insert 645,Insert 2643,Insert 214,Insert 1505] diff --git a/testsuite/tests/concurrent/should_run/1980.hs b/testsuite/tests/concurrent/should_run/1980.hs new file mode 100644 index 0000000000..61fcd9d15b --- /dev/null +++ b/testsuite/tests/concurrent/should_run/1980.hs @@ -0,0 +1,13 @@ +import Control.Exception +import Control.Concurrent + +main = do + thr <- myThreadId + evaluate $ increase_stack 1000 + throwTo thr ThreadKilled + `Control.Exception.catch` (\e -> case e of + ThreadKilled -> return () + _ -> throw e) + where + increase_stack 0 = 1 + increase_stack n = increase_stack (n-1) + n diff --git a/testsuite/tests/concurrent/should_run/2910.hs b/testsuite/tests/concurrent/should_run/2910.hs new file mode 100644 index 0000000000..2867008159 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/2910.hs @@ -0,0 +1,9 @@ +import Control.Exception +import GHC.Conc + +main = do + t1 <- block $ forkIO yield + t2 <- forkIO $ killThread t1 + threadDelay 100000 + threadStatus t1 >>= print + threadStatus t2 >>= print diff --git a/testsuite/tests/concurrent/should_run/2910.stdout b/testsuite/tests/concurrent/should_run/2910.stdout new file mode 100644 index 0000000000..145fced527 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/2910.stdout @@ -0,0 +1,2 @@ +ThreadFinished +ThreadFinished diff --git a/testsuite/tests/concurrent/should_run/2910a.hs b/testsuite/tests/concurrent/should_run/2910a.hs new file mode 100644 index 0000000000..380c15467d --- /dev/null +++ b/testsuite/tests/concurrent/should_run/2910a.hs @@ -0,0 +1,9 @@ +import Control.Exception +import GHC.Conc + +main = do + t1 <- mask_ $ forkIO yield + t2 <- forkIO $ killThread t1 + threadDelay 100000 + threadStatus t1 >>= print + threadStatus t2 >>= print diff --git a/testsuite/tests/concurrent/should_run/2910a.stdout b/testsuite/tests/concurrent/should_run/2910a.stdout new file mode 100644 index 0000000000..145fced527 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/2910a.stdout @@ -0,0 +1,2 @@ +ThreadFinished +ThreadFinished diff --git a/testsuite/tests/concurrent/should_run/3279.hs b/testsuite/tests/concurrent/should_run/3279.hs new file mode 100644 index 0000000000..279895f444 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/3279.hs @@ -0,0 +1,25 @@ +-- test for #3279 + +import System.IO.Unsafe +import GHC.Conc +import Control.Exception +import Prelude hiding (catch) + +f :: Int +f = (1 +) . unsafePerformIO $ do + error "foo" `catch` \(SomeException e) -> do + myThreadId >>= flip throwTo e + -- point X + unblock $ return 1 + +main :: IO () +main = do + evaluate f `catch` \(SomeException e) -> return 0 + -- the evaluation of 'x' is now suspended at point X + tid <- block $ forkIO (evaluate f >> return ()) + killThread tid + -- now execute the 'unblock' above with a pending exception + yield + -- should print 1 + 1 = 2 + print f + diff --git a/testsuite/tests/concurrent/should_run/3279.stdout b/testsuite/tests/concurrent/should_run/3279.stdout new file mode 100644 index 0000000000..0cfbf08886 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/3279.stdout @@ -0,0 +1 @@ +2 diff --git a/testsuite/tests/concurrent/should_run/3429.hs b/testsuite/tests/concurrent/should_run/3429.hs new file mode 100644 index 0000000000..8b12a8b1ff --- /dev/null +++ b/testsuite/tests/concurrent/should_run/3429.hs @@ -0,0 +1,22 @@ +import Control.Monad +import Control.Concurrent +import Control.Concurrent.MVar +import Control.Exception +import System.IO + +main :: IO () +main = do hSetBuffering stdout NoBuffering + replicateM_ 1000 doit + +doit :: IO () +doit = do v <- newMVar () + t <- forkIO (foo v) + threadDelay 1000 + killThread t + takeMVar v + putChar '.' + +foo :: MVar () -> IO () +foo v = do let loop = do withMVar v $ \x -> evaluate x + loop + loop diff --git a/testsuite/tests/concurrent/should_run/3429.stdout b/testsuite/tests/concurrent/should_run/3429.stdout new file mode 100644 index 0000000000..ad88db8c31 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/3429.stdout @@ -0,0 +1 @@ +........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
\ No newline at end of file diff --git a/testsuite/tests/concurrent/should_run/4030.hs b/testsuite/tests/concurrent/should_run/4030.hs new file mode 100644 index 0000000000..1993bad86b --- /dev/null +++ b/testsuite/tests/concurrent/should_run/4030.hs @@ -0,0 +1,8 @@ +module Main where + +import Control.Concurrent ( forkIO, killThread ) +import Control.Exception ( block ) + +main :: IO () +main = do tid <- block $ forkIO $ let x = x in x + killThread tid diff --git a/testsuite/tests/concurrent/should_run/4030.stderr b/testsuite/tests/concurrent/should_run/4030.stderr new file mode 100644 index 0000000000..0e2a7bfc12 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/4030.stderr @@ -0,0 +1 @@ +4030: <<loop>> diff --git a/testsuite/tests/concurrent/should_run/4262.hs b/testsuite/tests/concurrent/should_run/4262.hs new file mode 100644 index 0000000000..e114b558a6 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/4262.hs @@ -0,0 +1,27 @@ +{-# LANGUAGE ForeignFunctionInterface #-} +module Main where + +-- Tests that superfluous worker threads are discarded rather than +-- being kept around by the RTS. + +import Control.Concurrent +import Control.Monad +import Foreign.C.Types +import System.Mem +import System.Posix.Process +import System.Directory +import Control.Concurrent.QSem + +foreign import ccall safe sleep :: CUInt -> IO () + +main = do + let amount = 200 + qsem <- newQSem 0 + replicateM_ amount . forkIO $ (sleep 2 >> signalQSem qsem) + replicateM_ amount $ waitQSem qsem + -- POSIX only: check thread usage manually + pid <- getProcessID + let dir = "/proc/" ++ show pid ++ "/task" + contents <- getDirectoryContents dir + let status = length contents - 2 -- . and .. + print status diff --git a/testsuite/tests/concurrent/should_run/4262.stdout b/testsuite/tests/concurrent/should_run/4262.stdout new file mode 100644 index 0000000000..45a4fb75db --- /dev/null +++ b/testsuite/tests/concurrent/should_run/4262.stdout @@ -0,0 +1 @@ +8 diff --git a/testsuite/tests/concurrent/should_run/4811.hs b/testsuite/tests/concurrent/should_run/4811.hs new file mode 100644 index 0000000000..5aad0a51df --- /dev/null +++ b/testsuite/tests/concurrent/should_run/4811.hs @@ -0,0 +1,14 @@ +import Control.Concurrent +import Control.Monad + +-- tests for a bug where throwTo targets a thread just created by +-- forkOn, which is still in the process of migrating to another CPU (#4811) + +main = do + m <- newEmptyMVar + forkOn 0 $ do + replicateM_ 1000 $ do + t <- forkOn 1 $ return () + killThread t + putMVar m () + takeMVar m diff --git a/testsuite/tests/concurrent/should_run/4813.hs b/testsuite/tests/concurrent/should_run/4813.hs new file mode 100644 index 0000000000..db3a9778c6 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/4813.hs @@ -0,0 +1,12 @@ +import Control.Concurrent +import Control.Monad +import Control.Exception +import System.Mem + +-- caused an assertion failure with -debug in 7.0.1 (#4813) + +main = do + m <- newEmptyMVar + ts <- replicateM 100 $ mask_ $ forkIO $ threadDelay 100000; putMVar m () + mapM_ killThread (reverse (init ts)) + takeMVar m diff --git a/testsuite/tests/concurrent/should_run/Makefile b/testsuite/tests/concurrent/should_run/Makefile new file mode 100644 index 0000000000..c6bef49619 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/Makefile @@ -0,0 +1,6 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + +conc059_setup : + '$(TEST_HC)' $(TEST_HC_OPTS) -c conc059.hs diff --git a/testsuite/tests/concurrent/should_run/all.T b/testsuite/tests/concurrent/should_run/all.T new file mode 100644 index 0000000000..cdcbd6da68 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/all.T @@ -0,0 +1,200 @@ +# ----------------------------------------------------------------------------- +# These tests we do even for 'make fast' + +test('conc003', normal, compile_and_run, ['']) +test('conc006', normal, compile_and_run, ['']) +test('conc027', normal, compile_and_run, ['']) +test('conc051', normal, compile_and_run, ['']) + +if ('threaded1' in config.run_ways): + only_threaded_ways = only_ways(['ghci','threaded1','threaded2']) +else: + only_threaded_ways = skip + +test('conc069', only_threaded_ways, compile_and_run, ['']) +test('conc069a', only_threaded_ways, compile_and_run, ['']) +# this test gives slightly different results for non-threaded ways, so omit +# those for now. +test('conc070', only_threaded_ways, compile_and_run, ['']) + +test('conc071', omit_ways(['threaded2']), compile_and_run, ['']) +test('conc072', only_ways(['threaded2']), compile_and_run, ['']) + +test('1980', normal, compile_and_run, ['']) +test('2910', normal, compile_and_run, ['']) +test('2910a', normal, compile_and_run, ['']) +test('3279', normal, compile_and_run, ['']) + +# This test takes a long time with the default context switch interval +test('3429', extra_run_opts('+RTS -i0.001 -RTS'), compile_and_run, ['']) + +# without -O, goes into an infinite loop +# GHCi cannot deterct the infinite loop, because the thread is always reachable +# (see also conc033 and others). We should really fix this. +test('4030', omit_ways('ghci'), compile_and_run, ['-O']) + +# each of these runs for about a second +test('throwto001', [reqlib('random'), extra_run_opts('1000 2000')], + compile_and_run, ['']) +test('throwto002', [reqlib('random'), ignore_output], compile_and_run, ['']) +test('throwto003', normal, compile_and_run, ['']) + +test('mask001', normal, compile_and_run, ['']) +# ghci does not generate the BlockedIndefinitely exceptions, so omit: +test('mask002', omit_ways(['ghci']), compile_and_run, ['']) + +test('async001', normal, compile_and_run, ['']) + +test('numsparks001', only_ways(['threaded1']), compile_and_run, ['']) + +test('4262', [ skip, # skip for now, it doesn't give reliable results + only_ways(['threaded1']), + unless_os('linux',skip), + if_compiler_lt('ghc', '7.1', expect_fail) ], + compile_and_run, ['']) + +test('4813', normal, compile_and_run, ['']) +test('4811', normal, compile_and_run, ['']) + +test('allowinterrupt001', normal, compile_and_run, ['']) + +# ----------------------------------------------------------------------------- +# These tests we only do for a full run + +def f( opts ): + if config.fast: + opts.skip = 1 + +setTestOpts(f) + +test('conc001', normal, compile_and_run, ['']) +test('conc002', normal, compile_and_run, ['']) + +# Omit GHCi way - it blows up to 0.5G. Something to do with the threaded RTS? +test('conc004', omit_ways(['ghci']), compile_and_run, ['']) + +test('conc007', compose(only_compiler_types(['ghc']), + extra_run_opts('+RTS -H128M -RTS')), + compile_and_run, ['']) +test('conc008', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc009', compose(only_compiler_types(['ghc']), exit_code(1)), + compile_and_run, ['']) +test('conc010', only_compiler_types(['ghc']), compile_and_run, ['']) + +# conc012(ghci) needs a smaller stack, or it takes forever +test('conc012', normal, compile_and_run, ['+RTS -K8m -RTS']) + +test('conc013', only_compiler_types(['ghc']), compile_and_run, ['']) + +test('conc014', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc015', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc015a', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc016', [ omit_ways(['threaded2']), # see comment in conc016.hs + only_compiler_types(['ghc']) ], compile_and_run, ['']) +test('conc017', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc017a', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc018', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc019', compose(only_compiler_types(['ghc']), + extra_run_opts('+RTS -K16m -RTS')), + compile_and_run, ['']) +test('conc020', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc021', compose(omit_ways(['ghci']), exit_code(1)), + compile_and_run, ['']) +test('conc022', only_compiler_types(['ghc']), compile_and_run, ['']) + +# On Windows, the non-threaded RTS creates a real OS thread for each +# threadDelay. conc023 creates 5000 concurrent threadDelays, and the +# resulting creation of OS threads seems to cause the system to run +# out of memory sometimes (I'm not sure exactly how/why this happens, +# but the threaded RTS fixes it). See #1197. +if config.platform == 'i386-unknown-mingw32': + conc023_ways = only_ways(['threaded1','threaded2']) +else: + conc023_ways = normal + +test('conc023', composes([skip_if_fast, + only_compiler_types(['ghc']), + conc023_ways]), compile_and_run, ['']) + +test('conc024', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc025', normal, compile_and_run, ['']) +test('conc026', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc028', normal, compile_and_run, ['']) +test('conc029', normal, compile_and_run, ['']) +test('conc030', compose(only_compiler_types(['ghc']), + extra_run_opts('+RTS -K4M -RTS')), + compile_and_run, ['']) + +test('conc031', normal, compile_and_run, ['']) + +test('conc032', only_compiler_types(['ghc']), compile_and_run, ['']) + +# Omit for GHCi, because it just sits there waiting for you to press ^C +test('conc033', omit_ways(['ghci']), compile_and_run, ['']) + +# Omit for GHCi, because it just sits there waiting for you to press ^C +test('conc034', compose(only_compiler_types(['ghc']), + compose(omit_ways(['ghci']), + extra_run_opts('+RTS -C0 -RTS'))), + compile_and_run, ['']) + +test('conc035', only_compiler_types(['ghc']), compile_and_run, ['']) + +# Omit for GHCi: firstly GHCi doesn't have unsafe FFI calls, and secondly +# the main thread cannot receive the deadlock exception because it can be +# woken up by ^C. +# Omit for threaded2: this test is really bogus and fails to do anything +# sensible for more than one CPU. +test('conc036', compose(skip_if_fast, + compose(omit_ways(['ghci','threaded2']), + only_compiler_types(['ghc']))), compile_and_run, ['']) +# Interrupting foreign calls only makes sense if we are threaded +test('foreignInterruptible', composes([skip_if_fast, + only_threaded_ways, + only_compiler_types(['ghc'])]), compile_and_run, ['']) + +test('conc037', only_ways(['threaded1','threaded2']), compile_and_run, ['']) +test('conc038', only_ways(['threaded1','threaded2']), compile_and_run, ['']) + +# Omit for GHCi, uses foreign export +# Omit for the threaded ways, because in this case the main thread is allowed to +# complete, which causes the child thread to be interrupted. +test('conc039', omit_ways(['ghci','threaded1','threaded2','profthreaded']), compile_and_run, ['']) + +# Omit for GHCi, uses foreign export +test('conc040', compose(only_compiler_types(['ghc']), + compose(exit_code(1), + omit_ways(['ghci']))), + compile_and_run, ['']) + +# STM-related tests. +test('conc041', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc042', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc043', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc044', only_compiler_types(['ghc']), compile_and_run, ['']) +test('conc045', only_compiler_types(['ghc']), compile_and_run, ['']) + +test('conc058', only_compiler_types(['ghc']), compile_and_run, ['']) + +test('conc059', + [only_compiler_types(['ghc']), + only_ways(['threaded1','threaded2']), + compile_cmd_prefix('$MAKE conc059_setup && '), + extra_clean(['conc059_c.o'])], + compile_and_run, + ['conc059_c.c -no-hs-main']) + +# This test sometimes just exits successfully +# when run the threaded2 way. The problem hasn't been diagnosed yet +test('conc064', + exit_code(1), + compile_and_run, ['']) + +test('conc065', ignore_output, compile_and_run, ['']) +test('conc066', ignore_output, compile_and_run, ['']) +test('conc067', ignore_output, compile_and_run, ['']) + +# omit threaded2, the behaviour of this test is non-deterministic with more +# than one CPU. +test('conc068', [ omit_ways('threaded2'), exit_code(1) ], compile_and_run, ['']) + diff --git a/testsuite/tests/concurrent/should_run/allowinterrupt001.hs b/testsuite/tests/concurrent/should_run/allowinterrupt001.hs new file mode 100644 index 0000000000..938aa65383 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/allowinterrupt001.hs @@ -0,0 +1,13 @@ +import Control.Exception +import Control.Concurrent +import GHC.Conc +import Control.Monad + +nfib n = if n < 2 then 1 else nfib (n-2) + nfib (n-1) + +main = do + t <- mask_ $ forkIO $ forM_ [1..] $ \n -> nfib n `seq` allowInterrupt + killThread t + let loop = do r <- threadStatus t + when (r /= ThreadFinished) $ do yield; loop + loop diff --git a/testsuite/tests/concurrent/should_run/async001.hs b/testsuite/tests/concurrent/should_run/async001.hs new file mode 100644 index 0000000000..7d765e26f9 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/async001.hs @@ -0,0 +1,19 @@ +import Control.Exception as E +import Control.Concurrent +import System.IO.Unsafe + +-- x is killed during evaluation with an asynchronous exception, but +-- nevertheless gets overwritten with 'throw ThreadKilled' because the +-- async exception is re-thrown as a synchrnonous exception by +-- 'onException'. + +main = do + let x = unsafePerformIO $ + (do threadDelay 1000000; return 42) + `onException` return () + + t <- forkIO $ do evaluate x; return () + threadDelay 1000 + killThread t + + print x `E.catch` \e -> putStrLn ("main caught: " ++ show (e::SomeException)) diff --git a/testsuite/tests/concurrent/should_run/async001.stdout b/testsuite/tests/concurrent/should_run/async001.stdout new file mode 100644 index 0000000000..241be4a895 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/async001.stdout @@ -0,0 +1 @@ +main caught: thread killed diff --git a/testsuite/tests/concurrent/should_run/conc001.hs b/testsuite/tests/concurrent/should_run/conc001.hs new file mode 100644 index 0000000000..99488fb07b --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc001.hs @@ -0,0 +1,15 @@ +module Main where + +import Control.Concurrent + +-- two processes, one MVar communication. + +main = do + s <- newEmptyMVar + let + write = do + putMVar s "hello world\n" + + forkIO write + str <- takeMVar s + putStr str diff --git a/testsuite/tests/concurrent/should_run/conc001.stdout b/testsuite/tests/concurrent/should_run/conc001.stdout new file mode 100644 index 0000000000..3b18e512db --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc001.stdout @@ -0,0 +1 @@ +hello world diff --git a/testsuite/tests/concurrent/should_run/conc002.hs b/testsuite/tests/concurrent/should_run/conc002.hs new file mode 100644 index 0000000000..93efd6fe4c --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc002.hs @@ -0,0 +1,14 @@ +module Main where + +import Control.Concurrent + +main = do + c <- newChan + let writer = writeList2Chan c "Hello World\n" + forkIO writer + let reader = do char <- readChan c + if (char == '\n') + then return () + else do putChar char; reader + reader + diff --git a/testsuite/tests/concurrent/should_run/conc002.stdout b/testsuite/tests/concurrent/should_run/conc002.stdout new file mode 100644 index 0000000000..5e1c309dae --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc002.stdout @@ -0,0 +1 @@ +Hello World
\ No newline at end of file diff --git a/testsuite/tests/concurrent/should_run/conc003.hs b/testsuite/tests/concurrent/should_run/conc003.hs new file mode 100644 index 0000000000..c7b1f9a56c --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc003.hs @@ -0,0 +1,28 @@ +module Main where + +import Control.Concurrent + +-- simple handshaking using two MVars, +-- must context switch twice for each character. + +main = do + ready <- newEmptyMVar + datum <- newEmptyMVar + let + reader = do + putMVar ready () + char <- takeMVar datum + if (char == '\n') + then return () + else do putChar char; reader + + writer "" = do + takeMVar ready + putMVar datum '\n' + writer (c:cs) = do + takeMVar ready + putMVar datum c + writer cs + + forkIO reader + writer "Hello World" diff --git a/testsuite/tests/concurrent/should_run/conc003.stdout b/testsuite/tests/concurrent/should_run/conc003.stdout new file mode 100644 index 0000000000..5e1c309dae --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc003.stdout @@ -0,0 +1 @@ +Hello World
\ No newline at end of file diff --git a/testsuite/tests/concurrent/should_run/conc004.hs b/testsuite/tests/concurrent/should_run/conc004.hs new file mode 100644 index 0000000000..ec46c4ba73 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc004.hs @@ -0,0 +1,19 @@ +module Main where + +-- Test thread creation. +-- (from: Einar Wolfgang Karlsen <ewk@Informatik.Uni-Bremen.DE>) + +import Control.Concurrent + +main :: IO () +main = do + mvar <- newEmptyMVar + + let + spawner :: (IO () -> IO ThreadId) -> Int -> IO () + spawner c 0 = putMVar mvar () + spawner c n = do { c (spawner c (n-1)); return ()} + + spawner forkIO 100000 + takeMVar mvar + putStr "done" diff --git a/testsuite/tests/concurrent/should_run/conc004.stdout b/testsuite/tests/concurrent/should_run/conc004.stdout new file mode 100644 index 0000000000..348ebd9491 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc004.stdout @@ -0,0 +1 @@ +done
\ No newline at end of file diff --git a/testsuite/tests/concurrent/should_run/conc006.hs b/testsuite/tests/concurrent/should_run/conc006.hs new file mode 100644 index 0000000000..4a77b5fc95 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc006.hs @@ -0,0 +1,23 @@ +module Main where + +import Control.Concurrent + +-- This test hopefully exercises the black hole code. The main thread +-- forks off another thread and starts on a large computation. +-- The child thread attempts to get the result of the same large +-- computation (and should get blocked doing so, because the parent +-- won't have evaluated it yet). When the result is available, the +-- child passes it back to the parent who prints it out. + +test = sum [1..10000] + +main = do + x <- newEmptyMVar + forkIO (if test > 0 + then putMVar x test + else error "proc" + ) + if test > 0 -- evaluate test + then do result <- takeMVar x + print result + else error "main" diff --git a/testsuite/tests/concurrent/should_run/conc006.stdout b/testsuite/tests/concurrent/should_run/conc006.stdout new file mode 100644 index 0000000000..b9d569380c --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc006.stdout @@ -0,0 +1 @@ +50005000 diff --git a/testsuite/tests/concurrent/should_run/conc007.hs b/testsuite/tests/concurrent/should_run/conc007.hs new file mode 100644 index 0000000000..74535ebe6d --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc007.hs @@ -0,0 +1,23 @@ + +module Main where + +import Control.Concurrent +import Control.Exception as E + +choose :: a -> a -> IO a +choose a b = do + ready <- newMVar () + answer <- newEmptyMVar + a_id <- forkIO (a `seq` takeMVar ready >> putMVar answer a) + b_id <- forkIO (b `seq` takeMVar ready >> putMVar answer b) + it <- takeMVar answer + killThread a_id + killThread b_id + return it + +main = do + let big = sum [1..] + small = sum [1..42] + test1 <- choose big small + test2 <- choose small big + print (test1,test2) diff --git a/testsuite/tests/concurrent/should_run/conc007.stdout b/testsuite/tests/concurrent/should_run/conc007.stdout new file mode 100644 index 0000000000..ee81b5ecd3 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc007.stdout @@ -0,0 +1 @@ +(903,903) diff --git a/testsuite/tests/concurrent/should_run/conc008.hs b/testsuite/tests/concurrent/should_run/conc008.hs new file mode 100644 index 0000000000..66a4b5f973 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc008.hs @@ -0,0 +1,12 @@ + +module Main where + +import Control.Concurrent +import Control.Exception + +-- Send ourselves a KillThread signal, catch it and recover. + +main = do + id <- myThreadId + Control.Exception.catch (killThread id) $ + \e -> putStr (show (e::SomeException)) diff --git a/testsuite/tests/concurrent/should_run/conc008.stdout b/testsuite/tests/concurrent/should_run/conc008.stdout new file mode 100644 index 0000000000..faed5b894d --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc008.stdout @@ -0,0 +1 @@ +thread killed
\ No newline at end of file diff --git a/testsuite/tests/concurrent/should_run/conc009.hs b/testsuite/tests/concurrent/should_run/conc009.hs new file mode 100644 index 0000000000..94c7809332 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc009.hs @@ -0,0 +1,9 @@ + +module Main where + +import Control.Concurrent +import Control.Exception + +main = do + id <- myThreadId + throwTo id (ErrorCall "hello") diff --git a/testsuite/tests/concurrent/should_run/conc009.stderr b/testsuite/tests/concurrent/should_run/conc009.stderr new file mode 100644 index 0000000000..e42034eba1 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc009.stderr @@ -0,0 +1 @@ +conc009: hello diff --git a/testsuite/tests/concurrent/should_run/conc010.hs b/testsuite/tests/concurrent/should_run/conc010.hs new file mode 100644 index 0000000000..52acb97a35 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc010.hs @@ -0,0 +1,28 @@ + +module Main where + +import Control.Concurrent +import Control.Exception + +-- Raise an exception in another thread. We need a lot of synchronisation here: + +-- - an MVar for the second thread to block on which it waits for the +-- signal (block) + +-- - an MVar to signal the main thread that the second thread is ready to +-- accept the signal (ready) + +-- - an MVar to signal the main thread that the second thread has received +-- the signal (ready2). If we don't have this MVar, then the main +-- thread could exit before the second thread has time to print +-- the result. + +main = do + block <- newEmptyMVar + ready <- newEmptyMVar + ready2 <- newEmptyMVar + id <- forkIO (Control.Exception.catch (putMVar ready () >> takeMVar block) + (\e -> putStr (show (e::SomeException)) >> putMVar ready2 ())) + takeMVar ready + throwTo id (ErrorCall "hello") + takeMVar ready2 diff --git a/testsuite/tests/concurrent/should_run/conc010.stdout b/testsuite/tests/concurrent/should_run/conc010.stdout new file mode 100644 index 0000000000..b6fc4c620b --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc010.stdout @@ -0,0 +1 @@ +hello
\ No newline at end of file diff --git a/testsuite/tests/concurrent/should_run/conc012.hs b/testsuite/tests/concurrent/should_run/conc012.hs new file mode 100644 index 0000000000..a2f139e401 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc012.hs @@ -0,0 +1,23 @@ +module Main where + +import Control.Concurrent +import Control.Exception +--import GlaExts + +data Result = Died SomeException | Finished + +-- Test stack overflow catching. Should print "Died: stack overflow". + +stackoverflow :: Int -> Int +stackoverflow 0 = 1 +stackoverflow n = n + stackoverflow n + +main = do + let x = stackoverflow 1 + result <- newEmptyMVar + forkIO $ Control.Exception.catch (x `seq` putMVar result Finished) $ + \e -> putMVar result (Died e) + res <- takeMVar result + case res of + Died e -> putStr ("Died: " ++ show e ++ "\n") + Finished -> putStr "Ok.\n" diff --git a/testsuite/tests/concurrent/should_run/conc012.stdout b/testsuite/tests/concurrent/should_run/conc012.stdout new file mode 100644 index 0000000000..12e0c906fc --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc012.stdout @@ -0,0 +1 @@ +Died: stack overflow diff --git a/testsuite/tests/concurrent/should_run/conc013.hs b/testsuite/tests/concurrent/should_run/conc013.hs new file mode 100644 index 0000000000..ea2130ee47 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc013.hs @@ -0,0 +1,10 @@ +module Main where + +-- !!! test Eq and Ord instances over thread Ids. + +import Control.Concurrent + +main = do + tso1 <- forkIO (return ()) + tso2 <- forkIO (return ()) + print [compare tso1 tso2, compare tso1 tso1, compare tso2 tso1] diff --git a/testsuite/tests/concurrent/should_run/conc013.stdout b/testsuite/tests/concurrent/should_run/conc013.stdout new file mode 100644 index 0000000000..98ab9c11f2 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc013.stdout @@ -0,0 +1 @@ +[LT,EQ,GT] diff --git a/testsuite/tests/concurrent/should_run/conc014.hs b/testsuite/tests/concurrent/should_run/conc014.hs new file mode 100644 index 0000000000..76cb3c24b0 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc014.hs @@ -0,0 +1,27 @@ +import Control.Concurrent +import Control.Exception + +-- Test blocking of async exceptions in an exception handler. +-- The exception raised in the main thread should not be delivered +-- until the first exception handler finishes. +main = do + main_thread <- myThreadId + m <- newEmptyMVar + forkIO (do { takeMVar m; throwTo main_thread (ErrorCall "foo") }) + (do + error "wibble" + `Control.Exception.catch` + (\e -> let _ = e::ErrorCall in + do putMVar m (); sum [1..10000] `seq` putStrLn "done.") + myDelay 500000 + ) + `Control.Exception.catch` + \e -> putStrLn ("caught: " ++ show (e::SomeException)) + +-- compensate for the fact that threadDelay is non-interruptible +-- on Windows with the threaded RTS in 6.6. +myDelay usec = do + m <- newEmptyMVar + forkIO $ do threadDelay usec; putMVar m () + takeMVar m + diff --git a/testsuite/tests/concurrent/should_run/conc014.stdout b/testsuite/tests/concurrent/should_run/conc014.stdout new file mode 100644 index 0000000000..807edef7c9 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc014.stdout @@ -0,0 +1,2 @@ +done. +caught: foo diff --git a/testsuite/tests/concurrent/should_run/conc015.hs b/testsuite/tests/concurrent/should_run/conc015.hs new file mode 100644 index 0000000000..7574e15e5e --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc015.hs @@ -0,0 +1,44 @@ +import Control.Concurrent +import Control.Exception + +-- test blocking & unblocking of async exceptions. + +-- the first exception "foo" should be caught by the "caught1" handler, +-- since async exceptions are blocked outside this handler. + +-- the second exception "bar" should be caught by the outer "caught2" handler, +-- (i.e. this tests that async exceptions are properly unblocked after +-- being blocked). + +main = do + main_thread <- myThreadId + print =<< blocked -- False + m <- newEmptyMVar + m2 <- newEmptyMVar + forkIO (do takeMVar m + throwTo main_thread (ErrorCall "foo") + throwTo main_thread (ErrorCall "bar") + putMVar m2 () + ) + ( do + block (do + putMVar m () + print =<< blocked -- True + sum [1..1] `seq` -- give 'foo' a chance to be raised + (unblock $ myDelay 500000) + `Control.Exception.catch` + \e -> putStrLn ("caught1: " ++ show (e::SomeException)) + ) + threadDelay 10000 + takeMVar m2 + ) + `Control.Exception.catch` + \e -> do print =<< blocked + putStrLn ("caught2: " ++ show (e::SomeException)) + +-- compensate for the fact that threadDelay is non-interruptible +-- on Windows with the threaded RTS in 6.6. +myDelay usec = do + m <- newEmptyMVar + forkIO $ do threadDelay usec; putMVar m () + takeMVar m diff --git a/testsuite/tests/concurrent/should_run/conc015.stdout b/testsuite/tests/concurrent/should_run/conc015.stdout new file mode 100644 index 0000000000..be6aa71d11 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc015.stdout @@ -0,0 +1,5 @@ +False +True +caught1: foo +True +caught2: bar diff --git a/testsuite/tests/concurrent/should_run/conc015a.hs b/testsuite/tests/concurrent/should_run/conc015a.hs new file mode 100644 index 0000000000..cd8d9dd6c7 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc015a.hs @@ -0,0 +1,47 @@ +import Control.Concurrent +import Control.Exception + +-- version of conc015 using mask in place of the old deprecated +-- block/unblock. + +-- test blocking & unblocking of async exceptions. + +-- the first exception "foo" should be caught by the "caught1" handler, +-- since async exceptions are blocked outside this handler. + +-- the second exception "bar" should be caught by the outer "caught2" handler, +-- (i.e. this tests that async exceptions are properly unblocked after +-- being blocked). + +main = do + main_thread <- myThreadId + print =<< getMaskingState + m <- newEmptyMVar + m2 <- newEmptyMVar + forkIO (do takeMVar m + throwTo main_thread (ErrorCall "foo") + throwTo main_thread (ErrorCall "bar") + putMVar m2 () + ) + ( do + mask $ \restore -> do + putMVar m () + print =<< getMaskingState + sum [1..100000] `seq` -- give 'foo' a chance to be raised + (restore (myDelay 500000) + `Control.Exception.catch` + \e -> putStrLn ("caught1: " ++ show (e::SomeException))) + + threadDelay 10000 + takeMVar m2 + ) + `Control.Exception.catch` + \e -> do print =<< getMaskingState + putStrLn ("caught2: " ++ show (e::SomeException)) + +-- compensate for the fact that threadDelay is non-interruptible +-- on Windows with the threaded RTS in 6.6. +myDelay usec = do + m <- newEmptyMVar + forkIO $ do threadDelay usec; putMVar m () + takeMVar m diff --git a/testsuite/tests/concurrent/should_run/conc015a.stdout b/testsuite/tests/concurrent/should_run/conc015a.stdout new file mode 100644 index 0000000000..19b98e9b60 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc015a.stdout @@ -0,0 +1,5 @@ +Unmasked +MaskedInterruptible +caught1: foo +MaskedUninterruptible +caught2: bar diff --git a/testsuite/tests/concurrent/should_run/conc016.hs b/testsuite/tests/concurrent/should_run/conc016.hs new file mode 100644 index 0000000000..639b4306b3 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc016.hs @@ -0,0 +1,27 @@ +import Control.Concurrent +import Control.Exception + +-- check that we can still kill a thread that is blocked on +-- delivering an exception to us. + +-- NB. this test is non-deterministic in the threaded2 way since 6.14, +-- because throwTo is now always interruptible, so the main thread's +-- killThread can be legitimately interrupted by the child thread's +-- killThread, rather than the other way around. This happens because +-- the child thread is running on another processor, so the main +-- thread's throwTo is blocked waiting for a response, and while +-- waiting it is interruptible. + +main = do + main_thread <- myThreadId + m <- newEmptyMVar + sub_thread <- forkIO (do + takeMVar m + throwTo main_thread (ErrorCall "foo") + ) + mask_ $ do + putMVar m () + sum [1..10000] `seq` -- to be sure the other thread is now blocked + killThread sub_thread + + putStrLn "ok" diff --git a/testsuite/tests/concurrent/should_run/conc016.stdout b/testsuite/tests/concurrent/should_run/conc016.stdout new file mode 100644 index 0000000000..9766475a41 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc016.stdout @@ -0,0 +1 @@ +ok diff --git a/testsuite/tests/concurrent/should_run/conc017.hs b/testsuite/tests/concurrent/should_run/conc017.hs new file mode 100644 index 0000000000..30d8a1c56d --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc017.hs @@ -0,0 +1,45 @@ +import Control.Concurrent +import Control.Exception + +-- check that async exceptions are restored to their previous +-- state after an exception is raised and handled. + +main = do + main_thread <- myThreadId + m1 <- newEmptyMVar + m2 <- newEmptyMVar + m3 <- newEmptyMVar + forkIO (do + takeMVar m1 + throwTo main_thread (ErrorCall "foo") + takeMVar m2 + throwTo main_thread (ErrorCall "bar") + putMVar m3 () + ) + (do + block (do + (do putMVar m1 () + unblock ( + -- unblocked, "foo" delivered to "caught1" + myDelay 100000 + ) + ) `Control.Exception.catch` + \e -> putStrLn ("caught1: " ++ show (e::SomeException)) + putMVar m2 () + -- blocked here, "bar" can't be delivered + (sum [1..10000] `seq` return ()) + `Control.Exception.catch` + \e -> putStrLn ("caught2: " ++ show (e::SomeException)) + ) + -- unblocked here, "bar" delivered to "caught3" + takeMVar m3 + ) + `Control.Exception.catch` + \e -> putStrLn ("caught3: " ++ show (e::SomeException)) + +-- compensate for the fact that threadDelay is non-interruptible +-- on Windows with the threaded RTS in 6.6. +myDelay usec = do + m <- newEmptyMVar + forkIO $ do threadDelay usec; putMVar m () + takeMVar m diff --git a/testsuite/tests/concurrent/should_run/conc017.stdout b/testsuite/tests/concurrent/should_run/conc017.stdout new file mode 100644 index 0000000000..7fca279f26 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc017.stdout @@ -0,0 +1,2 @@ +caught1: foo +caught3: bar diff --git a/testsuite/tests/concurrent/should_run/conc017a.hs b/testsuite/tests/concurrent/should_run/conc017a.hs new file mode 100644 index 0000000000..ad015f7413 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc017a.hs @@ -0,0 +1,44 @@ +import Control.Concurrent +import Control.Exception + +-- check that async exceptions are restored to their previous +-- state after an exception is raised and handled. + +main = do + main_thread <- myThreadId + m1 <- newEmptyMVar + m2 <- newEmptyMVar + m3 <- newEmptyMVar + forkIO (do + takeMVar m1 + throwTo main_thread (ErrorCall "foo") + takeMVar m2 + throwTo main_thread (ErrorCall "bar") + putMVar m3 () + ) + (do + mask $ \restore -> do + (do putMVar m1 () + restore ( + -- unblocked, "foo" delivered to "caught1" + myDelay 100000 + ) + ) `Control.Exception.catch` + \e -> putStrLn ("caught1: " ++ show (e::SomeException)) + putMVar m2 () + -- blocked here, "bar" can't be delivered + (sum [1..10000] `seq` return ()) + `Control.Exception.catch` + \e -> putStrLn ("caught2: " ++ show (e::SomeException)) + -- unblocked here, "bar" delivered to "caught3" + takeMVar m3 + ) + `Control.Exception.catch` + \e -> putStrLn ("caught3: " ++ show (e::SomeException)) + +-- compensate for the fact that threadDelay is non-interruptible +-- on Windows with the threaded RTS in 6.6. +myDelay usec = do + m <- newEmptyMVar + forkIO $ do threadDelay usec; putMVar m () + takeMVar m diff --git a/testsuite/tests/concurrent/should_run/conc017a.stdout b/testsuite/tests/concurrent/should_run/conc017a.stdout new file mode 100644 index 0000000000..7fca279f26 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc017a.stdout @@ -0,0 +1,2 @@ +caught1: foo +caught3: bar diff --git a/testsuite/tests/concurrent/should_run/conc018.hs b/testsuite/tests/concurrent/should_run/conc018.hs new file mode 100644 index 0000000000..aa83e31738 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc018.hs @@ -0,0 +1,26 @@ +import Control.Concurrent +import Control.Exception +import GHC.Conc +import Foreign + +-- test that putMVar blocks on a full MVar rather than raising an +-- exception. + +main = do + -- In this test we want a thread to get BlockedIndefinitely; that + -- can't be the main thread because in GHCi the main thread + -- doesn't get BlockedIndefinitely. So we have to use a + -- subthread, and "prevent* the main thread from getting + -- BlockedIndefinitely when we're not in GHCi, which is what the + -- following hack does: + myThreadId >>= newStablePtr + + m <- newEmptyMVar + t <- forkIO $ do + Control.Exception.catch (do + m <- newMVar () + putMVar m () + ) + (\e -> putMVar m (e::SomeException)) + takeMVar m >>= print + -- should print "thread blocked indefinitely" diff --git a/testsuite/tests/concurrent/should_run/conc018.stdout b/testsuite/tests/concurrent/should_run/conc018.stdout new file mode 100644 index 0000000000..dd56b71f23 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc018.stdout @@ -0,0 +1 @@ +thread blocked indefinitely in an MVar operation diff --git a/testsuite/tests/concurrent/should_run/conc019.hs b/testsuite/tests/concurrent/should_run/conc019.hs new file mode 100644 index 0000000000..51b3d7563a --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc019.hs @@ -0,0 +1,14 @@ +import Control.Concurrent +import Control.Exception +import Data.List +import System.Mem + +-- !!! test that a child thread waiting on its own MVar will get killed by +-- a signal. + +main = do + forkIO (Control.Exception.catch (do { m <- newEmptyMVar; takeMVar m }) + $ \e -> putStrLn ("caught: " ++ show (e::SomeException))) + threadDelay 10000 + System.Mem.performGC + threadDelay 10000 diff --git a/testsuite/tests/concurrent/should_run/conc019.stdout b/testsuite/tests/concurrent/should_run/conc019.stdout new file mode 100644 index 0000000000..aba647b928 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc019.stdout @@ -0,0 +1 @@ +caught: thread blocked indefinitely in an MVar operation diff --git a/testsuite/tests/concurrent/should_run/conc020.hs b/testsuite/tests/concurrent/should_run/conc020.hs new file mode 100644 index 0000000000..956b761245 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc020.hs @@ -0,0 +1,10 @@ +import Control.Concurrent +import Control.Exception + +main = do + m <- newEmptyMVar + t <- forkIO (block $ takeMVar m) + threadDelay 100000 + throwTo t (ErrorCall "I'm Interruptible") + threadDelay 100000 + putMVar m () -- to avoid t being garbage collected diff --git a/testsuite/tests/concurrent/should_run/conc020.stderr b/testsuite/tests/concurrent/should_run/conc020.stderr new file mode 100644 index 0000000000..b0bcbfb17f --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc020.stderr @@ -0,0 +1 @@ +conc020: I'm Interruptible diff --git a/testsuite/tests/concurrent/should_run/conc021.hs b/testsuite/tests/concurrent/should_run/conc021.hs new file mode 100644 index 0000000000..c07c48af35 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc021.hs @@ -0,0 +1,11 @@ +{-# LANGUAGE ForeignFunctionInterface #-} +module Main where + +-- !!! test for uncaught exception + +foreign export ccall foo :: Int -> IO Int +foreign import ccall safe "foo" foo_imported :: Int -> IO Int + +foo n = error "wurble" + +main = foo_imported 3 diff --git a/testsuite/tests/concurrent/should_run/conc021.stderr b/testsuite/tests/concurrent/should_run/conc021.stderr new file mode 100644 index 0000000000..78e92140e6 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc021.stderr @@ -0,0 +1 @@ +conc021: wurble diff --git a/testsuite/tests/concurrent/should_run/conc022.hs b/testsuite/tests/concurrent/should_run/conc022.hs new file mode 100644 index 0000000000..5d420d8af7 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc022.hs @@ -0,0 +1,40 @@ +{-# LANGUAGE MagicHash #-} +-- !!! test tryTakeMVar + +import Control.Concurrent +import Control.Exception + +import GHC.Exts ( fork# ) +import GHC.IO ( IO(..) ) +import GHC.Conc ( ThreadId(..) ) + +main = do + m <- newEmptyMVar + r <- timeout 5 (tryTakeMVar m) (putStrLn "timed out!" >> return Nothing) + print (r :: Maybe Int) + + m <- newMVar True + r <- timeout 5 (tryTakeMVar m) (putStrLn "timed out!" >> return Nothing) + print r + +timeout + :: Int -- secs + -> IO a -- action to run + -> IO a -- action to run on timeout + -> IO a + +timeout secs action on_timeout + = do + threadid <- myThreadId + timeout <- forkIO $ do threadDelay (secs * 1000000) + throwTo threadid (ErrorCall "__timeout") + ( do result <- action + killThread timeout + return result + ) + `Control.Exception.catch` + \exception -> case fromException exception of + Just (ErrorCall "__timeout") -> on_timeout + _other -> do killThread timeout + throw exception + diff --git a/testsuite/tests/concurrent/should_run/conc022.stdout b/testsuite/tests/concurrent/should_run/conc022.stdout new file mode 100644 index 0000000000..07de2e62f6 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc022.stdout @@ -0,0 +1,2 @@ +Nothing +Just True diff --git a/testsuite/tests/concurrent/should_run/conc023.hs b/testsuite/tests/concurrent/should_run/conc023.hs new file mode 100644 index 0000000000..b128c224a3 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc023.hs @@ -0,0 +1,23 @@ +{-# LANGUAGE ScopedTypeVariables #-} +-- !!! test threadDelay, Random, and QSemN. + +-- start a large number (n) of threads each of which will wait for a +-- random delay between 0 and m seconds. We use a semaphore to wait +-- for all the threads to finish. + +import System.Random +import Control.Concurrent +import Control.Exception + +n = 5000 -- no. of threads +m = 3000 -- maximum delay + +main = do + s <- newQSemN n + (is :: [Int]) <- sequence (take n (repeat (getStdRandom (randomR (1,m))))) + mapM (fork_sleep s) is + waitQSemN s n + where + fork_sleep s i = forkIO (do waitQSemN s 1 + threadDelay (i*1000) + signalQSemN s 1) diff --git a/testsuite/tests/concurrent/should_run/conc024.hs b/testsuite/tests/concurrent/should_run/conc024.hs new file mode 100644 index 0000000000..e37d64a6e2 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc024.hs @@ -0,0 +1,15 @@ +module Main where + +import Control.Exception +import Control.Concurrent +import Prelude hiding (catch) +import System.Mem + +-- illustrates the BlockOnDeadMVar exception + +main = do + id <- myThreadId + forkIO (catch (do m <- newEmptyMVar; takeMVar m) + (\e -> throwTo id (e::SomeException))) + catch (do yield; performGC; threadDelay 1000000) + (\e -> print (e::SomeException)) diff --git a/testsuite/tests/concurrent/should_run/conc024.stdout b/testsuite/tests/concurrent/should_run/conc024.stdout new file mode 100644 index 0000000000..dd56b71f23 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc024.stdout @@ -0,0 +1 @@ +thread blocked indefinitely in an MVar operation diff --git a/testsuite/tests/concurrent/should_run/conc025.hs b/testsuite/tests/concurrent/should_run/conc025.hs new file mode 100644 index 0000000000..a9591d4223 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc025.hs @@ -0,0 +1,16 @@ +-- !!! Simple test of dupChan +-- Embarassingly, the published version fails! + +module Main where + +import Control.Exception +import Control.Concurrent.Chan + +main = do + chan <- newChan + ch <- dupChan chan + writeChan chan "done" + x <- readChan chan + y <- readChan ch + print ("Got "++x ++" "++y) + diff --git a/testsuite/tests/concurrent/should_run/conc025.stdout b/testsuite/tests/concurrent/should_run/conc025.stdout new file mode 100644 index 0000000000..fb1569261c --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc025.stdout @@ -0,0 +1 @@ +"Got done done" diff --git a/testsuite/tests/concurrent/should_run/conc026.hs b/testsuite/tests/concurrent/should_run/conc026.hs new file mode 100644 index 0000000000..0aa170afb5 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc026.hs @@ -0,0 +1,8 @@ +-- test for blocking putMVar + +import Control.Concurrent + +main = do + m <- newMVar () + forkIO (threadDelay 100000 >> takeMVar m) + putMVar m () diff --git a/testsuite/tests/concurrent/should_run/conc027.hs b/testsuite/tests/concurrent/should_run/conc027.hs new file mode 100644 index 0000000000..4a04211824 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc027.hs @@ -0,0 +1,9 @@ + +import Control.Concurrent + +main = do + m <- newEmptyMVar + end <- newEmptyMVar + forkIO (sequence_ [ putMVar m () | _ <- [1 .. 10000] ]) + forkIO (sequence_ [ takeMVar m | _ <- [1 .. 10000] ] >> putMVar end ()) + takeMVar end diff --git a/testsuite/tests/concurrent/should_run/conc028.hs b/testsuite/tests/concurrent/should_run/conc028.hs new file mode 100644 index 0000000000..4d3d16866a --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc028.hs @@ -0,0 +1,11 @@ +-- test tryPutMVar + +import Control.Concurrent + +main = do + m <- newMVar () + r <- tryPutMVar m () + print r + takeMVar m + r <- tryPutMVar m () + print r diff --git a/testsuite/tests/concurrent/should_run/conc028.stdout b/testsuite/tests/concurrent/should_run/conc028.stdout new file mode 100644 index 0000000000..91d6f80f27 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc028.stdout @@ -0,0 +1,2 @@ +False +True diff --git a/testsuite/tests/concurrent/should_run/conc029.hs b/testsuite/tests/concurrent/should_run/conc029.hs new file mode 100644 index 0000000000..dc1150073d --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc029.hs @@ -0,0 +1,11 @@ +module Main where + +import Control.Exception +import Control.Concurrent +import Prelude hiding (catch) + +-- the BlockOnDeadMVar exception doesn't cause any output by default + +main = do + forkIO (do m <- newEmptyMVar; takeMVar m) + print (sum [1..10000]) diff --git a/testsuite/tests/concurrent/should_run/conc029.stdout b/testsuite/tests/concurrent/should_run/conc029.stdout new file mode 100644 index 0000000000..b9d569380c --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc029.stdout @@ -0,0 +1 @@ +50005000 diff --git a/testsuite/tests/concurrent/should_run/conc030.hs b/testsuite/tests/concurrent/should_run/conc030.hs new file mode 100644 index 0000000000..4f01668456 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc030.hs @@ -0,0 +1,15 @@ +module Main where + +import Control.Exception +import Control.Concurrent +import Prelude hiding (catch) + +-- the ThreadKilled exception doesn't cause any output by default + +main = do + m <- newEmptyMVar + id <- forkIO (takeMVar m) + yield + killThread id + putMVar m () + print (sum [1..50000]) diff --git a/testsuite/tests/concurrent/should_run/conc030.stdout b/testsuite/tests/concurrent/should_run/conc030.stdout new file mode 100644 index 0000000000..ba6ee958ee --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc030.stdout @@ -0,0 +1 @@ +1250025000 diff --git a/testsuite/tests/concurrent/should_run/conc031.hs b/testsuite/tests/concurrent/should_run/conc031.hs new file mode 100644 index 0000000000..c3347550a9 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc031.hs @@ -0,0 +1,30 @@ +import Control.Concurrent +import Control.Exception +import System.Mem ( performGC ) +import System.Mem.Weak ( addFinalizer ) + +data P = P (MVar Bool) + +-- Bug reported by Manuel Chakravarty, namely that we weren't checking +-- for runnable finalizers before declaring that the program is +-- deadlocked. + +main = do +-- gcThread -- with this thread enabled, no error + mv <- newEmptyMVar + let p = P mv + addFinalizer p (set p) + takeMVar mv >>= print + putStrLn "End." + where + set (P mv) = putMVar mv True + -- + -- this is just to demonstrate that it is only about the GC timing + -- + gcThread = forkIO $ let gc = do + putStrLn "delay" + threadDelay 100000 + putStrLn "gc" + performGC + gc + in gc diff --git a/testsuite/tests/concurrent/should_run/conc031.stdout b/testsuite/tests/concurrent/should_run/conc031.stdout new file mode 100644 index 0000000000..8d45abf2c7 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc031.stdout @@ -0,0 +1,2 @@ +True +End. diff --git a/testsuite/tests/concurrent/should_run/conc032.hs b/testsuite/tests/concurrent/should_run/conc032.hs new file mode 100644 index 0000000000..42149ff477 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc032.hs @@ -0,0 +1,74 @@ +-- !!! this test exposed a bug in the take/putMVar implementation in +-- !!! GHC 5.00. It involves multiple blocking takes & puts on the +-- !!! same MVar. + +import Control.Concurrent +import System.IO.Unsafe + +awk True True z = 1 +awk False y True = 2 +awk x False False = 3 + +awk'1 True True z = 1 +awk'2 False y True = 2 +awk'3 x False False = 3 + +awk' x y z | ppm [a1'1,a1'2,a1'3] (x,y,z) = awk'1 x y z + | ppm [a2'1,a2'2,a2'3] (x,y,z) = awk'2 x y z + | ppm [a3'1,a3'2,a3'3] (x,y,z) = awk'3 x y z + | otherwise = 0 + +a1'1 (True,y,z) s = s True +a1'1 (x,y,z) s = s False + +a1'2 (x,True,z) s = s True +a1'2 (x,y,z) s = s False + +a1'3 (x,y,z) s = s True + +a2'1 (False,y,z) s = s True +a2'1 (x,y,z) s = s False + +a2'2 (x,y,z) s = s True + +a2'3 (x,y,True) s = s True +a2'3 (x,y,z) s = s False + +a3'1 (x,y,z) s = s True + +a3'2 (x,False,z) s = s True +a3'2 (x,y,z) s = s False + +a3'3 (x,y,False) s = s True +a3'3 (x,y,z) s = s False + +ppm fs as = unsafePerformIO (ppm' fs as) + +ppm' fs as = do m <- newEmptyMVar + let s = putMVar m + hs <- sequence [forkIO (f as s)|f <- fs] + result <- assess (length fs) m + sequence (map killThread hs) + return result + where assess 0 m = return True + assess n m = do h <- takeMVar m + if h then (assess (n-1) m) + else return False + +main = do sequence [putStrLn (show (awk' x y z))|(x,y,z) <- args] + where args = [ + (t,t,t), + (t,t,f), + (t,f,t), + (t,f,f), + (f,t,t), + (f,t,f), + (f,f,t), + (f,f,f), + (t,t,n) + --(f,n,t), + --(n,f,f), + ] + t = True + f = False + n = odd (last [1..]) diff --git a/testsuite/tests/concurrent/should_run/conc032.stdout b/testsuite/tests/concurrent/should_run/conc032.stdout new file mode 100644 index 0000000000..a357bc8aac --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc032.stdout @@ -0,0 +1,9 @@ +1 +1 +0 +3 +2 +0 +2 +3 +1 diff --git a/testsuite/tests/concurrent/should_run/conc033.hs b/testsuite/tests/concurrent/should_run/conc033.hs new file mode 100644 index 0000000000..6933822e56 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc033.hs @@ -0,0 +1,10 @@ +import Control.Concurrent +import Control.Exception + +-- !!! test that deadlock is raised as an exception properly +main = do + r <- Control.Exception.try $ do + m <- newEmptyMVar + takeMVar m + return () + print (r::Either SomeException ()) diff --git a/testsuite/tests/concurrent/should_run/conc033.stdout b/testsuite/tests/concurrent/should_run/conc033.stdout new file mode 100644 index 0000000000..1c0eba9dec --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc033.stdout @@ -0,0 +1 @@ +Left thread blocked indefinitely in an MVar operation diff --git a/testsuite/tests/concurrent/should_run/conc034.hs b/testsuite/tests/concurrent/should_run/conc034.hs new file mode 100644 index 0000000000..4101212ad1 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc034.hs @@ -0,0 +1,31 @@ +import Control.Concurrent +import Control.Exception +import Foreign + +import System.IO (hFlush,stdout) + +import Prelude hiding (catch) + +-- !!! Try to get two threads into a knot depending on each other. + +-- This should result in the main thread being sent a NonTermination +-- exception (in GHC 5.02, the program is terminated with "no threads +-- to run" instead). + +main = do + Foreign.newStablePtr stdout + -- HACK, because when these two threads get blocked on each other, + -- there's nothing keeping stdout alive so it will get finalized. + -- SDM 12/3/2004 + let a = last ([1..10000] ++ [b]) + b = last ([2..10000] ++ [a]) + -- we have to be careful to ensure that the strictness analyser + -- can't see that a and b are both bottom, otherwise the + -- simplifier will go to town here, resulting in something like + -- a = a and b = a. + forkIO (print a `catch` \NonTermination -> return ()) + -- we need to catch in the child thread too, because it might + -- get sent the NonTermination exception first. + r <- Control.Exception.try (print b) + print (r :: Either NonTermination ()) + diff --git a/testsuite/tests/concurrent/should_run/conc034.stdout b/testsuite/tests/concurrent/should_run/conc034.stdout new file mode 100644 index 0000000000..1f83158694 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc034.stdout @@ -0,0 +1 @@ +Left <<loop>> diff --git a/testsuite/tests/concurrent/should_run/conc035.hs b/testsuite/tests/concurrent/should_run/conc035.hs new file mode 100644 index 0000000000..fcb2d5c2e4 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc035.hs @@ -0,0 +1,49 @@ +module Main where + +import Control.Concurrent +import qualified Control.Exception as E + +trapHandler :: MVar Int -> MVar () -> IO () +trapHandler inVar caughtVar = + (do E.block $ do + trapMsg <- takeMVar inVar + putStrLn ("Handler got: " ++ show trapMsg) + trapHandler inVar caughtVar + ) + `E.catch` + (trapExc inVar caughtVar) + +trapExc :: MVar Int -> MVar () -> E.SomeException -> IO () +-- If we have been killed then we are done +trapExc inVar caughtVar e + | Just E.ThreadKilled <- E.fromException e = return () +-- Otherwise... +trapExc inVar caughtVar e = + do putStrLn ("Exception: " ++ show e) + putMVar caughtVar () + trapHandler inVar caughtVar + +main :: IO () +main = do + inVar <- newEmptyMVar + caughtVar <- newEmptyMVar + tid <- forkIO (trapHandler inVar caughtVar) + yield + putMVar inVar 1 + threadDelay 1000 + throwTo tid (E.ErrorCall "1st") + takeMVar caughtVar + putMVar inVar 2 + threadDelay 1000 + throwTo tid (E.ErrorCall "2nd") + -- the second time around, exceptions will be blocked, because + -- the trapHandler is effectively "still in the handler" from the + -- first exception. I'm not sure if this is by design or by + -- accident. Anyway, the trapHandler will at some point block + -- in takeMVar, and thereby become interruptible, at which point + -- it will receive the second exception. + takeMVar caughtVar + -- Running the GHCi way complains that tid is blocked indefinitely if + -- it still exists, so kill it. + killThread tid + putStrLn "All done" diff --git a/testsuite/tests/concurrent/should_run/conc035.stdout b/testsuite/tests/concurrent/should_run/conc035.stdout new file mode 100644 index 0000000000..f667439731 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc035.stdout @@ -0,0 +1,5 @@ +Handler got: 1 +Exception: 1st +Handler got: 2 +Exception: 2nd +All done diff --git a/testsuite/tests/concurrent/should_run/conc036.hs b/testsuite/tests/concurrent/should_run/conc036.hs new file mode 100644 index 0000000000..ead85a530d --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc036.hs @@ -0,0 +1,35 @@ +{-# LANGUAGE ForeignFunctionInterface #-} +{-# OPTIONS -cpp #-} +module Main where + +import Control.Concurrent +import Control.Exception +import Prelude hiding (catch) +import Foreign +import System.IO + +#ifdef mingw32_HOST_OS +sleep n = sleepBlock (n*1000) +foreign import stdcall unsafe "Sleep" sleepBlock :: Int -> IO () +#else +sleep n = sleepBlock n +foreign import ccall unsafe "sleep" sleepBlock :: Int -> IO () +#endif + +main :: IO () +main = do + newStablePtr stdout -- prevent stdout being finalized, sigh + th <- newEmptyMVar + forkIO $ do + putStrLn "newThread started" + sleep 1 + putMVar th "child" + threadDelay 500000 + yield -- another hack, just in case child yields right after "sleep 1" + putMVar th "main" `catch` (\BlockedIndefinitelyOnMVar -> return ()) + -- tests that the other thread doing an unsafe call to + -- sleep(3) has blocked this thread. Not sure if this + -- is a useful test. + x <- takeMVar th + putStrLn x + putStrLn "\nshutting down" diff --git a/testsuite/tests/concurrent/should_run/conc036.stdout b/testsuite/tests/concurrent/should_run/conc036.stdout new file mode 100644 index 0000000000..d5fb94ff25 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc036.stdout @@ -0,0 +1,4 @@ +newThread started +child + +shutting down diff --git a/testsuite/tests/concurrent/should_run/conc037.hs b/testsuite/tests/concurrent/should_run/conc037.hs new file mode 100644 index 0000000000..7da76f5025 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc037.hs @@ -0,0 +1,27 @@ +{-# OPTIONS_GHC -cpp #-} +{-# LANGUAGE ForeignFunctionInterface #-} +module Main where + +import Control.Concurrent + +#ifdef mingw32_HOST_OS +foreign import stdcall safe "Sleep" _sleepBlock :: Int -> IO () +sleepBlock n = _sleepBlock (n*1000) +#else +foreign import ccall safe "sleep" sleepBlock :: Int -> IO () +#endif + +main :: IO () +main = do + th <- newEmptyMVar + forkIO $ do + putStrLn "newThread started" + sleepBlock 1 + putStrLn "newThread back again" + putMVar th "1 sec later" + threadDelay 200000 -- make sure the newly created thread is run. + putStrLn "mainThread" + x <- takeMVar th + putStrLn x + putStrLn "\nshutting down" + diff --git a/testsuite/tests/concurrent/should_run/conc037.stdout b/testsuite/tests/concurrent/should_run/conc037.stdout new file mode 100644 index 0000000000..18c9f447f6 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc037.stdout @@ -0,0 +1,6 @@ +newThread started +mainThread +newThread back again +1 sec later + +shutting down diff --git a/testsuite/tests/concurrent/should_run/conc038.hs b/testsuite/tests/concurrent/should_run/conc038.hs new file mode 100644 index 0000000000..0cf82f3b24 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc038.hs @@ -0,0 +1,37 @@ +{-# OPTIONS_GHC -cpp #-} +{-# LANGUAGE ForeignFunctionInterface #-} +module Main where + +import Control.Concurrent + +haskellFun :: Int -> IO () +haskellFun c = putStrLn ("Haskell: " ++ show c) + +foreign export ccall "hFun" haskellFun :: Int -> IO () +foreign import ccall safe "hFun" hFun :: Int -> IO () + +#ifdef mingw32_HOST_OS +foreign import stdcall safe "Sleep" _sleepBlock :: Int -> IO () +sleepBlock n = _sleepBlock (n*1000) +#else +foreign import ccall safe "sleep" sleepBlock :: Int -> IO () +#endif + + + +main :: IO () +main = do + th <- newEmptyMVar + forkIO $ do + putStrLn "newThread started" + sleepBlock 1 + putStrLn "newThread back again" + putMVar th "1 sec later" + threadDelay 500000 >> putStrLn "mainThread" + -- this will not be blocked in the threaded RTS + forkIO $ (hFun 2) + -- neither will this + x <- takeMVar th + putStrLn x + putStrLn "\nshutting down" + diff --git a/testsuite/tests/concurrent/should_run/conc038.stdout b/testsuite/tests/concurrent/should_run/conc038.stdout new file mode 100644 index 0000000000..21fc15c4e2 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc038.stdout @@ -0,0 +1,7 @@ +newThread started +mainThread +Haskell: 2 +newThread back again +1 sec later + +shutting down diff --git a/testsuite/tests/concurrent/should_run/conc039.hs b/testsuite/tests/concurrent/should_run/conc039.hs new file mode 100644 index 0000000000..dc5d181a31 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc039.hs @@ -0,0 +1,31 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +import Foreign +import System.Mem +import Control.Concurrent + +foreign export ccall "performGC_" performGC' :: IO () +performGC' = do putMVar m (); yield; performGC + +foreign import ccall "performGC_" f :: IO () + +{-# NOINLINE m #-} +m = unsafePerformIO newEmptyMVar + +main = do + forkIO f + takeMVar m + +-- This tests for a bug in the garbage collector, whereby a main +-- thread that has completed may be GC'd before its return value is +-- propagated back to the caller of rts_evalIO(). +-- +-- The sequence we hope to create is: +-- - main thread (1) forks off thread (2) +-- - thread (2) invokes new main thread (3) via a 'safe' ccall +-- - thread (3) yields to thread (1) +-- - thread (1) completes, but cannot return yet because (3) +-- is the current main thread (unless we +-- are in SMP or RTS_SUPPORTS_THREADS mode) +-- - thread (3) invokes a GC +-- - thread (1) is GC'd, unless we're careful! diff --git a/testsuite/tests/concurrent/should_run/conc040.hs b/testsuite/tests/concurrent/should_run/conc040.hs new file mode 100644 index 0000000000..be3bfdb915 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc040.hs @@ -0,0 +1,28 @@ +{-# LANGUAGE ForeignFunctionInterface #-} + +import Foreign +import Data.IORef +import Control.Concurrent +import Control.Exception + +foreign import ccall "wrapper" + wrap :: IO () -> IO (FunPtr (IO ())) + +foreign import ccall "dynamic" + invoke :: FunPtr (IO ()) -> IO () + +{-# NOINLINE m #-} +m :: IORef ThreadId +m = unsafePerformIO (newIORef (error "m")) + +main = do + id <- myThreadId + writeIORef m id + raise' <- wrap raise + invoke raise' + +raise = do + id <- readIORef m + me <- myThreadId + forkIO $ do threadDelay 10000; throwTo me (ErrorCall "timeout") + throwTo id (ErrorCall "kapow!") diff --git a/testsuite/tests/concurrent/should_run/conc040.stderr b/testsuite/tests/concurrent/should_run/conc040.stderr new file mode 100644 index 0000000000..d113a02a99 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc040.stderr @@ -0,0 +1 @@ +conc040: timeout diff --git a/testsuite/tests/concurrent/should_run/conc041.hs b/testsuite/tests/concurrent/should_run/conc041.hs new file mode 100644 index 0000000000..8aec345b1c --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc041.hs @@ -0,0 +1,9 @@ +module Main where + +import GHC.Conc + +-- Create a new TVar and never use it +main = do + putStr "Before\n" + t <- atomically ( newTVar 42 ) + putStr "After\n" diff --git a/testsuite/tests/concurrent/should_run/conc041.stderr b/testsuite/tests/concurrent/should_run/conc041.stderr new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc041.stderr diff --git a/testsuite/tests/concurrent/should_run/conc041.stdout b/testsuite/tests/concurrent/should_run/conc041.stdout new file mode 100644 index 0000000000..a84f0c9779 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc041.stdout @@ -0,0 +1,2 @@ +Before
+After
diff --git a/testsuite/tests/concurrent/should_run/conc042.hs b/testsuite/tests/concurrent/should_run/conc042.hs new file mode 100644 index 0000000000..9ebbf3e4ea --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc042.hs @@ -0,0 +1,11 @@ +module Main where + +import GHC.Conc + +-- Create a new TVar and check that it contains the expected value +main = do + putStr "Before\n" + t <- atomically ( newTVar 42 ) + r <- atomically ( readTVar t ) + putStr ("After " ++ (show r) ++ "\n") + diff --git a/testsuite/tests/concurrent/should_run/conc042.stderr b/testsuite/tests/concurrent/should_run/conc042.stderr new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc042.stderr diff --git a/testsuite/tests/concurrent/should_run/conc042.stdout b/testsuite/tests/concurrent/should_run/conc042.stdout new file mode 100644 index 0000000000..6fea5e3fe9 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc042.stdout @@ -0,0 +1,2 @@ +Before
+After 42
diff --git a/testsuite/tests/concurrent/should_run/conc043.hs b/testsuite/tests/concurrent/should_run/conc043.hs new file mode 100644 index 0000000000..18cf1196f7 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc043.hs @@ -0,0 +1,13 @@ +module Main where + +import GHC.Conc + +-- Create a new TVar, update it and check that it contains the expected value after the +-- transaction +main = do + putStr "Before\n" + t <- atomically ( newTVar 42 ) + atomically ( writeTVar t 17 ) + r <- atomically ( readTVar t ) + putStr ("After " ++ (show r) ++ "\n") + diff --git a/testsuite/tests/concurrent/should_run/conc043.stderr b/testsuite/tests/concurrent/should_run/conc043.stderr new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc043.stderr diff --git a/testsuite/tests/concurrent/should_run/conc043.stdout b/testsuite/tests/concurrent/should_run/conc043.stdout new file mode 100644 index 0000000000..8b2ff8961d --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc043.stdout @@ -0,0 +1,2 @@ +Before
+After 17
diff --git a/testsuite/tests/concurrent/should_run/conc044.hs b/testsuite/tests/concurrent/should_run/conc044.hs new file mode 100644 index 0000000000..0ad4701f8b --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc044.hs @@ -0,0 +1,13 @@ +module Main where + +import GHC.Conc + +-- Create a new TVar, update it and check that it contains the expected value within +-- the transaction +main = do + putStr "Before\n" + t <- atomically ( newTVar 42 ) + r <- atomically ( do writeTVar t 17 + readTVar t) + putStr ("After " ++ (show r) ++ "\n") + diff --git a/testsuite/tests/concurrent/should_run/conc044.stderr b/testsuite/tests/concurrent/should_run/conc044.stderr new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc044.stderr diff --git a/testsuite/tests/concurrent/should_run/conc044.stdout b/testsuite/tests/concurrent/should_run/conc044.stdout new file mode 100644 index 0000000000..8b2ff8961d --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc044.stdout @@ -0,0 +1,2 @@ +Before
+After 17
diff --git a/testsuite/tests/concurrent/should_run/conc045.hs b/testsuite/tests/concurrent/should_run/conc045.hs new file mode 100644 index 0000000000..4ab585eef3 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc045.hs @@ -0,0 +1,39 @@ +module Main where + +import GHC.Conc +import Control.Concurrent + +snapshot t1 t2 = atomically ( do v1 <- readTVar t1 + v2 <- readTVar t2 + return (v1, v2) ) + +twiddle mv _ _ 0 = putMVar mv () +twiddle mv t1 t2 n = do atomically ( do v1 <- readTVar t1 + v2 <- readTVar t2 + writeTVar t2 (v1+1) + writeTVar t1 (v2+1) ) + twiddle mv t1 t2 (n-1) + + +-- Contended updates to a pair of TVars +main = do + putStr "Before\n" + (t1,t2) <- atomically ( do t1 <- newTVar 0 + t2 <- newTVar 1 + return (t1, t2)) + + -- MVars used to signal completion + t1c <- newEmptyMVar + t2c <- newEmptyMVar + + forkIO (twiddle t1c t1 t2 1000) + forkIO (twiddle t2c t1 t2 1000) + + -- Wait for threads to exit + takeMVar t1c + takeMVar t2c + + -- Display final state + (r1,r2) <- snapshot t1 t2 + putStr ("After " ++ (show r1) ++ " , " ++ (show r2) ++ "\n") + diff --git a/testsuite/tests/concurrent/should_run/conc045.stderr b/testsuite/tests/concurrent/should_run/conc045.stderr new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc045.stderr diff --git a/testsuite/tests/concurrent/should_run/conc045.stdout b/testsuite/tests/concurrent/should_run/conc045.stdout new file mode 100644 index 0000000000..31640611f4 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc045.stdout @@ -0,0 +1,2 @@ +Before
+After 2000 , 2001
diff --git a/testsuite/tests/concurrent/should_run/conc051.hs b/testsuite/tests/concurrent/should_run/conc051.hs new file mode 100644 index 0000000000..db8a796a9c --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc051.hs @@ -0,0 +1,32 @@ +module Main (main) where + +import System.Environment +import Control.Concurrent +import Control.Monad + +----------------------------------------------------------------------------- +-- test MVar throughput between the main thread and a child thread + +-- This test runs quite slowly on the threaded/SMP RTS vs. the normal RTS, +-- because the main thread and child thread are run by different OS threads, +-- so each MVar communication requires real OS thread switching. +-- +-- Figures I get are about a factor of 10 difference in speed, at GHC 6.5. + +main = chanTest 300000 + +chanTest :: Int -> IO () +chanTest n = do + chan <- newEmptyMVar + forkIO (writer chan n) + reader chan n + +reader chan 0 = return () +reader chan n = do + takeMVar chan + reader chan (n-1) + +writer chan 0 = return () +writer chan n = do + putMVar chan () + writer chan (n-1) diff --git a/testsuite/tests/concurrent/should_run/conc058.hs b/testsuite/tests/concurrent/should_run/conc058.hs new file mode 100644 index 0000000000..5fbe4e5af8 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc058.hs @@ -0,0 +1,13 @@ +import Control.Concurrent +import Control.Exception + +-- variation on conc020 that tests for threadDelay being interruptible. +-- On Windows, with the threaded RTS, in 6.6 and earlier, threadDelay is +-- not interruptible. +main = do + m <- newEmptyMVar + t <- forkIO (block $ threadDelay 1000000) + threadDelay 100000 + throwTo t (ErrorCall "I'm Interruptible") + threadDelay 100000 + putMVar m () -- to avoid t being garbage collected diff --git a/testsuite/tests/concurrent/should_run/conc058.stderr b/testsuite/tests/concurrent/should_run/conc058.stderr new file mode 100644 index 0000000000..2b5ddd02dc --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc058.stderr @@ -0,0 +1 @@ +conc058: I'm Interruptible diff --git a/testsuite/tests/concurrent/should_run/conc059.hs b/testsuite/tests/concurrent/should_run/conc059.hs new file mode 100644 index 0000000000..bed28d27cb --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc059.hs @@ -0,0 +1,26 @@ +{-# LANGUAGE CPP, ForeignFunctionInterface #-} +module Test where + +import Control.Concurrent +import Control.Monad +import Foreign.C + +-- See also conc059_c.c +-- +-- This test fires off some threads that will return after the RTS has +-- shut down. This should not crash or confuse the RTS. + +f :: Int -> IO () +f x = do + print x + replicateM_ 10 $ forkIO $ do usleep (fromIntegral x); putStrLn "hello" + return () + +foreign export ccall "f" f :: Int -> IO () + +#ifdef mingw32_HOST_OS +foreign import stdcall safe "Sleep" _sleep :: Int -> IO () +usleep n = _sleep (n `quot` 1000) +#else +foreign import ccall safe "usleep" usleep :: Int -> IO () +#endif diff --git a/testsuite/tests/concurrent/should_run/conc059.stdout b/testsuite/tests/concurrent/should_run/conc059.stdout new file mode 100644 index 0000000000..92911bfda2 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc059.stdout @@ -0,0 +1,2 @@ +exiting... +exited. diff --git a/testsuite/tests/concurrent/should_run/conc059_c.c b/testsuite/tests/concurrent/should_run/conc059_c.c new file mode 100644 index 0000000000..f15fbdd735 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc059_c.c @@ -0,0 +1,30 @@ +#include "HsFFI.h" +#include "conc059_stub.h" +#include <unistd.h> +#include <stdio.h> +#if mingw32_HOST_OS +#include <windows.h> +#endif + +void __stginit_Test(void); + +int main(int argc, char *argv[]) +{ + hs_init(&argc,&argv); + hs_add_root(__stginit_Test); + f(500000); +#if mingw32_HOST_OS + Sleep(100); +#else + usleep(100000); +#endif + printf("exiting...\n"); + hs_exit(); + printf("exited.\n"); +#if mingw32_HOST_OS + Sleep(1000); +#else + usleep(1000000); +#endif + exit(0); +} diff --git a/testsuite/tests/concurrent/should_run/conc064.hs b/testsuite/tests/concurrent/should_run/conc064.hs new file mode 100644 index 0000000000..d37387c601 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc064.hs @@ -0,0 +1,30 @@ +-- test for bug #1067 + +import Control.Concurrent +import Control.Exception + +main = do + master <- myThreadId + test master 10 + -- make sure we catch a final NonTermination exception to get + -- a consistent result. + threadDelay (10 * one_second) + +test tid 0 = return () +test tid n = do + e <- try threads + case e of + Left NonTermination -> test tid (n-1) + Right _ -> return () + where + threads = do sequence $ replicate 3 $ + forkIO $ do t <- myThreadId + --putStrLn ("Start " ++ show t) + threadDelay one_second + --putStrLn ("End " ++ show t) + throwTo tid NonTermination + --putStrLn ("Thrown " ++ show t) + threadDelay (10 * one_second) + +one_second :: Int +one_second = 100000 diff --git a/testsuite/tests/concurrent/should_run/conc064.stderr b/testsuite/tests/concurrent/should_run/conc064.stderr new file mode 100644 index 0000000000..9a49972f77 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc064.stderr @@ -0,0 +1 @@ +conc064: <<loop>> diff --git a/testsuite/tests/concurrent/should_run/conc065.hs b/testsuite/tests/concurrent/should_run/conc065.hs new file mode 100644 index 0000000000..db6d7cf3ba --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc065.hs @@ -0,0 +1,13 @@ +-- Test for bug #1047 + +import Control.Concurrent +import Control.Exception + +-- This loop spends most of its time printing stuff, and very occasionally +-- pops outside 'block'. This test ensures that an thread trying to +-- throwTo this thread will eventually succeed. +loop = block (print "alive") >> loop + +main = do tid <- forkIO loop + threadDelay 1 + killThread tid diff --git a/testsuite/tests/concurrent/should_run/conc066.hs b/testsuite/tests/concurrent/should_run/conc066.hs new file mode 100644 index 0000000000..81638dfd10 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc066.hs @@ -0,0 +1,13 @@ +-- Test for bug #1047 + +import Control.Concurrent +import Control.Exception + +-- This loop spends most of its time printing stuff, and very occasionally +-- executes 'unblock (return ())'. This test ensures that a thread waiting +-- to throwTo this thread is not blocked indefinitely. +loop = do unblock (return ()); print "alive"; loop + +main = do tid <- forkIO (block loop) + yield + killThread tid diff --git a/testsuite/tests/concurrent/should_run/conc067.hs b/testsuite/tests/concurrent/should_run/conc067.hs new file mode 100644 index 0000000000..ef6dde3ff7 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc067.hs @@ -0,0 +1,16 @@ +-- Test for bug #418 + +module Main where + +import Control.Concurrent +import System.IO.Unsafe (unsafeInterleaveIO) + +main = do + v <- newEmptyMVar + a <- unsafeInterleaveIO (readMVar v) + t <- forkIO (print a) + threadDelay (100*1000) + killThread t + forkIO $ print a + putMVar v () + diff --git a/testsuite/tests/concurrent/should_run/conc068.hs b/testsuite/tests/concurrent/should_run/conc068.hs new file mode 100644 index 0000000000..eb90d06591 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc068.hs @@ -0,0 +1,14 @@ +import Control.Concurrent +import Control.Exception +import GHC.Conc + +-- test forkBlockIO +main = do + main_thread <- myThreadId + m <- newEmptyMVar + sub_thread <- block $ forkIO $ + sum [1..100000] `seq` + throwTo main_thread (ErrorCall "foo") + killThread sub_thread + putStrLn "oops" + diff --git a/testsuite/tests/concurrent/should_run/conc068.stderr b/testsuite/tests/concurrent/should_run/conc068.stderr new file mode 100644 index 0000000000..bf40dfdd92 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc068.stderr @@ -0,0 +1 @@ +conc068: foo diff --git a/testsuite/tests/concurrent/should_run/conc069.hs b/testsuite/tests/concurrent/should_run/conc069.hs new file mode 100644 index 0000000000..fd757133a5 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc069.hs @@ -0,0 +1,19 @@ +import Control.Concurrent +import Control.Exception + +main = do + -- stat -- main thread is not bound in GHCi + m <- newEmptyMVar + forkIO (do stat; putMVar m ()) + takeMVar m + block $ forkIO (do stat; putMVar m ()) + takeMVar m + forkOS (do stat; putMVar m ()) + takeMVar m + block $ forkOS (do stat; putMVar m ()) + takeMVar m + +stat = do + x <- isCurrentThreadBound + y <- blocked + print (x,y) diff --git a/testsuite/tests/concurrent/should_run/conc069.stdout b/testsuite/tests/concurrent/should_run/conc069.stdout new file mode 100644 index 0000000000..240e16e63f --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc069.stdout @@ -0,0 +1,4 @@ +(False,False) +(False,True) +(True,False) +(True,True) diff --git a/testsuite/tests/concurrent/should_run/conc069a.hs b/testsuite/tests/concurrent/should_run/conc069a.hs new file mode 100644 index 0000000000..5bf619bec1 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc069a.hs @@ -0,0 +1,19 @@ +import Control.Concurrent +import Control.Exception + +main = do + -- stat -- main thread is not bound in GHCi + m <- newEmptyMVar + forkIO (do stat; putMVar m ()) + takeMVar m + mask_ $ forkIO (do stat; putMVar m ()) + takeMVar m + forkOS (do stat; putMVar m ()) + takeMVar m + mask_ $ forkOS (do stat; putMVar m ()) + takeMVar m + +stat = do + x <- isCurrentThreadBound + y <- getMaskingState + print (x,y) diff --git a/testsuite/tests/concurrent/should_run/conc069a.stdout b/testsuite/tests/concurrent/should_run/conc069a.stdout new file mode 100644 index 0000000000..0883f133dc --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc069a.stdout @@ -0,0 +1,4 @@ +(False,Unmasked) +(False,MaskedInterruptible) +(True,Unmasked) +(True,MaskedInterruptible) diff --git a/testsuite/tests/concurrent/should_run/conc070.hs b/testsuite/tests/concurrent/should_run/conc070.hs new file mode 100644 index 0000000000..71eb415427 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc070.hs @@ -0,0 +1,18 @@ +import Control.Concurrent +import GHC.Conc +import Data.List +import Data.Maybe + +main = do + t1 <- forkIO (threadDelay 100000000) + m <- newEmptyMVar + t2 <- forkIO (takeMVar m) + t3 <- forkIO (let loop = do r <- tryTakeMVar m; + _ <- newEmptyMVar -- do some allocation :( + if isNothing r then loop else return () + in loop) + t4 <- forkIO (return ()) + yield + threadDelay 10000 + print =<< mapM threadStatus [t1,t2,t3,t4] + putMVar m () diff --git a/testsuite/tests/concurrent/should_run/conc070.stdout b/testsuite/tests/concurrent/should_run/conc070.stdout new file mode 100644 index 0000000000..30f0076668 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc070.stdout @@ -0,0 +1 @@ +[ThreadBlocked BlockedOnMVar,ThreadBlocked BlockedOnMVar,ThreadRunning,ThreadFinished] diff --git a/testsuite/tests/concurrent/should_run/conc071.hs b/testsuite/tests/concurrent/should_run/conc071.hs new file mode 100644 index 0000000000..7c58efbc9f --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc071.hs @@ -0,0 +1,11 @@ +module Main where + +import Control.Concurrent + +main = do + t <- forkIO (return ()) + threadCapability t >>= print + t <- forkOn 0 (return ()) + threadCapability t >>= print + t <- forkOn 1 (return ()) + threadCapability t >>= print diff --git a/testsuite/tests/concurrent/should_run/conc071.stdout b/testsuite/tests/concurrent/should_run/conc071.stdout new file mode 100644 index 0000000000..9933b254fe --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc071.stdout @@ -0,0 +1,3 @@ +(0,False) +(0,True) +(0,True) diff --git a/testsuite/tests/concurrent/should_run/conc072.hs b/testsuite/tests/concurrent/should_run/conc072.hs new file mode 100644 index 0000000000..8f1218084c --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc072.hs @@ -0,0 +1,9 @@ +module Main where + +import Control.Concurrent + +main = do + t <- forkOn 0 (return ()) + threadCapability t >>= print + t <- forkOn 1 (return ()) + threadCapability t >>= print diff --git a/testsuite/tests/concurrent/should_run/conc072.stdout b/testsuite/tests/concurrent/should_run/conc072.stdout new file mode 100644 index 0000000000..739ac3797e --- /dev/null +++ b/testsuite/tests/concurrent/should_run/conc072.stdout @@ -0,0 +1,2 @@ +(0,True) +(1,True) diff --git a/testsuite/tests/concurrent/should_run/foreignInterruptible.hs b/testsuite/tests/concurrent/should_run/foreignInterruptible.hs new file mode 100644 index 0000000000..32252fb8db --- /dev/null +++ b/testsuite/tests/concurrent/should_run/foreignInterruptible.hs @@ -0,0 +1,32 @@ +{-# LANGUAGE ForeignFunctionInterface #-} +{-# OPTIONS -cpp #-} +module Main where + +import Control.Concurrent +import Control.Exception +import Prelude hiding (catch) +import Foreign +import System.IO + +#ifdef mingw32_HOST_OS +sleep n = sleepBlock (n*1000) +foreign import stdcall interruptible "Sleep" sleepBlock :: Int -> IO () +#else +sleep n = sleepBlock n +foreign import ccall interruptible "sleep" sleepBlock :: Int -> IO () +#endif + +main :: IO () +main = do + newStablePtr stdout -- prevent stdout being finalized + th <- newEmptyMVar + tid <- forkIO $ do + putStrLn "newThread started" + (sleep 2 >> putStrLn "fail") `catch` (\ThreadKilled -> putStrLn "pass") + putMVar th "child" + yield + threadDelay 500000 + killThread tid + x <- takeMVar th + putStrLn x + putStrLn "\nshutting down" diff --git a/testsuite/tests/concurrent/should_run/foreignInterruptible.stdout b/testsuite/tests/concurrent/should_run/foreignInterruptible.stdout new file mode 100644 index 0000000000..4048ae362e --- /dev/null +++ b/testsuite/tests/concurrent/should_run/foreignInterruptible.stdout @@ -0,0 +1,5 @@ +newThread started +pass +child + +shutting down diff --git a/testsuite/tests/concurrent/should_run/mask001.hs b/testsuite/tests/concurrent/should_run/mask001.hs new file mode 100644 index 0000000000..96bbf53c73 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/mask001.hs @@ -0,0 +1,70 @@ +import Control.Exception +import Text.Printf + +-- Test all the various combinations of nesting mask/uninterruptibleMask + +main = do + stat 1 Unmasked + mask_ $ stat 2 MaskedInterruptible + mask $ \restore -> do + stat 3 MaskedInterruptible + restore $ stat 4 Unmasked + restore $ restore $ stat 5 Unmasked + stat 6 MaskedInterruptible + uninterruptibleMask $ \restore -> do + stat 7 MaskedUninterruptible + restore $ stat 8 MaskedInterruptible + restore $ restore $ stat 9 MaskedInterruptible + stat 10 MaskedUninterruptible + mask $ \restore -> do + stat 11 MaskedUninterruptible + restore $ stat 12 MaskedUninterruptible + restore $ restore $ stat 13 MaskedUninterruptible + stat 14 MaskedUninterruptible + stat 15 MaskedUninterruptible + stat 16 MaskedInterruptible + stat 17 Unmasked + + uninterruptibleMask $ \restore -> do + stat 20 MaskedUninterruptible + restore $ stat 21 Unmasked + restore $ restore $ stat 22 Unmasked + stat 23 MaskedUninterruptible + mask $ \restore -> do + stat 24 MaskedUninterruptible + restore $ stat 25 MaskedUninterruptible + restore $ restore $ stat 26 MaskedUninterruptible + stat 27 MaskedUninterruptible + uninterruptibleMask $ \restore -> do + stat 28 MaskedUninterruptible + restore $ stat 29 MaskedUninterruptible + restore $ restore $ stat 30 MaskedUninterruptible + stat 31 MaskedUninterruptible + stat 32 MaskedUninterruptible + stat 33 MaskedUninterruptible + stat 34 Unmasked + + -- it is possible to call a restore from a mask that is not the + -- innermost enclosing one, although this is not a recommended use + -- of the API. + mask $ \restore0 -> do + stat 41 MaskedInterruptible + -- it is possible to call a restore from a mask that is not the + uninterruptibleMask $ \restore1 -> do + stat 42 MaskedUninterruptible + restore0 $ stat 43 Unmasked + restore0 $ restore0 $ stat 44 Unmasked + restore1 $ stat 45 MaskedInterruptible + restore1 $ restore1 $ stat 46 MaskedInterruptible + restore0 $ restore1 $ stat 47 MaskedInterruptible + restore1 $ restore0 $ stat 48 Unmasked + stat 49 MaskedUninterruptible + stat 50 MaskedInterruptible + stat 51 Unmasked + +stat :: Int -> MaskingState -> IO () +stat n m = do + s <- getMaskingState + if (s /= m) + then error (printf "%2d: %s\n" n (show s)) + else return () diff --git a/testsuite/tests/concurrent/should_run/mask002.hs b/testsuite/tests/concurrent/should_run/mask002.hs new file mode 100644 index 0000000000..15b2e64a00 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/mask002.hs @@ -0,0 +1,32 @@ +import Control.Exception +import Control.Concurrent +import Text.Printf +import Prelude hiding(catch) + +-- Test combinations of nesting mask/uninterruptibleMask with +-- forkIO/forkIOUnmask + +main = do + m <- newEmptyMVar + t1 <- mask_ $ forkIO $ do + takeMVar m `catch` \e -> do stat 1 MaskedInterruptible + print (e::SomeException) + throwIO e + killThread t1 + t2 <- uninterruptibleMask_ $ forkIO $ do + takeMVar m `catch` \e -> do stat 2 MaskedUninterruptible + print (e::SomeException) + throwIO e + killThread t2 + t3 <- mask_ $ forkIOUnmasked $ do stat 3 Unmasked; putMVar m () + takeMVar m + t4 <- uninterruptibleMask_ $ forkIOUnmasked $ do stat 4 Unmasked; putMVar m () + takeMVar m + +stat :: Int -> MaskingState -> IO () +stat n m = do + s <- getMaskingState + if (s /= m) + then error (printf "%2d: %s\n" n (show s)) + else return () + diff --git a/testsuite/tests/concurrent/should_run/mask002.stdout b/testsuite/tests/concurrent/should_run/mask002.stdout new file mode 100644 index 0000000000..baa1975a5a --- /dev/null +++ b/testsuite/tests/concurrent/should_run/mask002.stdout @@ -0,0 +1,2 @@ +thread killed +thread blocked indefinitely in an MVar operation diff --git a/testsuite/tests/concurrent/should_run/numsparks001.hs b/testsuite/tests/concurrent/should_run/numsparks001.hs new file mode 100644 index 0000000000..f28bf87d55 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/numsparks001.hs @@ -0,0 +1,11 @@ + +import GHC.Conc + +main = do + let x = length [1..100] + numSparks >>= print + x `par` numSparks >>= print + x `par` numSparks >>= print + x `par` numSparks >>= print + x `par` numSparks >>= print + diff --git a/testsuite/tests/concurrent/should_run/numsparks001.stdout b/testsuite/tests/concurrent/should_run/numsparks001.stdout new file mode 100644 index 0000000000..9dfcf39f5a --- /dev/null +++ b/testsuite/tests/concurrent/should_run/numsparks001.stdout @@ -0,0 +1,5 @@ +0 +1 +2 +3 +4 diff --git a/testsuite/tests/concurrent/should_run/throwto001.hs b/testsuite/tests/concurrent/should_run/throwto001.hs new file mode 100644 index 0000000000..999d3335d8 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/throwto001.hs @@ -0,0 +1,38 @@ +import Control.Concurrent +import Control.Exception +import Data.Array +import System.Random +import System.Environment +import Control.Monad +import GHC.Conc + +-- A fiendish throwTo test. A bunch of threads take random MVars from +-- a shared array; if the MVar has Nothing in it, replace it with Just +-- of the current thread's ThreadId. If the MVar has another ThreadId +-- in it, then killThread that thread, and replace it with the current +-- thread's ThreadId. We keep going until only one thread is left +-- standing. +-- +-- On multiple CPUs this should give throwTo a good workout. +-- +main = do + [m, t] <- fmap (fmap read) getArgs + ms <- replicateM m $ newMVar Nothing + let arr = listArray (1,m) ms + dead <- newTVarIO 0 + ts <- replicateM t $ forkIO (thread m arr `onException` + (atomically $ do d <- readTVar dead + writeTVar dead $! d+1)) + atomically $ do + d <- readTVar dead + when (d < t-1) $ retry + +thread m arr = do + x <- randomIO + id <- myThreadId + modifyMVar_ (arr ! ((x `mod` m) + 1)) $ \b -> + case b of + Nothing -> return (Just id) + Just other -> do when (other /= id) $ killThread other + return (Just id) + thread m arr diff --git a/testsuite/tests/concurrent/should_run/throwto002.hs b/testsuite/tests/concurrent/should_run/throwto002.hs new file mode 100644 index 0000000000..c9857f1f1e --- /dev/null +++ b/testsuite/tests/concurrent/should_run/throwto002.hs @@ -0,0 +1,25 @@ +{-# LANGUAGE DoRec, ScopedTypeVariables #-} +import Control.Concurrent +import Control.Exception +import Data.Array +import System.Random +import System.Environment +import Control.Monad +import GHC.Conc +import Data.IORef +import Prelude hiding (catch) + +main = do + r <- newIORef 0 + rec + t1 <- block $ forkIO (thread r t2) + t2 <- block $ forkIO (thread r t1) + threadDelay 1000000 + readIORef r >>= print + +thread r t = run + where + run = (unblock $ forever $ do killThread t + i <- atomicModifyIORef r (\i -> (i + 1, i)) + evaluate i) + `catch` \(e::SomeException) -> run diff --git a/testsuite/tests/concurrent/should_run/throwto003.hs b/testsuite/tests/concurrent/should_run/throwto003.hs new file mode 100644 index 0000000000..6369c62352 --- /dev/null +++ b/testsuite/tests/concurrent/should_run/throwto003.hs @@ -0,0 +1,17 @@ +{-# LANGUAGE DoRec, ScopedTypeVariables #-} +import Control.Concurrent +import Control.Exception +import Control.Monad +import Prelude hiding (catch) + +main = do + m <- newMVar 1 + t1 <- forkIO $ thread m + t2 <- forkIO $ forever $ killThread t1 + threadDelay 1000000 + takeMVar m + +thread m = run + where + run = (unblock $ forever $ modifyMVar_ m $ \v -> if v `mod` 2 == 1 then return (v*2) else return (v-1)) + `catch` \(e::SomeException) -> run |