« first day (852 days earlier)      last day (2328 days later) » 
00:00 - 21:0021:00 - 00:00

12:01 AM
RELOAD!
[retailcoder/Rubberduck] 25 commits. 2857 additions. 2171 deletions.
[rubberduck-vba/Rubberduck] 5 opened issues. 1 closed issue. 7 issue comments.
[Vogel612/TranslationHelper\‌​] 2 commits. 65 additions. 28 deletions.
 
12:19 AM
I'm not ditching the wrappers just yet. But I'm removing the IDisposable implementations and replacing it with some IComResource - each wrapper will be responsible for releasing itself and its children, so all we'll need is one call to _vbe.Release as late as possible in the teardown process, and that will access and release every single type in the API - including the commandbars.
@PeterMTaylor makes me want to switch all enumerables to List<T> seriously; this might actually massively improve the performance of inspections
OTOH the strategy for inspections is going to change drastically when they work off an AST.. still, I tend to consistently expose IEnumerable<T> everywhere I'm returning an enumerable.
@Duga huh, Chrome renders emojis in chat now?
:+1
nope
 
 
2 hours later…
2:06 AM
@Mat'sMug sounds like a very positive and useful good plan in the name of simplicity with performance gains. I wonder how many enumerables in total you have already in RD? Who then will be having the responsibility to put say tokens of data into these lists?
 
various methods in various tree nodes :)
 
Shame not to have specific numbers that would provide a good data driven design...
Keep going sounds good nonetheless
Could AppVoyer provide this info at some time during the compile phrase, just thinking aloud.
 
@Mat'sMug 'tis unicode
 
'tis recent ;-)
 
or maybe it's gh that changed the emojis from images to unicode
 
 
2 hours later…
3:55 AM
:+1:
Nope also. ;)
 
 
2 hours later…
5:31 AM
[retailcoder/Rubberduck] retailcoder pushed commit b450ef44 to next: removed IDisposable for wrappers; added & implemented ISafeComWrapper.Release
 
> Managed Debugging Assistant 'FatalExecutionEngineError' has detected a problem in 'C:\Program Files\Microsoft Office\Office14\EXCEL.EXE'.

Additional information: The runtime has encountered a fatal error. The address of the error was at 0x1e18e072, on thread 0x1d68. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
 
5:50 AM
[retailcoder/Rubberduck] retailcoder pushed commit 5ffeacc7 to next: COMException thrown on exit due to double-releasing of a CommandBar - menu actions work again
[retailcoder/Rubberduck] retailcoder pushed commit 97a79ac9 to next: fixed commandbar teardown - exception on exit has to do with references events (sink?)
[retailcoder/Rubberduck] retailcoder pushed commit 3a1d3d85 to next: fixed null check in QualifiedModuleName
[retailcoder/Rubberduck] retailcoder pushed commit d1278574 to next: removed obsolete R# comment
 
TTGTB. This wrapper thing might actually end up working.
Just need to avoid releasing COM objects that the VBE still uses to tear itself down
Oh and null checks against wrappers. ...hmm now that equals and gethashcode are implemented that ==/!= operator override might be worth it
 
 
2 hours later…
7:59 AM
> RD's ExtractMethod refactoring names the new method `NewMethod` regardless of whether the module already contains a declaration named `NewMethod`.

If the user performs an Extract Method followed by another ExtractMethod, the user ends up with 2 methods called `NewMethod`, and no way to distinguish the calls to each method.

**Before:**
```vb
Sub foo()

Dim x As String
x = "foo"

Dim y As String
y = "bar"

End Sub
```

**After:**
```vb
Sub foo()


NewMethod

N
> Extract Method seems to cause a syntax error when the extracted statements are near the top of the procedure, and possibly other situations.

**Before:**
```vb
Sub foo()
Dim x As String
x = "foo"
End Sub
```

**After:**
```vb
Sub foo()
End Sub
NewMethod
Private Sub NewMethod()
Dim x As String
x = "foo"
End Sub
```
 
8:29 AM
> The indentation of the extracted lines is preserved, and the indentation of the call to the new method is seemingly always 0 spaces.

Also note the error in the new method line placement - see comment in code below...

**Before:**
```vb
Sub foo()

Dim x As String
If True Then
If True Then
If True Then
x = "foo"
End If
End If
End If

End Sub
```

**After:**
```vb
Sub foo()

If True Then
If True Then
If True Then
End
 
 
1 hour later…
9:53 AM
> I've added some line numbers as comments to help identify the bug.

```vb
Option Explicit '1
'2
Sub foo() '3
'4
Dim x As String ' 5
x = "foo" ' 6
'7
End Sub '8
'9
Sub bar() '10
'11
End Sub '12
```

I trigger the Extract Method command by right clicking anywhere in Line `6`, and get this result:

```vb
Option Explicit '1
'2
Sub foo() '3
'4
'7
NewMethod
End Sub '8
Private Sub NewMethod()
Dim x As String ' 5
x = "foo" ' 6
End Sub
'9
Sub bar(
 
 
1 hour later…
11:06 AM
> @Vogel612 Thanks. I ran that and got the successful message, but I'm still getting the "object reference not set to an instance of an object" error.
> @Vogel612 Thanks. I ran that and got the successful message, follow by

>Assembly exported to 'C:\ProgramData\Rubberduck\rubberduck.tlb', and the type library was registered successfully

but I'm still getting the "object reference not set to an instance of an object" error.
> @Vogel612 Thanks. I ran that (as administrator) and got the successful message, follow by

>Assembly exported to 'C:\ProgramData\Rubberduck\rubberduck.tlb', and the type library was registered successfully

but I'm still getting the "object reference not set to an instance of an object" error.
> @Vogel612 Thanks. I ran that (as administrator) and got the successful message, followed by

>Assembly exported to 'C:\ProgramData\Rubberduck\rubberduck.tlb', and the type library was registered successfully

but I'm still getting the "object reference not set to an instance of an object" error.
> @Vogel612 Thanks. I ran that (as administrator) and got the successful message, followed by

>Assembly exported to 'C:\ProgramData\Rubberduck\rubberduck.tlb', and the type library was registered successfully

but I'm still getting the "object reference not set to an instance of an object" error.
 
11:41 AM
@Kaz - do you happen to know the secrets of GreenPackage?
 
> You should be able to find the logs under `%AppData%/Rubberduck/logs`. At this point a Stacktrace would greatly help us nail the error down.

You'll find one either in the logs (most probably as the last few lines) or in the details of the error message you get.
 
Kaz
@ThunderFrame The only GreenPackage I know of is BlackRock's suite of risk/analytics reporting for investments. Is that what you're thinking of?
 
that's the one
 
Kaz
@ThunderFrame What do you want to know about it?
 
I'm trying to build some URLS to retrieve the reports I want, but I need specific fields in with a specific number of decimal places. I could use a favorite, but I'd prefer to request the decimal places as part of the URL.
favorite = GreenPackage favorite (not a browser favorite)
 
Kaz
11:53 AM
@ThunderFrame I'm afraid you're way beyond my functional knowledge here. I've never had to interact with it as an end user.
 
np - thought by chance you might have known the guy that knows the guy that wrote the URL documentation.
 
> So I uninstalled RD, cleaned up the files, removed all the office 07/10/13 entries from the registry, ran all the 2016 updates. Restarted, installed RD as admin and got the error. Ran the cmd fix as admin again and still getting the error.

The `\AppData\Roaming\Rubberduck\Logs\RubberduckLog` has no entries for today. Yesterday only has repeated

>
> 2016-10-04 13:11:11.0114;WARN;Rubberduck.Parsing.Symbols.TypeAnnotationPass;Failed to resolve type VBE;
> 2016-10-04 13:11:11.2504;WARN;Ru
> So I uninstalled RD, cleaned up the files, removed all the office 07/10/13 entries from the registry, ran all the 2016 updates. Restarted, installed RD as admin and got the error. Ran the cmd fix as admin again and still getting the error.

The `\AppData\Roaming\Rubberduck\Logs\RubberduckLog` has no entries for today. Yesterday only has repeated

>
> 2016-10-04 13:11:11.0114;WARN;Rubberduck.Parsing.Symbols.TypeAnnotationPass;Failed to resolve type VBE;
> 2016-10-04 13:11:11.2504;WARN;Ru
 
 
1 hour later…
1:05 PM
> My preference is for 1 blank line *after* a declaration, so that Types/Enums/Procedures are easier to identify visually:

**Before:**
```vb
Option Explicit
Type Fizz
Foo As String
Bar As String
End Type
Enum Buzz
aaa =1
bbb = 2
End Enum
Sub Foo()
End Sub
Sub Bar()
End Sub
'TODO - Refactor FooBar
Sub FooBar
End Sub
```

becomes

**After:**
```vb
Option Explicit

Type Fizz
Foo As String
Bar As String
End Type

Enum Buzz
aaa =1
bbb = 2
End Enum
 
1:50 PM
> This should be simple to fix. The problem is that the "newMethodCall" is inserted at the SelectionStart [here](https://github.com/rubberduck-vba/Rubberduck/blob/next/RetailCoder.VBE/Refactorings/ExtractMethod/ExtractMethodExtraction.cs#L24)

```c#
var newMethod = constructLinesOfProc(codeModule, model);
codeModule.InsertLines(positionToInsertNewMethod.StartLine, newMethod);
removeSelection(codeModule, selectionToRemove);
codeModule.InsertLi
 
 
1 hour later…
2:54 PM
> So I uninstalled RD, cleaned up the files, removed all the office 07/10/13 entries from the registry, ran all the 2016 updates. Restarted, installed RD as admin and got the error. Ran the cmd fix as admin again and still getting the error.

The `\AppData\Roaming\Rubberduck\Logs\RubberduckLog` has no entries for today. Yesterday only has repeated

>
> 2016-10-04 13:11:11.0114;WARN;Rubberduck.Parsing.Symbols.TypeAnnotationPass;Failed to resolve type VBE;
> 2016-10-04 13:11:11.2504;WARN;Ru
> So I uninstalled RD, cleaned up the files, removed all the office 07/10/13 entries from the registry, ran all the 2016 updates. Restarted, installed RD as admin and got the error. Ran the cmd fix as admin again and still getting the error.

The `\AppData\Roaming\Rubberduck\Logs\RubberduckLog` has no entries for today. Yesterday only has repeated

>
> 2016-10-04 13:11:11.0114;WARN;Rubberduck.Parsing.Symbols.TypeAnnotationPass;Failed to resolve type VBE;
> 2016-10-04 13:11:11.2504;WARN;Ru
 
3:48 PM
down to 34 failing tests. I suspect an off-by-one somewhere.
 
4:30 PM
4 failing tests
2 failing tests
all good!
moving a bunch of extension methods to the wrappers... removing duplicate code
ugh. broke 7 tests.
huh, one of them doesn't quite make sense
@Hosch250 test names like ExtractInterface_CanExecute_NoMembers make it easy to tell what's being tested, but impossible to tell the expected result without looking at the test implementation - e.g. that test is doing Assert.IsFalse, so ExtractInterface_CannotExecute_NoMembers would be a better name. just an example.
 
5:02 PM
> This is by design, sort of - the refactoring was written before the indenter was finished - it's not a feature of the *extract method* refactoring to know how to indent code.

Changing from [bug] to [enhancement], since all that's needed is to call into the indenter interface when generating the extracted method.
> ref. #1599 - the Extract Method dialog solves this problem.
> Probably the same underlying issue as #2202
 
5:21 PM
> @RaymondWise there was a bug at one point (not sure which release fixed it) where RD wouldn't start without at least one project in VBE.VBProjects; since the bug is now fixed, I'll close this issue. Make sure there's a host document in the host application when you open up the VBE.
 
ExtractInterface tests were relying on CodePaneExtensions.GetQualifiedSelection; other tests were relying on CodeModuleExtensions.GetQualifiedSelection. It wouldn't have been too bad if the two weren't contradicting each other.
 
5:46 PM
0
Q: Computing and Populating Excel Table With VBA

DombeyI am trying to populate a table like this in Excel. I came up with a bunch of loops to do this. I feel like this is a brute-force approach and may not work well when populating bigger tables. Any other ways to populate values in Excel? Sub Fill_SLA_priority() Dim SLAbyPrior As Worksh...

 
@Mat'sMug OK.
 
[retailcoder/Rubberduck] retailcoder pushed commit 3ec6220e to next: removed more static classes / moved extension methods to appropriate wrapper types
[retailcoder/Rubberduck] retailcoder pushed commit ee95ad84 to next: fixed NRE
[retailcoder/Rubberduck] retailcoder pushed commit b6171ffc to next: fixed NRE
[retailcoder/Rubberduck] retailcoder pushed commit ccfbfa93 to next: minor cleanups
> This PR ensures every single COM type ever accessed gets properly cleaned up when RD shuts down. Also cleans up a number of extension methods, now moved to wrapper types.

Host app *still* crashes on exit though.
Make test for Class event procedures a case-insensitive test

Thunderframe added some tests!
Merge pull request #2246 from ThunderFrame/next

Make test for Class event procedures a case-insensitive test
ignore functions returning arrays

Partial fix for #2265. Requires a fix for #2266 before *all* functions
returning arrays are excluded.
fixes array assignments for declarations (not just function return values)

auxiliary partial fix for #2265
Merge pull request #2267 from ThunderFrame/next

ignore functions returning arrays AND variable array assignments
[retailcoder/Rubberduck] web-flow pushed commit b2ff5b8e to next: Merge branch 'next' into next
[rubberduck-vba/Rubberduck] build for commit ccfbfa93 on unknown branch: AppVeyor build failed
BUILD FAILURE!
[rubberduck-vba/Rubberduck] build for commit b2ff5b8e on unknown branch: AppVeyor build succeeded
[rubberduck-vba/Rubberduck] retailcoder pushed 100 commits to next (only showing some of them below)
[rubberduck-vba/Rubberduck] retailcoder pushed commit d1278574 to next: removed redundant R# comment
[rubberduck-vba/Rubberduck] retailcoder pushed commit 012e8a08 to next: put the Project Explorer context menu back into the right parent controls collection
[rubberduck-vba/Rubberduck] retailcoder pushed commit 5ab9a743 to next: down to 34 failing tests
[rubberduck-vba/Rubberduck] retailcoder pushed commit 8d50e17c to next: all tests pass (ExtractMethod tests still disabled)
 
6:08 PM
@Duga that hasn't happened in a loooooooooooong while!
 
[rubberduck-vba/Rubberduck] retailcoder pushed commit 3ec6220e to next: removed more static classes / moved extension methods to appropriate wrapper types
[rubberduck-vba/Rubberduck] retailcoder pushed commit ee95ad84 to next: fixed NRE
[rubberduck-vba/Rubberduck] retailcoder pushed commit b6171ffc to next: fixed NRE
[rubberduck-vba/Rubberduck] retailcoder pushed commit ccfbfa93 to next: minor cleanups
[rubberduck-vba/Rubberduck] web-flow pushed commit b2ff5b8e to next: Merge branch 'next' into next
Merge pull request #2287 from retailcoder/next

Implemented SafeComWrappers
[rubberduck-vba/Rubberduck] build for commit 710f6f4f on next: AppVeyor build failed
BUILD FAILURE!
 
@Mat'sMug I won't be on SE anymore. That election thing is the last straw.
I agree the election is bad, but I viewed SE as a Q/A site group.
 
huh?
 
They are running ads to vote in the election. Fortunately, they haven't officially endorsed a candidate yet.
 
> I guess we got approached by some voter registration org about running these, and it seemed like a good idea... So we're running them.
they're not SE's ads
 
6:11 PM
If you want to contact me, you have my email. I hope to contribute to RD still.
 
...okay
 
No, but SE endorsed them by running them.
 
and you have a problem with people saying "you have a right to vote, use it"?
 
I have a problem with people being pressured to vote.
And, it breaks SE's "rule" of only running community-approved ads.
 
they're not the community ads
they're the banner ads displayed between posts when you have <200 rep
 
6:14 PM
Oh, OK.
 
now please don't make me nuke your account :)
 
Well, I guess if this isn't anything new, then I'll stay around for a while.
@Mat'sMug No, I wasn't going to do that.
I was just going to not sign in--I'm already not contributing, really.
I thought SE only ran community ads.
 
hey @SimonForsberg
 
@Hosch250 Last question on September 13. How is that not contributing? :)
 
@SimonForsberg I guess you could call that contributing to the problem of more questions than answers.
 
6:18 PM
hey, it's still contributing!
 
Good questions is probably one of the most important ways of contributing.
 
It just doesn't feel quite right to have a site be "all about the community", but then be pushing their own agendas.
 
Says the moderator who hasn't posted a question since December, erhm...
 
On the other hand, it isn't that much different than traditional businesses endorsing candidates...
 
FWIW this very site kicked off with people being pressured to vote :)
3
50
Q: Call of Duty - We're on a mission

Mat's MugThis is a direct reply to Grace Note's recent CR review, more precisely the following part: (emphasis mine) Unanswered Tying in to all of the above is one of the most pressing concerns about the site I had in my own review, which is the gigantic pool of unanswered questions. There are, ...

 
6:20 PM
I just hate this whole election and big government stuff. I think the best government is small communities where people help each other because they care, not having the impersonal government helping in ways that don't really help.
 
@Hosch250 I think I agree with you about that one.
 
2:22pm... I should've had lunch by now
 
@Mat'sMug That is internal voting ;)
Anyway, I'm going to go walk my dog.
 
@Comintern you were right, proper cleanup changes sweet nothing, host app still crashes on exit.
 
6:48 PM
@Mat'sMug Proper cleanup changes improper cleanup, which isn't nothing.
 
I guess... I'm just a bit tired of hunting down this crashing
At this point I guess it's a matter of shutting off all hooks and listeners and see if it stabilizes, and then turning things back on one at a time
 
Did you wrap the vbComponent.Properties member all the way down? We use that to return host-specific objects that are NOT part of VBIDE.
 
7:04 PM
I also remember seeing instances where parser threads weren't terminating on shutdown. Basically, RD was out-living the VBE.
 
@ThunderFrame I think so
@Comintern still is; the mainwindow is long gone and we have stuff tearing down still
 
I'm guessing it has more to do with how an STA handles requests - they basically end up in a message queue.
So, if you have 5 threads that are accessing the same STA server the server is responsible for "scheduling" them, and it does it with a FIFO stack.
 
interesting: if I move the _vbe.Release(); call before the _kernel.Dispose(); call, I get the "Excel has stopped working" error earlier.
 
So lets say that one thread sends a WM_QUIT message while there are still additional messages in the queue. The rest of the queue doesn't get processed.
What I'm not entirely clear on is how the RCW plays into that. IIR I read somewhere that it "bends the rules" on the STA threading assumptions. I can easily see access violations coming from that.
 
do the vbProject removals that occur on shutdown trigger threads?
 
7:18 PM
@ThunderFrame that's a good lead. hooks would raise an event and request a reparse, which explains the dangling parser threads
 
ie. is RD trying to reparse after each project is removed?
does Excel crash if there are 0 projects open, and RD is in parsed state?
 
How would you have 0 projects open?
 
open up Excel, close the default document, bring up the VBE
1.4.3 goes boom
 
no add-ins, no loaded workbooks - an empty VBE
 
Ah.
 
7:20 PM
no crash
although, all RD menus are enabled... which is a minor issue.
 
Although... interestingly enough all of the menu options are enabled.
 
but no crash on exit.
lol
 
My build still crashed on exit
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Exception code: 0xc0000005
 
huh, so perhaps the cleanup does help :)
 
It certainly shouldn't hurt.
 
7:24 PM
1. Extension.BeginShutdown gets called
2. Extension.OnDisconnection gets called
3. _sink_ProjectRemoved gets called
consider it fixed
 
@Mat'sMug 2.0 didn't last I had it open.
@Mat'sMug Uh, doesn't step three throw an exception?
 
huh, ISinks doesn't even expose Stop()
hmm
@Hosch250 no, because the runtime is holding on to the RCW's receiving the events (my theory)
 
Hmm. Let's see.
 
Stop() won't be enough.. it needs to Dispose() ...but...... it does. this is bad :(
BeginShutdown > ShutdownAddIn > _app.Shutdown > _hooks.Detach > _ide.Release > _kernel.Dispose > Sinks.Dispose
the sequence is good
I'm adding Marshal.ReleaseComObject in there, to release the IConnectionPoint objects
still crashes
still crashes, but doesn't run _sink_ProjectRemoved anymore
so, progress :)
 
7:41 PM
Shouldn't the Sinks be disposed before _ide.Release?
 
good point
I moved it up to experiment
nope
 
_ide.Dispose should be releasing RD's reference count for the VBE.
 
        private void ShutdownAddIn()
        {
            if (_app != null)
            {
                _app.Shutdown();
                _app = null;
            }

            if (_kernel != null)
            {
                _kernel.Dispose();
                _kernel = null;
            }

            _ide.Release();
            _isInitialized = false;
        }
_kernel.Dispose disposes every injected disposable
_ide.Release releases every COM object in the VBE wrapper tree
 
I thought Sinks was created explicitly with new.
 
I don't want to be a system admin anymore.
3
 
7:43 PM
no, they're ctor-injected in SingletonScope in a few places
 
I can't stand my messaging systems class.
The funny thing is that I don't really understand most of it, but am getting 100%'s and comments that I am demonstrating thorough knowledge from the professor...
TBH, I'm not sure how well she understands it either...
 
_state = new RubberduckParserState(new Sinks(vbe));
 
@Comintern where's that?
oh christ
 
In my (albeit old synch), it's in ParserState.Initialize.
 
Rubberduck.API.ParserState
it's not created unless a COM client creates it
 
8:02 PM
OK, here's the call stack of the crash:
>	ole32.dll!CDestObjectWrapper::GetMarshalSizeMax(const _GUID & riid, void * pv, unsigned long dwDestCtx, void * pvDestObjectWrapper, unsigned long mshlflags, unsigned long * pSize) Line 493	C++
 	ole32.dll!CoGetMarshalSizeMax(unsigned long * pulSize, const _GUID & riid, IUnknown * pUnk, unsigned long dwDestCtx, void * pvDestCtx, unsigned long mshlflags) Line 722	C++
 	ole32.dll!CRemoteUnknown::DoCallback(tagXAptCallback * pCallbackData) Line 1571	C++
 	rpcrt4.dll!_Invoke@12()	Unknown
 	rpcrt4.dll!_NdrStubCall2@16()	Unknown
 
hmm.. what does that tell us?
I'm guessing the MTAInvoke has something to do with it
 
The call to ole32.dll!MTAInvoke is kind of puzzling, but the crash seems to be directly related to ole32.dll!CRemoteUnknown::DoCallback.
Possibly related:
Seems related to detaching the event handlers on the COM side.
 
8:23 PM
ugh. so what are we doing wrong here?
 
Not exactly sure - unfortunately the mini-dump doesn't include any of the managed stack at all. I'm trying to see if I can find out what windows message it's trying to handle.
 
I'm making another PR to bring in the sink changes
 
Looks like it's trying to handle WM_SETFOCUS
Assuming I'm reading the hex dump correctly...
WTH is it going through RPC for?
 
merged
feel free to pull :)
 
Ah - that's the marshaller. So it's definitely an RD call.
 
8:33 PM
0
Q: Properly destroying the VBE

Mat's MugThe disposable wrappers worked exactly as intended... and that turned out being a huge mistake: That's because the .net runtime creates a Runtime Callable Wrapper per-type, not per-instance*; it took a number of refactorings and adjustments just to be able to get the project to build and run, ...

 
@Duga I've been enhancing destroying the VBE successfully for years
 
OK, all synched up. Time to crash Excel again.
3
Grr.... WARNING: Unable to enumerate some of the managed modules from this dump. The operation failed because the debugger could not get the metadata.
The unmanaged side has the exact same call stack.
 
8:48 PM
Could the Invoke calls be responsible for this?
 
Possibly. It has every look of a callback though, which is odd. It's almost like the RCW is gone and Excel is calling it. Kind of like it's trying to call an event handler that doesn't exist anymore.
Ugh. I wish the debugging symbols I had were better. I have no clue how to decode the RPCOLEMESSAGE that's being passed. That should have the ordinal for the procedure it's calling in it. All I can find is the missing vtable entry.
 
@Mat'sMug is there a difference between killing RD when VBE is empty because there have never been any projects open, and killing RD when VBE is empty but RD had previously parsed 1 or more projects (before those projects were closed)?
 
@ThunderFrame good question
there shouldn't be
 
We're about to find out...
 
If it doesn't crash after parsing and then closing the host document.... we're doing something right
uh, guys
it didn't crash
(no debugger attached)
 
00:00 - 21:0021:00 - 00:00

« first day (852 days earlier)      last day (2328 days later) »