{"cells":[{"cell_type":"markdown","metadata":{},"source":["# FileSystem (Polyglot)"]},{"cell_type":"code","execution_count":1,"metadata":{"duration_ms":2177,"language":"fsharp"},"outputs":[],"source":["#r \"nuget: fsharp.control.asyncseq, 3.2.1\"\n","#r \"nuget: system.reactive, 6.0.1-preview.1\"\n","#r \"nuget: system.reactive.linq, 6.0.1-preview.1\"\n","#r \"nuget: argu, 6.2.4\""]},{"cell_type":"code","execution_count":2,"metadata":{"duration_ms":10194,"language":"fsharp"},"outputs":[],"source":["#!import ../../lib/fsharp/Notebooks.livemd"]},{"cell_type":"code","execution_count":3,"metadata":{"duration_ms":689,"language":"fsharp"},"outputs":[],"source":["#!import ../../lib/fsharp/Testing.livemd"]},{"cell_type":"code","execution_count":4,"metadata":{"duration_ms":41,"language":"fsharp"},"outputs":[],"source":["#!import ../../lib/fsharp/Common.fs"]},{"cell_type":"code","execution_count":5,"metadata":{"duration_ms":16,"language":"fsharp"},"outputs":[],"source":["#!import ../../lib/fsharp/CommonFSharp.fs"]},{"cell_type":"code","execution_count":6,"metadata":{"duration_ms":297,"language":"fsharp"},"outputs":[],"source":["#!import ../../lib/fsharp/Async.fs"]},{"cell_type":"code","execution_count":7,"metadata":{"duration_ms":59,"language":"fsharp"},"outputs":[],"source":["#!import ../../lib/fsharp/AsyncSeq.fs"]},{"cell_type":"code","execution_count":8,"metadata":{"duration_ms":59,"language":"fsharp"},"outputs":[],"source":["#!import ../../lib/fsharp/Runtime.fs"]},{"cell_type":"code","execution_count":9,"metadata":{"duration_ms":9,"language":"fsharp"},"outputs":[],"source":["#if !INTERACTIVE\n","open Lib\n","#endif"]},{"cell_type":"code","execution_count":10,"metadata":{"duration_ms":11,"language":"fsharp"},"outputs":[],"source":["open Common\n","open SpiralFileSystem.Operators"]},{"cell_type":"markdown","metadata":{},"source":["## watchDirectory"]},{"cell_type":"code","execution_count":11,"metadata":{"duration_ms":201,"language":"fsharp"},"outputs":[],"source":["[<RequireQualifiedAccess>]\n","type FileSystemChangeType =\n","    | Failure\n","    | Changed\n","    | Created\n","    | Deleted\n","    | Renamed\n","\n","[<RequireQualifiedAccess>]\n","type FileSystemChange =\n","    | Failure of exn: exn\n","    | Changed of path: string * content: string option\n","    | Created of path: string * content: string option\n","    | Deleted of path: string\n","    | Renamed of oldPath: string * (string * string option)\n","\n","\n","let inline watchDirectoryWithFilter filter shouldReadContent path =\n","    let fullPath = path |> System.IO.Path.GetFullPath\n","    let _locals () = $\"filter: {filter} / {_locals ()}\"\n","\n","    let watcher =\n","        new System.IO.FileSystemWatcher (\n","            Path = fullPath,\n","            NotifyFilter = filter,\n","            EnableRaisingEvents = true,\n","            IncludeSubdirectories = true\n","        )\n","\n","    let inline getEventPath (path : string) =\n","        path |> SpiralSm.trim |> SpiralSm.replace fullPath \"\" |> SpiralSm.trim_start [| '/'; '\\\\' |]\n","\n","    let inline ticks () =\n","        System.DateTime.UtcNow.Ticks\n","\n","    let changedStream =\n","        AsyncSeq.subscribeEvent\n","            watcher.Changed\n","            (fun event ->\n","                ticks (),\n","                [ FileSystemChange.Changed (getEventPath event.FullPath, None) ]\n","            )\n","\n","    let deletedStream =\n","        AsyncSeq.subscribeEvent\n","            watcher.Deleted\n","            (fun event ->\n","                ticks (),\n","                [ FileSystemChange.Deleted (getEventPath event.FullPath) ]\n","            )\n","\n","    let createdStream =\n","        AsyncSeq.subscribeEvent\n","            watcher.Created\n","            (fun event ->\n","                let path = getEventPath event.FullPath\n","                ticks (), [\n","                    FileSystemChange.Created (path, None)\n","                    if SpiralPlatform.is_windows () then\n","                        FileSystemChange.Changed (path, None)\n","                ])\n","\n","    let renamedStream =\n","        AsyncSeq.subscribeEvent\n","            watcher.Renamed\n","            (fun event ->\n","                ticks (), [\n","                    FileSystemChange.Renamed (\n","                        getEventPath event.OldFullPath,\n","                        (getEventPath event.FullPath, None)\n","                    )\n","                ]\n","            )\n","\n","    let failureStream =\n","        AsyncSeq.subscribeEvent\n","            watcher.Error\n","            (fun event -> ticks (), [ FileSystemChange.Failure (event.GetException ()) ])\n","\n","    let stream =\n","        [\n","            changedStream\n","            deletedStream\n","            createdStream\n","            renamedStream\n","            failureStream\n","        ]\n","        |> FSharp.Control.AsyncSeq.mergeAll\n","        |> FSharp.Control.AsyncSeq.map (fun (t, events) ->\n","            events\n","            |> List.fold\n","                (fun (i, events) event ->\n","                    i + 1L,\n","                    (t + i, event) :: events)\n","                (0L, [])\n","            |> snd\n","            |> List.rev\n","        )\n","        |> FSharp.Control.AsyncSeq.concatSeq\n","        |> FSharp.Control.AsyncSeq.mapAsyncParallel (fun (t, event) -> async {\n","            match shouldReadContent event, event with\n","            | true, FileSystemChange.Changed (path, _) ->\n","                do! Async.Sleep 5\n","                let! content = fullPath </> path |> SpiralFileSystem.read_all_text_retry_async\n","                return t, FileSystemChange.Changed (path, content)\n","            | true, FileSystemChange.Created (path, _) ->\n","                do! Async.Sleep 5\n","                let! content = fullPath </> path |> SpiralFileSystem.read_all_text_retry_async\n","                return t, FileSystemChange.Created (path, content)\n","            | true, FileSystemChange.Renamed (oldPath, (newPath, _)) ->\n","                let! content = fullPath </> newPath |> SpiralFileSystem.read_all_text_retry_async\n","                return t, FileSystemChange.Renamed (oldPath, (newPath, content))\n","            | _ -> return t, event\n","        })\n","\n","    let disposable =\n","        new_disposable (fun () ->\n","            trace Debug (fun () -> \"FileSystem.watchWithFilter / Disposing watch stream\") _locals\n","            watcher.EnableRaisingEvents <- false\n","            watcher.Dispose ()\n","        )\n","\n","    stream, disposable\n","\n","let inline watchDirectory path =\n","    watchDirectoryWithFilter\n","        (System.IO.NotifyFilters.FileName\n","        // ||| System.IO.NotifyFilters.DirectoryName\n","        // ||| System.IO.NotifyFilters.Attributes\n","        //// ||| System.IO.NotifyFilters.Size\n","        ||| System.IO.NotifyFilters.LastWrite\n","        //// ||| System.IO.NotifyFilters.LastAccess\n","        // ||| System.IO.NotifyFilters.CreationTime\n","        // ||| System.IO.NotifyFilters.Security\n","        )\n","        path"]},{"cell_type":"markdown","metadata":{},"source":["### testEventsRaw (test)"]},{"cell_type":"code","execution_count":12,"metadata":{"duration_ms":79,"language":"fsharp"},"outputs":[],"source":["///- --test\n","\n","let inline testEventsRaw\n","    (watchFn : (_ -> bool) -> string -> FSharp.Control.AsyncSeq<int64 * FileSystemChange> * IDisposable)\n","    write\n","    =\n","    let struct (tempDir, tempDisposable) =\n","        \"FileSystem.testEventsRaw\"\n","        |> SpiralCrypto.hash_text\n","        |> SpiralFileSystem.create_temp_dir'\n","    let stream, disposable = watchFn (fun _ -> true) tempDir\n","\n","    let events = System.Collections.Concurrent.ConcurrentBag ()\n","\n","    let inline iter () =\n","        stream\n","        |> FSharp.Control.AsyncSeq.iterAsyncParallel (fun event -> async { events.Add event })\n","\n","    let run = async {\n","        let! _ = iter () |> Async.StartChild\n","        do! Async.Sleep 250\n","        return! write tempDir\n","    }\n","\n","    try\n","        run\n","        |> Async.runWithTimeout 60000\n","        |> _assertEqual (Some ())\n","    finally\n","        disposable.Dispose ()\n","        tempDisposable.Dispose ()\n","\n","    let eventsLog =\n","        events\n","        |> Seq.toList\n","        |> List.sortBy fst\n","        |> List.fold\n","            (fun (prev, acc) (ticks, event) ->\n","                ticks, (ticks, (if prev = 0L then 0L else ticks - prev), event) :: acc\n","            )\n","            (0L, [])\n","        |> snd\n","        |> List.rev\n","        |> List.map (fun (diff, n, event) -> $\"{n} / {diff} / {event}\" |> SpiralSm.ellipsis_end 100L)\n","        |> SpiralSm.concat \"\\n\"\n","    let _locals () = $\"eventsLog: \\n{eventsLog} / {_locals ()}\"\n","    trace Debug (fun () -> \"FileSystem.testEventsRaw\") _locals\n","\n","    events\n","    |> Seq.toList\n","    |> List.sortBy fst\n","    |> List.map snd\n","    |> List.fold\n","        (fun acc event ->\n","            match acc, event with\n","            | FileSystemChange.Changed (lastPath, Some lastContent) as lastEvent :: acc,\n","                FileSystemChange.Changed (path, Some content)\n","                when lastPath = path && content |> SpiralSm.starts_with lastContent\n","                ->\n","                event :: acc\n","            | _ -> event :: acc\n","        )\n","        []\n","    |> List.rev"]},{"cell_type":"markdown","metadata":{},"source":["#### fast (test)"]},{"cell_type":"code","execution_count":13,"metadata":{"duration_ms":1996,"language":"fsharp"},"outputs":[{"name":"stdout","output_type":"stream","text":["Some ()\n","\n","11:54:34 \u001B[94md\u001B[0m #1 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite\n","11:54:34 \u001B[94md\u001B[0m #2 FileSystem.testEventsRaw / eventsLog: \n","0 / 639269708730520262 / Created (\"file1.txt\", Some \"a1\")\n","12919 / 639269708730533181 / Changed (\"file1.txt\", Some \"a1\")\n","2034 / 639269708730535215 / Created (\"file2.txt\", Some \"a2\")\n","40 / 639269708730535255 / Changed (\"file2.txt\", Some \"a2\")\n","37 / 639269708730535292 / Changed (\"file2.txt\", Some \"a2\")\n","2481958 / 639269708733017250 / Changed (\"file1.txt\", Some \"b1\")\n","277 / 639269708733017527 / Changed (\"file1.txt\", Some \"b1\")\n","9774 / 639269708733027301 / Changed (\"file2.txt\", Some \"b2\")\n","2672009 / 639269708735699310 / Renamed (\"file1.txt\", (\"file_1.txt\", Some \"b1\"))\n","12201 / 639269708735711511 / Renamed (\"file2.txt\", (\"file_2.txt\", Some \"b2\"))\n","2538763 / 639269708738250274 / Changed (\"file_1.txt\", Some \"c1\")\n","375 / 639269708738250649 / Changed (\"file_1.txt\", Some \"c1\")\n","5053 / 639269708738255702 / Changed (\"file_2.txt\", Some \"c2\")\n","431 / 639269708738256133 / Changed (\"file_2.txt\", Some \"c2\")\n","2566519 / 639269708740822652 / Deleted \"file_1.txt\"\n","1763 / 639269708740824415 / Deleted \"file_2.txt\"\n","[Created (\"file1.txt\", Some \"a1\"); Changed (\"file1.txt\", Some \"a1\"); Created (\"file2.txt\", Some \"a2\");\n"," Changed (\"file2.txt\", Some \"a2\"); Changed (\"file1.txt\", Some \"b1\"); Changed (\"file2.txt\", Some \"b2\");\n"," Renamed (\"file1.txt\", (\"file_1.txt\", Some \"b1\")); Renamed (\"file2.txt\", (\"file_2.txt\", Some \"b2\"));\n"," Changed (\"file_1.txt\", Some \"c1\"); Changed (\"file_2.txt\", Some \"c2\"); Deleted \"file_1.txt\"; Deleted \"file_2.txt\"]\n","\n","Some ()"]}],"source":["///- --test\n","\n","let inline write path = async {\n","    let n = 2\n","\n","    for i = 1 to n do\n","        do! $\"a{i}\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    do! Async.Sleep 250\n","\n","    for i = 1 to n do\n","        do! $\"b{i}\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    do! Async.Sleep 250\n","\n","    for i = 1 to n do\n","        do! path </> $\"file{i}.txt\" |> SpiralFileSystem.move_file_async (path </> $\"file_{i}.txt\") |> Async.Ignore\n","\n","    do! Async.Sleep 250\n","\n","    for i = 1 to n do\n","        do! $\"c{i}\" |> SpiralFileSystem.write_all_text_async (path </> $\"file_{i}.txt\")\n","\n","    do! Async.Sleep 250\n","\n","    for i = 1 to n do\n","        do! SpiralFileSystem.delete_file_async (path </> $\"file_{i}.txt\") |> Async.Ignore\n","\n","    do! Async.Sleep 250\n","}\n","\n","let inline run () =\n","    let events = testEventsRaw watchDirectory write\n","\n","    events\n","    |> _sequenceEqual [\n","        FileSystemChange.Created (\"file1.txt\", Some \"a1\")\n","        FileSystemChange.Changed (\"file1.txt\", Some \"a1\")\n","        FileSystemChange.Created (\"file2.txt\", Some \"a2\")\n","        FileSystemChange.Changed (\"file2.txt\", Some \"a2\")\n","\n","        FileSystemChange.Changed (\"file1.txt\", Some \"b1\")\n","        FileSystemChange.Changed (\"file2.txt\", Some \"b2\")\n","\n","        FileSystemChange.Renamed (\"file1.txt\", (\"file_1.txt\", Some \"b1\"))\n","        FileSystemChange.Renamed (\"file2.txt\", (\"file_2.txt\", Some \"b2\"))\n","\n","        FileSystemChange.Changed (\"file_1.txt\", Some \"c1\")\n","        FileSystemChange.Changed (\"file_2.txt\", Some \"c2\")\n","\n","        FileSystemChange.Deleted \"file_1.txt\"\n","        FileSystemChange.Deleted \"file_2.txt\"\n","    ]\n","\n","run\n","|> retry_fn 3\n","|> _assertEqual (Some ())"]},{"cell_type":"markdown","metadata":{},"source":["#### slow (test)"]},{"cell_type":"code","execution_count":14,"metadata":{"duration_ms":9879,"language":"fsharp"},"outputs":[{"name":"stdout","output_type":"stream","text":["Some ()\n","\n","11:54:42 \u001B[94md\u001B[0m #3 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite\n","11:54:43 \u001B[94md\u001B[0m #4 FileSystem.testEventsRaw / eventsLog: \n","0 / 639269708750507668 / Created\n","  (\"file1.txt\",\n"," ...11111111111111111111111111111111111111111111111a\")\n","3426 / 639269708750511094 / Changed\n","  (\"file1.txt\"...11111111111111111111111111111111111111111111111a\")\n","271 / 639269708750511365 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111a\")\n","73 / 639269708750511438 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","38 / 639269708750511476 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","37 / 639269708750511513 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","50 / 639269708750511563 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","38 / 639269708750511601 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","27 / 639269708750511628 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","30 / 639269708750511658 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","45 / 639269708750511703 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","35 / 639269708750511738 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","88 / 639269708750511826 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","72 / 639269708750511898 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","37 / 639269708750511935 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","35 / 639269708750511970 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","33 / 639269708750512003 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","142 / 639269708750512145 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111a\")\n","151 / 639269708750512296 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111a\")\n","82 / 639269708750512378 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","48 / 639269708750512426 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","33 / 639269708750512459 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","33 / 639269708750512492 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","42 / 639269708750512534 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","31 / 639269708750512565 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","36 / 639269708750512601 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","34 / 639269708750512635 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","34 / 639269708750512669 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","28 / 639269708750512697 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","27 / 639269708750512724 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","29 / 639269708750512753 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","39 / 639269708750512792 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","36 / 639269708750512828 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","33 / 639269708750512861 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","34 / 639269708750512895 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","35 / 639269708750512930 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","36 / 639269708750512966 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","32 / 639269708750512998 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","31 / 639269708750513029 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","45 / 639269708750513074 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","32 / 639269708750513106 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","30 / 639269708750513136 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","30 / 639269708750513166 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","27 / 639269708750513193 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","32 / 639269708750513225 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","29 / 639269708750513254 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","31 / 639269708750513285 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","34 / 639269708750513319 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","49 / 639269708750513368 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","33 / 639269708750513401 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","33 / 639269708750513434 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","29 / 639269708750513463 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","32 / 639269708750513495 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","30 / 639269708750513525 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","31 / 639269708750513556 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","30 / 639269708750513586 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","46 / 639269708750513632 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","33 / 639269708750513665 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","31 / 639269708750513696 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","31 / 639269708750513727 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","32 / 639269708750513759 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","29 / 639269708750513788 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","29 / 639269708750513817 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","29 / 639269708750513846 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","30 / 639269708750513876 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","40 / 639269708750513916 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","34 / 639269708750513950 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","32 / 639269708750513982 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","29 / 639269708750514011 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","31 / 639269708750514042 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","28 / 639269708750514070 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","31 / 639269708750514101 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","42 / 639269708750514143 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","32 / 639269708750514175 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","577 / 639269708750514752 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111a\")\n","80 / 639269708750514832 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","33 / 639269708750514865 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","33 / 639269708750514898 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","51 / 639269708750514949 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","29 / 639269708750514978 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","32 / 639269708750515010 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","34 / 639269708750515044 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","32 / 639269708750515076 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","2329 / 639269708750517405 / Changed\n","  (\"file1.txt\"...11111111111111111111111111111111111111111111111a\")\n","102 / 639269708750517507 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111a\")\n","27 / 639269708750517534 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","19 / 639269708750517553 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","17 / 639269708750517570 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","18 / 639269708750517588 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","18 / 639269708750517606 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","18 / 639269708750517624 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","39 / 639269708750517663 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","16 / 639269708750517679 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111a\")\n","448 / 639269708750518127 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111a\")\n","22392 / 639269708750540519 / Created\n","  (\"file2.txt...22222222222222222222222222222222222222222222222a\")\n","67 / 639269708750540586 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","41 / 639269708750540627 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750540657 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","33 / 639269708750540690 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","58 / 639269708750540748 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750540779 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750540810 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750540840 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750540870 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750540899 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750540929 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750540959 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","28 / 639269708750540987 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","41 / 639269708750541028 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","28 / 639269708750541056 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750541085 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750541116 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750541146 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","27 / 639269708750541173 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","27 / 639269708750541200 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750541230 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","43 / 639269708750541273 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750541302 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750541333 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750541364 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750541393 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","28 / 639269708750541421 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750541452 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750541483 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","43 / 639269708750541526 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750541557 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750541587 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750541617 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","27 / 639269708750541644 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750541674 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750541704 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","28 / 639269708750541732 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750541762 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","71 / 639269708750541833 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750541862 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750541891 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750541922 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750541953 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750541982 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","39 / 639269708750542021 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750542050 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","26 / 639269708750542076 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","27 / 639269708750542103 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","24 / 639269708750542127 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","24 / 639269708750542151 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","27 / 639269708750542178 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","28 / 639269708750542206 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","27 / 639269708750542233 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","43 / 639269708750542276 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750542306 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750542338 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750542370 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750542400 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750542432 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750542463 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750542493 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","48 / 639269708750542541 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","37 / 639269708750542578 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","33 / 639269708750542611 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750542640 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","35 / 639269708750542675 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750542706 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","27 / 639269708750542733 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750542764 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750542795 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","43 / 639269708750542838 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","35 / 639269708750542873 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","33 / 639269708750542906 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","34 / 639269708750542940 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750542969 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","27 / 639269708750542996 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750543028 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750543059 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","40 / 639269708750543099 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750543131 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750543163 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750543192 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750543224 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750543255 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750543286 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","28 / 639269708750543314 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750543345 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","49 / 639269708750543394 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","33 / 639269708750543427 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750543459 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750543491 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750543522 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750543554 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750543586 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","33 / 639269708750543619 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","42 / 639269708750543661 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750543692 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750543722 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750543753 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750543783 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750543815 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750543844 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","33 / 639269708750543877 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750543906 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","44 / 639269708750543950 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","35 / 639269708750543985 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","32 / 639269708750544017 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750544046 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","26 / 639269708750544072 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","29 / 639269708750544101 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","31 / 639269708750544132 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","30 / 639269708750544162 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","43 / 639269708750544205 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","28 / 639269708750544233 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222a\")\n","15057451 / 639269708765601684 / Changed\n","  (\"file1....11111111111111111111111111111111111111111111111b\")\n","3607 / 639269708765605291 / Changed\n","  (\"file1.txt\"...11111111111111111111111111111111111111111111111b\")\n","610 / 639269708765605901 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","45 / 639269708765605946 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","30 / 639269708765605976 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","26 / 639269708765606002 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","27 / 639269708765606029 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","30 / 639269708765606059 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","26 / 639269708765606085 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","25 / 639269708765606110 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","39 / 639269708765606149 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","1516 / 639269708765607665 / Changed\n","  (\"file1.txt\"...11111111111111111111111111111111111111111111111b\")\n","75 / 639269708765607740 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","31 / 639269708765607771 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","29 / 639269708765607800 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","43 / 639269708765607843 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","32 / 639269708765607875 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","33 / 639269708765607908 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765607936 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765607964 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","29 / 639269708765607993 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","27 / 639269708765608020 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","27 / 639269708765608047 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","1265 / 639269708765609312 / Changed\n","  (\"file1.txt\"...11111111111111111111111111111111111111111111111b\")\n","65 / 639269708765609377 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","31 / 639269708765609408 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","30 / 639269708765609438 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765609466 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","31 / 639269708765609497 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","54 / 639269708765609551 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","40 / 639269708765609591 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","29 / 639269708765609620 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","41 / 639269708765609661 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765609689 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","29 / 639269708765609718 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765609746 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","1359 / 639269708765611105 / Changed\n","  (\"file1.txt\"...11111111111111111111111111111111111111111111111b\")\n","63 / 639269708765611168 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","21 / 639269708765611189 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","22 / 639269708765611211 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765611239 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765611257 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765611276 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765611294 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765611312 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765611330 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765611349 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","20 / 639269708765611369 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765611388 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","1503 / 639269708765612891 / Changed\n","  (\"file1.txt\"...11111111111111111111111111111111111111111111111b\")\n","39 / 639269708765612930 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765612949 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765612967 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","17 / 639269708765612984 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765613002 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","20 / 639269708765613022 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765613040 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","747 / 639269708765613787 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","34 / 639269708765613821 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765613840 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","20 / 639269708765613860 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","20 / 639269708765613880 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765613899 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765613918 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","723 / 639269708765614641 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","42 / 639269708765614683 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765614702 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765614721 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765614739 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765614757 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","726 / 639269708765615483 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","33 / 639269708765615516 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765615535 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","27 / 639269708765615562 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","17 / 639269708765615579 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","17 / 639269708765615596 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765615614 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","19 / 639269708765615633 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","18 / 639269708765615651 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","719 / 639269708765616370 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","289 / 639269708765616659 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","60 / 639269708765616719 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","27 / 639269708765616746 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765616774 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765616802 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","31 / 639269708765616833 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","492 / 639269708765617325 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","591 / 639269708765617916 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","82 / 639269708765617998 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","29 / 639269708765618027 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","492 / 639269708765618519 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","66 / 639269708765618585 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","939 / 639269708765619524 / Changed\n","  (\"file1.txt\",...11111111111111111111111111111111111111111111111b\")\n","76 / 639269708765619600 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","29 / 639269708765619629 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","27 / 639269708765619656 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","27 / 639269708765619683 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765619711 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","46 / 639269708765619757 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","30 / 639269708765619787 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","30 / 639269708765619817 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","29 / 639269708765619846 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","1316 / 639269708765621162 / Changed\n","  (\"file1.txt\"...11111111111111111111111111111111111111111111111b\")\n","67 / 639269708765621229 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","28 / 639269708765621257 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","31 / 639269708765621288 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","30 / 639269708765621318 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","41 / 639269708765621359 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","30 / 639269708765621389 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","26 / 639269708765621415 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","27 / 639269708765621442 / Changed\n","  (\"file1.txt\",\n","...11111111111111111111111111111111111111111111111b\")\n","21322 / 639269708765642764 / Changed\n","  (\"file2.txt...22222222222222222222222222222222222222222222222b\")\n","89 / 639269708765642853 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","1152 / 639269708765644005 / Changed\n","  (\"file2.txt\"...22222222222222222222222222222222222222222222222b\")\n","75 / 639269708765644080 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","31 / 639269708765644111 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765644140 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765644170 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765644197 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765644225 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765644255 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","32 / 639269708765644287 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","43 / 639269708765644330 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765644357 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765644386 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","1144 / 639269708765645530 / Changed\n","  (\"file2.txt\"...22222222222222222222222222222222222222222222222b\")\n","65 / 639269708765645595 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765645623 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765645650 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765645677 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765645705 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","43 / 639269708765645748 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765645775 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765645803 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765645831 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765645861 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","1471 / 639269708765647332 / Changed\n","  (\"file2.txt\"...22222222222222222222222222222222222222222222222b\")\n","72 / 639269708765647404 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765647433 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","49 / 639269708765647482 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765647512 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765647538 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765647567 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765647593 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","31 / 639269708765647624 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765647651 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765647680 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","38 / 639269708765647718 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","1307 / 639269708765649025 / Changed\n","  (\"file2.txt\"...22222222222222222222222222222222222222222222222b\")\n","68 / 639269708765649093 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765649120 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765649147 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765649177 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765649206 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765649234 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765649260 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","45 / 639269708765649305 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765649334 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765649361 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","17686 / 639269708765667047 / Changed\n","  (\"file2.txt...22222222222222222222222222222222222222222222222b\")\n","89 / 639269708765667136 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","34 / 639269708765667170 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","48 / 639269708765667218 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765667247 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765667275 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765667305 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765667335 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765667362 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765667389 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765667416 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","42 / 639269708765667458 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765667486 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765667514 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765667540 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765667568 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765667597 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765667627 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765667655 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765667683 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","42 / 639269708765667725 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765667755 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765667783 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765667809 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","34 / 639269708765667843 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765667871 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765667900 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765667929 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","40 / 639269708765667969 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","31 / 639269708765668000 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765668027 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","32 / 639269708765668059 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765668087 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765668114 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765668142 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765668171 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","41 / 639269708765668212 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765668240 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","33 / 639269708765668273 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765668302 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765668329 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765668355 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765668385 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765668411 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765668437 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","45 / 639269708765668482 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765668511 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765668538 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765668564 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765668594 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765668620 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765668646 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765668674 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","39 / 639269708765668713 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765668743 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765668769 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","27 / 639269708765668796 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765668824 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765668850 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","34 / 639269708765668884 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","30 / 639269708765668914 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765668943 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","39 / 639269708765668982 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765669011 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765669039 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","25 / 639269708765669064 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","32 / 639269708765669096 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","26 / 639269708765669122 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765669151 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765669179 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","40 / 639269708765669219 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","28 / 639269708765669247 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","34 / 639269708765669281 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765669310 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","29 / 639269708765669339 / Changed\n","  (\"file2.txt\",\n","...22222222222222222222222222222222222222222222222b\")\n","15028321 / 639269708780697660 / Renamed\n","  (\"file1....1111111111111111111111111111111111111111111111b\"))\n","523 / 639269708780698183 / Renamed\n","  (\"file2.txt\",...2222222222222222222222222222222222222222222222b\"))\n","15056679 / 639269708795754862 / Changed\n","  (\"file_1...11111111111111111111111111111111111111111111111c\")\n","2364 / 639269708795757226 / Changed\n","  (\"file_1.txt...11111111111111111111111111111111111111111111111c\")\n","236 / 639269708795757462 / Changed\n","  (\"file_1.txt\"...11111111111111111111111111111111111111111111111c\")\n","3724 / 639269708795761186 / Changed\n","  (\"file_1.txt...11111111111111111111111111111111111111111111111c\")\n","100 / 639269708795761286 / Changed\n","  (\"file_1.txt\"...11111111111111111111111111111111111111111111111c\")\n","31 / 639269708795761317 / Changed\n","  (\"file_1.txt\",...11111111111111111111111111111111111111111111111c\")\n","5993 / 639269708795767310 / Changed\n","  (\"file_1.txt...11111111111111111111111111111111111111111111111c\")\n","76 / 639269708795767386 / Changed\n","  (\"file_1.txt\",...11111111111111111111111111111111111111111111111c\")\n","32 / 639269708795767418 / Changed\n","  (\"file_1.txt\",...11111111111111111111111111111111111111111111111c\")\n","26 / 639269708795767444 / Changed\n","  (\"file_1.txt\",...11111111111111111111111111111111111111111111111c\")\n","24 / 639269708795767468 / Changed\n","  (\"file_1.txt\",...11111111111111111111111111111111111111111111111c\")\n","65 / 639269708795767533 / Changed\n","  (\"file_1.txt\",...11111111111111111111111111111111111111111111111c\")\n","183 / 639269708795767716 / Changed\n","  (\"file_1.txt\"...11111111111111111111111111111111111111111111111c\")\n","559 / 639269708795768275 / Changed\n","  (\"file_1.txt\"...11111111111111111111111111111111111111111111111c\")\n","74 / 639269708795768349 / Changed\n","  (\"file_1.txt\",...11111111111111111111111111111111111111111111111c\")\n","17426 / 639269708795785775 / Changed\n","  (\"file_2.tx...22222222222222222222222222222222222222222222222c\")\n","139 / 639269708795785914 / Changed\n","  (\"file_2.txt\"...22222222222222222222222222222222222222222222222c\")\n","684 / 639269708795786598 / Changed\n","  (\"file_2.txt\"...22222222222222222222222222222222222222222222222c\")\n","55 / 639269708795786653 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795786674 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","116 / 639269708795786790 / Changed\n","  (\"file_2.txt\"...22222222222222222222222222222222222222222222222c\")\n","1177 / 639269708795787967 / Changed\n","  (\"file_2.txt...22222222222222222222222222222222222222222222222c\")\n","83 / 639269708795788050 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","25 / 639269708795788075 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","24 / 639269708795788099 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795788120 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795788141 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","25 / 639269708795788166 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","23 / 639269708795788189 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","142 / 639269708795788331 / Changed\n","  (\"file_2.txt\"...22222222222222222222222222222222222222222222222c\")\n","26 / 639269708795788357 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","23 / 639269708795788380 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","19 / 639269708795788399 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","22 / 639269708795788421 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","1256 / 639269708795789677 / Changed\n","  (\"file_2.txt...22222222222222222222222222222222222222222222222c\")\n","62 / 639269708795789739 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","22 / 639269708795789761 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","196 / 639269708795789957 / Changed\n","  (\"file_2.txt\"...22222222222222222222222222222222222222222222222c\")\n","35 / 639269708795789992 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","22 / 639269708795790014 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795790035 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","25 / 639269708795790060 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795790080 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","19 / 639269708795790099 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795790119 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795790139 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","111 / 639269708795790250 / Changed\n","  (\"file_2.txt\"...22222222222222222222222222222222222222222222222c\")\n","22 / 639269708795790272 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","24 / 639269708795790296 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795790316 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","19 / 639269708795790335 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795790356 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","19 / 639269708795790375 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795790396 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","87 / 639269708795790483 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","22 / 639269708795790505 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","1277 / 639269708795791782 / Changed\n","  (\"file_2.txt...22222222222222222222222222222222222222222222222c\")\n","56 / 639269708795791838 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","24 / 639269708795791862 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","19 / 639269708795791881 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","19 / 639269708795791900 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795791920 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","69 / 639269708795791989 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795792009 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795792030 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795792050 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795792071 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795792092 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","25 / 639269708795792117 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795792138 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","190 / 639269708795792328 / Changed\n","  (\"file_2.txt\"...22222222222222222222222222222222222222222222222c\")\n","31 / 639269708795792359 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795792380 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795792400 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795792421 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795792442 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","24 / 639269708795792466 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","25 / 639269708795792491 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","1547 / 639269708795794038 / Changed\n","  (\"file_2.txt...22222222222222222222222222222222222222222222222c\")\n","55 / 639269708795794093 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","23 / 639269708795794116 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","24 / 639269708795794140 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","22 / 639269708795794162 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795794182 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","25 / 639269708795794207 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795794227 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795794248 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","83 / 639269708795794331 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795794351 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","22 / 639269708795794373 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795794393 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","24 / 639269708795794417 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","19 / 639269708795794436 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","55 / 639269708795794491 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795794512 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","65 / 639269708795794577 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","21 / 639269708795794598 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795794618 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","20 / 639269708795794638 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","19 / 639269708795794657 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","22 / 639269708795794679 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","22 / 639269708795794701 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","19 / 639269708795794720 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","150 / 639269708795794870 / Changed\n","  (\"file_2.txt\"...22222222222222222222222222222222222222222222222c\")\n","14 / 639269708795794884 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","12 / 639269708795794896 / Changed\n","  (\"file_2.txt\",...22222222222222222222222222222222222222222222222c\")\n","15034126 / 639269708810829022 / Deleted \"file_1.txt\"\n","2534 / 639269708810831556 / Deleted \"file_2.txt\"\n","[Created (\"file1.txt\", Some \"1a\"); Changed (\"file1.txt\", Some \"1a\"); Created (\"file2.txt\", Some \"2a\");\n"," Changed (\"file2.txt\", Some \"2a\"); Changed (\"file1.txt\", Some \"1b\"); Changed (\"file2.txt\", Some \"2b\");\n"," Renamed (\"file1.txt\", (\"file_1.txt\", Some \"1b\")); Renamed (\"file2.txt\", (\"file_2.txt\", Some \"2b\"));\n"," Changed (\"file_1.txt\", Some \"1c\"); Changed (\"file_2.txt\", Some \"2c\"); Deleted \"file_1.txt\"; Deleted \"file_2.txt\"]\n","\n","Some ()"]}],"source":["///- --test\n","\n","let inline write path = async {\n","    let n = 2\n","\n","    let contents =\n","        [ 1 .. n ]\n","        |> List.map (string >> String.replicate 1_000_000)\n","\n","    for i = 1 to n do\n","        do! $\"{contents.[i - 1]}a\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    do! Async.Sleep 1500\n","\n","    for i = 1 to n do\n","        do! $\"{contents.[i - 1]}b\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    do! Async.Sleep 1500\n","\n","    for i = 1 to n do\n","        do! path </> $\"file{i}.txt\" |> SpiralFileSystem.move_file_async (path </> $\"file_{i}.txt\") |> Async.Ignore\n","\n","    do! Async.Sleep 1500\n","\n","    for i = 1 to n do\n","        do! $\"{contents.[i - 1]}c\" |> SpiralFileSystem.write_all_text_async (path </> $\"file_{i}.txt\")\n","\n","    do! Async.Sleep 1500\n","\n","    for i = 1 to n do\n","        do! SpiralFileSystem.delete_file_async (path </> $\"file_{i}.txt\") |> Async.Ignore\n","\n","    do! Async.Sleep 1500\n","}\n","\n","let inline run () =\n","    let events =\n","        testEventsRaw watchDirectory write\n","        |> List.map (function\n","            | FileSystemChange.Changed (path, Some content) ->\n","                FileSystemChange.Changed (path, content |> Seq.distinct |> Seq.map string |> SpiralSm.concat \"\" |> Some)\n","            | FileSystemChange.Created (path, Some content) ->\n","                FileSystemChange.Created (path, content |> Seq.distinct |> Seq.map string |> SpiralSm.concat \"\" |> Some)\n","            | FileSystemChange.Renamed (oldPath, (newPath, Some content)) ->\n","                FileSystemChange.Renamed (\n","                    oldPath,\n","                    (newPath, content |> Seq.distinct |> Seq.map string |> SpiralSm.concat \"\" |> Some)\n","                )\n","            | event -> event\n","        )\n","\n","    events\n","    |> _sequenceEqual [\n","        FileSystemChange.Created (\"file1.txt\", Some \"1a\")\n","        FileSystemChange.Changed (\"file1.txt\", Some \"1a\")\n","        FileSystemChange.Created (\"file2.txt\", Some \"2a\")\n","        FileSystemChange.Changed (\"file2.txt\", Some \"2a\")\n","\n","        FileSystemChange.Changed (\"file1.txt\", Some \"1b\")\n","        FileSystemChange.Changed (\"file2.txt\", Some \"2b\")\n","\n","        FileSystemChange.Renamed (\"file1.txt\", (\"file_1.txt\", Some \"1b\"))\n","        FileSystemChange.Renamed (\"file2.txt\", (\"file_2.txt\", Some \"2b\"))\n","\n","        FileSystemChange.Changed (\"file_1.txt\", Some \"1c\")\n","        FileSystemChange.Changed (\"file_2.txt\", Some \"2c\")\n","\n","        FileSystemChange.Deleted \"file_1.txt\"\n","        FileSystemChange.Deleted \"file_2.txt\"\n","    ]\n","\n","run\n","|> retry_fn 5\n","|> _assertEqual (Some ())"]},{"cell_type":"markdown","metadata":{},"source":["### testEventsSorted (test)"]},{"cell_type":"code","execution_count":15,"metadata":{"duration_ms":39,"language":"fsharp"},"outputs":[],"source":["///- --test\n","\n","let inline sortEvent event =\n","    match event with\n","    | FileSystemChange.Failure _ -> 0\n","    | FileSystemChange.Created _ -> 1\n","    | FileSystemChange.Changed _ -> 2\n","    | FileSystemChange.Renamed (_oldPath, _) -> 3\n","    | FileSystemChange.Deleted _ -> 4\n","\n","let inline formatEvents events =\n","    events\n","    |> Seq.toList\n","    |> List.sortBy (snd >> sortEvent)\n","    |> List.choose (fun (ticks, event) ->\n","        match event with\n","        | FileSystemChange.Failure _ ->\n","            None\n","        | FileSystemChange.Changed (path, _) ->\n","            Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Changed)\n","        | FileSystemChange.Created (path, _) ->\n","            Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Created)\n","        | FileSystemChange.Deleted path ->\n","            Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Deleted)\n","        | FileSystemChange.Renamed (_oldPath, (path, _)) ->\n","            Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Renamed)\n","    )\n","    |> List.sortBy (fun (_, path, _) -> path)\n","    |> List.distinctBy (fun (_, path, event) -> path, event)\n","\n","let inline testEventsSorted\n","    (watchFn : string -> FSharp.Control.AsyncSeq<int64 * FileSystemChange> * IDisposable)\n","    write\n","    =\n","    let struct (tempDir, tempDisposable) =\n","        \"FileSystem.testEventsSorted\"\n","        |> SpiralCrypto.hash_text\n","        |> SpiralFileSystem.create_temp_dir'\n","    let stream, disposable = watchFn tempDir\n","\n","    let events = System.Collections.Concurrent.ConcurrentBag ()\n","\n","    let inline iter () =\n","        stream\n","        |> FSharp.Control.AsyncSeq.iterAsyncParallel (fun event -> async { events.Add event })\n","\n","    let run = async {\n","        let! _ = iter () |> Async.StartChild\n","        do! Async.Sleep 250\n","        return! write tempDir\n","    }\n","\n","    try\n","        run\n","        |> Async.runWithTimeout 5000\n","        |> _assertEqual (Some ())\n","    finally\n","        disposable.Dispose ()\n","        tempDisposable.Dispose ()\n","\n","    let events = formatEvents events\n","\n","    let eventMap =\n","        events\n","        |> List.map (fun (ticks, path, event) -> path, (event, ticks))\n","        |> List.groupBy fst\n","        |> List.map (fun (path, events) ->\n","            let event, _ticks =\n","                events\n","                |> List.map snd\n","                |> List.sortByDescending snd\n","                |> List.head\n","\n","            path, event\n","        )\n","        |> Map.ofList\n","\n","    let eventList =\n","        events\n","        |> List.map (fun (_ticks, path, event) -> path, event)\n","\n","    eventMap, eventList"]},{"cell_type":"markdown","metadata":{},"source":["#### create and delete (test)"]},{"cell_type":"code","execution_count":16,"metadata":{"duration_ms":524,"language":"fsharp"},"outputs":[{"name":"stdout","output_type":"stream","text":["Some ()\n","\n","11:54:44 \u001B[94md\u001B[0m #5 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite\n","[(\"file1.txt\", \"Created\"); (\"file1.txt\", \"Changed\"); (\"file1.txt\", \"Deleted\"); (\"file2.txt\", \"Created\");\n"," (\"file2.txt\", \"Changed\"); (\"file2.txt\", \"Deleted\"); (\"file3.txt\", \"Created\"); (\"file3.txt\", \"Changed\");\n"," (\"file3.txt\", \"Deleted\")]\n","\n","map [(\"file1.txt\", \"Deleted\"); (\"file2.txt\", \"Deleted\"); (\"file3.txt\", \"Deleted\")]\n","\n","Some ()"]}],"source":["///- --test\n","\n","let inline write path = async {\n","    let n = 3\n","\n","    for i = 1 to n do\n","        do! $\"{i}\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    for i = 1 to n do\n","        do! SpiralFileSystem.delete_file_async (path </> $\"file{i}.txt\") |> Async.Ignore\n","\n","    do! Async.Sleep 150\n","}\n","\n","let inline run () =\n","    let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write\n","\n","    [\n","        \"file1.txt\", nameof FileSystemChangeType.Created\n","        \"file1.txt\", nameof FileSystemChangeType.Changed\n","        \"file1.txt\", nameof FileSystemChangeType.Deleted\n","\n","        \"file2.txt\", nameof FileSystemChangeType.Created\n","        \"file2.txt\", nameof FileSystemChangeType.Changed\n","        \"file2.txt\", nameof FileSystemChangeType.Deleted\n","\n","        \"file3.txt\", nameof FileSystemChangeType.Created\n","        \"file3.txt\", nameof FileSystemChangeType.Changed\n","        \"file3.txt\", nameof FileSystemChangeType.Deleted\n","    ]\n","    |> _sequenceEqual eventList\n","\n","    [\n","        \"file1.txt\", nameof FileSystemChangeType.Deleted\n","        \"file2.txt\", nameof FileSystemChangeType.Deleted\n","        \"file3.txt\", nameof FileSystemChangeType.Deleted\n","    ]\n","    |> Map.ofList\n","    |> _sequenceEqual eventMap\n","\n","run\n","|> retry_fn 3\n","|> _assertEqual (Some ())"]},{"cell_type":"markdown","metadata":{},"source":["#### change (test)"]},{"cell_type":"code","execution_count":17,"metadata":{"duration_ms":530,"language":"fsharp"},"outputs":[{"name":"stdout","output_type":"stream","text":["Some ()\n","\n","11:54:45 \u001B[94md\u001B[0m #6 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite\n","[(\"file1.txt\", \"Created\"); (\"file1.txt\", \"Changed\"); (\"file1.txt\", \"Deleted\"); (\"file2.txt\", \"Created\");\n"," (\"file2.txt\", \"Changed\"); (\"file2.txt\", \"Deleted\")]\n","\n","map [(\"file1.txt\", \"Deleted\"); (\"file2.txt\", \"Deleted\")]\n","\n","Some ()"]}],"source":["///- --test\n","\n","let inline write path = async {\n","    let n = 2\n","\n","    for i = 1 to n do\n","        do! $\"{i}\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    for i = 1 to n do\n","        do! \"\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    for i = 1 to n do\n","        do! SpiralFileSystem.delete_file_async (path </> $\"file{i}.txt\") |> Async.Ignore\n","\n","    do! Async.Sleep 150\n","}\n","\n","let inline run () =\n","    let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write\n","\n","    [\n","        \"file1.txt\", nameof FileSystemChangeType.Created\n","        \"file1.txt\", nameof FileSystemChangeType.Changed\n","        \"file1.txt\", nameof FileSystemChangeType.Deleted\n","\n","        \"file2.txt\", nameof FileSystemChangeType.Created\n","        \"file2.txt\", nameof FileSystemChangeType.Changed\n","        \"file2.txt\", nameof FileSystemChangeType.Deleted\n","    ]\n","    |> _sequenceEqual eventList\n","\n","    [\n","        \"file1.txt\", nameof FileSystemChangeType.Deleted\n","        \"file2.txt\", nameof FileSystemChangeType.Deleted\n","    ]\n","    |> Map.ofList\n","    |> _sequenceEqual eventMap\n","\n","run\n","|> retry_fn 3\n","|> _assertEqual (Some ())"]},{"cell_type":"markdown","metadata":{},"source":["#### rename (test)"]},{"cell_type":"code","execution_count":18,"metadata":{"duration_ms":520,"language":"fsharp"},"outputs":[{"name":"stdout","output_type":"stream","text":["Some ()\n","\n","11:54:45 \u001B[94md\u001B[0m #7 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite\n","[(\"file1.txt\", \"Created\"); (\"file1.txt\", \"Changed\"); (\"file2.txt\", \"Created\"); (\"file2.txt\", \"Changed\");\n"," (\"file_1.txt\", \"Renamed\"); (\"file_1.txt\", \"Deleted\"); (\"file_2.txt\", \"Renamed\"); (\"file_2.txt\", \"Deleted\")]\n","\n","map [(\"file1.txt\", \"Changed\"); (\"file2.txt\", \"Changed\"); (\"file_1.txt\", \"Deleted\"); (\"file_2.txt\", \"Deleted\")]\n","\n","Some ()"]}],"source":["///- --test\n","\n","let inline write path = async {\n","    let n = 2\n","\n","    for i = 1 to n do\n","        do! $\"{i}\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    for i = 1 to n do\n","        do! path </> $\"file{i}.txt\" |> SpiralFileSystem.move_file_async (path </> $\"file_{i}.txt\") |> Async.Ignore\n","\n","    for i = 1 to n do\n","        do! SpiralFileSystem.delete_file_async (path </> $\"file_{i}.txt\") |> Async.Ignore\n","\n","    do! Async.Sleep 150\n","}\n","\n","let inline run () =\n","    let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write\n","\n","    [\n","        \"file1.txt\", nameof FileSystemChangeType.Created\n","        \"file1.txt\", nameof FileSystemChangeType.Changed\n","        \"file2.txt\", nameof FileSystemChangeType.Created\n","        \"file2.txt\", nameof FileSystemChangeType.Changed\n","\n","        \"file_1.txt\", nameof FileSystemChangeType.Renamed\n","        \"file_1.txt\", nameof FileSystemChangeType.Deleted\n","\n","        \"file_2.txt\", nameof FileSystemChangeType.Renamed\n","        \"file_2.txt\", nameof FileSystemChangeType.Deleted\n","    ]\n","    |> _sequenceEqual eventList\n","\n","    [\n","        \"file1.txt\", nameof FileSystemChangeType.Changed\n","        \"file2.txt\", nameof FileSystemChangeType.Changed\n","        \"file_1.txt\", nameof FileSystemChangeType.Deleted\n","        \"file_2.txt\", nameof FileSystemChangeType.Deleted\n","    ]\n","    |> Map.ofList\n","    |> _sequenceEqual eventMap\n","\n","run\n","|> retry_fn 3\n","|> _assertEqual (Some ())"]},{"cell_type":"markdown","metadata":{},"source":["#### full (test)"]},{"cell_type":"code","execution_count":19,"metadata":{"duration_ms":549,"language":"fsharp"},"outputs":[{"name":"stdout","output_type":"stream","text":["Some ()\n","\n","11:54:46 \u001B[94md\u001B[0m #8 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite\n","[(\"file1.txt\", \"Created\"); (\"file1.txt\", \"Changed\"); (\"file2.txt\", \"Created\"); (\"file2.txt\", \"Changed\");\n"," (\"file_1.txt\", \"Changed\"); (\"file_1.txt\", \"Renamed\"); (\"file_1.txt\", \"Deleted\"); (\"file_2.txt\", \"Changed\");\n"," (\"file_2.txt\", \"Renamed\"); (\"file_2.txt\", \"Deleted\")]\n","\n","map [(\"file1.txt\", \"Changed\"); (\"file2.txt\", \"Changed\"); (\"file_1.txt\", \"Deleted\"); (\"file_2.txt\", \"Deleted\")]\n","\n","Some ()"]}],"source":["///- --test\n","\n","let inline write path = async {\n","    let n = 2\n","\n","    for i = 1 to n do\n","        do! $\"{i}\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    for i = 1 to n do\n","        do! \"\" |> SpiralFileSystem.write_all_text_async (path </> $\"file{i}.txt\")\n","\n","    for i = 1 to n do\n","        do! path </> $\"file{i}.txt\" |> SpiralFileSystem.move_file_async (path </> $\"file_{i}.txt\") |> Async.Ignore\n","\n","    for i = 1 to n do\n","        do! $\"{i}\" |> SpiralFileSystem.write_all_text_async (path </> $\"file_{i}.txt\")\n","\n","    for i = 1 to n do\n","        do! SpiralFileSystem.delete_file_async (path </> $\"file_{i}.txt\") |> Async.Ignore\n","\n","    do! Async.Sleep 150\n","}\n","\n","let inline run () =\n","    let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write\n","\n","    [\n","        \"file1.txt\", nameof FileSystemChangeType.Created\n","        \"file1.txt\", nameof FileSystemChangeType.Changed\n","        \"file2.txt\", nameof FileSystemChangeType.Created\n","        \"file2.txt\", nameof FileSystemChangeType.Changed\n","\n","        \"file_1.txt\", nameof FileSystemChangeType.Changed\n","        \"file_1.txt\", nameof FileSystemChangeType.Renamed\n","        \"file_1.txt\", nameof FileSystemChangeType.Deleted\n","\n","        \"file_2.txt\", nameof FileSystemChangeType.Changed\n","        \"file_2.txt\", nameof FileSystemChangeType.Renamed\n","        \"file_2.txt\", nameof FileSystemChangeType.Deleted\n","    ]\n","    |> _sequenceEqual eventList\n","\n","    [\n","        \"file1.txt\", nameof FileSystemChangeType.Changed\n","        \"file2.txt\", nameof FileSystemChangeType.Changed\n","        \"file_1.txt\", nameof FileSystemChangeType.Deleted\n","        \"file_2.txt\", nameof FileSystemChangeType.Deleted\n","    ]\n","    |> Map.ofList\n","    |> _sequenceEqual eventMap\n","\n","run\n","|> retry_fn 3\n","|> _assertEqual (Some ())"]}],"metadata":{"kernelspec":{"display_name":"Spiral","language":"spiral","name":"spiral"}},"nbformat":4,"nbformat_minor":5}