FileSystem (Polyglot)¶

In [1]:
#r "nuget: fsharp.control.asyncseq, 3.2.1"
#r "nuget: system.reactive, 6.0.1-preview.1"
#r "nuget: system.reactive.linq, 6.0.1-preview.1"
#r "nuget: argu, 6.2.4"
In [2]:
#!import ../../lib/fsharp/Notebooks.livemd
In [3]:
#!import ../../lib/fsharp/Testing.livemd
In [4]:
#!import ../../lib/fsharp/Common.fs
In [5]:
#!import ../../lib/fsharp/CommonFSharp.fs
In [6]:
#!import ../../lib/fsharp/Async.fs
In [7]:
#!import ../../lib/fsharp/AsyncSeq.fs
In [8]:
#!import ../../lib/fsharp/Runtime.fs
In [9]:
#if !INTERACTIVE
open Lib
#endif
In [10]:
open Common
open SpiralFileSystem.Operators

watchDirectory¶

In [11]:
[<RequireQualifiedAccess>]
type FileSystemChangeType =
    | Failure
    | Changed
    | Created
    | Deleted
    | Renamed

[<RequireQualifiedAccess>]
type FileSystemChange =
    | Failure of exn: exn
    | Changed of path: string * content: string option
    | Created of path: string * content: string option
    | Deleted of path: string
    | Renamed of oldPath: string * (string * string option)


let inline watchDirectoryWithFilter filter shouldReadContent path =
    let fullPath = path |> System.IO.Path.GetFullPath
    let _locals () = $"filter: {filter} / {_locals ()}"

    let watcher =
        new System.IO.FileSystemWatcher (
            Path = fullPath,
            NotifyFilter = filter,
            EnableRaisingEvents = true,
            IncludeSubdirectories = true
        )

    let inline getEventPath (path : string) =
        path |> SpiralSm.trim |> SpiralSm.replace fullPath "" |> SpiralSm.trim_start [| '/'; '\\' |]

    let inline ticks () =
        System.DateTime.UtcNow.Ticks

    let changedStream =
        AsyncSeq.subscribeEvent
            watcher.Changed
            (fun event ->
                ticks (),
                [ FileSystemChange.Changed (getEventPath event.FullPath, None) ]
            )

    let deletedStream =
        AsyncSeq.subscribeEvent
            watcher.Deleted
            (fun event ->
                ticks (),
                [ FileSystemChange.Deleted (getEventPath event.FullPath) ]
            )

    let createdStream =
        AsyncSeq.subscribeEvent
            watcher.Created
            (fun event ->
                let path = getEventPath event.FullPath
                ticks (), [
                    FileSystemChange.Created (path, None)
                    if SpiralPlatform.is_windows () then
                        FileSystemChange.Changed (path, None)
                ])

    let renamedStream =
        AsyncSeq.subscribeEvent
            watcher.Renamed
            (fun event ->
                ticks (), [
                    FileSystemChange.Renamed (
                        getEventPath event.OldFullPath,
                        (getEventPath event.FullPath, None)
                    )
                ]
            )

    let failureStream =
        AsyncSeq.subscribeEvent
            watcher.Error
            (fun event -> ticks (), [ FileSystemChange.Failure (event.GetException ()) ])

    let stream =
        [
            changedStream
            deletedStream
            createdStream
            renamedStream
            failureStream
        ]
        |> FSharp.Control.AsyncSeq.mergeAll
        |> FSharp.Control.AsyncSeq.map (fun (t, events) ->
            events
            |> List.fold
                (fun (i, events) event ->
                    i + 1L,
                    (t + i, event) :: events)
                (0L, [])
            |> snd
            |> List.rev
        )
        |> FSharp.Control.AsyncSeq.concatSeq
        |> FSharp.Control.AsyncSeq.mapAsyncParallel (fun (t, event) -> async {
            match shouldReadContent event, event with
            | true, FileSystemChange.Changed (path, _) ->
                do! Async.Sleep 5
                let! content = fullPath </> path |> SpiralFileSystem.read_all_text_retry_async
                return t, FileSystemChange.Changed (path, content)
            | true, FileSystemChange.Created (path, _) ->
                do! Async.Sleep 5
                let! content = fullPath </> path |> SpiralFileSystem.read_all_text_retry_async
                return t, FileSystemChange.Created (path, content)
            | true, FileSystemChange.Renamed (oldPath, (newPath, _)) ->
                let! content = fullPath </> newPath |> SpiralFileSystem.read_all_text_retry_async
                return t, FileSystemChange.Renamed (oldPath, (newPath, content))
            | _ -> return t, event
        })

    let disposable =
        new_disposable (fun () ->
            trace Debug (fun () -> "FileSystem.watchWithFilter / Disposing watch stream") _locals
            watcher.EnableRaisingEvents <- false
            watcher.Dispose ()
        )

    stream, disposable

let inline watchDirectory path =
    watchDirectoryWithFilter
        (System.IO.NotifyFilters.FileName
        // ||| System.IO.NotifyFilters.DirectoryName
        // ||| System.IO.NotifyFilters.Attributes
        //// ||| System.IO.NotifyFilters.Size
        ||| System.IO.NotifyFilters.LastWrite
        //// ||| System.IO.NotifyFilters.LastAccess
        // ||| System.IO.NotifyFilters.CreationTime
        // ||| System.IO.NotifyFilters.Security
        )
        path

testEventsRaw (test)¶

In [12]:
///- --test

let inline testEventsRaw
    (watchFn : (_ -> bool) -> string -> FSharp.Control.AsyncSeq<int64 * FileSystemChange> * IDisposable)
    write
    =
    let struct (tempDir, tempDisposable) =
        "FileSystem.testEventsRaw"
        |> SpiralCrypto.hash_text
        |> SpiralFileSystem.create_temp_dir'
    let stream, disposable = watchFn (fun _ -> true) tempDir

    let events = System.Collections.Concurrent.ConcurrentBag ()

    let inline iter () =
        stream
        |> FSharp.Control.AsyncSeq.iterAsyncParallel (fun event -> async { events.Add event })

    let run = async {
        let! _ = iter () |> Async.StartChild
        do! Async.Sleep 250
        return! write tempDir
    }

    try
        run
        |> Async.runWithTimeout 60000
        |> _assertEqual (Some ())
    finally
        disposable.Dispose ()
        tempDisposable.Dispose ()

    let eventsLog =
        events
        |> Seq.toList
        |> List.sortBy fst
        |> List.fold
            (fun (prev, acc) (ticks, event) ->
                ticks, (ticks, (if prev = 0L then 0L else ticks - prev), event) :: acc
            )
            (0L, [])
        |> snd
        |> List.rev
        |> List.map (fun (diff, n, event) -> $"{n} / {diff} / {event}" |> SpiralSm.ellipsis_end 100L)
        |> SpiralSm.concat "\n"
    let _locals () = $"eventsLog: \n{eventsLog} / {_locals ()}"
    trace Debug (fun () -> "FileSystem.testEventsRaw") _locals

    events
    |> Seq.toList
    |> List.sortBy fst
    |> List.map snd
    |> List.fold
        (fun acc event ->
            match acc, event with
            | FileSystemChange.Changed (lastPath, Some lastContent) as lastEvent :: acc,
                FileSystemChange.Changed (path, Some content)
                when lastPath = path && content |> SpiralSm.starts_with lastContent
                ->
                event :: acc
            | _ -> event :: acc
        )
        []
    |> List.rev

fast (test)¶

In [13]:
///- --test

let inline write path = async {
    let n = 2

    for i = 1 to n do
        do! $"a{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    do! Async.Sleep 250

    for i = 1 to n do
        do! $"b{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    do! Async.Sleep 250

    for i = 1 to n do
        do! path </> $"file{i}.txt" |> SpiralFileSystem.move_file_async (path </> $"file_{i}.txt") |> Async.Ignore

    do! Async.Sleep 250

    for i = 1 to n do
        do! $"c{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file_{i}.txt")

    do! Async.Sleep 250

    for i = 1 to n do
        do! SpiralFileSystem.delete_file_async (path </> $"file_{i}.txt") |> Async.Ignore

    do! Async.Sleep 250
}

let inline run () =
    let events = testEventsRaw watchDirectory write

    events
    |> _sequenceEqual [
        FileSystemChange.Created ("file1.txt", Some "a1")
        FileSystemChange.Changed ("file1.txt", Some "a1")
        FileSystemChange.Created ("file2.txt", Some "a2")
        FileSystemChange.Changed ("file2.txt", Some "a2")

        FileSystemChange.Changed ("file1.txt", Some "b1")
        FileSystemChange.Changed ("file2.txt", Some "b2")

        FileSystemChange.Renamed ("file1.txt", ("file_1.txt", Some "b1"))
        FileSystemChange.Renamed ("file2.txt", ("file_2.txt", Some "b2"))

        FileSystemChange.Changed ("file_1.txt", Some "c1")
        FileSystemChange.Changed ("file_2.txt", Some "c2")

        FileSystemChange.Deleted "file_1.txt"
        FileSystemChange.Deleted "file_2.txt"
    ]

run
|> retry_fn 3
|> _assertEqual (Some ())
Some ()

11:54:34 d #1 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
11:54:34 d #2 FileSystem.testEventsRaw / eventsLog: 
0 / 639269708730520262 / Created ("file1.txt", Some "a1")
12919 / 639269708730533181 / Changed ("file1.txt", Some "a1")
2034 / 639269708730535215 / Created ("file2.txt", Some "a2")
40 / 639269708730535255 / Changed ("file2.txt", Some "a2")
37 / 639269708730535292 / Changed ("file2.txt", Some "a2")
2481958 / 639269708733017250 / Changed ("file1.txt", Some "b1")
277 / 639269708733017527 / Changed ("file1.txt", Some "b1")
9774 / 639269708733027301 / Changed ("file2.txt", Some "b2")
2672009 / 639269708735699310 / Renamed ("file1.txt", ("file_1.txt", Some "b1"))
12201 / 639269708735711511 / Renamed ("file2.txt", ("file_2.txt", Some "b2"))
2538763 / 639269708738250274 / Changed ("file_1.txt", Some "c1")
375 / 639269708738250649 / Changed ("file_1.txt", Some "c1")
5053 / 639269708738255702 / Changed ("file_2.txt", Some "c2")
431 / 639269708738256133 / Changed ("file_2.txt", Some "c2")
2566519 / 639269708740822652 / Deleted "file_1.txt"
1763 / 639269708740824415 / Deleted "file_2.txt"
[Created ("file1.txt", Some "a1"); Changed ("file1.txt", Some "a1"); Created ("file2.txt", Some "a2");
 Changed ("file2.txt", Some "a2"); Changed ("file1.txt", Some "b1"); Changed ("file2.txt", Some "b2");
 Renamed ("file1.txt", ("file_1.txt", Some "b1")); Renamed ("file2.txt", ("file_2.txt", Some "b2"));
 Changed ("file_1.txt", Some "c1"); Changed ("file_2.txt", Some "c2"); Deleted "file_1.txt"; Deleted "file_2.txt"]

Some ()

slow (test)¶

In [14]:
///- --test

let inline write path = async {
    let n = 2

    let contents =
        [ 1 .. n ]
        |> List.map (string >> String.replicate 1_000_000)

    for i = 1 to n do
        do! $"{contents.[i - 1]}a" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    do! Async.Sleep 1500

    for i = 1 to n do
        do! $"{contents.[i - 1]}b" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    do! Async.Sleep 1500

    for i = 1 to n do
        do! path </> $"file{i}.txt" |> SpiralFileSystem.move_file_async (path </> $"file_{i}.txt") |> Async.Ignore

    do! Async.Sleep 1500

    for i = 1 to n do
        do! $"{contents.[i - 1]}c" |> SpiralFileSystem.write_all_text_async (path </> $"file_{i}.txt")

    do! Async.Sleep 1500

    for i = 1 to n do
        do! SpiralFileSystem.delete_file_async (path </> $"file_{i}.txt") |> Async.Ignore

    do! Async.Sleep 1500
}

let inline run () =
    let events =
        testEventsRaw watchDirectory write
        |> List.map (function
            | FileSystemChange.Changed (path, Some content) ->
                FileSystemChange.Changed (path, content |> Seq.distinct |> Seq.map string |> SpiralSm.concat "" |> Some)
            | FileSystemChange.Created (path, Some content) ->
                FileSystemChange.Created (path, content |> Seq.distinct |> Seq.map string |> SpiralSm.concat "" |> Some)
            | FileSystemChange.Renamed (oldPath, (newPath, Some content)) ->
                FileSystemChange.Renamed (
                    oldPath,
                    (newPath, content |> Seq.distinct |> Seq.map string |> SpiralSm.concat "" |> Some)
                )
            | event -> event
        )

    events
    |> _sequenceEqual [
        FileSystemChange.Created ("file1.txt", Some "1a")
        FileSystemChange.Changed ("file1.txt", Some "1a")
        FileSystemChange.Created ("file2.txt", Some "2a")
        FileSystemChange.Changed ("file2.txt", Some "2a")

        FileSystemChange.Changed ("file1.txt", Some "1b")
        FileSystemChange.Changed ("file2.txt", Some "2b")

        FileSystemChange.Renamed ("file1.txt", ("file_1.txt", Some "1b"))
        FileSystemChange.Renamed ("file2.txt", ("file_2.txt", Some "2b"))

        FileSystemChange.Changed ("file_1.txt", Some "1c")
        FileSystemChange.Changed ("file_2.txt", Some "2c")

        FileSystemChange.Deleted "file_1.txt"
        FileSystemChange.Deleted "file_2.txt"
    ]

run
|> retry_fn 5
|> _assertEqual (Some ())
Some ()

11:54:42 d #3 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
11:54:43 d #4 FileSystem.testEventsRaw / eventsLog: 
0 / 639269708750507668 / Created
  ("file1.txt",
 ...11111111111111111111111111111111111111111111111a")
3426 / 639269708750511094 / Changed
  ("file1.txt"...11111111111111111111111111111111111111111111111a")
271 / 639269708750511365 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111a")
73 / 639269708750511438 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
38 / 639269708750511476 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
37 / 639269708750511513 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
50 / 639269708750511563 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
38 / 639269708750511601 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
27 / 639269708750511628 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
30 / 639269708750511658 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
45 / 639269708750511703 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
35 / 639269708750511738 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
88 / 639269708750511826 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
72 / 639269708750511898 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
37 / 639269708750511935 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
35 / 639269708750511970 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
33 / 639269708750512003 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
142 / 639269708750512145 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111a")
151 / 639269708750512296 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111a")
82 / 639269708750512378 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
48 / 639269708750512426 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
33 / 639269708750512459 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
33 / 639269708750512492 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
42 / 639269708750512534 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
31 / 639269708750512565 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
36 / 639269708750512601 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
34 / 639269708750512635 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
34 / 639269708750512669 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
28 / 639269708750512697 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
27 / 639269708750512724 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
29 / 639269708750512753 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
39 / 639269708750512792 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
36 / 639269708750512828 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
33 / 639269708750512861 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
34 / 639269708750512895 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
35 / 639269708750512930 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
36 / 639269708750512966 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
32 / 639269708750512998 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
31 / 639269708750513029 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
45 / 639269708750513074 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
32 / 639269708750513106 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
30 / 639269708750513136 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
30 / 639269708750513166 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
27 / 639269708750513193 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
32 / 639269708750513225 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
29 / 639269708750513254 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
31 / 639269708750513285 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
34 / 639269708750513319 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
49 / 639269708750513368 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
33 / 639269708750513401 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
33 / 639269708750513434 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
29 / 639269708750513463 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
32 / 639269708750513495 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
30 / 639269708750513525 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
31 / 639269708750513556 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
30 / 639269708750513586 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
46 / 639269708750513632 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
33 / 639269708750513665 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
31 / 639269708750513696 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
31 / 639269708750513727 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
32 / 639269708750513759 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
29 / 639269708750513788 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
29 / 639269708750513817 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
29 / 639269708750513846 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
30 / 639269708750513876 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
40 / 639269708750513916 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
34 / 639269708750513950 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
32 / 639269708750513982 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
29 / 639269708750514011 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
31 / 639269708750514042 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
28 / 639269708750514070 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
31 / 639269708750514101 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
42 / 639269708750514143 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
32 / 639269708750514175 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
577 / 639269708750514752 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111a")
80 / 639269708750514832 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
33 / 639269708750514865 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
33 / 639269708750514898 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
51 / 639269708750514949 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
29 / 639269708750514978 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
32 / 639269708750515010 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
34 / 639269708750515044 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
32 / 639269708750515076 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
2329 / 639269708750517405 / Changed
  ("file1.txt"...11111111111111111111111111111111111111111111111a")
102 / 639269708750517507 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111a")
27 / 639269708750517534 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
19 / 639269708750517553 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
17 / 639269708750517570 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
18 / 639269708750517588 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
18 / 639269708750517606 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
18 / 639269708750517624 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
39 / 639269708750517663 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
16 / 639269708750517679 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111a")
448 / 639269708750518127 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111a")
22392 / 639269708750540519 / Created
  ("file2.txt...22222222222222222222222222222222222222222222222a")
67 / 639269708750540586 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
41 / 639269708750540627 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750540657 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
33 / 639269708750540690 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
58 / 639269708750540748 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750540779 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750540810 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750540840 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750540870 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750540899 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750540929 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750540959 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
28 / 639269708750540987 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
41 / 639269708750541028 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
28 / 639269708750541056 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750541085 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750541116 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750541146 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
27 / 639269708750541173 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
27 / 639269708750541200 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750541230 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
43 / 639269708750541273 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750541302 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750541333 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750541364 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750541393 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
28 / 639269708750541421 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750541452 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750541483 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
43 / 639269708750541526 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750541557 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750541587 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750541617 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
27 / 639269708750541644 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750541674 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750541704 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
28 / 639269708750541732 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750541762 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
71 / 639269708750541833 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750541862 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750541891 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750541922 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750541953 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750541982 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
39 / 639269708750542021 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750542050 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
26 / 639269708750542076 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
27 / 639269708750542103 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
24 / 639269708750542127 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
24 / 639269708750542151 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
27 / 639269708750542178 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
28 / 639269708750542206 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
27 / 639269708750542233 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
43 / 639269708750542276 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750542306 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750542338 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750542370 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750542400 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750542432 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750542463 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750542493 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
48 / 639269708750542541 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
37 / 639269708750542578 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
33 / 639269708750542611 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750542640 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
35 / 639269708750542675 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750542706 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
27 / 639269708750542733 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750542764 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750542795 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
43 / 639269708750542838 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
35 / 639269708750542873 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
33 / 639269708750542906 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
34 / 639269708750542940 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750542969 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
27 / 639269708750542996 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750543028 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750543059 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
40 / 639269708750543099 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750543131 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750543163 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750543192 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750543224 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750543255 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750543286 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
28 / 639269708750543314 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750543345 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
49 / 639269708750543394 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
33 / 639269708750543427 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750543459 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750543491 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750543522 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750543554 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750543586 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
33 / 639269708750543619 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
42 / 639269708750543661 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750543692 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750543722 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750543753 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750543783 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750543815 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750543844 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
33 / 639269708750543877 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750543906 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
44 / 639269708750543950 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
35 / 639269708750543985 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
32 / 639269708750544017 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750544046 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
26 / 639269708750544072 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
29 / 639269708750544101 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
31 / 639269708750544132 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
30 / 639269708750544162 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
43 / 639269708750544205 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
28 / 639269708750544233 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222a")
15057451 / 639269708765601684 / Changed
  ("file1....11111111111111111111111111111111111111111111111b")
3607 / 639269708765605291 / Changed
  ("file1.txt"...11111111111111111111111111111111111111111111111b")
610 / 639269708765605901 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
45 / 639269708765605946 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
30 / 639269708765605976 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
26 / 639269708765606002 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
27 / 639269708765606029 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
30 / 639269708765606059 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
26 / 639269708765606085 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
25 / 639269708765606110 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
39 / 639269708765606149 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
1516 / 639269708765607665 / Changed
  ("file1.txt"...11111111111111111111111111111111111111111111111b")
75 / 639269708765607740 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
31 / 639269708765607771 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
29 / 639269708765607800 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
43 / 639269708765607843 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
32 / 639269708765607875 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
33 / 639269708765607908 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765607936 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765607964 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
29 / 639269708765607993 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
27 / 639269708765608020 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
27 / 639269708765608047 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
1265 / 639269708765609312 / Changed
  ("file1.txt"...11111111111111111111111111111111111111111111111b")
65 / 639269708765609377 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
31 / 639269708765609408 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
30 / 639269708765609438 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765609466 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
31 / 639269708765609497 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
54 / 639269708765609551 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
40 / 639269708765609591 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
29 / 639269708765609620 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
41 / 639269708765609661 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765609689 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
29 / 639269708765609718 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765609746 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
1359 / 639269708765611105 / Changed
  ("file1.txt"...11111111111111111111111111111111111111111111111b")
63 / 639269708765611168 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
21 / 639269708765611189 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
22 / 639269708765611211 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765611239 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765611257 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765611276 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765611294 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765611312 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765611330 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765611349 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
20 / 639269708765611369 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765611388 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
1503 / 639269708765612891 / Changed
  ("file1.txt"...11111111111111111111111111111111111111111111111b")
39 / 639269708765612930 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765612949 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765612967 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
17 / 639269708765612984 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765613002 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
20 / 639269708765613022 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765613040 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
747 / 639269708765613787 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
34 / 639269708765613821 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765613840 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
20 / 639269708765613860 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
20 / 639269708765613880 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765613899 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765613918 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
723 / 639269708765614641 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
42 / 639269708765614683 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765614702 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765614721 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765614739 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765614757 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
726 / 639269708765615483 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
33 / 639269708765615516 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765615535 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
27 / 639269708765615562 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
17 / 639269708765615579 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
17 / 639269708765615596 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765615614 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
19 / 639269708765615633 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
18 / 639269708765615651 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
719 / 639269708765616370 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
289 / 639269708765616659 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
60 / 639269708765616719 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
27 / 639269708765616746 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765616774 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765616802 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
31 / 639269708765616833 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
492 / 639269708765617325 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
591 / 639269708765617916 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
82 / 639269708765617998 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
29 / 639269708765618027 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
492 / 639269708765618519 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
66 / 639269708765618585 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
939 / 639269708765619524 / Changed
  ("file1.txt",...11111111111111111111111111111111111111111111111b")
76 / 639269708765619600 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
29 / 639269708765619629 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
27 / 639269708765619656 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
27 / 639269708765619683 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765619711 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
46 / 639269708765619757 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
30 / 639269708765619787 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
30 / 639269708765619817 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
29 / 639269708765619846 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
1316 / 639269708765621162 / Changed
  ("file1.txt"...11111111111111111111111111111111111111111111111b")
67 / 639269708765621229 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
28 / 639269708765621257 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
31 / 639269708765621288 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
30 / 639269708765621318 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
41 / 639269708765621359 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
30 / 639269708765621389 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
26 / 639269708765621415 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
27 / 639269708765621442 / Changed
  ("file1.txt",
...11111111111111111111111111111111111111111111111b")
21322 / 639269708765642764 / Changed
  ("file2.txt...22222222222222222222222222222222222222222222222b")
89 / 639269708765642853 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
1152 / 639269708765644005 / Changed
  ("file2.txt"...22222222222222222222222222222222222222222222222b")
75 / 639269708765644080 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
31 / 639269708765644111 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765644140 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765644170 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765644197 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765644225 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765644255 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
32 / 639269708765644287 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
43 / 639269708765644330 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765644357 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765644386 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
1144 / 639269708765645530 / Changed
  ("file2.txt"...22222222222222222222222222222222222222222222222b")
65 / 639269708765645595 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765645623 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765645650 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765645677 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765645705 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
43 / 639269708765645748 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765645775 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765645803 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765645831 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765645861 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
1471 / 639269708765647332 / Changed
  ("file2.txt"...22222222222222222222222222222222222222222222222b")
72 / 639269708765647404 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765647433 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
49 / 639269708765647482 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765647512 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765647538 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765647567 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765647593 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
31 / 639269708765647624 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765647651 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765647680 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
38 / 639269708765647718 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
1307 / 639269708765649025 / Changed
  ("file2.txt"...22222222222222222222222222222222222222222222222b")
68 / 639269708765649093 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765649120 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765649147 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765649177 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765649206 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765649234 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765649260 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
45 / 639269708765649305 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765649334 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765649361 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
17686 / 639269708765667047 / Changed
  ("file2.txt...22222222222222222222222222222222222222222222222b")
89 / 639269708765667136 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
34 / 639269708765667170 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
48 / 639269708765667218 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765667247 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765667275 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765667305 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765667335 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765667362 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765667389 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765667416 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
42 / 639269708765667458 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765667486 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765667514 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765667540 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765667568 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765667597 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765667627 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765667655 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765667683 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
42 / 639269708765667725 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765667755 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765667783 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765667809 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
34 / 639269708765667843 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765667871 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765667900 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765667929 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
40 / 639269708765667969 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
31 / 639269708765668000 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765668027 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
32 / 639269708765668059 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765668087 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765668114 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765668142 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765668171 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
41 / 639269708765668212 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765668240 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
33 / 639269708765668273 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765668302 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765668329 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765668355 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765668385 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765668411 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765668437 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
45 / 639269708765668482 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765668511 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765668538 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765668564 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765668594 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765668620 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765668646 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765668674 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
39 / 639269708765668713 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765668743 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765668769 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
27 / 639269708765668796 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765668824 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765668850 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
34 / 639269708765668884 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
30 / 639269708765668914 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765668943 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
39 / 639269708765668982 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765669011 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765669039 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
25 / 639269708765669064 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
32 / 639269708765669096 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
26 / 639269708765669122 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765669151 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765669179 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
40 / 639269708765669219 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
28 / 639269708765669247 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
34 / 639269708765669281 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765669310 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
29 / 639269708765669339 / Changed
  ("file2.txt",
...22222222222222222222222222222222222222222222222b")
15028321 / 639269708780697660 / Renamed
  ("file1....1111111111111111111111111111111111111111111111b"))
523 / 639269708780698183 / Renamed
  ("file2.txt",...2222222222222222222222222222222222222222222222b"))
15056679 / 639269708795754862 / Changed
  ("file_1...11111111111111111111111111111111111111111111111c")
2364 / 639269708795757226 / Changed
  ("file_1.txt...11111111111111111111111111111111111111111111111c")
236 / 639269708795757462 / Changed
  ("file_1.txt"...11111111111111111111111111111111111111111111111c")
3724 / 639269708795761186 / Changed
  ("file_1.txt...11111111111111111111111111111111111111111111111c")
100 / 639269708795761286 / Changed
  ("file_1.txt"...11111111111111111111111111111111111111111111111c")
31 / 639269708795761317 / Changed
  ("file_1.txt",...11111111111111111111111111111111111111111111111c")
5993 / 639269708795767310 / Changed
  ("file_1.txt...11111111111111111111111111111111111111111111111c")
76 / 639269708795767386 / Changed
  ("file_1.txt",...11111111111111111111111111111111111111111111111c")
32 / 639269708795767418 / Changed
  ("file_1.txt",...11111111111111111111111111111111111111111111111c")
26 / 639269708795767444 / Changed
  ("file_1.txt",...11111111111111111111111111111111111111111111111c")
24 / 639269708795767468 / Changed
  ("file_1.txt",...11111111111111111111111111111111111111111111111c")
65 / 639269708795767533 / Changed
  ("file_1.txt",...11111111111111111111111111111111111111111111111c")
183 / 639269708795767716 / Changed
  ("file_1.txt"...11111111111111111111111111111111111111111111111c")
559 / 639269708795768275 / Changed
  ("file_1.txt"...11111111111111111111111111111111111111111111111c")
74 / 639269708795768349 / Changed
  ("file_1.txt",...11111111111111111111111111111111111111111111111c")
17426 / 639269708795785775 / Changed
  ("file_2.tx...22222222222222222222222222222222222222222222222c")
139 / 639269708795785914 / Changed
  ("file_2.txt"...22222222222222222222222222222222222222222222222c")
684 / 639269708795786598 / Changed
  ("file_2.txt"...22222222222222222222222222222222222222222222222c")
55 / 639269708795786653 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795786674 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
116 / 639269708795786790 / Changed
  ("file_2.txt"...22222222222222222222222222222222222222222222222c")
1177 / 639269708795787967 / Changed
  ("file_2.txt...22222222222222222222222222222222222222222222222c")
83 / 639269708795788050 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
25 / 639269708795788075 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
24 / 639269708795788099 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795788120 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795788141 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
25 / 639269708795788166 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
23 / 639269708795788189 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
142 / 639269708795788331 / Changed
  ("file_2.txt"...22222222222222222222222222222222222222222222222c")
26 / 639269708795788357 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
23 / 639269708795788380 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
19 / 639269708795788399 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
22 / 639269708795788421 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
1256 / 639269708795789677 / Changed
  ("file_2.txt...22222222222222222222222222222222222222222222222c")
62 / 639269708795789739 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
22 / 639269708795789761 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
196 / 639269708795789957 / Changed
  ("file_2.txt"...22222222222222222222222222222222222222222222222c")
35 / 639269708795789992 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
22 / 639269708795790014 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795790035 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
25 / 639269708795790060 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795790080 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
19 / 639269708795790099 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795790119 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795790139 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
111 / 639269708795790250 / Changed
  ("file_2.txt"...22222222222222222222222222222222222222222222222c")
22 / 639269708795790272 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
24 / 639269708795790296 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795790316 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
19 / 639269708795790335 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795790356 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
19 / 639269708795790375 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795790396 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
87 / 639269708795790483 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
22 / 639269708795790505 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
1277 / 639269708795791782 / Changed
  ("file_2.txt...22222222222222222222222222222222222222222222222c")
56 / 639269708795791838 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
24 / 639269708795791862 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
19 / 639269708795791881 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
19 / 639269708795791900 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795791920 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
69 / 639269708795791989 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795792009 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795792030 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795792050 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795792071 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795792092 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
25 / 639269708795792117 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795792138 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
190 / 639269708795792328 / Changed
  ("file_2.txt"...22222222222222222222222222222222222222222222222c")
31 / 639269708795792359 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795792380 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795792400 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795792421 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795792442 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
24 / 639269708795792466 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
25 / 639269708795792491 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
1547 / 639269708795794038 / Changed
  ("file_2.txt...22222222222222222222222222222222222222222222222c")
55 / 639269708795794093 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
23 / 639269708795794116 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
24 / 639269708795794140 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
22 / 639269708795794162 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795794182 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
25 / 639269708795794207 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795794227 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795794248 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
83 / 639269708795794331 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795794351 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
22 / 639269708795794373 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795794393 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
24 / 639269708795794417 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
19 / 639269708795794436 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
55 / 639269708795794491 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795794512 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
65 / 639269708795794577 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
21 / 639269708795794598 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795794618 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
20 / 639269708795794638 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
19 / 639269708795794657 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
22 / 639269708795794679 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
22 / 639269708795794701 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
19 / 639269708795794720 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
150 / 639269708795794870 / Changed
  ("file_2.txt"...22222222222222222222222222222222222222222222222c")
14 / 639269708795794884 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
12 / 639269708795794896 / Changed
  ("file_2.txt",...22222222222222222222222222222222222222222222222c")
15034126 / 639269708810829022 / Deleted "file_1.txt"
2534 / 639269708810831556 / Deleted "file_2.txt"
[Created ("file1.txt", Some "1a"); Changed ("file1.txt", Some "1a"); Created ("file2.txt", Some "2a");
 Changed ("file2.txt", Some "2a"); Changed ("file1.txt", Some "1b"); Changed ("file2.txt", Some "2b");
 Renamed ("file1.txt", ("file_1.txt", Some "1b")); Renamed ("file2.txt", ("file_2.txt", Some "2b"));
 Changed ("file_1.txt", Some "1c"); Changed ("file_2.txt", Some "2c"); Deleted "file_1.txt"; Deleted "file_2.txt"]

Some ()

testEventsSorted (test)¶

In [15]:
///- --test

let inline sortEvent event =
    match event with
    | FileSystemChange.Failure _ -> 0
    | FileSystemChange.Created _ -> 1
    | FileSystemChange.Changed _ -> 2
    | FileSystemChange.Renamed (_oldPath, _) -> 3
    | FileSystemChange.Deleted _ -> 4

let inline formatEvents events =
    events
    |> Seq.toList
    |> List.sortBy (snd >> sortEvent)
    |> List.choose (fun (ticks, event) ->
        match event with
        | FileSystemChange.Failure _ ->
            None
        | FileSystemChange.Changed (path, _) ->
            Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Changed)
        | FileSystemChange.Created (path, _) ->
            Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Created)
        | FileSystemChange.Deleted path ->
            Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Deleted)
        | FileSystemChange.Renamed (_oldPath, (path, _)) ->
            Some (ticks, System.IO.Path.GetFileName path, nameof FileSystemChangeType.Renamed)
    )
    |> List.sortBy (fun (_, path, _) -> path)
    |> List.distinctBy (fun (_, path, event) -> path, event)

let inline testEventsSorted
    (watchFn : string -> FSharp.Control.AsyncSeq<int64 * FileSystemChange> * IDisposable)
    write
    =
    let struct (tempDir, tempDisposable) =
        "FileSystem.testEventsSorted"
        |> SpiralCrypto.hash_text
        |> SpiralFileSystem.create_temp_dir'
    let stream, disposable = watchFn tempDir

    let events = System.Collections.Concurrent.ConcurrentBag ()

    let inline iter () =
        stream
        |> FSharp.Control.AsyncSeq.iterAsyncParallel (fun event -> async { events.Add event })

    let run = async {
        let! _ = iter () |> Async.StartChild
        do! Async.Sleep 250
        return! write tempDir
    }

    try
        run
        |> Async.runWithTimeout 5000
        |> _assertEqual (Some ())
    finally
        disposable.Dispose ()
        tempDisposable.Dispose ()

    let events = formatEvents events

    let eventMap =
        events
        |> List.map (fun (ticks, path, event) -> path, (event, ticks))
        |> List.groupBy fst
        |> List.map (fun (path, events) ->
            let event, _ticks =
                events
                |> List.map snd
                |> List.sortByDescending snd
                |> List.head

            path, event
        )
        |> Map.ofList

    let eventList =
        events
        |> List.map (fun (_ticks, path, event) -> path, event)

    eventMap, eventList

create and delete (test)¶

In [16]:
///- --test

let inline write path = async {
    let n = 3

    for i = 1 to n do
        do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    for i = 1 to n do
        do! SpiralFileSystem.delete_file_async (path </> $"file{i}.txt") |> Async.Ignore

    do! Async.Sleep 150
}

let inline run () =
    let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write

    [
        "file1.txt", nameof FileSystemChangeType.Created
        "file1.txt", nameof FileSystemChangeType.Changed
        "file1.txt", nameof FileSystemChangeType.Deleted

        "file2.txt", nameof FileSystemChangeType.Created
        "file2.txt", nameof FileSystemChangeType.Changed
        "file2.txt", nameof FileSystemChangeType.Deleted

        "file3.txt", nameof FileSystemChangeType.Created
        "file3.txt", nameof FileSystemChangeType.Changed
        "file3.txt", nameof FileSystemChangeType.Deleted
    ]
    |> _sequenceEqual eventList

    [
        "file1.txt", nameof FileSystemChangeType.Deleted
        "file2.txt", nameof FileSystemChangeType.Deleted
        "file3.txt", nameof FileSystemChangeType.Deleted
    ]
    |> Map.ofList
    |> _sequenceEqual eventMap

run
|> retry_fn 3
|> _assertEqual (Some ())
Some ()

11:54:44 d #5 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
[("file1.txt", "Created"); ("file1.txt", "Changed"); ("file1.txt", "Deleted"); ("file2.txt", "Created");
 ("file2.txt", "Changed"); ("file2.txt", "Deleted"); ("file3.txt", "Created"); ("file3.txt", "Changed");
 ("file3.txt", "Deleted")]

map [("file1.txt", "Deleted"); ("file2.txt", "Deleted"); ("file3.txt", "Deleted")]

Some ()

change (test)¶

In [17]:
///- --test

let inline write path = async {
    let n = 2

    for i = 1 to n do
        do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    for i = 1 to n do
        do! "" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    for i = 1 to n do
        do! SpiralFileSystem.delete_file_async (path </> $"file{i}.txt") |> Async.Ignore

    do! Async.Sleep 150
}

let inline run () =
    let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write

    [
        "file1.txt", nameof FileSystemChangeType.Created
        "file1.txt", nameof FileSystemChangeType.Changed
        "file1.txt", nameof FileSystemChangeType.Deleted

        "file2.txt", nameof FileSystemChangeType.Created
        "file2.txt", nameof FileSystemChangeType.Changed
        "file2.txt", nameof FileSystemChangeType.Deleted
    ]
    |> _sequenceEqual eventList

    [
        "file1.txt", nameof FileSystemChangeType.Deleted
        "file2.txt", nameof FileSystemChangeType.Deleted
    ]
    |> Map.ofList
    |> _sequenceEqual eventMap

run
|> retry_fn 3
|> _assertEqual (Some ())
Some ()

11:54:45 d #6 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
[("file1.txt", "Created"); ("file1.txt", "Changed"); ("file1.txt", "Deleted"); ("file2.txt", "Created");
 ("file2.txt", "Changed"); ("file2.txt", "Deleted")]

map [("file1.txt", "Deleted"); ("file2.txt", "Deleted")]

Some ()

rename (test)¶

In [18]:
///- --test

let inline write path = async {
    let n = 2

    for i = 1 to n do
        do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    for i = 1 to n do
        do! path </> $"file{i}.txt" |> SpiralFileSystem.move_file_async (path </> $"file_{i}.txt") |> Async.Ignore

    for i = 1 to n do
        do! SpiralFileSystem.delete_file_async (path </> $"file_{i}.txt") |> Async.Ignore

    do! Async.Sleep 150
}

let inline run () =
    let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write

    [
        "file1.txt", nameof FileSystemChangeType.Created
        "file1.txt", nameof FileSystemChangeType.Changed
        "file2.txt", nameof FileSystemChangeType.Created
        "file2.txt", nameof FileSystemChangeType.Changed

        "file_1.txt", nameof FileSystemChangeType.Renamed
        "file_1.txt", nameof FileSystemChangeType.Deleted

        "file_2.txt", nameof FileSystemChangeType.Renamed
        "file_2.txt", nameof FileSystemChangeType.Deleted
    ]
    |> _sequenceEqual eventList

    [
        "file1.txt", nameof FileSystemChangeType.Changed
        "file2.txt", nameof FileSystemChangeType.Changed
        "file_1.txt", nameof FileSystemChangeType.Deleted
        "file_2.txt", nameof FileSystemChangeType.Deleted
    ]
    |> Map.ofList
    |> _sequenceEqual eventMap

run
|> retry_fn 3
|> _assertEqual (Some ())
Some ()

11:54:45 d #7 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
[("file1.txt", "Created"); ("file1.txt", "Changed"); ("file2.txt", "Created"); ("file2.txt", "Changed");
 ("file_1.txt", "Renamed"); ("file_1.txt", "Deleted"); ("file_2.txt", "Renamed"); ("file_2.txt", "Deleted")]

map [("file1.txt", "Changed"); ("file2.txt", "Changed"); ("file_1.txt", "Deleted"); ("file_2.txt", "Deleted")]

Some ()

full (test)¶

In [19]:
///- --test

let inline write path = async {
    let n = 2

    for i = 1 to n do
        do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    for i = 1 to n do
        do! "" |> SpiralFileSystem.write_all_text_async (path </> $"file{i}.txt")

    for i = 1 to n do
        do! path </> $"file{i}.txt" |> SpiralFileSystem.move_file_async (path </> $"file_{i}.txt") |> Async.Ignore

    for i = 1 to n do
        do! $"{i}" |> SpiralFileSystem.write_all_text_async (path </> $"file_{i}.txt")

    for i = 1 to n do
        do! SpiralFileSystem.delete_file_async (path </> $"file_{i}.txt") |> Async.Ignore

    do! Async.Sleep 150
}

let inline run () =
    let eventMap, eventList = testEventsSorted (watchDirectory (fun _ -> false)) write

    [
        "file1.txt", nameof FileSystemChangeType.Created
        "file1.txt", nameof FileSystemChangeType.Changed
        "file2.txt", nameof FileSystemChangeType.Created
        "file2.txt", nameof FileSystemChangeType.Changed

        "file_1.txt", nameof FileSystemChangeType.Changed
        "file_1.txt", nameof FileSystemChangeType.Renamed
        "file_1.txt", nameof FileSystemChangeType.Deleted

        "file_2.txt", nameof FileSystemChangeType.Changed
        "file_2.txt", nameof FileSystemChangeType.Renamed
        "file_2.txt", nameof FileSystemChangeType.Deleted
    ]
    |> _sequenceEqual eventList

    [
        "file1.txt", nameof FileSystemChangeType.Changed
        "file2.txt", nameof FileSystemChangeType.Changed
        "file_1.txt", nameof FileSystemChangeType.Deleted
        "file_2.txt", nameof FileSystemChangeType.Deleted
    ]
    |> Map.ofList
    |> _sequenceEqual eventMap

run
|> retry_fn 3
|> _assertEqual (Some ())
Some ()

11:54:46 d #8 FileSystem.watchWithFilter / Disposing watch stream / filter: FileName, LastWrite
[("file1.txt", "Created"); ("file1.txt", "Changed"); ("file2.txt", "Created"); ("file2.txt", "Changed");
 ("file_1.txt", "Changed"); ("file_1.txt", "Renamed"); ("file_1.txt", "Deleted"); ("file_2.txt", "Changed");
 ("file_2.txt", "Renamed"); ("file_2.txt", "Deleted")]

map [("file1.txt", "Changed"); ("file2.txt", "Changed"); ("file_1.txt", "Deleted"); ("file_2.txt", "Deleted")]

Some ()