From 12b13d2aa464fa97873f3ef97a7e957ee79784cf Mon Sep 17 00:00:00 2001 From: Pieter de Bie Date: Sat, 14 Jun 2008 21:03:49 +0200 Subject: [PATCH] Use a Commit model in Javascript to parse commit data This includes the prototype library in the bundle for convenience. Whenever a new commit is selected, a new Commit object is created that is going to parse the raw message. From the object we can select author information, diffs, etc. Currently there is still a bug with commits without content changes. --- English.lproj/MainMenu.nib/designable.nib | 3552 ++++++++-------- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 36228 -> 35719 bytes GitTest.xcodeproj/project.pbxproj | 12 + html/commit.html | 28 +- html/commit.js | 49 + html/prototype.js | 4221 +++++++++++++++++++ 6 files changed, 6033 insertions(+), 1829 deletions(-) create mode 100644 html/commit.js create mode 100644 html/prototype.js diff --git a/English.lproj/MainMenu.nib/designable.nib b/English.lproj/MainMenu.nib/designable.nib index 1eedbd3..1051904 100644 --- a/English.lproj/MainMenu.nib/designable.nib +++ b/English.lproj/MainMenu.nib/designable.nib @@ -8,81 +8,81 @@ 352.00 YES - + YES - com.apple.WebKitIBPlugin - com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + com.apple.InterfaceBuilder.CocoaPlugin - + YES - + NSApplication - + FirstResponder - + NSApplication - + 15 2 {{6, 479}, {862, 474}} 1886912512 GitX - NSWindow + NSWindow View - + 256 YES - - + + 274 YES - - + + 274 YES - - + + 2304 YES - - + + 256 {845, 139} - + YES - - + + 256 {845, 17} - + - + - - + + 256 {{846, 0}, {16, 17}} - + YES - + 6.080000e+02 4.000000e+01 1.000000e+03 @@ -91,56 +91,56 @@ 0 Subject - LucidaGrande + LucidaGrande 1.100000e+01 3100 - + 3 MC4zMzMzMzI5OQA - + 6 - System + System headerTextColor - + 3 MAA - + 337772096 2048 - Text Cell - - + Text Cell + + 1.300000e+01 1044 - - + + 6 - + controlBackgroundColor - + 3 MC42NjY2NjY2OQA - + 6 - + controlTextColor - + 3 YES YES - + - + 2.310000e+02 4.000000e+01 1.000000e+03 @@ -149,33 +149,33 @@ 0 Author - - + + - + 337772096 2048 - - - - - + + + + + 3 YES YES - + 3.000000e+00 2.000000e+00 - + 3 MQA 6 - + gridColor 3 @@ -191,73 +191,73 @@ {{1, 17}, {845, 139}} - + - - + + 4 - - + + 256 {{846, 17}, {15, 139}} - + - - _doScroller: + + _doScroller: 3.700000e+01 1.947368e-01 - - + + 256 {{1, 156}, {845, 15}} - + 1 - - + + 9.988180e-01 - - + + 2304 YES - + {{1, 0}, {845, 17}} - + - - + + 4 - + {862, 172} - + 50 - - - - - + + + + + QSAAAEEgAABBmAAAQZgAAA - - + + 36 YES - - + + 256 YES - - + + 274 YES @@ -279,13 +279,13 @@ {{-3, -3}, {848, 195}} - + - - + + - + YES @@ -297,8 +297,8 @@ YES - - + + @@ -309,50 +309,50 @@ {{10, 33}, {842, 195}} - + {{0, 173}, {862, 241}} - + YES - + 1 - + Details - + 6 - + controlColor - + - + - + 2 - + 256 YES - - + + 274 YES - - + + 2304 YES - - + + 2322 {831, 70} - - + + @@ -480,39 +480,39 @@ YES - + 6 - + 8.310000e+02 1 2369 - - + + YES YES NSBackgroundColor - NSColor + NSColor YES 6 - + selectedTextBackgroundColor - + 6 - + selectedTextColor - + @@ -521,7 +521,7 @@ YES YES - + NSUnderline @@ -542,71 +542,71 @@ {{1, 1}, {831, 193}} - - - - + + + + {4, -5} 1 4 - - + + 256 {{832, 1}, {15, 193}} - - - + + + 8.108108e-01 - - + + 256 {{-100, -100}, {87, 18}} - + 1 - - + + 1.000000e+00 9.456522e-01 {{-3, -3}, {848, 195}} - - + + 18 - - - + + + {{10, 33}, {842, 195}} Raw - - + + - + Item 2 - + 256 YES - - + + 268 {{17, 17}, {808, 195}} - + YES 67239488 2048 - + 1.200000e+01 16 @@ -623,88 +623,88 @@ {{10, 33}, {842, 195}} Tree - - + + - - + + 0 YES YES {{0, 25}, {862, 414}} - + 2 - - + + 292 {{3, 0}, {305, 17}} - + YES - + 67239488 272630784 Label - - - - + + + + - - + + 268 {{3, 447}, {159, 17}} - + YES - + 67239488 272630784 U2hvd2luZyBicmFuY2ggJ21hc3Rlcic - - - - + + + + - - + + 265 {{659, 447}, {183, 22}} - + YES - + 343014976 268436480 - - Subject - + + Subject + YES 1 6 - + textBackgroundColor - + - + 130560 0 search _searchFieldSearch: - - + + 138690815 0 - + 400 75 @@ -729,38 +729,17 @@ _searchFieldCancel: - - + + 138690815 0 - + 400 75 255 - - - 268 - {{266, 436}, {96, 32}} - - - YES - - 67239424 - 134217728 - Button - - - -2038284033 - 129 - - - 200 - 25 - - {862, 474} @@ -770,78 +749,78 @@ {213, 129} {3.40282e+38, 3.40282e+38} - - MainMenu + + MainMenu YES - - - GitTest - + + + GitTest + 1048576 2147483647 - - NSImage + + NSImage NSMenuCheckmark - - + + NSMenuMixedState submenuAction: - - + + YES - - + + About GitTest - + 2147483647 - - + + - - + + YES YES - - + + 1048576 2147483647 - - + + - - + + UHJlZmVyZW5jZXPigKY , 1048576 2147483647 - - + + - - + + YES YES - - + + 1048576 2147483647 - - + + - - + + Services - + 1048576 2147483647 - - + + submenuAction: - + Services @@ -851,497 +830,497 @@ _NSServicesMenu - - + + YES YES - - + + 1048576 2147483647 - - + + - - + + Hide GitTest - h + h 1048576 2147483647 - - + + - - + + Hide Others - + 1572864 2147483647 - - + + - - + + Show All - + 1048576 2147483647 - - + + - - + + YES YES - - + + 1048576 2147483647 - - + + - - + + Quit GitTest q 1048576 2147483647 - - + + _NSAppleMenu - - + + File - + 1048576 2147483647 - - + + submenuAction: - + File YES - - + + New n 1048576 2147483647 - - + + - - + + Open... o 1048576 2147483647 - - + + - - + + Open Recent - + 1048576 2147483647 - - + + submenuAction: - + Open Recent YES - - + + Clear Menu - + 1048576 2147483647 - - + + _NSRecentDocumentsMenu - - + + YES YES - - + + 1048576 2147483647 - - + + - - + + Close w 1048576 2147483647 - - + + - - + + Save s 1048576 2147483647 - - + + - - + + U2F2ZSBBc+KApg S 1048576 2147483647 - - + + - - + + Revert to Saved - + 2147483647 - - + + - - + + YES YES - - + + 1048576 2147483647 - - + + - - + + UGFnZSBTZXR1cOKApg P 1048576 2147483647 - - + + - - + + UHJpbnTigKY p 1048576 2147483647 - - + + - - + + Edit - + 1048576 2147483647 - - + + submenuAction: - + Edit YES - - + + Undo z 1048576 2147483647 - - + + - - + + Redo Z 1048576 2147483647 - - + + - - + + YES YES - - + + 1048576 2147483647 - - + + - - + + Cut x 1048576 2147483647 - - + + - - + + Copy c 1048576 2147483647 - - + + - - + + Paste v 1048576 2147483647 - - + + - - + + Delete - + 1048576 2147483647 - - + + - - + + Select All a 1048576 2147483647 - - + + - - + + YES YES - - + + 1048576 2147483647 - - + + - - + + Find - + 1048576 2147483647 - - + + submenuAction: - + Find YES - - + + RmluZOKApg - f + f 1048576 2147483647 - - + + 1 - - + + Find Next - g + g 1048576 2147483647 - - + + 2 - - + + Find Previous - G + G 1048576 2147483647 - - + + 3 - - + + Use Selection for Find e 1048576 2147483647 - - + + 7 - - + + Jump to Selection j 1048576 2147483647 - - + + - - - Spelling and Grammar - + + + Spelling and Grammar + 1048576 2147483647 - - + + submenuAction: - - + + YES - - + + U2hvdyBTcGVsbGluZ+KApg : 1048576 2147483647 - - + + - - + + Check Spelling ; 1048576 2147483647 - - + + - - + + Check Spelling While Typing - + 1048576 2147483647 - - + + - - + + Check Grammar With Spelling - + 1048576 2147483647 - - + + - - - Substitutions - + + + Substitutions + 1048576 2147483647 - - + + submenuAction: - - + + YES - - + + Smart Copy/Paste - + 1048576 2147483647 - - + + - - + + Smart Quotes - + 1048576 2147483647 - - + + - - + + Smart Links - + 1048576 2147483647 - - + + - - - Speech - + + + Speech + 1048576 2147483647 - - + + submenuAction: - - + + YES - - + + Start Speaking - + 2147483647 - - + + - - + + Stop Speaking - + 2147483647 - - + + @@ -1349,154 +1328,154 @@ - - + + Format - + 1048576 2147483647 - - + + submenuAction: - + Format YES - - + + Show Fonts - t + t 1048576 2147483647 - - + + - - + + Show Colors C 1048576 2147483647 - - + + - - - View - + + + View + 1048576 2147483647 - - + + submenuAction: - - + + YES - - + + Show Toolbar - + 1572864 2147483647 - - + + - - + + Q3VzdG9taXplIFRvb2xiYXLigKY - + 1048576 2147483647 - - + + - - - Window - + + + Window + 1048576 2147483647 - - + + submenuAction: - + Window YES - - + + Minimize m 1048576 2147483647 - - + + - - + + Zoom - + 1048576 2147483647 - - + + - - + + YES YES - - + + 1048576 2147483647 - - + + - - + + Bring All to Front - + 1048576 2147483647 - - + + _NSWindowsMenu - - - Help - + + + Help + 1048576 2147483647 - - + + submenuAction: - - + + YES - - + + GitTest Help ? 1048576 2147483647 - - + + @@ -1504,10 +1483,10 @@ _NSMainMenu - - GitTest_AppDelegate + + GitTest_AppDelegate - + YES arr @@ -1527,7 +1506,7 @@ YES YES - + PBWebGitController @@ -1537,316 +1516,316 @@ print: - - + + 86 runPageLayout: - - + + 87 showHelp: - - + + 122 clearRecentDocuments: - - + + 127 terminate: - - + + 139 orderFrontStandardAboutPanel: - - + + 142 hideOtherApplications: - - + + 146 hide: - - + + 152 unhideAllApplications: - - + + 153 cut: - - + + 175 paste: - - + + 176 redo: - - + + 178 selectAll: - - + + 179 undo: - - + + 180 copy: - - + + 181 showGuessPanel: - - + + 188 checkSpelling: - - + + 190 toggleContinuousSpellChecking: - - + + 192 performClose: - - + + 193 delete: - - + + 195 - performFindPanelAction: - - + performFindPanelAction: + + 199 - - - + + + 200 - - - + + + 201 - - - + + + 202 centerSelectionInVisibleArea: - - + + 203 - delegate - - + delegate + + 206 - - - + + + 207 - window - - + window + + 208 saveAction: - - + + 211 performMiniaturize: - - + + 247 performZoom: - - + + 248 arrangeInFront: - - + + 249 startSpeaking: - - + + 257 stopSpeaking: - - + + 258 toggleToolbarShown: - - + + 342 runToolbarCustomizationPalette: - - + + 343 orderFrontColorPanel: - - + + 345 content - - + + 396 - contentArray: repository.commits - - + contentArray: repository.commits + + - - - + + + contentArray repository.commits 2 @@ -1856,13 +1835,13 @@ - displayPatternValue1: arrangedObjects.@count - - + displayPatternValue1: arrangedObjects.@count + + - - - + + + displayPatternValue1 arrangedObjects.@count @@ -1874,15 +1853,15 @@ NSNoSelectionPlaceholder NSNotApplicablePlaceholder NSNullPlaceholder - NSRaisesForNotApplicableKeys + NSRaisesForNotApplicableKeys YES %{value1}@ commits loaded - - - - + + + + @@ -1893,29 +1872,29 @@ - predicate: filterPredicate - - - - - - + predicate: filterPredicate + + + + + + predicate - filterPredicate + filterPredicate YES YES - NSAlwaysPresentsApplicationModalAlerts - NSDisplayName - NSPredicateFormat - - NSValidatesImmediately + NSAlwaysPresentsApplicationModalAlerts + NSDisplayName + NSPredicateFormat + + NSValidatesImmediately YES - + subject contains[c] $value @@ -1928,24 +1907,24 @@ - predicate2: filterPredicate - - + predicate2: filterPredicate + + - - - + + + predicate2 - + YES YES - - - - - + + + + + YES @@ -1956,7 +1935,7 @@ - + 2 @@ -1964,14 +1943,14 @@ - value: arrangedObjects.subject - - + value: arrangedObjects.subject + + - - - - value + + + + value arrangedObjects.subject 2 @@ -1980,14 +1959,14 @@ - value: arrangedObjects.author - - + value: arrangedObjects.author + + - - - - + + + + arrangedObjects.author 2 @@ -1996,14 +1975,14 @@ - value: selection.details - - + value: selection.details + + - - - - + + + + selection.details 2 @@ -2013,40 +1992,32 @@ controller - - + + 588 view - - + + 589 - - - doeHet: - - - - 594 - commitsController - - + + 595 frameLoadDelegate - - + + 596 @@ -2059,857 +2030,842 @@ YES - + -2 - + RmlsZSdzIE93bmVyA -1 - + First Responder -3 - + Application 21 - + YES - + - + 2 - + YES - - - - - + + + + - + 436 - + YES - - + + - + 448 - + YES - - - - + + + + - + 452 - + YES - - + + - + 453 - + YES - + - + 456 - - + + 454 - + YES - + - + 455 - - + + 29 - + YES - - - - - - - + + + + + + + - + 56 - + YES - + - + 57 - + YES - - - - - - - - - - - + + + + + + + + + + + - + 58 - - + + 129 - - + + 131 - + YES - + - + 130 - - + + 134 - - + + 136 - - + + 143 - - + + 144 - - + + 145 - - + + 149 - - + + 150 - - + + 196 - - + + 83 - + YES - + - + 81 - + YES - - - - - - - - - - - + + + + + + + + + + + - + 72 - - + + 73 - - + + 74 - - + + 75 - - + + 77 - - + + 78 - - + + 79 - - + + 80 - - + + 82 - - + + 112 - - + + 124 - + YES - + - + 125 - + YES - + - + 126 - - + + 103 - + YES - + - + 106 - + YES - + - + 111 - - + + 163 - + YES - + - + 169 - + YES - - - - - - - - - - - - - + + + + + + + + + + + + + - + 156 - - + + 157 - - + + 158 - - + + 160 - - + + 164 - - + + 168 - + YES - + - + 159 - + YES - - - - - + + + + + - + 154 - - + + 155 - - + + 161 - - + + 162 - - + + 167 - - + + 171 - - + + 172 - - + + 173 - - + + 174 - - + + 184 - + YES - + - + 185 - + YES - - - - + + + + - + 187 - - + + 189 - - + + 191 - - + + 212 - - + + 214 - + YES - + - + 215 - + YES - - - + + + - + 216 - - + + 218 - - + + 219 - - + + 224 - + YES - + - + 225 - + YES - - + + - + 227 - - + + 228 - - + + 241 - + YES - + - + 242 - + YES - - - - + + + + - + 243 - - + + 244 - - + + 245 - - + + 246 - - + + 262 - + YES - + - + 263 - + YES - - + + - + 336 - - + + 337 - - + + 338 - + YES - + - + 339 - + YES - - + + - + 340 - - + + 341 - - + + 205 - + - + 395 - + CommitsController 469 - - + + 470 - - + + 471 - - + + 499 - + YES - + - + 500 - - + + 510 - + YES - + - + 511 - - + + 520 - + YES - + - + 521 - - + + 561 - + YES - - - + + + - + 562 - + YES - + - + 563 - + YES - + - + 564 - + YES - + - + 569 - + YES - + - + 574 - + YES - - - + + + - + 575 - - + + 576 - - + + 577 - - + + 582 - + YES - + - + 583 - + YES - + - + 584 - - + + 585 - - + + 587 - + - - 592 - - - YES - - - - - - 593 - - - @@ -3103,8 +3059,6 @@ 584.IBPluginDependency 585.IBPluginDependency 587.IBPluginDependency - 592.IBPluginDependency - 593.IBPluginDependency 72.IBPluginDependency 72.ImportedFromIB2 73.IBPluginDependency @@ -3130,97 +3084,97 @@ YES - - - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + {{471, 308}, {862, 474}} @@ -3229,117 +3183,115 @@ {3.40282e+38, 3.40282e+38} {213, 107} - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + - + - com.apple.InterfaceBuilder.CocoaPlugin - - - - + com.apple.InterfaceBuilder.CocoaPlugin + + + + - + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - + - + - + - + - + - + - + - + - + - + - + @@ -3370,7 +3322,7 @@ YES PBGitRepository - NSObject + NSObject YES @@ -3390,13 +3342,13 @@ - IBProjectSource + IBProjectSource PBGitRepository.h PBGitRepository - + YES @@ -3416,13 +3368,13 @@ - IBUserSource - + IBUserSource + GitTest_AppDelegate - + getData: id @@ -3432,13 +3384,13 @@ NSArray - - + + GitTest_AppDelegate - + YES @@ -3448,8 +3400,8 @@ YES - id - + id + @@ -3457,22 +3409,22 @@ YES repository - + YES PBGitRepository - + - + GitTest_AppDelegate.h PBWebGitController - + YES @@ -3498,7 +3450,7 @@ - + PBWebGitController.h @@ -3509,609 +3461,601 @@ 3 YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEDmQALAAwAMQA1ADkAQABD -AEQASQBhAGIAYwBkAGcACwB0AHwAhgCLAKAAqAC2ALoA2QDaAOIA6wDsAPEA9wD4APsBAAETAR8BIAEo -ASkBLAExATQBPAE9AT4BQQFHAVEBUgFXAVwBXQFgAWUBZgFoAWsBcwF5AXoBgQGFAYgBjQGOAZEBlAGV -AZgBpgGnAagBqwG1AbYBugG7AbwBvwHQAdQB2wHfAfMCAwIEAgUCBgIHAggCCQIKAgsCDAINAg4CDwIQ -AhQACwIVAhYCHAIpAioCKwIsAi0BsAIuAi8CMwI2AjkCOgI8Aj0CQwJNAk4CTwJUAlUCWAJfAmACZQJp -AnQCegKFAokCmQKaAqICqgKwArMCuwErArwCwQLkAugC6wLuAvEC9AL3AvoC/QMAAwMDBgMJAwwDDwMS -AxUDGAMbAx4DIQMkAycDKgMtAzADMwM2AzkDPAM/A0IDRQNIA0oDTANRA1IDVANYA1wDXgNgA28AvgEz -A3cDfAN9A4IDgwOLA4wDkAOTA5QDlQOYA5kDngOfA6EDqQOqA7MCFAI5A7QDtQO8A70DwgPGA9oD2wPg -A+ED5QPoA+kCOQPsA+0D7wPwA/MD/AP9BAUEBgQJBBEEEgQZBBoEIwQkAR8ENgQ7BDwETARNBE4EUQRa -BFsEXwRnBGgEaQRqBGsEbgRxBHkEegSIBIkEjAALBI0EjgSPBJAEkwTIBM0E3QTiBOME5ATpBOoE6wTu -BPIE8wT2BPcE+wUBBQQFBQUXBSIFIwUkBSUFJgUnBSgFKQUqBSwFLgUzBTQFNwU8BT0FQgVFBUYFRwVM -BU0FUQVYBVwFXQVeBWMFagVvBXAFcQVyBXYFfQWBBYIFgwWHBY4FkgWTBZQFlQWZBaAFpQWmBacFqwWy -BbMFtAW1BbkFwAXBBcIFwwXHBc4FzwXQBdEF1gXdBd4F3wXkBesF7AXtBfEF+AX5BfoF+wX/BgYGCgYL -BgwGDQYRBhkGHQYeBh8GIAYkBisGLAYtBjIGMwY3Bj4GPwZABkEGRQZNBlEGUgZTBlQGWAZfBmAGYQZl -Bm0GbgZvBnMGegZ/BoAGgQaGBocGiwaSBpMGlAaYBp8GowakBqUGpgaqBrEGsgazBrQGuQa6Br8GxgbH -BsgGyQbNBtQG1QbWBtcG2wbiBuMG5AblBuoG8QbyBvMG9Ab4Bv8HAAcBBwYHDQcOBw8HFAcYBx8HIAch -ByIHJgctBy4HLwczBzoHOwc8Bz0HQQdIB0kHSgdOB1UHVgdXB1gHXQdeB2gHaQdqB2sHbgd1B3YHdwd4 -B38HgAeBB4gHiQeKB5MHlAeVB5YHpgenB6gHqQeqB6sCFQDOB60Hrge2B7cHuAe5B8cHyAfJB8oHywfM -B9YH1wfYB+YBeQfnCF8IaQhuCG8IcAhyCIAIhwiICIkIkAiRCJIImwhvCJwIngiiCKMIpQiwCLcIuAi5 -CMAIwQjKCMsI1QjeCG8I3wjtCPYI/Qj+CP8JCAkRCG8JEgkXCRkJHAkdCSYJLwkwCTkIbwk6CTwJTAlV -CV4JZwhvCWgJaglyCXsIbwl8CYMJigmLCZQIbwmVCZkJnwmmCacJrgmvCbYJtwnACG8JwQnGCc8IbwnQ -CdIJ1wneCd8AZghvCegJ7Qn2CG8J9wn5CgAKCQoKChMIbwoUChgKGQA4ChwKlAsNC4YLhwuIC4kLiguL -C4wLjQuOC48LkAuRC5ILkwuUC5ULlguXC5gLmQuaC5sLnAudC54LnwugC6ELogujC6QLpQumC6cLqAup -C6oLqwusC60LrguvC7ALsQuyC7MLtAu1C7YLtwu4C7kLugu7C7wLvQu+C78LwAvBC8ILwwvEC8ULxgvH -C8gLyQvKC8sLzAvNC84LzwvQC9EL0gvTC9QL1QvWC9cL2AvZC9oL2wvcC90L3gvfC+AL4QviC+ML5Avl -C+YL5wvoC+kL6gvrC+wL7QvuC+8L8AvxC/IL8wv0C/UL9gv3C/gL+wv+DKkNVA1VDVYNVw1YDVkNWg1b -DVwNXQ1eDV8NYA1hDWINYw1kDWUNZg1nDWgNaQ1qDWsNbA1tDW4EgA1vDXANcQ1yDXMNdA11DXYNdw14 -DXkNeg17DXwNfQ1+DX8NgA2BDYINgw2EDYUNhg2HDYgNiQ2KDYsNjA2NDY4Njw2QDZENkg2TDZQNlQ2W -DZcNmA2ZDZoNmw2cDZ0Nng2fDaANoQ2iDaMNpA2lDaYNpw2oDakNqg2rBIUNrA2tDa4Nrw2wDbENsg2z -DbQNtQ22DbcNuA25DboNuw28Db0Nvg2/DcANwQ3CDcMNxARFDcUNxg3HAF0NyA3JDcoNyw3MDc0Nzg3P -DdAN0Q3SDdMN1A3VDdYN1w3YDdkN2g3bDdwN3Q3eDd8N4A3hDeIN4w3kDeUN5g3nDegN6Q3qDesN7A3t -De4N7w3wDfEN8g3zDfQN9Q32DfcN+A37Df4OAVUkbnVsbN8QEgANAA4ADwAQABEAEgATABQAFQAWABcA -GAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMFZOU1Jvb3RWJGNs -YXNzXU5TT2JqZWN0c0tleXNfEA9OU0NsYXNzZXNWYWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlPaWRzVmFs -dWVzXU5TQ29ubmVjdGlvbnNbTlNOYW1lc0tleXNbTlNGcmFtZXdvcmtdTlNDbGFzc2VzS2V5c1pOU09p -ZHNLZXlzXU5TTmFtZXNWYWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlDb25uZWN0b3JzXU5TRm9udE1hbmFn -ZXJfEBBOU1Zpc2libGVXaW5kb3dzXxAPTlNPYmplY3RzVmFsdWVzXxAXTlNBY2Nlc3NpYmlsaXR5T2lk -c0tleXNZTlNOZXh0T2lkXE5TT2lkc1ZhbHVlc4ACgQOYgQIKgQLqgQOXgQEKgQJ1gAaBAumBAuuBAnaB -A5WAAIAHgQJ0gQOWEQJWgQLs0gAOADIAMwA0W05TQ2xhc3NOYW1lgAWAA9IADgA2ADcAOFlOUy5zdHJp -bmeABF1OU0FwcGxpY2F0aW9u0gA6ADsAPAA9WCRjbGFzc2VzWiRjbGFzc25hbWWjAD0APgA/XxAPTlNN -dXRhYmxlU3RyaW5nWE5TU3RyaW5nWE5TT2JqZWN00gA6ADsAQQBCogBCAD9eTlNDdXN0b21PYmplY3Rf -EBBJQkNvY29hRnJhbWV3b3Jr0gAOAEUARgBHWk5TLm9iamVjdHOAYKEASIAI3ABKAA4ASwBMAE0ATgBP -AFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYFxOU1dpbmRvd1ZpZXdcTlNTY3JlZW5SZWN0 -XU5TV2luZG93VGl0bGVZTlNXVEZsYWdzXU5TV2luZG93Q2xhc3NcTlNXaW5kb3dSZWN0WU5TTWF4U2l6 -ZV8QD05TV2luZG93QmFja2luZ18QEU5TV2luZG93U3R5bGVNYXNrWU5TTWluU2l6ZVtOU1ZpZXdDbGFz -c4ANgQEJgQEGgAoScHgAAIALgAmBAQgQAhAPgQEHgAxfEBZ7ezYsIDQ3OX0sIHs4NjIsIDQ3NH19VEdp -dFhYTlNXaW5kb3fSAA4ANgA3AGaABFRWaWV31wBoAA4AaQBqAGsAYwBsAG0AbgBvAHAAcQBtAHNfEA9O -U05leHRSZXNwb25kZXJaTlNTdWJ2aWV3c1hOU3ZGbGFnc1tOU0ZyYW1lU2l6ZVtOU1N1cGVydmlld4AO -gHGADxEBAIEBBIAOgQEF0gAOAEUAdQB2gDulAHcAeAB5AHoAe4AQgOKA54DrgP/YAGgADgB9AGkAagB+ -AGMAbABVAIAAgQCCAIMAXQBtAFVXTlNGcmFtZV5OU0RpdmlkZXJTdHlsZYANgOGA4IAREQESgA6ADdIA -DgBFAHUAiIA7ogCJAIqAEoBN3gBoAIwADgCNAI4AjwBpAJAAagBrAGMAbACRAJIAdwCUAJUAlgCXAJgA -mQCaAIMAmwBtAHcAngCfW05TSFNjcm9sbGVyWE5Tc0ZsYWdzXE5TQ29ybmVyVmlld18QEE5TSGVhZGVy -Q2xpcFZpZXdcTlNTY3JvbGxBbXRzW05TVlNjcm9sbGVyXU5TQ29udGVudFZpZXeAEIBHgEwQMoAcgBmA -E08QEEEgAABBIAAAQZgAAEGYAACAS4AOgBCAQ4AU0gAOAEUAdQCigDulAJ8AngCUAJgAl4AUgEOAR4AZ -gBzaAGgADgB9AKkAaQBqAKoAYwCrAGwAiQCtAK4ArwCwALEAsgBtALQAiVlOU2N2RmxhZ3NZTlNEb2NW -aWV3WU5TQkdDb2xvcoASgEKAQRAEgBURCQCAFoAOgDCAEtIADgBFAHUAuIA7oQCygBbfEBQAaAC7AA4A -vAC9AL4AvwCOAMAAwQDCAGoAawDDAGMAxADFAGwAxgDHAJ8AyQDKAMsAzADNAM4AlwDQAK8A0QBwANIA -zgBtANUAXgCfANcA2F8QH05TRHJhZ2dpbmdTb3VyY2VNYXNrRm9yTm9uTG9jYWxZTlNUdkZsYWdzXE5T -SGVhZGVyVmlld18QEU5TQmFja2dyb3VuZENvbG9yXxASTlNBbGxvd3NUeXBlU2VsZWN0XxAXTlNJbnRl -cmNlbGxTcGFjaW5nV2lkdGhfEBlOU0NvbHVtbkF1dG9yZXNpemluZ1N0eWxlXxAYTlNJbnRlcmNlbGxT -cGFjaW5nSGVpZ2h0WU5TRW5hYmxlZFtOU0dyaWRDb2xvcl8QHE5TRHJhZ2dpbmdTb3VyY2VNYXNrRm9y -TG9jYWxeTlNUYWJsZUNvbHVtbnNbTlNSb3dIZWlnaHSAFBAAgEAT/////9ZAAACAGIA8CYAcI0AIAAAA -AAAAI0AAAAAAAAAAgBcJgA6APYAUgB8jQDEAAAAAAABaezg0NSwgMTM5fdcAaAAOAGoAawBjAGwA2wCY -AN0AcADeAG0AmACyW05TVGFibGVWaWV3gBmAG4AagA6AGYAW2gBoAA4AfQCpAGkAagCqAGMAqwBsAIkA -rQDlAK8A5gCxAMwAbQC0AImAEoBCgEqASYAYgA6AMIASWXs4NDUsIDE3fdIAOgA7AO0A7qQA7gDvAPAA -P18QEU5TVGFibGVIZWFkZXJWaWV3Vk5TVmlld1tOU1Jlc3BvbmRlctYAaAAOAH0AagBjAGwAiQDzAPQA -cABtAImAEoAegB2ADoASXxAUe3s4NDYsIDB9LCB7MTYsIDE3fX3SADoAOwD5APqkAPoA7wDwAD9dX05T -Q29ybmVyVmlld9IADgBFAHUA/YA7ogD+AP+AIIA32gEBAA4BAgEDAQQBBQEGAQcBCADbAM4BCgELAQwB -DQEOAQ8BEADOALJeTlNJc1Jlc2l6ZWFibGVcTlNIZWFkZXJDZWxsV05TV2lkdGhaTlNEYXRhQ2VsbF5O -U1Jlc2l6aW5nTWFza1pOU01pbldpZHRoWk5TTWF4V2lkdGhcTlNJc0VkaXRhYmxlCYA2gCEjQIMAAAAA -AACALRADI0BEAAAAAAAAI0CPQAAAAAAACYAW1wEUAA4AvgEVARYBFwEYARkBGgEbARwBHQDJAR5bTlND -ZWxsRmxhZ3NaTlNDb250ZW50c1lOU1N1cHBvcnRcTlNDZWxsRmxhZ3MyW05TVGV4dENvbG9yEgSB/gCA -LIAmgCKAI4AoV1N1YmplY3TUAA4BIQEiASMBJAElASYBJ1ZOU1NpemVWTlNOYW1lWE5TZkZsYWdzgCUj -QCYAAAAAAACAJBEMHFxMdWNpZGFHcmFuZGXSADoAOwEqASuiASsAP1ZOU0ZvbnTTAA4BLQEuAS8BDgEw -XE5TQ29sb3JTcGFjZVdOU1doaXRlgCdLMC4zMzMzMzI5OQDSADoAOwEyATOiATMAP1dOU0NvbG9y1QAO -ATMBLQE1ATYBLwE4ATkBOgE7W05TQ29sb3JOYW1lXU5TQ2F0YWxvZ05hbWWAJ4ArEAaAKoApVlN5c3Rl -bV8QD2hlYWRlclRleHRDb2xvctMADgEtAS4BLwEOAUCAJ0IwANIAOgA7AUIBQ6UBQwFEAUUBRgA/XxAR -TlNUYWJsZUhlYWRlckNlbGxfEA9OU1RleHRGaWVsZENlbGxcTlNBY3Rpb25DZWxsVk5TQ2VsbNgBFAAO -AL4BFQEWAUgBFwEYAUkBSgC0AUwBTQCyAU8BUF1OU0NvbnRyb2xWaWV3EhQh/kCANYAwgC6AL4AWEQgA -gDNZVGV4dCBDZWxs1AAOASEBIgEjASQBVAEmAVaAJSNAKgAAAAAAAIAkEQQU1QAOATMBLQE1ATYBLwFZ -ATkBWgE7gCeAMoAxgClfEBZjb250cm9sQmFja2dyb3VuZENvbG9y0wAOAS0BLgEvAQ4BX4AnSzAuNjY2 -NjY2NjkA1QAOATMBLQE1ATYBLwE4ATkBYwE7gCeAK4A0gClfEBBjb250cm9sVGV4dENvbG9y0gA6ADsB -ZwFEpAFEAUUBRgA/0gA6ADsBaQFqogFqAD9dTlNUYWJsZUNvbHVtbtoBAQAOAQIBAwEEAQUBBgEHAQgA -2wDOAQoBbgFvAXABDgEPARAAzgCyCYA2gDgjQGzgAAAAAACAOgmAFtcBFAAOAL4BFQEWARcBGAEZARoB -GwF2AR0AyQEegCyAJoA5gCOAKFZBdXRob3LYARQADgC+ARUBFgFIARcBGAFJAUoAtAFMAU0AsgFPAVCA -NYAwgC6AL4AWgDPSADoAOwGCAYOjAYMBhAA/Xk5TTXV0YWJsZUFycmF5V05TQXJyYXnTAA4BLQEuAS8B -DgGHgCdCMQDVAA4BMwEtATUBNgEvAYoBOQGLATuAJ4A/gD6AKVlncmlkQ29sb3LTAA4BLQEuAS8BDgGQ -gCdEMC41ANIAOgA7AZIA26UA2wGTAO8A8AA/WU5TQ29udHJvbF8QFXt7MSwgMTd9LCB7ODQ1LCAxMzl9 -fdIAOgA7AZYBl6QBlwDvAPAAP1pOU0NsaXBWaWV32gBoAZkADgB9AGoAYwGaAGwBmwGcAIkAiQGfAaAA -cABtAaIAiQGkAaVYTlNUYXJnZXRYTlNBY3Rpb25aTlNDdXJWYWx1ZVlOU1BlcmNlbnSAEoASgEaARIAO -gEWAEiNAQoAAAAAAACM/yO0ioAAAAF8QFnt7ODQ2LCAxN30sIHsxNSwgMTM5fX1cX2RvU2Nyb2xsZXI6 -0gA6ADsBqQGqpQGqAZMA7wDwAD9aTlNTY3JvbGxlctoAaAGZAA4AfQCNAGoAYwGaAGwBnACJAIkBnwGv -AbAAcABtAaIAiQG0gBKAEoBGgEgQAYAOgEWAEiM/7/ZRIAAAAF8QFXt7MSwgMTU2fSwgezg0NSwgMTV9 -fdIADgBFAHUBuIA7oQDMgBhfEBN7ezEsIDB9LCB7ODQ1LCAxN319Wns4NjIsIDE3Mn3SADoAOwG9Ab6k -Ab4A7wDwAD9cTlNTY3JvbGxWaWV33QBoAA4BwAC8AH0BKwBpAGoAYwHBAGwBwgHDAHcBxQHGAMkBxwFN -AckBygBtAM4AdwDOAc9eTlNUYWJWaWV3SXRlbXNfEBFOU0RyYXdzQmFja2dyb3VuZF8QFk5TQWxsb3dU -cnVuY2F0ZWRMYWJlbHNfEBVOU1NlbGVjdGVkVGFiVmlld0l0ZW2AEIDfgHOAcoAvgE4QJIAOCYAQCYB0 -0gAOAEUAdQHSgDuhAdOAT9cAaAAOAH0AaQBqAGMAbACKAG4B1wHYAHAAbQCKgE2AcYBwgFCADoBN0gAO -AEUAdQHdgDuhAd6AUd0AaAAOAH0B4AHhAeIAagHjAeQAYwHlAGwB5gHTAegB6QDOAesB7ACDAe0AzgBt -Ae0B0wHyWkFsbG93c1VuZG9bUHJlZmVyZW5jZXNbTlNEcmFnVHlwZXNZR3JvdXBOYW1lXxASVXNlQmFj -a0ZvcndhcmRMaXN0WUZyYW1lTmFtZV1OU05leHRLZXlWaWV3gE+Ab4BhCYBkgFKAYwmADoBjgE+AYtIA -DgBFAEYB9YBgrQH2AfcB+AH5AfoB+wH8Af0B/gH/AgACAQICgFOAVIBVgFaAV4BYgFmAWoBbgFyAXYBe -gF9fEBlOZVhUIFJURkQgcGFzdGVib2FyZCB0eXBlWnB1YmxpYy51cmxfEBJOU1N0cmluZ1Bib2FyZFR5 -cGVfEB5OZVhUIFRJRkYgdjQuMCBwYXN0ZWJvYXJkIHR5cGVfEBlBcHBsZSBVUkwgcGFzdGVib2FyZCB0 -eXBlXxAhQXBwbGUgV2ViIEFyY2hpdmUgcGFzdGVib2FyZCB0eXBlXxAbV2ViVVJMc1dpdGhUaXRsZXNQ -Ym9hcmRUeXBlXxAPcHVibGljLnVybC1uYW1lXxAaQXBwbGUgSFRNTCBwYXN0ZWJvYXJkIHR5cGVfEBVO -U0ZpbGVuYW1lc1Bib2FyZFR5cGVfEBdOU0NvbG9yIHBhc3RlYm9hcmQgdHlwZV8QGkFwcGxlIFBJQ1Qg -cGFzdGVib2FyZCB0eXBlXxAqTmVYVCBSaWNoIFRleHQgRm9ybWF0IHYxLjAgcGFzdGVib2FyZCB0eXBl -0gA6ADsCEQISowISAhMAP1xOU011dGFibGVTZXRVTlNTZXRfEBZ7ey0zLCAtM30sIHs4NDgsIDE5NX19 -UNMADgIXAhgCGQHtAhtaSWRlbnRpZmllclZWYWx1ZXOAboBjgGXTAA4CHQBFAh4CHwIkV05TLmtleXOA -baQCIAIhAiICI4BmgGeAaIBppAIlAiYCJQIogGqAa4BqgGxfEBpXZWJLaXREZWZhdWx0Rml4ZWRGb250 -U2l6ZV8QFVdlYktpdE1pbmltdW1Gb250U2l6ZV8QFVdlYktpdERlZmF1bHRGb250U2l6ZV8QEVdlYktp -dEphdmFFbmFibGVkEAwI0gA6ADsCMAIxowIxAjIAP18QE05TTXV0YWJsZURpY3Rpb25hcnlcTlNEaWN0 -aW9uYXJ50gA6ADsCNAI1ogI1AD9eV2ViUHJlZmVyZW5jZXPSADoAOwI3AjikAjgA7wDwAD9XV2ViVmll -d18QFnt7MTAsIDMzfSwgezg0MiwgMTk1fX3SADoAOwI7AO+jAO8A8AA/XxAWe3swLCAxNzN9LCB7ODYy -LCAyNDF9fdIADgBFAHUCP4A7owHPAkECQoB0gHqA0dYADgJEAO8CRQEzAkYCRwJIAdMAigJLAkxcTlNJ -ZGVudGlmaWVyWU5TVGFiVmlld1dOU0xhYmVsgHmAdYBPgE2Ad4B2UTFXRGV0YWlsc9UADgEzAS0BNQE2 -AS8BWQE5AlIBO4AngDKAeIApXGNvbnRyb2xDb2xvctIAOgA7AlYCV6ICVwA/XU5TVGFiVmlld0l0ZW3W -AA4CRADvAkUBMwJGAkcCWgJbAIoCSwJegHmAe4B8gE2Ad4DQUTLVAGgADgB9AGkAagArAG4CYwJkAHCA -AIBxgM+AfdIADgBFAHUCZ4A7oQJogH7bAGgAjAAOAH0AjQBpAGoAbACRAeYAkgJbAmsAlQJtAm4CbwCD -AlsCcQJyAnKAfIDMgEyAzhASgH+AfIDKgICAgNIADgBFAHUCdoA7owJyAnECa4CAgMqAzNsAaAAOAH0C -ewCpAGkAagCqAKsAbAHmAmgArQJ+An8ArwKAALECgQDNAmgCgVhOU0N1cnNvcoB+gEKAxoDHgIGAgoA8 -gH6AgtIADgBFAHUCh4A7oQKBgILbAGgADgKKAosCjABqAGsAUAKNAGwCjgJyApACkQE5ApICkwKUApUC -lgJyACtfEA9OU1RleHRDb250YWluZXJZTlNUVkZsYWdzXE5TU2hhcmVkRGF0YVhOU01pbml6ZVpOU0Rl -bGVnYXRlgICAxYCEgLcRCRKAg4DDgMSAgIAAWXs4MzEsIDcwfdUCmwAOApwBAwKdAbACngKBAqACoVlO -U1RDRmxhZ3NaTlNUZXh0Vmlld18QD05TTGF5b3V0TWFuYWdlcoC2gIIjQIn4AAAAAACAhdUADgKjAqQC -pQKOAqYCpwKoATkAK18QEE5TVGV4dENvbnRhaW5lcnNdTlNUZXh0U3RvcmFnZVlOU0xNRmxhZ3OAtYC0 -gIaAANQADgKrAD4CjgKsAq0CrgArXE5TQXR0cmlidXRlc4CzgIiAh4AA0gAOADYANwKygARfEQJeTG9y -ZW0gaXBzdW0gZG9sb3Igc2l0IGVyIGVsaXQgbGFtZXQsIGNvbnNlY3RldGF1ciBjaWxsaXVtIGFkaXBp -c2ljaW5nIHBlY3UsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBk -b2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4 -ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29u -c2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUg -dmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVy -IHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2Zm -aWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bSBFdCBoYXJ1bWQgdW5kIGxvb2t1 -bSBsaWtlIEdyZWVrIHRvIG1lLCBkZXJldWQgZmFjaWxpcyBlc3QgZXIgZXhwZWRpdCBkaXN0aW5jdC4g -TmFtIGxpYmVyIHRlIGNvbnNjaWVudCB0byBmYWN0b3IgdHVtIHBvZW4gbGVndW0gb2Rpb3F1ZSBjaXZp -dWRh0wAOAh0ARQK0ArUCuICyogK2AreAiYCKogK5ArqAi4CwXxAQTlNQYXJhZ3JhcGhTdHlsZdMCvQAO -Ar4CvwLAAQ5aTlNUYWJTdG9wc1tOU0FsaWdubWVudICMgK/SAA4ARQLCAsOArq8QIALEAsUCxgLHAsgC -yQLKAssCzALNAs4CzwLQAtEC0gLTAtQC1QLWAtcC2ALZAtoC2wLcAt0C3gLfAuAC4QLiAuOAjYCPgJCA -kYCSgJOAlICVgJaAl4CYgJmAmoCbgJyAnYCegJ+AoIChgKKAo4CkgKWApoCngKiAqYCqgKuArICt0gAO -AuUC5gLnWk5TTG9jYXRpb26AjiMAAAAAAAAAANIAOgA7AukC6qIC6gA/WU5TVGV4dFRhYtIADgLlAuYC -7YCOI0BMAAAAAAAA0gAOAuUC5gLwgI4jQFwAAAAAAADSAA4C5QLmAvOAjiNAZQAAAAAAANIADgLlAuYC -9oCOI0BsAAAAAAAA0gAOAuUC5gL5gI4jQHGAAAAAAADSAA4C5QLmAvyAjiNAdQAAAAAAANIADgLlAuYC -/4COI0B4gAAAAAAA0gAOAuUC5gMCgI4jQHwAAAAAAADSAA4C5QLmAwWAjiNAf4AAAAAAANIADgLlAuYD -CICOI0CBgAAAAAAA0gAOAuUC5gMLgI4jQINAAAAAAADSAA4C5QLmAw6AjiNAhQAAAAAAANIADgLlAuYD -EYCOI0CGwAAAAAAA0gAOAuUC5gMUgI4jQIiAAAAAAADSAA4C5QLmAxeAjiNAikAAAAAAANIADgLlAuYD -GoCOI0CMAAAAAAAA0gAOAuUC5gMdgI4jQI3AAAAAAADSAA4C5QLmAyCAjiNAj4AAAAAAANIADgLlAuYD -I4COI0CQoAAAAAAA0gAOAuUC5gMmgI4jQJGAAAAAAADSAA4C5QLmAymAjiNAkmAAAAAAANIADgLlAuYD -LICOI0CTQAAAAAAA0gAOAuUC5gMvgI4jQJQgAAAAAADSAA4C5QLmAzKAjiNAlQAAAAAAANIADgLlAuYD -NYCOI0CV4AAAAAAA0gAOAuUC5gM4gI4jQJbAAAAAAADSAA4C5QLmAzuAjiNAl6AAAAAAANIADgLlAuYD -PoCOI0CYgAAAAAAA0gAOAuUC5gNBgI4jQJlgAAAAAADSAA4C5QLmA0SAjiNAmkAAAAAAANIADgLlAuYD -R4COI0CbIAAAAAAA0gA6ADsDSQGEogGEAD/SADoAOwNLAruiArsAP9QADgEhASIBIwEkA04DTwNQgCUj -QCQAAAAAAACAsRAQVk1vbmFjb9IAOgA7A1MCMqICMgA/0gA6ADsDVQKkpAKkA1YDVwA/XxAZTlNNdXRh -YmxlQXR0cmlidXRlZFN0cmluZ18QEk5TQXR0cmlidXRlZFN0cmluZ9IADgBFAHUDWoA7oQKRgITSADoA -OwNdAp2iAp0AP9IAOgA7A18CiqICigA/2AAOA2EDYgNjAL4DZANlA2YDZwNoACsBOADNA2wAKwNuV05T -RmxhZ3NfEBdOU0RlZmF1bHRQYXJhZ3JhcGhTdHlsZV8QEE5TSW5zZXJ0aW9uQ29sb3JfEBROU1NlbGVj -dGVkQXR0cmlidXRlc18QEk5TTWFya2VkQXR0cmlidXRlc18QEE5TTGlua0F0dHJpYnV0ZXOAwhEJQYAA -gCuAPIC4gACAv9MADgIdAEUCtANxA3SAsqIDcgNzgLmAuqIDdQN2gLuAvdUADgEzAS0BNQE2AS8BWQE5 -A3oBO4AngDKAvIApXxAbc2VsZWN0ZWRUZXh0QmFja2dyb3VuZENvbG9y1QAOATMBLQE1ATYBLwE4ATkD -gAE7gCeAK4C+gClfEBFzZWxlY3RlZFRleHRDb2xvctMADgIdAEUCtAOFA4iAsqIDcwOHgLqAwKIDiQIm -gMGAa1tOU1VuZGVybGluZdMADgEtA40BLwGwA49VTlNSR0KAJ0YwIDAgMQDSADoAOwORA5KiA5IAP18Q -FE5TVGV4dFZpZXdTaGFyZWREYXRhXHs4NTEsIDFlKzA3fVh7MjIzLCAwfdIAOgA7A5YCnKUCnAOXAO8A -8AA/Vk5TVGV4dF8QFHt7MSwgMX0sIHs4MzEsIDE5M3190wAOA5oDmwOcA50BsFlOU0hvdFNwb3RcTlND -dXJzb3JUeXBlgMmAyFd7NCwgLTV90gA6ADsDoAJ7ogJ7AD/YAGgBmQAOAH0AagGaAGwBnAJoAmgBnwOl -AHABogJoA6iAfoB+gEaAy4BFgH4jP+nyKYAAAABfEBV7ezgzMiwgMX0sIHsxNSwgMTkzfX3aAGgBmQAO -AH0AjQBqAZoAbAGbAZwCaAJoAZ8DrgGwAHABogJoA7EDsoB+gH6ARoDNgEWAfiM/8AAAAAAAACM/7kLI -YAAAAF8QGHt7LTEwMCwgLTEwMH0sIHs4NywgMTh9fVNSYXfWAA4CRADvAkUBMwJGAkcDtwO4AIoCSwO7 -gHmA0oDTgE2Ad4DeVkl0ZW0gMtUAaAAOAH0AaQBqACsAbgPAA8EAcIAAgHGA3YDU0gAOAEUAdQPEgDuh -A8WA1d4AaAAOAH0DxwPIA8kDygC/AGoAwwPLA8wAbAPNA7gDzwPQA9ED0gPTA9QAzgPWAM4D2AE5A7gB -sF8QD05TUGF0aFNlcGFyYXRvcllOU0JyRmxhZ3NfEBVOU1ByZWZlcmVkQ29sdW1uV2lkdGhfEA9OU0Nl -bGxQcm90b3R5cGVfEBBOU01pbkNvbHVtbldpZHRoXxAYTlNOdW1iZXJPZlZpc2libGVDb2x1bW5zXxAU -TlNDb2x1bW5SZXNpemluZ1R5cGWA04DcgNaA2xIcAUAAI0BZAAAAAAAAgNcJEQEMCRBkgNNfEBZ7ezE3 -LCAxN30sIHs4MDgsIDE5NX191QEUAA4BFQEWARcD3APdA94D3wFPEgQB/kCA2oDYgNlRINQADgEhASIB -IwEkA+MBJgNQgCUjQCgAAAAAAACAJNIAOgA7A+YD56MD5wFGAD9dTlNCcm93c2VyQ2VsbFEv0gA6ADsD -6gPrpQPrAZMA7wDwAD9ZTlNCcm93c2VyVFRyZWXSADoAOwPuAkWkAkUA7wDwAD9fEBV7ezAsIDI1fSwg -ezg2MiwgNDE0fX3SADoAOwPxA/KkA/IA7wDwAD9bTlNTcGxpdFZpZXfYAGgADgB9AUYAagDDAGMAbABV -A/UD9gP3A/gAzgBtAFWADYDmgOOA5BEBJAmADoANXxATe3szLCAwfSwgezMwNSwgMTd9fdgBFAAOAL4B -FQEWAUgBFwEYA9wBSgJLBAABTQB4BAMBUIA1gHeA5YAvgOISEEAEAIAzVUxhYmVs0gA6ADsEBwQIpQQI -AZMA7wDwAD9bTlNUZXh0RmllbGTYAGgADgB9AUYAagDDAGMAbABVA/UEDAQNA9YAzgBtAFWADYDmgOiA -6QmADoANXxAVe3szLCA0NDd9LCB7MTU5LCAxN3192AEUAA4AvgEVARYBSAEXARgD3AFKAksEFQFNAHkE -AwFQgDWAd4DqgC+A54AzXxAXU2hvd2luZyBicmFuY2ggJ21hc3RlcifYAGgADgB9AUYAagDDAGMAbABV -BBwEHQQeBB8AzgBtAFWADYD+gOyA7REBCQmADoANXxAXe3s2NTksIDQ0N30sIHsxODMsIDIyfX3dARQA -DgQlAL4BFgFIARcEJgHBBCcEKAQpARgEKgQrBCwELQFNAHoEMAGwAM4EMgQzBDQBUF8QEk5TQ2FuY2Vs -QnV0dG9uQ2VsbF8QEE5TVGV4dEJlemVsU3R5bGVfEBJOU1NlYXJjaEJ1dHRvbkNlbGxfEBBOU01heGlt -dW1SZWNlbnRzXxATTlNQbGFjZWhvbGRlclN0cmluZxIUcf5AgP2A9YDvgC+A6xIQAAQACYDxEP+A7oAz -1QAOATMBLQE1ATYBLwDNATkEOQE7gCeAPIDwgClfEBN0ZXh0QmFja2dyb3VuZENvbG9y3AGZARQADgQ9 -BD4EPwEVAUgEQAEXAZoEQQQeBEMERARFAMkB7QRHAHoESQDJBEoES18QEk5TUGVyaW9kaWNJbnRlcnZh -bF5OU0J1dHRvbkZsYWdzMl8QD05TS2V5RXF1aXZhbGVudF8QD05TUGVyaW9kaWNEZWxheV1OU0J1dHRv -bkZsYWdzgO0SAAH+AID0EEuAY4DygOsRAZCA8xIIRED/VnNlYXJjaF8QE19zZWFyY2hGaWVsZFNlYXJj -aDrSADoAOwRPBFCkBFABRQFGAD9cTlNCdXR0b25DZWxs3QGZARQADgQ9BD4EPwRSARUBSARAARcBmgRB -BB4EQwREBEUAyQHtBFYEVwB6BEkAyQRZBEtfECNOU0FjY2Vzc2liaWxpdHlPdmVycmlkZGVuQXR0cmli -dXRlc4DtgPSAY4D3gPaA64D8VWNsZWFy0gAOAEUAdQRdgDuhBF6A+NMADgIdAEUCHgRhBGSAbaIEYgRj -gPmA+qIEZQImgPuAa11BWERlc2NyaXB0aW9uXxApTlNBY2Nlc3NpYmlsaXR5RW5jb2RlZEF0dHJpYnV0 -ZXNWYWx1ZVR5cGVWY2FuY2VsXxATX3NlYXJjaEZpZWxkQ2FuY2VsOtIAOgA7BGwEbaUEbQFEAUUBRgA/ -XxARTlNTZWFyY2hGaWVsZENlbGzSADoAOwRvBHCmBHAECAGTAO8A8AA/XU5TU2VhcmNoRmllbGTYAGgA -DgB9AUYAagDDAGMAbABVBHMEdAR1A9YAzgBtAFWADYEBA4EBAIEBAQmADoANXxAWe3syNjYsIDQzNn0s -IHs5NiwgMzJ9fdwBFAAOBHsEPQQ+BD8BFQEWAUgEQAEXBEEEfAREAe0EfwSAAe0EggFNAHsEhQSGBIdf -EBNOU0FsdGVybmF0ZUNvbnRlbnRzEgQB/gCA9IBjEBkQgYBjgQECgC+A/xDIEggAAAAT/////4aCQP9W -QnV0dG9u0gA6ADsEigSLpQSLAZMA7wDwAD9YTlNCdXR0b25aezg2MiwgNDc0fV8QFnt7MCwgMH0sIHsx -NjgwLCAxMDI4fX1aezIxMywgMTI5fV8QGnszLjQwMjgyZSszOCwgMy40MDI4MmUrMzh90gA6ADsEkQSS -ogSSAD9fEBBOU1dpbmRvd1RlbXBsYXRl0gAOAEUAdQSVgDuvEDIElgSXBJgEmQSaBJsEnASdBJ4EnwSg -BKEEogSjBKQEpQSmBKcEqASpBKoEqwSsBK0ErgSvBLAEsQSyBLMEtAS1BLYEtwS4BLkEugS7BLwEvQS+ -BL8EwATBBMIEwwTEBMUExgTHgQELgQEZgQErgQEtgQExgQEzgQE4gQE+gQFDgQFJgQFOgQFTgQFYgQFd -gQFhgQFlgQFqgQFwgQF2gQF6gQF8gQGBgQGHgQGLgQGPgQGUgQGWgQGagQGggQGlgQGngQGsgQGxgQG2 -gQG7gQG/gQHDgQHEgQHJgQHNgQHSgQHWgQHbgQHdgQHigQHmgQHpgQHsgQH6gQIE0wAOBMkCRgTKBMsE -zFhOU1NvdXJjZYEBGIEBDIEBF9gADgTOBM8E0ATRBNIE0wTUBNUE1gTXBNgE2QTaBNsE3FdOU1RpdGxl -XxARTlNLZXlFcXVpdk1vZE1hc2taTlNLZXlFcXVpdl1OU01uZW1vbmljTG9jWU5TT25JbWFnZVxOU01p -eGVkSW1hZ2VWTlNNZW51gQEWgQEOEgAQAACBAQ8Sf////4EBEIEBFIEBDdMADgTOBN4E3wTgBOFbTlNN -ZW51SXRlbXOBAh2BAg+BAhBmAFAAcgBpAG4AdCAmUXDTAA4AMgTlBOYE5wToXk5TUmVzb3VyY2VOYW1l -gQETgQERgQESV05TSW1hZ2VfEA9OU01lbnVDaGVja21hcmvSADoAOwTsBO2iBO0AP18QEE5TQ3VzdG9t -UmVzb3VyY2XTAA4AMgTlBOYE5wTxgQETgQERgQEVXxAQTlNNZW51TWl4ZWRTdGF0ZdIAOgA7BPQE9aIE -9QA/Wk5TTWVudUl0ZW1WcHJpbnQ60gA6ADsE+AT5owT5BPoAP18QFU5TTmliQ29udHJvbENvbm5lY3Rv -cl5OU05pYkNvbm5lY3RvctQADgT8BMkCRgT9BP4E/wUAXU5TRGVzdGluYXRpb26BASqBARyBARqBASnS -AA4AMgAzBQOABYEBG18QElBCV2ViR2l0Q29udHJvbGxlctkFBgAOBQcFCAUJBQoFCwUMBQ0AzgUPAM4F -EQDOBRMAzgDOAM5fEBpOU0ZpbHRlclJlc3RyaWN0c0luc2VydGlvbl8QFE5TUHJlc2VydmVzU2VsZWN0 -aW9uXxAPX05TTWFuYWdlZFByb3h5Wk5TRWRpdGFibGVeTlNEZWNsYXJlZEtleXNfECJOU0NsZWFyc0Zp -bHRlclByZWRpY2F0ZU9uSW5zZXJ0aW9uXxAYTlNTZWxlY3RzSW5zZXJ0ZWRPYmplY3RzXxAWTlNBdm9p -ZHNFbXB0eVNlbGVjdGlvbgmBASgJgQEmCYEBHQkJCdIADgBFAHUFGYA7qAUaBRsFHAUdBR4FHwUgBSGB -AR6BAR+BASCBASGBASKBASOBASSBASVTYXJyVHNlbGZTc2hhV2RldGFpbHNXc3ViamVjdFZAY291bnRb -c2VsZi5AY291bnRWYXV0aG9y0QAOBSuBASfSADoAOwUtBQiiBQgAP9IAOgA7BS8FMKQFMAUxBTIAP18Q -EU5TQXJyYXlDb250cm9sbGVyXxASTlNPYmplY3RDb250cm9sbGVyXE5TQ29udHJvbGxlcl8QEWNvbW1p -dHNDb250cm9sbGVy0gA6ADsFNQU2owU2BPoAP18QFE5TTmliT3V0bGV0Q29ubmVjdG9y1AAOBPwEyQJG -BP0B3gT/BTuBASqAUYEBGoEBLFR2aWV31AAOBPwEyQJGBP0FPwT/BUGBASqBAS6BARqBATDSAA4AMgAz -BUSABYEBL18QE0dpdFRlc3RfQXBwRGVsZWdhdGVaY29udHJvbGxlctQADgT8BMkCRgT9BT8AHwVLgQEq -gQEugAKBATJYZGVsZWdhdGXTAA4EyQJGBMoFTwVQgQEYgQE0gQE32AAOBM4EzwTQBNEE0gTTBNQE1QVT -BNcB7QTZBNoE2wVXgQEWgQE2gGOBARCBARSBATXTAA4EzgTeBN8FWgVbgQIdgQI9gQI+VkRlbGV0ZVdk -ZWxldGU61AAOBPwEyQJGBMoAHwVhBWKBARiAAoEBOYEBPdgADgTOBM8E0ATRBNIE0wTUBNUFZQTXBWYE -2QTaBNsFaYEBFoEBO4EBPIEBEIEBFIEBOtQADgTOASIE3gTfBWwFbQVugQIdgQIogQI5gQIqXEhpZGUg -R2l0VGVzdFFoVWhpZGU60wAOBMkCRgTKBXQFdYEBGIEBP4EBQtcADgTOBNAE0QTSBNME1ATVBXgB7QTZ -BNoE2wV8gQEWgQFBgGOBARCBARSBAUDTAA4EzgTeBN8FfwWAgQIdgQJYgQJaXVN0b3AgU3BlYWtpbmdd -c3RvcFNwZWFraW5nOtMADgTJAkYEygWFBYaBARiBAUSBAUjYAA4EzgTPBNAE0QTSBNME1ATVBYkE1wWK -BNkE2gTbBY2BARaBAUaBAUeBARCBARSBAUXTAA4EzgTeBN8FkAWRgQIdgQJugQJwXEdpdFRlc3QgSGVs -cFE/WXNob3dIZWxwOtMADgTJAkYEygWXBZiBARiBAUqBAU3YAA4EzgTPBNAE0QTSBNME1ATVBZsE1wHt -BNkE2gTbBZ+BARaBAUyAY4EBEIEBFIEBS9QADgTOASIE3gTfBaIFowWkgQIdgQJpgQJsgQJqVFpvb21c -cGVyZm9ybVpvb2060wAOBMkCRgTKBakFqoEBGIEBT4EBUtgADgTOBM8E0ATRBNIE0wTUBNUFrQTXBa4E -2QTaBNsE3IEBFoEBUIEBUYEBEIEBFIEBDVVDbG9zZVF3XXBlcmZvcm1DbG9zZTrTAA4EyQJGBMoFtwW4 -gQEYgQFUgQFX2AAOBM4EzwTQBNEE0gTTBNQE1QW7BNcFvATZBNoE2wVXgQEWgQFVgQFWgQEQgQEUgQE1 -VENvcHlRY1Vjb3B5OtMADgTJAkYEygXFBcaBARiBAVmBAVzYAA4EzgTPBNAE0QTSBNME1ATVBckE1wXK -BNkE2gTbBVeBARaBAVqBAVuBARCBARSBATVUVW5kb1F6VXVuZG861AAOBPwEyQJGBMoAHwXUBdWBARiA -AoEBXoEBYNcADgTOBNAE0QTSBNME1ATVBdgB7QTZBNoE2wVpgQEWgQFfgGOBARCBARSBATpdQWJvdXQg -R2l0VGVzdF8QHW9yZGVyRnJvbnRTdGFuZGFyZEFib3V0UGFuZWw61AAOBPwEyQJGBMoAHwXiBeOBARiA -AoEBYoEBZNgADgTOBM8E0ATRBNIE0wTUBNUF5gTXAe0E2QTaBNsFaYEBFoEBY4BjgQEQgQEUgQE6WFNo -b3cgQWxsXxAWdW5oaWRlQWxsQXBwbGljYXRpb25zOtMADgTJAkYEygXvBfCBARiBAWaBAWnYAA4EzgTP -BNAE0QTSBNME1ATVBfME1wX0BNkE2gTbBZ+BARaBAWeBAWiBARCBARSBAUtYTWluaW1pemVRbV8QE3Bl -cmZvcm1NaW5pYXR1cml6ZTrTAA4EyQJGBMoF/QX+gQEYgQFrgQFv2AAOBM4EzwTQBNEE0gTTBNQE1QYB -BNcGAgTZBNoE2wYFgQEWgQFtgQFugQEQgQEUgQFs0wAOBM4E3gTfBggGCYECHYECR4ECSV5DaGVjayBT -cGVsbGluZ1E7XmNoZWNrU3BlbGxpbmc60wAOBMkCRgTKBg8GEIEBGIEBcYEBddkADgTOBM8E0ATRBNIE -0wTUBhIE1QYUBNcGFQTZBNoE2wYYAQ5VTlNUYWeBARaBAXOBAXSBARCBARSBAXLTAA4EzgTeBN8GGwYc -gQIdgQJEgQJFXUZpbmQgUHJldmlvdXNRR18QF3BlcmZvcm1GaW5kUGFuZWxBY3Rpb2460wAOBMkCRgTK -BiIGEIEBGIEBd4EBddkADgTOBM8E0ATRBNIE0wTUBhIE1QYmBNcGJwTZBNoE2wYYAbCBARaBAXiBAXmB -ARCBARSBAXJlAEYAaQBuAGQgJlFm1AAOBPwEyQJGBP0ASAU/BjGBASqACIEBLoEBe1Z3aW5kb3fTAA4E -yQJGBMoGNQY2gQEYgQF9gQGA2AAOBM4EzwTQBNEE0gTTBNQE1QY5BNcGOgTZBNoE2wYYgQEWgQF+gQF/ -gQEQgQEUgQFyXxARSnVtcCB0byBTZWxlY3Rpb25Ral8QHWNlbnRlclNlbGVjdGlvbkluVmlzaWJsZUFy -ZWE60wAOBMkCRgTKBkMGRIEBGIEBgoEBhtgADgTOBM8E0ATRBNIE0wTUBNUGRwZIBkkE2QTaBNsGTIEB -FoEBhBIAGAAAgQGFgQEQgQEUgQGD0wAOBM4E3gTfBk8GUIECHYECY4ECZVxTaG93IFRvb2xiYXJRdF8Q -E3RvZ2dsZVRvb2xiYXJTaG93bjrTAA4EyQJGBMoGVgZXgQEYgQGIgQGK2AAOBM4EzwTQBNEE0gTTBNQE -1QZaBNcB7QTZBNoE2wZMgQEWgQGJgGOBARCBARSBAYNvEBIAQwB1AHMAdABvAG0AaQB6AGUAIABUAG8A -bwBsAGIAYQByICZfEB9ydW5Ub29sYmFyQ3VzdG9taXphdGlvblBhbGV0dGU60wAOBMkCRgTKBmMGEIEB -GIEBjIEBddkADgTOBM8E0ATRBNIE0wTUBhIE1QZnBNcGaATZBNoE2wYYBmyBARaBAY2BAY6BARCBARSB -AXIQB18QFlVzZSBTZWxlY3Rpb24gZm9yIEZpbmRRZdMADgTJAkYEygZxBnKBARiBAZCBAZPYAA4EzgTP -BNAE0QTSBNME1ATVBnUE1wHtBNkE2gTbBnmBARaBAZKAY4EBEIEBFIEBkdQADgTOASIE3gTfBnwGfQZ+ -gQIdgQIagQIcgQIbWkNsZWFyIE1lbnVfEBVjbGVhclJlY2VudERvY3VtZW50czrUAA4E/ATJAkYEygT/ -AHsGhYEBGIEBGoD/gQGVV2RvZUhldDrTAA4EyQJGBMoGiQaKgQEYgQGXgQGZ1wAOBM4E0ATRBNIE0wTU -BNUGjQHtBNkE2gTbBXyBARaBAZiAY4EBEIEBFIEBQF5TdGFydCBTcGVha2luZ15zdGFydFNwZWFraW5n -OtMADgTJAkYEygaWBpeBARiBAZuBAZ/YAA4EzgTPBNAE0QTSBNME1ATVBpoE1wabBNkE2gTbBp6BARaB -AZ2BAZ6BARCBARSBAZzTAA4EzgTeBN8GoQaigQIdgQJegQJfW1Nob3cgQ29sb3JzUUNfEBVvcmRlckZy -b250Q29sb3JQYW5lbDrTAA4EyQJGBMoGqAapgQEYgQGhgQGk2AAOBM4EzwTQBNEE0gTTBNQE1QasBNcG -rQTZBNoE2wVXgQEWgQGigQGjgQEQgQEUgQE1U0N1dFF4VGN1dDrUAA4E/ATJAkYE/QT/Ad4GuIEBKoEB -GoBRgQGmXxARZnJhbWVMb2FkRGVsZWdhdGXUAA4E/ATJAkYEygAfBr0GvoEBGIACgQGogQGr2AAOBM4E -zwTQBNEE0gTTBNQE1QbBBNcGwgTZBNoE2wVpgQEWgQGpgQGqgQEQgQEUgQE6XFF1aXQgR2l0VGVzdFFx -WnRlcm1pbmF0ZTrTAA4EyQJGBMoGywbMgQEYgQGtgQGw2AAOBM4EzwTQBNEE0gTTBNQE1QbPBNcG0ATZ -BNoE2wVXgQEWgQGugQGvgQEQgQEUgQE1VFJlZG9RWlVyZWRvOtMADgTJAkYEygbZBtqBARiBAbKBAbXY -AA4EzgTPBNAE0QTSBNME1ATVBt0E1wbeBNkE2gTbBgWBARaBAbOBAbSBARCBARSBAWxuAFMAaABvAHcA -IABTAHAAZQBsAGwAaQBuAGcgJlE6XxAPc2hvd0d1ZXNzUGFuZWw61AAOBPwEyQJGBMoFPwboBumBARiB -AS6BAbeBAbrYAA4EzgTPBNAE0QTSBNME1ATVBuwE1wbtBNkE2gTbBNyBARaBAbiBAbmBARCBARSBAQ1U -U2F2ZVFzW3NhdmVBY3Rpb2460wAOBMkCRgTKBvYG94EBGIEBvIEBvtgADgTOBM8E0ATRBNIE0wTUBNUG -+gTXAe0E2QTaBNsGBYEBFoEBvYBjgQEQgQEUgQFsXxAbQ2hlY2sgU3BlbGxpbmcgV2hpbGUgVHlwaW5n -XxAedG9nZ2xlQ29udGludW91c1NwZWxsQ2hlY2tpbmc61AAOBPwEyQJGBMoAHwcEBwWBARiAAoEBwIEB -wtgADgTOBM8E0ATRBNIE0wTUBNUHCAZIBWYE2QTaBNsFaYEBFoEBwYEBPIEBEIEBFIEBOltIaWRlIE90 -aGVyc18QFmhpZGVPdGhlckFwcGxpY2F0aW9uczrUAA4E/ATJAkYE/QU/AEgFS4EBKoEBLoAIgQEy0wAO -BMkCRgTKBxYHF4EBGIEBxYEByNgADgTOBM8E0ATRBNIE0wTUBNUHGgTXBxsE2QTaBNsE3IEBFoEBxoEB -x4EBEIEBFIEBDWsAUABhAGcAZQAgAFMAZQB0AHUAcCAmUVBecnVuUGFnZUxheW91dDrTAA4EyQJGBMoH -JAclgQEYgQHKgQHM2AAOBM4EzwTQBNEE0gTTBNQE1QcoBNcB7QTZBNoE2wWfgQEWgQHLgGOBARCBARSB -AUtfEBJCcmluZyBBbGwgdG8gRnJvbnRfEA9hcnJhbmdlSW5Gcm9udDrTAA4EyQJGBMoHMQcygQEYgQHO -gQHR2AAOBM4EzwTQBNEE0gTTBNQE1Qc1BNcHNgTZBNoE2wVXgQEWgQHPgQHQgQEQgQEUgQE1VVBhc3Rl -UXZWcGFzdGU60wAOBMkCRgTKBz8GEIEBGIEB04EBddkADgTOBM8E0ATRBNIE0wTUBhIE1QdDBNcHRATZ -BNoE2wYYAF2BARaBAdSBAdWBARCBARSBAXJZRmluZCBOZXh0UWfTAA4EyQJGBMoHTAdNgQEYgQHXgQHa -2AAOBM4EzwTQBNEE0gTTBNQE1QdQBNcHUQTZBNoE2wVXgQEWgQHYgQHZgQEQgQEUgQE1WlNlbGVjdCBB -bGxRYVpzZWxlY3RBbGw61AAOBPwEyQJGBP0FPwT+B1yBASqBAS6BARyBAdxXY29udGVudNcADgT8B18H -YATJAkYHYQdiBT8HZAdlBP4HZwBdWU5TS2V5UGF0aFlOU0JpbmRpbmdfEBxOU05pYkJpbmRpbmdDb25u -ZWN0b3JWZXJzaW9ugQHhgQEugQHggQHfgQEcgQHeXxAgY29udGVudEFycmF5OiByZXBvc2l0b3J5LmNv -bW1pdHNcY29udGVudEFycmF5XxAScmVwb3NpdG9yeS5jb21taXRz0gA6ADsHbAdtowdtBPoAP18QFU5T -TmliQmluZGluZ0Nvbm5lY3RvctcADgT8B18HYATJAkYHYQdiBP4HcQdyAP8HdABdgQHhgQEcgQHlgQHk -gDeBAeNfEB12YWx1ZTogYXJyYW5nZWRPYmplY3RzLmF1dGhvclV2YWx1ZV8QFmFycmFuZ2VkT2JqZWN0 -cy5hdXRob3LXAA4E/AdfB2AEyQJGB2EHYgT+B3sHcgD+B34AXYEB4YEBHIEB6IEB5IAggQHnXxAedmFs -dWU6IGFycmFuZ2VkT2JqZWN0cy5zdWJqZWN0XxAXYXJyYW5nZWRPYmplY3RzLnN1YmplY3TXAA4E/Adf -B2AEyQJGB2EHYgT+B4QHcgKBB4cAXYEB4YEBHIEB64EB5ICCgQHqXxAYdmFsdWU6IHNlbGVjdGlvbi5k -ZXRhaWxzXxARc2VsZWN0aW9uLmRldGFpbHPYAA4E/AdfB2AEyQJGB4sHYQdiBP4HjgePAHgHkQeSAF1Z -TlNPcHRpb25zgQHhgQEcgQHvgQHugOKBAe2BAfBfECxkaXNwbGF5UGF0dGVyblZhbHVlMTogYXJyYW5n -ZWRPYmplY3RzLkBjb3VudF8QFGRpc3BsYXlQYXR0ZXJuVmFsdWUxXxAWYXJyYW5nZWRPYmplY3RzLkBj -b3VudNMADgIdAEUCtAeYB5+AsqYHmQeaB5sHnAedB56BAfGBAfKBAfOBAfSBAfWBAfamB6AHoQeiB6AH -oAeggQH3gQH4gQH5gQH3gQH3gQH3XxARTlNOdWxsUGxhY2Vob2xkZXJfEBxOU1JhaXNlc0Zvck5vdEFw -cGxpY2FibGVLZXlzXxAQTlNEaXNwbGF5UGF0dGVybl8QGk5TTm90QXBwbGljYWJsZVBsYWNlaG9sZGVy -XxAYTlNOb1NlbGVjdGlvblBsYWNlaG9sZGVyXxAbTlNNdWx0aXBsZVZhbHVlc1BsYWNlaG9sZGVyCV8Q -GSV7dmFsdWUxfUAgY29tbWl0cyBsb2FkZWTYAA4E/AdfB2AEyQJGB4sHYQdiBP4HsQeyAHoHtAe1AF2B -AeGBARyBAf2BAfyA64EB+4EB/l8QGnByZWRpY2F0ZTogZmlsdGVyUHJlZGljYXRlWXByZWRpY2F0ZV8Q -D2ZpbHRlclByZWRpY2F0ZdMADgIdAEUCtAe7B8GAsqUHmge9B74HvwfAgQHygQH/gQIAgQIBgQICpQeh -AigHxAIoBDSBAfiAbIECA4BsgO5fEBZOU1ZhbGlkYXRlc0ltbWVkaWF0ZWx5XxARTlNQcmVkaWNhdGVG -b3JtYXRfECZOU0Fsd2F5c1ByZXNlbnRzQXBwbGljYXRpb25Nb2RhbEFsZXJ0c11OU0Rpc3BsYXlOYW1l -XxAac3ViamVjdCBjb250YWluc1tjXSAkdmFsdWXZAA4E/AdfB2AHzQTJAkYHiwdhB2IE/gexB9EExgB6 -B9QH1QBdXxATTlNQcmV2aW91c0Nvbm5lY3RvcoEB4YEBHIEB/YECBoEB+oDrgQIFgQIHXxAbcHJlZGlj -YXRlMjogZmlsdGVyUHJlZGljYXRlWnByZWRpY2F0ZTLTAA4CHQBFArQH2gfggLKlB5oHvQe+B78HwIEB -8oEB/4ECAIECAYECAqUHoQIoB+MCKAflgQH4gGyBAgiAbIECCV8QFmF1dGhvciBjb250YWlucyAkdmFs -dWXSAA4ARQLCB+mArq8QdQfqAmgAdwftB+4H7wfwBkMFxQYiAP8CWwQeB/cGeQVXBZ8G9gf8BYUAigBI -CAAF7wgCCAMIBAgFBlYIBwD+BZcE3AcxBpYB0wgOBf0HFgWNBhgAsgQNAJQDuAKBA8UHBAaeAHkFfAEN -AXAFYQY1CCEIIgXiBWkIJQZxAkIHTAbLBokGYwTLCC0ILgVPCDAAzAR1AJ4D9wg1CDYINwYFCDkIOgg7 -CDwFdAboAmsIQABVAIkGvQaoAd4IRgJBCEgFtwB4BkwFPwHPBP4ITwYPCFEHPwbZBdQIVQhWAHsFqQT/ -AnEHJAB6CF0IXoECC4B+gBCBAgyBAm2BAmuBAjOBAYKBAVmBAXeAN4B8gO2BAieBAZGBATWBAUuBAbyB -AjqBAUSATYAIgQIsgQFmgQJggQJigQI3gQJVgQGIgQI/gCCBAUqBAQ2BAc6BAZuAT4ECIoEBa4EBxYEB -RYEBcoAWgOmAR4DTgIKA1YEBwIEBnIDngQFAgC2AOoEBOYEBfYECTIECU4EBYoEBOoECF4EBkIDRgQHX -gQGtgQGXgQGMgQEMgQJKgQJXgQE0gQJGgBiBAQGAQ4DkgQIkgQIegQIRgQFsgQJRgQJPgQIvgQJBgQE/ -gQG3gMyBAjiADYASgQGogQGhgFGBAjCAeoECFIEBVIDigQGDgQEugHSBARyBAnKBAXGBAkCBAdOBAbKB -AV6BAluBAiuA/4EBT4EBGoDKgQHKgOuBAh+BAmbaAA4IYATOBM8E0ATRBNIE0wTUAZoE1QTcCGME1wHt -BNkE2gTbB+0IaFlOU1N1Ym1lbnWBARaBAQ2BAg2AY4EBEIEBFIECDIECDtQADgTOASIE3gTfCGsIbAht -gQIdgQIlgQJxgQImVEZpbGVec3VibWVudUFjdGlvbjrSAA4ANgA3CG6ABNIADgBFAHUIdIA7qwg3CEgI -JQg2BakG6AhdCA4INQcWBMuBAhGBAhSBAheBAh6BAU+BAbeBAh+BAiKBAiSBAcWBAQzYAA4EzgTPBNAE -0QTSBNME1ATVCIIE1wiDBNkE2gTbBNyBARaBAhKBAhOBARCBARSBAQ1TTmV3UW7YAA4EzgTPBNAE0QTS -BNME1ATVCIsE1wiMBNkE2gTbBNyBARaBAhWBAhaBARCBARSBAQ1XT3Blbi4uLlFv2gAOCGAEzgTPBNAE -0QTSBNME1AGaBNUGeQiVBNcB7QTZBNoE2wTcCJqBARaBAZGBAhiAY4EBEIEBFIEBDYECGVtPcGVuIFJl -Y2VudNIADgA2ADcIm4AE0gAOAEUAdQiggDuhBnGBAZBfEBZfTlNSZWNlbnREb2N1bWVudHNNZW510gA6 -ADsIpATUogTUAD/aAA4EzgTPCKYE0AinBNEE0gTTBNQE1QHtBNcAzgHtAM4E2QTaBNsE3F1OU0lzU2Vw -YXJhdG9yXE5TSXNEaXNhYmxlZIEBFoBjCYBjCYEBEIEBFIEBDdgADgTOBM8E0ATRBNIE0wTUBNUIsgTX -CLME2QTaBNsE3IEBFoECIIECIYEBEIEBFIEBDWgAUwBhAHYAZQAgAEEAcyAmUVPXAA4EzgTQBNEE0gTT -BNQE1Qi7Ae0E2QTaBNsE3IEBFoECI4BjgQEQgQEUgQENXxAPUmV2ZXJ0IHRvIFNhdmVk2gAOBM4Ezwim -BNAIpwTRBNIE0wTUBNUB7QTXAM4B7QDOBNkE2gTbBNyBARaAYwmAYwmBARCBARSBAQ1YTWFpbk1lbnXS -AA4ARQB1CM2AO6cH9wfqB/wIVQgDCF4H7oECJ4ECC4ECOoECW4ECYoECZoECbdoADghgBM4EzwTQBNEE -0gTTBNQBmgTVBWkFbATXAe0E2QTaBNsH7QjdgQEWgQE6gQIogGOBARCBARSBAgyBAilXR2l0VGVzdNIA -DgBFAHUI4YA7qwXUCFYIAAg7CEYIBAVhBwQF4ghABr2BAV6BAiuBAiyBAi+BAjCBAjeBATmBAcCBAWKB -AjiBAajaAA4EzgTPCKYE0AinBNEE0gTTBNQE1QHtBNcAzgHtAM4E2QTaBNsFaYEBFoBjCYBjCYEBEIEB -FIEBOtgADgTOBM8E0ATRBNIE0wTUBNUI+ATXCPkE2QTaBNsFaYEBFoECLYECLoEBEIEBFIEBOmwAUABy -AGUAZgBlAHIAZQBuAGMAZQBzICZRLNoADgTOBM8IpgTQCKcE0QTSBNME1ATVAe0E1wDOAe0AzgTZBNoE -2wVpgQEWgGMJgGMJgQEQgQEUgQE62gAOCGAEzgTPBNAE0QTSBNME1AGaBNUH8AkLBNcB7QTZBNoE2wVp -CRCBARaBAjOBAjGAY4EBEIEBFIEBOoECMlhTZXJ2aWNlc9QADgTOASIE3gTfCRQJFQkWgQIdgQI0gQI2 -gQI10gAOADYANwkRgATSAA4ARQB1CRuAO6BfEA9fTlNTZXJ2aWNlc01lbnXaAA4EzgTPCKYE0AinBNEE -0gTTBNQE1QHtBNcAzgHtAM4E2QTaBNsFaYEBFoBjCYBjCYEBEIEBFIEBOtoADgTOBM8IpgTQCKcE0QTS -BNME1ATVAe0E1wDOAe0AzgTZBNoE2wVpgQEWgGMJgGMJgQEQgQEUgQE6XF9OU0FwcGxlTWVuddoADghg -BM4EzwTQBNEE0gTTBNQBmgTVBVcJMwTXAe0E2QTaBNsH7Qk4gQEWgQE1gQI7gGOBARCBARSBAgyBAjxU -RWRpdNIADgA2ADcJOYAE0gAOAEUAdQk+gDutBcUGywgHBqgFtwcxBU8HTAhRCDwIMAghCC6BAVmBAa2B -Aj+BAaGBAVSBAc6BATSBAdeBAkCBAkGBAkaBAkyBAlfaAA4EzgTPCKYE0AinBNEE0gTTBNQE1QHtBNcA -zgHtAM4E2QTaBNsFV4EBFoBjCYBjCYEBEIEBFIEBNdoADgTOBM8IpgTQCKcE0QTSBNME1ATVAe0E1wDO -Ae0AzgTZBNoE2wVXgQEWgGMJgGMJgQEQgQEUgQE12gAOCGAEzgTPBNAE0QTSBNME1AGaBNUGGAlhBNcB -7QTZBNoE2wVXCWaBARaBAXKBAkKAY4EBEIEBFIEBNYECQ1RGaW5k0gAOADYANwlngATSAA4ARQB1CWyA -O6UGIgc/Bg8GYwY1gQF3gQHTgQFxgQGMgQF92gAOCGAEzgTPBNAE0QTSBNME1AGaBNUGBQYIBNcB7QTZ -BNoE2wVXCXqBARaBAWyBAkeAY4EBEIEBFIEBNYECSF8QFFNwZWxsaW5nIGFuZCBHcmFtbWFy0gAOAEUA -dQl+gDukBtkF/Qb2CC2BAbKBAWuBAbyBAkrYAA4EzgTPBNAE0QTSBNME1ATVCYUE1wHtBNkE2gTbBgWB -ARaBAkuAY4EBEIEBFIEBbF8QG0NoZWNrIEdyYW1tYXIgV2l0aCBTcGVsbGluZ9oADghgBM4EzwTQBNEE -0gTTBNQBmgTVCDoJjgTXAe0E2QTaBNsFVwmTgQEWgQJPgQJNgGOBARCBARSBATWBAk5dU3Vic3RpdHV0 -aW9uc9MADgTOBN4E3wmOCZiBAh2BAk2BAlDSAA4ARQB1CZuAO6MIOQgiCAWBAlGBAlOBAlXYAA4EzgTP -BNAE0QTSBNME1ATVCaEE1wYnBNkE2gTbCDqBARaBAlKBAXmBARCBARSBAk9fEBBTbWFydCBDb3B5L1Bh -c3Rl2AAOBM4EzwTQBNEE0gTTBNQE1QmpBNcHRATZBNoE2wg6gQEWgQJUgQHVgQEQgQEUgQJPXFNtYXJ0 -IFF1b3Rlc9gADgTOBM8E0ATRBNIE0wTUBNUJsQTXBhUE2QTaBNsIOoEBFoECVoEBdIEBEIEBFIECT1tT -bWFydCBMaW5rc9oADghgBM4EzwTQBNEE0gTTBNQBmgTVBXwFfwTXAe0E2QTaBNsFVwm/gQEWgQFAgQJY -gGOBARCBARSBATWBAllWU3BlZWNo0gAOAEUAdQnDgDuiBokFdIEBl4EBP9oADghgBM4EzwTQBNEE0gTT -BNQBmgTVBp4JyQTXAe0E2QTaBNsH7QnOgQEWgQGcgQJcgGOBARCBARSBAgyBAl1WRm9ybWF00gAOADYA -NwnPgATSAA4ARQB1CdSAO6IIAgaWgQJggQGb2AAOBM4EzwTQBNEE0gTTBNQE1QnZBNcGSQTZBNoE2wae -gQEWgQJhgQGFgQEQgQEUgQGcWlNob3cgRm9udHPaAA4IYATOBM8E0ATRBNIE0wTUAZoE1QZMBk8E1wHt -BNkE2gTbB+0J54EBFoEBg4ECY4BjgQEQgQEUgQIMgQJk0gAOAEUAdQnqgDuiBkMGVoEBgoEBiNoADghg -BM4EzwTQBNEE0gTTBNQBmgTVBZ8J8ATXAe0E2QTaBNsH7Qn1gQEWgQFLgQJngGOBARCBARSBAgyBAmhW -V2luZG930gAOADYANwn2gATSAA4ARQB1CfuAO6QF7wWXB+8HJIEBZoEBSoECa4EBytoADgTOBM8IpgTQ -CKcE0QTSBNME1ATVAe0E1wDOAe0AzgTZBNoE2wWfgQEWgGMJgGMJgQEQgQEUgQFLXl9OU1dpbmRvd3NN -ZW512gAOCGAEzgTPBNAE0QTSBNME1AGaBNUFjQWQBNcB7QTZBNoE2wftChKBARaBAUWBAm6AY4EBEIEB -FIECDIECb1RIZWxw0gAOAEUAdQoWgDuhBYWBAURbX05TTWFpbk1lbnXSAA4AMgAzChuABYECc9IADgBF -AsIKHoCurxB1B+0CWwBVAB8H7QWfCEYGTAVXBhgAsgJBAHoH7QglB/wIXgYFB+0FjQB3AB8FaQWfBp4H -7QVpCDoGTAVXALIFnwfqBVcGngHPBNwGBQTcB+4IPACJAHkAiQJCAmgDuAVpCFUAVQguAP4A/wVpBhgF -Vwg6BWkH9wTcBnkAigVXBVcFfAYYBNwGBQVXBVcFVwCJAHsAiQB4BNwE3ATcCDAIOgghBWkFVwV8BNwC -aAVpAEgAdwVpBVcB0wVpAIoE3AVXAFUIAwAfAIoAHwAfBhgFVwYYBgUFaQftBWkAVQTcAB8CaAWfAFUE -3AftgQIMgHyADYACgQIMgQFLgQIwgQGDgQE1gQFygBaAeoDrgQIMgQIXgQI6gQJmgQFsgQIMgQFFgBCA -AoEBOoEBS4EBnIECDIEBOoECT4EBg4EBNYAWgQFLgQILgQE1gQGcgHSBAQ2BAWyBAQ2BAm2BAkGAEoDn -gBKA0YB+gNOBATqBAluADYECV4AggDeBATqBAXKBATWBAk+BATqBAieBAQ2BAZGATYEBNYEBNYEBQIEB -coEBDYEBbIEBNYEBNYEBNYASgP+AEoDigQENgQENgQENgQJGgQJPgQJMgQE6gQE1gQFAgQENgH6BATqA -CIAQgQE6gQE1gE+BATqATYEBDYEBNYANgQJigAKATYACgAKBAXKBATWBAXKBAWyBATqBAgyBATqADYEB -DYACgH6BAUuADYEBDYECDNIADgBFAsIKloCurxB2B+oH7QfuAHcGQwfvB/ACaAXFBiIA/wJbBB4H9wVX -BnkFnwb2B/wFhQCKAEgIAAXvCAIIAwgECAUGVggHAP4FlwTcBzEGlgHTCA4F/QcWBY0GGACyBA0HBACU -A7gGngPFAoEAeQV8AQ0BcAVhCCEIIgY1AB8FaQXiCCUHTAbLAkIGcQaJBmMEywguCC0FTwgwBHUAzACe -A/cINQg2CDcGBQg5CDoIOwg8BXQG6AJrCEAAVQCJBr0GqAHeCEYCQQhIBT8AeAZMBbcBzwT+CE8GDwhR -Bz8G2QXUCFUIVgB7BP8FqQckAnEAeghdCF6BAguBAgyBAm2AEIEBgoECa4ECM4B+gQFZgQF3gDeAfIDt -gQIngQE1gQGRgQFLgQG8gQI6gQFEgE2ACIECLIEBZoECYIECYoECN4ECVYEBiIECP4AggQFKgQENgQHO -gQGbgE+BAiKBAWuBAcWBAUWBAXKAFoDpgQHAgEeA04EBnIDVgIKA54EBQIAtgDqBATmBAkyBAlOBAX2A -AoEBOoEBYoECF4EB14EBrYDRgQGQgQGXgQGMgQEMgQJXgQJKgQE0gQJGgQEBgBiAQ4DkgQIkgQIegQIR -gQFsgQJRgQJPgQIvgQJBgQE/gQG3gMyBAjiADYASgQGogQGhgFGBAjCAeoECFIEBLoDigQGDgQFUgHSB -ARyBAnKBAXGBAkCBAdOBAbKBAV6BAluBAiuA/4EBGoEBT4EByoDKgOuBAh+BAmbSAA4ARQLCCw+Arq8Q -dgsQCGsLEgsTCxQLFQsWCxcLGAsZCxoLGwscCx0LHgsfCyALIQsiCyMLJAnwCyYLJwsoCykLKgsrCywL -LQsuCy8LMAsxCzILMws0CzULNgs3CzgLOQs6CzsLPAZPCz4LPwtAC0ELQgtDC0QLRQtGC0cLSAtJC0oL -SwtMC00LTgtPC1ALUQtSC1MLVAtVC1YLVwtYC1kLWgtbC1wLXQteC18LYAthC2ILYwtkC2ULZgtnC2gL -aQtqC2sLbAttC24LbwVEC3ELcgtzC3QLdQt2C3cLeAt5C3oLewt8C30Lfgt/C4ALgQuCC4MLhAuFgQJ3 -gQIlgQJ4gQJ5gQJ6gQJ7gQJ8gQJ9gQJ+gQJ/gQKAgQKBgQKCgQKDgQKEgQKFgQKGgQKHgQKIgQKJgQKK -gQJngQKLgQKMgQKNgQKOgQKPgQKQgQKRgQKSgQKTgQKUgQKVgQKWgQKXgQKYgQKZgQKagQKbgQKcgQKd -gQKegQKfgQKggQKhgQJjgQKigQKjgQKkgQKlgQKmgQKngQKogQKpgQKqgQKrgQKsgQKtgQKugQKvgQKw -gQKxgQKygQKzgQK0gQK1gQK2gQK3gQK4gQK5gQK6gQK7gQK8gQK9gQK+gQK/gQLAgQLBgQLCgQLDgQLE -gQLFgQLGgQLHgQLIgQLJgQLKgQLLgQLMgQLNgQLOgQLPgQLQgQLRgQLSgQLTgQEvgQLUgQLVgQLWgQLX -gQLYgQLZgQLagQLbgQLcgQLdgQLegQLfgQLggQLhgQLigQLjgQLkgQLlgQLmgQLngQLoXxAQTWVudSBJ -dGVtIChGaWxlKV8QEE1lbnUgSXRlbSAoSGVscClaU3BsaXQgVmlld18QGE1lbnUgSXRlbSAoU2hvdyBU -b29sYmFyKVtTZXBhcmF0b3ItOF8QD01lbnUgKFNlcnZpY2VzKV1TY3JvbGwgVmlldy0xXxAQTWVudSBJ -dGVtIChVbmRvKW8QEQBNAGUAbgB1ACAASQB0AGUAbQAgACgARgBpAG4AZCAmAClfEBVUYWJsZSBDb2x1 -bW4gKEF1dGhvcilWVmlldy0xXxARU2VhcmNoIEZpZWxkIENlbGxfEBNNZW51IEl0ZW0gKEdpdFRlc3Qp -W01lbnUgKEVkaXQpXxASTWVudSAoT3BlbiBSZWNlbnQpXU1lbnUgKFdpbmRvdylfECdNZW51IEl0ZW0g -KENoZWNrIFNwZWxsaW5nIFdoaWxlIFR5cGluZylfEBBNZW51IEl0ZW0gKEVkaXQpXxAYTWVudSBJdGVt -IChHaXRUZXN0IEhlbHApXxAhVG9wIFRhYiBWaWV3IChEZXRhaWxzLCBSYXcsIFRyZWUpbxAYAE0AZQBu -AHUAIABJAHQAZQBtACAAKABQAHIAZQBmAGUAcgBlAG4AYwBlAHMgJgApXxAUTWVudSBJdGVtIChNaW5p -bWl6ZSlfEBZNZW51IEl0ZW0gKFNob3cgRm9udHMpXxAQTWVudSBJdGVtIChWaWV3KVtTZXBhcmF0b3It -Ml8QF01lbnUgSXRlbSAoU21hcnQgTGlua3MpbxAeAE0AZQBuAHUAIABJAHQAZQBtACAAKABDAHUAcwB0 -AG8AbQBpAHoAZQAgAFQAbwBvAGwAYgBhAHIgJgApW1NlcGFyYXRvci02XxAWVGFibGUgQ29sdW1uIChT -dWJqZWN0KV8QEE1lbnUgSXRlbSAoWm9vbSlbTWVudSAoRmlsZSlfEBFNZW51IEl0ZW0gKFBhc3RlKV8Q -F01lbnUgSXRlbSAoU2hvdyBDb2xvcnMpVlZpZXctMl8QG01lbnUgSXRlbSAoUmV2ZXJ0IHRvIFNhdmVk -KV8QGk1lbnUgSXRlbSAoQ2hlY2sgU3BlbGxpbmcpbxAXAE0AZQBuAHUAIABJAHQAZQBtACAAKABQAGEA -ZwBlACAAUwBlAHQAdQBwICYAKVtNZW51IChIZWxwKVtNZW51IChGaW5kKV8QHFRhYmxlIFZpZXcgKFN1 -YmplY3QsIEF1dGhvcilfEClUZXh0IEZpZWxkIENlbGwgKFNob3dpbmcgYnJhbmNoICdtYXN0ZXInKV8Q -F01lbnUgSXRlbSAoSGlkZSBPdGhlcnMpXxATSG9yaXpvbnRhbCBTY3JvbGxlcl1NZW51IChGb3JtYXQp -V0Jyb3dzZXJZVGV4dCBWaWV3XxAlU3RhdGljIFRleHQgKFNob3dpbmcgYnJhbmNoICdtYXN0ZXInKV1N -ZW51IChTcGVlY2gpXxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTFfEBtUZXh0IEZpZWxkIENl -bGwgKFRleHQgQ2VsbClfEBhNZW51IEl0ZW0gKEhpZGUgR2l0VGVzdClfEBlNZW51IEl0ZW0gKFN1YnN0 -aXR1dGlvbnMpXxAYTWVudSBJdGVtIChTbWFydCBRdW90ZXMpXxAdTWVudSBJdGVtIChKdW1wIHRvIFNl -bGVjdGlvbilcRmlsZSdzIE93bmVyXk1lbnUgKEdpdFRlc3QpXxAUTWVudSBJdGVtIChTaG93IEFsbClf -EBdNZW51IEl0ZW0gKE9wZW4gUmVjZW50KV8QFk1lbnUgSXRlbSAoU2VsZWN0IEFsbClfEBBNZW51IEl0 -ZW0gKFJlZG8pXxAUVGFiIFZpZXcgSXRlbSAoVHJlZSlfEBZNZW51IEl0ZW0gKENsZWFyIE1lbnUpXxAa -TWVudSBJdGVtIChTdGFydCBTcGVha2luZylfECJNZW51IEl0ZW0gKFVzZSBTZWxlY3Rpb24gZm9yIEZp -bmQpbxASAE0AZQBuAHUAIABJAHQAZQBtACAAKABQAHIAaQBuAHQgJgApXxASTWVudSBJdGVtIChTcGVl -Y2gpXxAnTWVudSBJdGVtIChDaGVjayBHcmFtbWFyIFdpdGggU3BlbGxpbmcpXxASTWVudSBJdGVtIChE -ZWxldGUpXxAgTWVudSBJdGVtIChTcGVsbGluZyBhbmQgR3JhbW1hcilfEBRCdXR0b24gQ2VsbCAoQnV0 -dG9uKV8QEVRhYmxlIEhlYWRlciBWaWV3XxARVmVydGljYWwgU2Nyb2xsZXJfEBdUZXh0IEZpZWxkIENl -bGwgKExhYmVsKVlTZXBhcmF0b3JbU2VwYXJhdG9yLTFfEA9NZW51IEl0ZW0gKE5ldylfEBtNZW51IChT -cGVsbGluZyBhbmQgR3JhbW1hcilfEBxNZW51IEl0ZW0gKFNtYXJ0IENvcHkvUGFzdGUpXxAUTWVudSAo -U3Vic3RpdHV0aW9ucylbU2VwYXJhdG9yLTNfEBBNZW51IEl0ZW0gKEZpbmQpXxAZTWVudSBJdGVtIChT -dG9wIFNwZWFraW5nKV8QEE1lbnUgSXRlbSAoU2F2ZSlfEBVIb3Jpem9udGFsIFNjcm9sbGVyLTFbU2Vw -YXJhdG9yLTRcQ29udGVudCBWaWV3W1Njcm9sbCBWaWV3XxAYTWVudSBJdGVtIChRdWl0IEdpdFRlc3Qp -XxAPTWVudSBJdGVtIChDdXQpWFdlYiBWaWV3XxAUTWVudSBJdGVtIChTZXJ2aWNlcylfEBNUYWIgVmll -dyBJdGVtIChSYXcpXxATTWVudSBJdGVtIChPcGVuLi4uKV8QE1N0YXRpYyBUZXh0IChMYWJlbClbTWVu -dSAoVmlldylfEBBNZW51IEl0ZW0gKENvcHkpXxAXVGFiIFZpZXcgSXRlbSAoRGV0YWlscylfEBFDb21t -aXRzQ29udHJvbGxlcltBcHBsaWNhdGlvbl8QGU1lbnUgSXRlbSAoRmluZCBQcmV2aW91cylbU2VwYXJh -dG9yLTdfEBVNZW51IEl0ZW0gKEZpbmQgTmV4dClvEBoATQBlAG4AdQAgAEkAdABlAG0AIAAoAFMAaABv -AHcAIABTAHAAZQBsAGwAaQBuAGcgJgApXxAZTWVudSBJdGVtIChBYm91dCBHaXRUZXN0KV8QEk1lbnUg -SXRlbSAoRm9ybWF0KVtTZXBhcmF0b3ItNV8QFFB1c2ggQnV0dG9uIChCdXR0b24pXxASV2ViIEdpdCBD -b250cm9sbGVyXxARTWVudSBJdGVtIChDbG9zZSlfEB5NZW51IEl0ZW0gKEJyaW5nIEFsbCB0byBGcm9u -dClfEBNWZXJ0aWNhbCBTY3JvbGxlci0xXFNlYXJjaCBGaWVsZG8QFABNAGUAbgB1ACAASQB0AGUAbQAg -ACgAUwBhAHYAZQAgAEEAcyAmAClfEBJNZW51IEl0ZW0gKFdpbmRvdynSAA4ARQLCC/qArqDSAA4ARQLC -C/2ArqDSAA4ARQLCDACArq8QqAfqAmgAdwftB+4H7wfwBkMFxQYiAP8CWwScBB4EpAf3BnkFVwShBLsF -nwSmBvYH/AWFAIoASAgABe8IAggDCAQEwAgFBlYIBwSzAP4EogWXBNwHMQaWAdMIDgX9BxYEsgS3BY0G -GACyBJgEDQCUA7gCgQPFBwQGngSsBLUEtgB5BXwBDQFwBWEGNQghCCIEvAAfBWkF4gglBnECQgdMBssE -nwSoBKsErwaJBMcEsAZjBMsEvggtCC4FTwgwBLEAzAR1AJ4ElgP3CDUINgg3BgUIOQSpBK4Emgg6BJ0E -wQg7CDwFdAS9BugEwwJrCEAAVQCJBr0GqAS/Ad4IRgJBCEgFtwB4BkwFPwHPBP4EpQStBMQITwS0BLkG -DwSeBJcEuAhRBz8G2QXUCFUEmwSgBKcIVgB7BMYFqQT/BJkCcQckBMUAeghdBMIEqgS6CF4Eo4ECC4B+ -gBCBAgyBAm2BAmuBAjOBAYKBAVmBAXeAN4B8gQE4gO2BAWGBAieBAZGBATWBAVOBAcSBAUuBAWqBAbyB -AjqBAUSATYAIgQIsgQFmgQJggQJigQI3gQHbgQJVgQGIgQI/gQGlgCCBAViBAUqBAQ2BAc6BAZuAT4EC -IoEBa4EBxYEBoIEBtoEBRYEBcoAWgQErgOmAR4DTgIKA1YEBwIEBnIEBh4EBrIEBsYDngQFAgC2AOoEB -OYEBfYECTIECU4EByYACgQE6gQFigQIXgQGQgNGBAdeBAa2BAUmBAXaBAYGBAZSBAZeBAgSBAZaBAYyB -AQyBAdKBAkqBAleBATSBAkaBAZqAGIEBAYBDgQELgOSBAiSBAh6BAhGBAWyBAlGBAXqBAY+BATGBAk+B -AT6BAd2BAi+BAkGBAT+BAc2BAbeBAeaAzIECOIANgBKBAaiBAaGBAdaAUYECMIB6gQIUgQFUgOKBAYOB -AS6AdIEBHIEBZYEBi4EB6YECcoEBp4EBv4EBcYEBQ4EBGYEBu4ECQIEB04EBsoEBXoECW4EBM4EBToEB -cIECK4D/gQH6gQFPgQEagQEtgMqBAcqBAeyA64ECH4EB4oEBfIEBw4ECZoEBXdIADgBFAsIMq4CurxCo -DKwMrQyuDK8MsAyxDLIMswy0DLUMtgy3DLgMuQy6DLsMvAy9DL4MvwzADMEMwgzDDMQMxQzGDMcMyAzJ -DMoMywzMDM0MzgzPDNAM0QzSDNMM1AzVDNYM1wzYDNkM2gzbDNwM3QzeDN8M4AzhDOIM4wzkDOUM5gzn -DOgM6QzqDOsM7AztDO4M7wzwDPEM8gzzDPQM9Qz2DPcM+Az5DPoM+wz8DP0M/gz/DQANAQ0CDQMNBA0F -DQYNBw0IDQkNCg0LDQwNDQ0ODQ8NEA0RDRINEw0UDRUNFg0XDRgNGQ0aDRsNHA0dDR4NHw0gDSENIg0j -DSQNJQ0mDScNKA0pDSoNKw0sDS0NLg0vDTANMQ0yDTMNNA01DTYNNw04DTkNOg07DTwNPQ0+DT8NQA1B -DUINQw1EDUUNRg1HDUgNSQ1KDUsNTA1NDU4NTw1QDVENUg1TgQLtgQLugQLvgQLwgQLxgQLygQLzgQL0 -gQL1gQL2gQL3gQL4gQL5gQL6gQL7gQL8gQL9gQL+gQL/gQMAgQMBgQMCgQMDgQMEgQMFgQMGgQMHgQMI -gQMJgQMKgQMLgQMMgQMNgQMOgQMPgQMQgQMRgQMSgQMTgQMUgQMVgQMWgQMXgQMYgQMZgQMagQMbgQMc -gQMdgQMegQMfgQMggQMhgQMigQMjgQMkgQMlgQMmgQMngQMogQMpgQMqgQMrgQMsgQMtgQMugQMvgQMw -gQMxgQMygQMzgQM0gQM1gQM2gQM3gQM4gQM5gQM6gQM7gQM8gQM9gQM+gQM/gQNAgQNBgQNCgQNDgQNE -gQNFgQNGgQNHgQNIgQNJgQNKgQNLgQNMgQNNgQNOgQNPgQNQgQNRgQNSgQNTgQNUgQNVgQNWgQNXgQNY -gQNZgQNagQNbgQNcgQNdgQNegQNfgQNggQNhgQNigQNjgQNkgQNlgQNmgQNngQNogQNpgQNqgQNrgQNs -gQNtgQNugQNvgQNwgQNxgQNygQNzgQN0gQN1gQN2gQN3gQN4gQN5gQN6gQN7gQN8gQN9gQN+gQN/gQOA -gQOBgQOCgQODgQOEgQOFgQOGgQOHgQOIgQOJgQOKgQOLgQOMgQONgQOOgQOPgQOQgQORgQOSgQOTgQOU -EFMRAj4RAbQQHRBnEPMQghEBVRCeEJoRAcURAjkQmBECCRCZEDgQfRCpELUQVxDyEL4QvxCjEG8RAjEQ -FRD2EQFQEQFSEJARAYwQ2BEBVBCcEQJUEQHGELQQ9BBREKsRAVERAjQQcBC9EE0QrxDTEGoQnxEBxBEC -TREB/xEB1hECRxECQRECSRCREQEHEQFXELIQvBEB/hDhEQHHEQHIEIYQmxDWENsQ+RECVRA5EJYQfBB+ -EQJGEKwQrRD4EMcRAVYRAlIQ4xECDBEBARChEE4Q1BDgEKQQuBEBWREB1xECUREB1RBWEQH0EEoQTxBS -ELkQ2hDQEH8QzhDXEQECEQGPEI8QqBDkELARAg0RAkAQlREBwBCIEKAQsxECSBCDEQIyEEgQnREB8xEB -UxDNEQIzEQGLEPcQyhECRRP//////////RCLEJIQohB6EQJTEMAQrhCnELsQOhEBBhDDEMEQyRDEEQJQ -EQILEEkRAksRAkwRAj8Q9REB/RECCBBQEQIOEMsQzxDxEI7SAA4ARQB1DfqAO6DSAA4ARQLCDf2ArqDS -AA4ARQLCDgCArqDSADoAOw4CDgOiDgMAP15OU0lCT2JqZWN0RGF0YQAIABkAIgAnADEAOgA/AEQAUgBU -AGYHnAeiB+0H9Af7CAkIGwg3CEUIUQhdCGsIdgiECKAIrgjBCNMI7Qj3CQQJBgkJCQwJDwkSCRUJGAka -CR0JIAkjCSYJKAkqCS0JMAkzCTYJPwlLCU0JTwlYCWIJZAlyCXsJhAmPCZYJqAmxCboJwwnICdcJ6gnz -Cf4KAAoDCgUKNgpDClAKXgpoCnYKgwqNCp8Kswq9CskKywrOCtEK0wrYCtoK3ArfCuEK4wrmCugLAQsG -Cw8LGAsaCx8LPAtOC1kLYgtuC3oLfAt+C4ALgwuGC4gLiwuUC5YLoQujC6ULpwupC6sLzAvUC+ML5Qvn -C+kL6wvuC/AL8gv7C/0MAgwEDAYMPwxLDFQMYQx0DIEMjQybDJ0MnwyhDKMMpQynDKkMvAy+DMAMwgzE -DMYMzwzRDNwM3gzgDOIM5AzmDQ8NGQ0jDS0NLw0xDTMNNQ03DToNPA0+DUANQg1LDU0NUA1SDaUNxw3R -Dd4N8g4HDiEOPQ5YDmIObg6NDpwOqA6qDqwOrg63DrkOuw68Dr4Oxw7QDtIO0w7VDtcO2Q7bDuQO7w8M -DxgPGg8cDx4PIA8iDyQPTQ9PD1EPUw9VD1cPWQ9bD10PZw9wD3kPjQ+UD6APuQ+7D70Pvw/BD8MP2g/j -D+wP+hADEAUQChAMEA4QNxBGEFMQWxBmEHUQgBCLEJgQmRCbEJ0QphCoEKoQsxC8EL0QvxDcEOgQ8xD9 -EQoRFhEbER0RHxEhESMRJREtET4RRRFMEVURVxFgEWIRZRFyEXsRgBGHEZQRoRGpEasRtxHAEcURzRHi -Ee4R/BH+EgASAhIEEgYSDRIfEiwSLhIxEjoSRRJZEmsSeBJ/EqASrhKzErUStxK5ErsSvRLAEsISzBLd -Et8S6BLqEu0TAhMEEwYTCBMKEyMTMBMyEz4TUxNVE1cTWRNbE24TdxOAE4kTjhOcE8UTxhPIE8oT0xPV -E9YT2BP1E/cT+RP7E/0T/xQGFCcUKRQrFC0ULxQxFDMUPBRDFFIUWhRnFGkUbBSBFIMUhRSHFIkUkxSg -FKIUpxSwFLsUxRTdFOYU7xT6FSMVLBU1FUAVShVMFU4VUBVSFVQVVhVYFWEVahWDFZAVmRWkFa8V2BXa -FdwV3hXgFeIV5BXmFegV8RYJFhIWFBYXFhkWLxY6FkMWTBZZFo4WnRaxFsoW4hbkFuYW6BbqFuwW7hbw -FvIW8xb1FvYW+BcBFwMXBhcIFyUXJxcpFysXLRcvFzEXOhc8Fz8XQRd2F4EXjReZF6MXuBfCF9AX0hfU -F9YX1xfZF9sX3RfeF+AX4hfkF+YX7xfxGAwYDhgQGBIYFBgWGBgYGhgcGB4YIBgiGCQYJhhCGE0YYhiD -GJ8YwxjhGPMZEBkoGUIZXxmMGZUZnBmpGa8ZyBnJGdYZ4RnoGeoZ7BnuGfsaAxoFGg4aEBoSGhQaFhof -GiEaIxolGicaRBpcGnQaiBqKGosalBqbGrEavhrHGswa2xrkGu0a9RsOGxcbHhs3G0AbQhtJG0sbTRtP -G2gbdRt/G4cbiRuLG40bjxuRG5MblRudG7IbtBu2G7gbuhvHG9Ab1RvjG/wb/hwAHAIcBBwGHAgcChwf -HCEcIxwlHCccMBwyHDUcNxxkHGYcaBxqHGwcbhxwHHIcdBx2HHgcgRyDHIocjByOHJAcvRzGHMgcyhzM -HM4c0BzSHNQc1hzYHOEc4xzmHOgdFR0nHTEdPh1HHVIdVB1WHVgdWh1dHV8dYR1jHWUdZx1xHYYdkB2b -Ha0drx2xHbodvB3RHeQd8h38Hf4eAB4CHgQeFR4iHiQeJh4oHioeMx41IJcgpCCmIKsgrSCvILQgtiC4 -IMsg2CDjIO8g8SDzIPwg/iFBIUMhRSFHIUkhSyFNIU8hUSFTIVUhVyFZIVshXSFfIWEhYyFlIWchaSFr -IW0hbyFxIXMhdSF3IXkheyF9IX8hgSGKIZUhlyGgIakhriG4IcEhwyHMIdUh1yHgIekh6yH0If0h/yII -IhEiEyIcIiUiJyIwIjkiOyJEIk0iTyJYImEiYyJsInUidyKAIokiiyKUIp0inyKoIrEisyK8IsUixyLQ -Itki2yLkIu0i7yL4IwEjAyMMIxUjFyMgIykjKyM0Iz0jPyNII1EjUyNcI2UjZyNwI3kjeyOEI40jjyOY -I6EjoyOsI7UjtyPAI8kjyyPUI90j3yPoI/Ej8yP8JAUkByQQJBkkGyQkJC0kMiQ7JEAkUSRTJFwkXiRg -JGckcCR1JH4khySjJLgkwSTDJMYkyCTRJNYk3yTkJQUlDSUnJTolUSVmJXkleyV+JYAlgiWEJYYliCWK -JZclmSWeJaAloiWnJaklqyXAJcIlxCXGJcgl5iX7Jf0l/yYBJgMmFyYkJiYmKyYtJi8mNCY2JjgmRCZR -JlcmWSZgJmkmbiaFJpImmyakJq8mtibNJtom5CbxJvMm9Sb9JwYnCycsJy4nMCcyJzQnNic4J0EnWSeC -J4QnhieIJ4onjCeOJ5cnoCe7J78n2CfaJ9wn3ifgJ+In5CfrKAAoAigEKAYoCCgRKBMoFigYKFEoYyht -KIUolyiqKMUo3CjeKOAo4ijkKOko8ij0KPUo+Cj5KPso/SkWKSspMCkyKTQpNik4KUkpSylUKVYpXylm -KXQpdil/KYoplCmZKaIpqynDKcwp1SnhKgIqBCoGKggqCioNKg4qECoSKigqSSpLKk0qTypRKlMqWCpa -KmAqaSp0KoAqoSqjKqUqpyqpKqoqrCquKsYq5yrpKusq7SrvKvEq8ysNKy4rMCsyKzQrNis5KzorPCs+ -K1grjSuiK7UryivdK/Mr+Cv6K/wr/iwALAIsBywILAosDCwOLBAsJSwnLCksKywtLEMsdCyJLJgsqiy8 -LMoszCzRLNMs1SzXLNks2yzeLOAs5SzsLQItCy0ULSEtVi18LX4tgC2CLYQthi2ILYotkC2ZLZstni2g -La0try20LbYtuC29Lb8twS3PLfsuAi4YLiEuLC5ALkkuVi5kLoUuhy6KLo0ukC6RLpMulS6uLt8u9S76 -Lvwu/i8ALwIvBC8HLwkvCy8NLxIvGy8iLysvNi8/L0ovYy9uL4svlC+ZL6wvtS+3MB4wITAkMCcwKjAt -MDAwMzA2MDkwPDA/MEIwRTBIMEswTjBRMFQwVzBaMF0wYDBjMGYwaTBsMG8wcjB1MHgwezB+MIEwhDCH -MIowjTCQMJMwljCZMJwwnzCiMKUwqDCrMK4wsTC0MMEwyjDNMNAw0zD0MPwxEDEbMSkxMzFAMUcxSjFN -MVIxVTFaMV0xYDFjMXAxfDF/MYIxhTGSMZQxoTGwMbMxtjG5McEx0zHcMeEx9DIBMgQyBzIKMh0yJjIr -MjYyPTJGMk0yZTJ0MoUykzKWMpkynDKfMqgyqjKtMsIy5zMEMxszLTM4M0czbDOHM6AzoTOkM6UzqDOp -M6wzrTOuM68zuDO6M8szzjPRM9Qz1zPaM90z4DPjM+cz7DPwM/g0ADQHNBM0GjQfNCI0KzQwNDk0QjRW -NGs0eDSMNJU0nDSzNMQ0xzTJNMw0zzTUNOU06DTrNO408TT6NPw0/zUVNSA1MTU0NTc1OTU8NUU1UjVV -NVg1WzV8NX81gjWENYc1ijWNNZo1nTWgNaM1qjWyNcM1xjXINcs1zjXvNfI19TX4Nfs1/jYBNhI2FTYY -Nhs2HjYrNi02MzZANkM2RjZJNmY2aTZsNm42cTZ0Nnc2hDaHNoo2jTabNqk2tja5Nrw2vzbgNuM25jbp -Nuw27zbyNv83AjcFNwg3FTcXNyE3LjcxNzQ3NzdYN1s3XjdgN2M3ZjdpN3o3fTeAN4M3hjeLN5g3pTeo -N6s3rjfPN9I31TfYN9s33jfhN+c36Tf3OAQ4BzgKOA04LjgxODQ4Nzg6OD04QDhFOEc4TThaOF04YDhj -OIQ4hziKOI04kDiTOJY4mzidOKM4tDi3OLk4vDi/ONw43zjiOOQ45zjqOO04+zkbOSw5LzkxOTQ5NzlY -OVs5XjlgOWM5ZjlpOXI5izmYOZs5njmhOcI5xTnIOcs5zjnROdQ53TnfOfU6AjoFOgg6CzosOi86Mjo1 -Ojg6Ozo+Oks6TjpROlQ6YzplOnQ6gTqEOoc6ijqvOrU6uDq7Or46wTrEOsc61DrXOto63TrrOu07BzsU -Oxc7GjsdO0I7RTtIO0s7TjtRO1Q7XzthO3I7dTt3O3o7fTuEO5E7lDuXO5o7uzu+O8E7xDvHO8o7zTvh -O+M8AzwQPBM8FjwZPDo8PTxAPEU8SDxLPE48UTxePGE8ZDxnPHQ8djyMPJk8nDyfPKI8wzzGPMk8yzzO -PNE81Dz7PR09Kj0tPTA9Mz1YPVs9Xj1hPWQ9Zz1qPWw9hT2HPZQ9lz2aPZ09vj3BPcQ9xj3JPcw9zz3g -PeM95j3pPew99z4PPiA+Iz4mPig+Kz4zPkA+Qz5GPkk+Zj5pPmw+bj5xPnQ+dz6GPpU+oj6lPqg+qz7M -Ps8+0j7VPtg+2z7ePus+7j7xPvQ/AD8CPxo/Jz8qPy0/MD9RP1Q/Vz9aP10/YD9jP2c/aT9uP38/gj+F -P4c/ij+eP68/sj+0P7c/uj/bP94/4T/kP+c/6j/tP/o//EAHQBRAF0AaQB1APkBBQERAR0BKQE1AUEBV -QFdAXUBqQG1AcEBzQJRAl0CaQJ1AoECjQKZAw0DFQNdA6EDrQO5A8UD0QRVBGEEbQR5BIUEkQSdBLEEu -QTpBR0FKQU1BUEFxQXRBd0F5QXxBf0GCQaBBwUHSQdVB10HaQd1B/kIBQgRCB0IKQg1CEEIcQjVCRkJJ -QkxCTkJRQl5CYUJkQmdCiEKLQo5CkUKUQpdCmkKxQrNCwkLPQtJC1ULYQvlC/EL/QwFDBEMHQwpDH0Mx -Qz5DQUNEQ0dDaENrQ25DcUN0Q3dDekOAQ4JDiUOWQ5lDnEOfQ8RDx0PKQ81D0EPTQ9ZD4EPiQ+9D8kP1 -Q/hEGUQcRB9EIkQlRChEK0Q2RDhEQ0RURFdEWkRdRGBEaESFRI9EmUS4RLtEvkTBRMREx0TKRO1E+kUP -RRhFH0U3RVRFV0VaRV1FYEViRWVFhUWLRaRFwUXERcdFykXNRc9F0kXzRg1GKkYtRjBGM0Y2RjhGO0ZW -RmpGi0aVRphGm0aeRqFGo0amRqlG2EbvRwhHFUcXRyRHJ0cqRy1HMEczRzZHQ0dGR0lHTEdPR1JHVUdp -R4hHm0e4R9NH8UfySA5IL0gySDVIOEg7SD1IQEhDSGBIakh8SIlIi0iWSJlInEifSKJIpUiwSLNItUi4 -SLpIvEjVSOlJEkkgST1JYkl4SXtJfkmBSYRJh0mJSYxJj0mtSbhJxUnHSdJJ1UnYSdtJ3knhSexJ70nx -SfRJ9kn5ShJKG0odSwpLDUsPSxFLFEsXSxpLHUsgSyNLJksoSypLLEsvSzJLNUs4SztLPktBS0NLRUtI -S0tLTktRS1RLV0taS11LX0tiS2VLaEtrS21LcEtzS3ZLeUt8S35LgEuCS4RLhkuIS4tLjkuQS5NLlUuX -S5pLnUugS6NLpkupS6xLr0uxS7RLt0u6S71LwEvDS8ZLyUvMS85L0UvTS9VL2EvbS95L4UvkS+dL6kvt -S/BL80v1S/hL+kv8S/9MAkwETAdMCUwMTA9MEUwUTBdMGUwcTB9MIkwlTChMK0wuTDFMNEw2TDlMPEw+ -TEFMQ0xGTElMckx8TH9MgkyFTIdMikyNTJBMk0ykTKdMqkytTLBMtUzETM1Mz0zYTNpM8Uz0TPdM+kz9 -TQBNA00GTQlNDE0PTRJNM002TTlNPE0/TUJNRU1JTUtNbE1vTXJNdU14TXtNfk2GTYhNsU20TbdNuk28 -Tb9Nwk3FTchN1E3dTd9N6E3qTe1N8E4JThJOF05ATk5OW05eTmBOYU5jTmROZ05qTm1Ojk6RTpROl06a -Tp1OoE6xTrNO0E7TTtZO2E7bTt5O4U7zTxxPH08hTyJPJE8lTyhPK08uTzdPQE9CT1FPVE9XT1pPXU9g -T2NPZk+PT5JPlU+YT5pPnU+gT6NPpk+uT7dPuU/QT9NP1k/ZT9xP30/iT+VP6E/rT+5P8VAaUB1QH1Ag -UCJQI1AmUClQLFBNUFBQU1BWUFlQXFBfUHhQelCjUKZQqFCpUKtQrFCvULJQtVDeUOFQ5FDnUOlQ7FDv -UPJQ9VD+UQ9RElEVURhRG1EkUSZRL1ExUTJRRFFtUXBRclFzUXVRdlF5UXxRf1GoUatRrVGuUbBRsVG0 -UbdRulHHUfBR81H2UflR+1H+UgFSBFIHUgxSFVIXUiBSIlI9UkBSQ1JGUklSTFJPUlJSVVJYUltSXlJh -UmRSjVKQUpJSk1KVUpZSmVKcUp9SyFLLUs1SzlLQUtFS1FLXUtpTA1MGUwlTDFMOUxFTFFMXUxpTH1Mo -UypTM1M1U0BTQ1NGU0lTTFNPU3hTe1N+U4FTg1OGU4lTjFOPU6ZTr1OxU7pTvVPAU8NTxlPnU+pT7VPv -U/JT9VP4VBZUP1RCVEVUSFRKVE1UUFRTVFZUZFRxVHRUd1R6VINUhVSMVI9UklSVVLZUuVS8VL9UwlTF -VMhU21T8VP9VAlUFVQhVC1UOVRtVPFU/VUJVRVVIVUtVTlVaVYNVhlWJVYxVjlWRVZRVl1WaVaFVqlWs -VbFVtFW3VeBV41XmVelV61XuVfFV9FX3Vf5WB1YJVhJWFFYZVhxWH1ZAVkNWRlZJVkxWT1ZSVl1WhlaJ -VoxWj1aRVpRWl1aaVp1WplaoVq1WsFazVtxW31biVuVW51bqVu1W8FbzVvpXA1cFVw5XEFcZVxxXH1ci -VyVXTldRV1NXVFdWV1dXWlddV2BXb1eYV5tXnlehV6NXplepV6xXr1e0V71Xv1fCV8VX0VfaV9xX31fo -V+pY11jaWNxY3ljgWONY5ljpWOxY71jyWPRY9lj4WPtY/lkBWQRZB1kKWQ1ZD1kRWRRZF1kaWR1ZIFkj -WSZZKVkrWS5ZMVk0WTdZOVk8WT9ZQllFWUhZSllMWU5ZUFlSWVRZV1laWVxZX1lhWWNZZllpWWxZb1ly -WXVZeFl7WX1ZgFmDWYZZiVmMWY9ZklmVWZhZmlmcWZ5ZoFmjWaZZqVmsWa9Zslm1WbhZu1m+WcBZw1nF -WcdZylnNWc9Z0lnUWddZ2lncWd9Z4VnjWeVZ51nqWe1Z8FnzWfZZ+Vn8Wf5aAVoDWgVaCFoKWg1aEFoZ -WhtbClsNWxBbE1sVWxhbG1seWyBbI1smWyhbKlssWy9bMls1WzhbO1s+W0FbQ1tFW0hbS1tOW1FbVFtX -W1pbXVtfW2JbZVtoW2tbbVtwW3Nbdlt5W3xbfluAW4NbhVuHW4pbjFuOW5Bbk1uVW5dbmludW6Bbo1ul -W6hbq1uuW7FbtFu2W7lbvFu/W8JbxVvIW8tbzlvRW9Nb1VvXW9pb3VvgW+Nb5lvpW+xb71vyW/Vb91v6 -W/xb/lwBXARcBlwJXAtcDlwRXBNcFlwZXBtcHlwhXCRcJ1wqXC1cMFwzXDZcOFw7XD5cQVxDXEVcSFxL -XFRcVl1FXUhdS11OXVFdVF1XXVpdXV1gXWNdZl1pXWxdb11yXXVdeF17XX5dgV2EXYddil2NXZBdk12W -XZldnF2fXaJdpV2oXatdrl2xXbRdt126Xb1dwF3DXcZdyV3MXc9d0l3VXdhd213eXeFd5F3nXepd7V3w -XfNd9l35Xfxd/14CXgVeCF4LXg5eEV4UXhdeGl4dXiBeI14mXileLF4vXjJeNV44XjtePl5BXkReR15K -Xk1eUF5TXlZeWV5cXl9eYl5lXmhea15uXnFedF53XnpefV6AXoNehl6JXoxej16SXpVemF6bXp5eoV6k -Xqdeul7NXthe817/XxFfH18yX1dfb192X4pfoF+sX8Ffz1/5YAxgJ2BLYH5glWCuYMFgzWDnYSZhMmFL -YV5hamF+YZhhn2G9YdpiC2IXYiNiQmJuYohinmKsYrRivmLmYvRjFGMyY01jaWOEY6RjsWPAY9dj8WQK -ZB1kNGRNZGpkj2S2ZMtk9WUKZS1lRGVYZWxlhmWQZZxlrmXMZetmAmYOZiFmPWZQZmhmdGaBZo1mqGa6 -ZsNm2mbwZwZnHGcoZztnVWdpZ3VnkWedZ7Vn7GgIaB1oKWhAaFVoaWiKaKBorWjYaO1o9mj4aPlpAmkE -aQVpDmkQamNqZmpoampqbWpwanNqdmp5anxqf2qBaoNqhmqIaotqjmqRapRql2qaap1qoGqjaqZqqWqr -aq1qsGqzarZquWq8ar9qwmrFashqy2rNatBq02rWatlq3GreauFq5Grnaupq7WrwavNq9Wr4avpq/Gr+ -awBrAmsFawhrC2sOaxFrE2sWaxhrGmsdayBrI2smaylrK2suazFrNGs3azlrPGs/a0JrRWtIa0trTmtR -a1RrV2taa11rYGtja2ZraWtsa25rcWtza3ZreGt7a35rgWuEa4drimuNa5Brk2uWa5lrnGufa6JrpWuo -a6trrWuwa7JrtGu3a7prvWu/a8JrxGvHa8przGvPa9Jr1GvXa9pr3Wvga+Nr5mvpa+xr72vya/Vr+Gv7 -a/5sAWwEbAdsCmwNbBBsEmwVbBhsG2webCBsI2wmbChsK2wubDFsNGw3bDpsQ2xFbZhtm22ebaFtpG2n -baptrW2wbbNttm25bbxtv23CbcVtyG3Lbc5t0W3Ubddt2m3dbeBt423mbelt7G3vbfJt9W34bftt/m4B -bgRuB24Kbg1uEG4TbhZuGW4cbh9uIm4lbihuK24ubjFuNG43bjpuPW5AbkNuRm5JbkxuT25SblVuWG5b -bl5uYW5kbmduam5tbnBuc252bnlufG5/boJuhW6Ibotujm6RbpRul26abp1uoG6jbqZuqW6sbq9usm61 -brhuu26+bsFuxG7HbspuzW7QbtNu1m7Zbtxu327ibuVu6G7rbu5u8W70bvdu+m79bwBvA28GbwlvDG8P -bxJvFW8YbxtvHm8hbyRvJ28qby1vMG8zbzZvOW88bz9vQm9Fb0hvS29Ob1FvVG9Xb1pvXW9gb2NvZm9p -b2xvb29yb3VveG97b35vgW+Eb4dvim+Nb5Bvkm+Vb5hvmm+cb55voG+jb6Vvp2+qb61vr2+yb7Rvtm+4 -b7pvvG++b8Bvwm/Eb8ZvyG/Lb81vz2/Sb9Vv12/ab9xv32/hb+Rv52/pb+tv7W/vb/Jv9W/3b/lv+2/9 -b/9wAXADcAZwCXAMcA9wEnAVcBhwGnAdcCBwInAkcCdwKXAscC9wMXAzcDVwN3A5cDxwPnBAcEJwRHBH -cElwS3BNcE9wUnBVcFdwWnBdcF9wYXBjcGVwZ3BpcGxwb3BycHVwd3B6cHxwfnCAcIJwhHCGcIhwinCM -cI9wknCUcJZwmHCacJ1woHCicKVwp3CpcKtwrnCwcLNwtXC3cLpwvXC/cMJwxXDHcMlwzHDVcNdw2XDb -cN1w4HDicORw5nDocOpw7XDvcPFw83D1cPhw+3D9cQBxA3EGcQhxC3EOcRBxE3EVcRdxGXEbcSRxJnEn -cTBxMnEzcTxxPnE/cUhxTQAAAAAAAAICAAAAAAAADgQAAAAAAAAAAAAAAAAAAHFcA +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEDjQALAAwAMQA1ADkAQABD +AEQASQBhAGIAYwBkAGcACwB0AHsAhQCKAJ8ApwC1ALkA2ADZAOEA6gDrAPAA9gD3APoA/wESAR4BHwEn +ASgBKwEwATMBOwE8AT0BQAFGAVABUQFWAVsBXAFfAWQBZQFnAWoBcgF4AXkBgAGEAYcBjAGNAZABkwGU +AZcBpQGmAacBqgG0AbUBuQG6AbsBvgHPAdMB2gHeAfICAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIP +AhMACwIUAhUCGwIoAikCKgIrAiwBrwItAi4CMgI1AjgCOQI7AjwCQgJMAk0CTgJTAlQCVwJeAl8CZAJo +AnMCeQKEAogCmAKZAqECqQKvArICugEqArsCwALjAucC6gLtAvAC8wL2AvkC/AL/AwIDBQMIAwsDDgMR +AxQDFwMaAx0DIAMjAyYDKQMsAy8DMgM1AzgDOwM+A0EDRANHA0kDSwNQA1EDUwNXA1sDXQNfA24AvQEy +A3YDewN8A4EDggOKA4sDjwOSA5MDlAOXA5gDnQOeA6ADqAOpA7ICEwI4A7MDtAO7A7wDwQPFA9kD2gPf +A+AD5APnA+gCOAPrA+wD7gPvA/ID+wP8BAQEBQQIBBAEEQQYBBkEIgQjAR4ENQQ6BDsESwRMBE0EUARZ +BFoEXgRmBGcEaARpBGoEbQRwAAsEcQRyBHMEdAR3BKsEsATABMUExgTHBMwEzQTOBNEE1QTWBNkE2gTe +BOQE5wToBPoFBQUGBQcFCAUJBQoFCwUMBQ0FDwURBRYFFwUaBR8FIAUlBSgFKQUqBS8FMAU0BTsFPwVA +BUEFRgVNBVIFUwVUBVUFWQVgBWQFZQVmBWoFcQV1BXYFdwV4BXwFgwWIBYkFigWOBZUFlgWXBZgFnAWj +BaQFpQWmBaoFsQWyBbMFtAW5BcAFwQXCBccFzgXPBdAF1AXbBdwF3QXeBeIF6QXtBe4F7wXwBfQF/AYA +BgEGAgYDBgcGDgYPBhAGFQYWBhoGIQYiBiMGJAYoBjAGNAY1BjYGNwY7BkIGQwZEBkgGUAZRBlIGVgZd +BmIGYwZkBmgGbwZwBnEGdQZ8BoAGgQaCBoMGhwaOBo8GkAaRBpYGlwacBqMGpAalBqYGqgaxBrIGswa0 +BrgGvwbABsEGwgbHBs4GzwbQBtEG1QbcBt0G3gbjBuoG6wbsBvEG9Qb8Bv0G/gb/BwMHCgcLBwwHEAcX +BxgHGQcaBx4HJQcmBycHKwcyBzMHNAc1BzoHOwdFB0YHRwdIB0sHUgdTB1QHVQdcB10HXgdlB2YHZwdw +B3EHcgdzB4MHhAeFB4YHhweIAhQAzQeKB4sHkweUB5UHlgekB6UHpgenB6gHqQezB7QHtQfDAXgHxAg6 +CEQISQhKCEsITQhbCGIIYwhkCGsIbAhtCHYISgh3CHkIfQh+CIAIiwiSCJMIlAibCJwIpQimCLAIuQhK +CLoIyAjRCNgI2QjaCOMI7AhKCO0I8gj0CPcI+AkBCQoJCwkUCEoJFQkXCScJMAk5CUIISglDCUUJTQlW +CEoJVwleCWUJZglvCEoJcAl0CXoJgQmCCYkJigmRCZIJmwhKCZwJoQmqCEoJqwmtCbIJuQm6AGYISgnD +CcgJ0QhKCdIJ1AnbCeQJ5QnuCEoJ7wnzCfQAOAn3Cm0K5AtbC1wLXQteC18LYAthC2ILYwtkC2ULZgtn +C2gLaQtqC2sLbAttC24LbwtwC3ELcgtzC3QLdQt2C3cLeAt5C3oLewt8C30Lfgt/C4ALgQuCC4MLhAuF +C4YLhwuIC4kLiguLC4wLjQuOC48LkAuRC5ILkwuUC5ULlguXC5gLmQuaC5sLnAudC54LnwugC6ELoguj +C6QLpQumC6cLqAupC6oLqwusC60LrguvC7ALsQuyC7MLtAu1C7YLtwu4C7kLugu7C7wLvQu+C78LwAvB +C8ILwwvEC8ULxgvHC8gLyQvKC8sLzgvRDHkNIQ0iDSMNJA0lDSYNJw0oDSkNKg0rDSwNLQ0uDS8NMA0x +DTINMw00DTUNNg03DTgNOQ06DTsNPA09DT4NPw1ADUENQg1DDUQNRQ1GDUcNSA1JDUoNSw1MDU0NTg1P +DVANUQ1SDVMNVA1VDVYNVw1YDVkNWg1bDVwNXQ1eDV8NYA1hDWINYw1kDWUNZg1nDWgNaQ1qDWsNbA1t +DW4Nbw1wDXENcg1zDXQNdQ12DXcNeA15DXoNew18DX0Nfg1/DYANgQ2CDYMNhA2FDYYNhw2IDYkNig2L +DYwNjQ2ODY8NkA2RDZINkw2UDZUNlg2XDZgNmQREDZoNmw2cAF0NnQ2eDZ8NoA2hDaINow2kDaUNpg2n +DagNqQ2qDasNrA2tDa4Nrw2wDbENsg2zDbQNtQ22DbcNuA25DboNuw28Db0Nvg2/DcANwQ3CDcMNxA3H +DcoNzVUkbnVsbN8QEgANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMA +JAAlACYAJwAoACkAKgArACwALQAuAC8AMFZOU1Jvb3RWJGNsYXNzXU5TT2JqZWN0c0tleXNfEA9OU0Ns +YXNzZXNWYWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlPaWRzVmFsdWVzXU5TQ29ubmVjdGlvbnNbTlNOYW1l +c0tleXNbTlNGcmFtZXdvcmtdTlNDbGFzc2VzS2V5c1pOU09pZHNLZXlzXU5TTmFtZXNWYWx1ZXNfEBlO +U0FjY2Vzc2liaWxpdHlDb25uZWN0b3JzXU5TRm9udE1hbmFnZXJfEBBOU1Zpc2libGVXaW5kb3dzXxAP +TlNPYmplY3RzVmFsdWVzXxAXTlNBY2Nlc3NpYmlsaXR5T2lkc0tleXNZTlNOZXh0T2lkXE5TT2lkc1Zh +bHVlc4ACgQOMgQIDgQLhgQOLgQEFgQJugAaBAuCBAuKBAm+BA4mAAIAHgQJtgQOKEQJWgQLj0gAOADIA +MwA0W05TQ2xhc3NOYW1lgAWAA9IADgA2ADcAOFlOUy5zdHJpbmeABF1OU0FwcGxpY2F0aW9u0gA6ADsA +PAA9WCRjbGFzc2VzWiRjbGFzc25hbWWjAD0APgA/XxAPTlNNdXRhYmxlU3RyaW5nWE5TU3RyaW5nWE5T +T2JqZWN00gA6ADsAQQBCogBCAD9eTlNDdXN0b21PYmplY3RfEBBJQkNvY29hRnJhbWV3b3Jr0gAOAEUA +RgBHWk5TLm9iamVjdHOAYKEASIAI3ABKAA4ASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBb +AFwAXQBeAF8AYFxOU1dpbmRvd1ZpZXdcTlNTY3JlZW5SZWN0XU5TV2luZG93VGl0bGVZTlNXVEZsYWdz +XU5TV2luZG93Q2xhc3NcTlNXaW5kb3dSZWN0WU5TTWF4U2l6ZV8QD05TV2luZG93QmFja2luZ18QEU5T +V2luZG93U3R5bGVNYXNrWU5TTWluU2l6ZVtOU1ZpZXdDbGFzc4ANgQEEgQEBgAoScHgAAIALgAmBAQMQ +AhAPgQECgAxfEBZ7ezYsIDQ3OX0sIHs4NjIsIDQ3NH19VEdpdFhYTlNXaW5kb3fSAA4ANgA3AGaABFRW +aWV31wBoAA4AaQBqAGsAYwBsAG0AbgBvAHAAcQBtAHNfEA9OU05leHRSZXNwb25kZXJaTlNTdWJ2aWV3 +c1hOU3ZGbGFnc1tOU0ZyYW1lU2l6ZVtOU1N1cGVydmlld4AOgHGADxEBAID/gA6BAQDSAA4ARQB1AHaA +O6QAdwB4AHkAeoAQgOKA54Dr2ABoAA4AfABpAGoAfQBjAGwAVQB/AIAAgQCCAF0AbQBVV05TRnJhbWVe +TlNEaXZpZGVyU3R5bGWADYDhgOCAEREBEoAOgA3SAA4ARQB1AIeAO6IAiACJgBKATd4AaACLAA4AjACN +AI4AaQCPAGoAawBjAGwAkACRAHcAkwCUAJUAlgCXAJgAmQCCAJoAbQB3AJ0AnltOU0hTY3JvbGxlclhO +U3NGbGFnc1xOU0Nvcm5lclZpZXdfEBBOU0hlYWRlckNsaXBWaWV3XE5TU2Nyb2xsQW10c1tOU1ZTY3Jv +bGxlcl1OU0NvbnRlbnRWaWV3gBCAR4BMEDKAHIAZgBNPEBBBIAAAQSAAAEGYAABBmAAAgEuADoAQgEOA +FNIADgBFAHUAoYA7pQCeAJ0AkwCXAJaAFIBDgEeAGYAc2gBoAA4AfACoAGkAagCpAGMAqgBsAIgArACt +AK4ArwCwALEAbQCzAIhZTlNjdkZsYWdzWU5TRG9jVmlld1lOU0JHQ29sb3KAEoBCgEEQBIAVEQkAgBaA +DoAwgBLSAA4ARQB1ALeAO6EAsYAW3xAUAGgAugAOALsAvAC9AL4AjQC/AMAAwQBqAGsAwgBjAMMAxABs +AMUAxgCeAMgAyQDKAMsAzADNAJYAzwCuANAAcADRAM0AbQDUAF4AngDWANdfEB9OU0RyYWdnaW5nU291 +cmNlTWFza0Zvck5vbkxvY2FsWU5TVHZGbGFnc1xOU0hlYWRlclZpZXdfEBFOU0JhY2tncm91bmRDb2xv +cl8QEk5TQWxsb3dzVHlwZVNlbGVjdF8QF05TSW50ZXJjZWxsU3BhY2luZ1dpZHRoXxAZTlNDb2x1bW5B +dXRvcmVzaXppbmdTdHlsZV8QGE5TSW50ZXJjZWxsU3BhY2luZ0hlaWdodFlOU0VuYWJsZWRbTlNHcmlk +Q29sb3JfEBxOU0RyYWdnaW5nU291cmNlTWFza0ZvckxvY2FsXk5TVGFibGVDb2x1bW5zW05TUm93SGVp +Z2h0gBQQAIBAE//////WQAAAgBiAPAmAHCNACAAAAAAAACNAAAAAAAAAAIAXCYAOgD2AFIAfI0AxAAAA +AAAAWns4NDUsIDEzOX3XAGgADgBqAGsAYwBsANoAlwDcAHAA3QBtAJcAsVtOU1RhYmxlVmlld4AZgBuA +GoAOgBmAFtoAaAAOAHwAqABpAGoAqQBjAKoAbACIAKwA5ACuAOUAsADLAG0AswCIgBKAQoBKgEmAGIAO +gDCAEll7ODQ1LCAxN33SADoAOwDsAO2kAO0A7gDvAD9fEBFOU1RhYmxlSGVhZGVyVmlld1ZOU1ZpZXdb +TlNSZXNwb25kZXLWAGgADgB8AGoAYwBsAIgA8gDzAHAAbQCIgBKAHoAdgA6AEl8QFHt7ODQ2LCAwfSwg +ezE2LCAxN3190gA6ADsA+AD5pAD5AO4A7wA/XV9OU0Nvcm5lclZpZXfSAA4ARQB1APyAO6IA/QD+gCCA +N9oBAAAOAQEBAgEDAQQBBQEGAQcA2gDNAQkBCgELAQwBDQEOAQ8AzQCxXk5TSXNSZXNpemVhYmxlXE5T +SGVhZGVyQ2VsbFdOU1dpZHRoWk5TRGF0YUNlbGxeTlNSZXNpemluZ01hc2taTlNNaW5XaWR0aFpOU01h +eFdpZHRoXE5TSXNFZGl0YWJsZQmANoAhI0CDAAAAAAAAgC0QAyNARAAAAAAAACNAj0AAAAAAAAmAFtcB +EwAOAL0BFAEVARYBFwEYARkBGgEbARwAyAEdW05TQ2VsbEZsYWdzWk5TQ29udGVudHNZTlNTdXBwb3J0 +XE5TQ2VsbEZsYWdzMltOU1RleHRDb2xvchIEgf4AgCyAJoAigCOAKFdTdWJqZWN01AAOASABIQEiASMB +JAElASZWTlNTaXplVk5TTmFtZVhOU2ZGbGFnc4AlI0AmAAAAAAAAgCQRDBxcTHVjaWRhR3JhbmRl0gA6 +ADsBKQEqogEqAD9WTlNGb2500wAOASwBLQEuAQ0BL1xOU0NvbG9yU3BhY2VXTlNXaGl0ZYAnSzAuMzMz +MzMyOTkA0gA6ADsBMQEyogEyAD9XTlNDb2xvctUADgEyASwBNAE1AS4BNwE4ATkBOltOU0NvbG9yTmFt +ZV1OU0NhdGFsb2dOYW1lgCeAKxAGgCqAKVZTeXN0ZW1fEA9oZWFkZXJUZXh0Q29sb3LTAA4BLAEtAS4B +DQE/gCdCMADSADoAOwFBAUKlAUIBQwFEAUUAP18QEU5TVGFibGVIZWFkZXJDZWxsXxAPTlNUZXh0Rmll +bGRDZWxsXE5TQWN0aW9uQ2VsbFZOU0NlbGzYARMADgC9ARQBFQFHARYBFwFIAUkAswFLAUwAsQFOAU9d +TlNDb250cm9sVmlldxIUIf5AgDWAMIAugC+AFhEIAIAzWVRleHQgQ2VsbNQADgEgASEBIgEjAVMBJQFV +gCUjQCoAAAAAAACAJBEEFNUADgEyASwBNAE1AS4BWAE4AVkBOoAngDKAMYApXxAWY29udHJvbEJhY2tn +cm91bmRDb2xvctMADgEsAS0BLgENAV6AJ0swLjY2NjY2NjY5ANUADgEyASwBNAE1AS4BNwE4AWIBOoAn +gCuANIApXxAQY29udHJvbFRleHRDb2xvctIAOgA7AWYBQ6QBQwFEAUUAP9IAOgA7AWgBaaIBaQA/XU5T +VGFibGVDb2x1bW7aAQAADgEBAQIBAwEEAQUBBgEHANoAzQEJAW0BbgFvAQ0BDgEPAM0AsQmANoA4I0Bs +4AAAAAAAgDoJgBbXARMADgC9ARQBFQEWARcBGAEZARoBdQEcAMgBHYAsgCaAOYAjgChWQXV0aG9y2AET +AA4AvQEUARUBRwEWARcBSAFJALMBSwFMALEBTgFPgDWAMIAugC+AFoAz0gA6ADsBgQGCowGCAYMAP15O +U011dGFibGVBcnJheVdOU0FycmF50wAOASwBLQEuAQ0BhoAnQjEA1QAOATIBLAE0ATUBLgGJATgBigE6 +gCeAP4A+gClZZ3JpZENvbG9y0wAOASwBLQEuAQ0Bj4AnRDAuNQDSADoAOwGRANqlANoBkgDuAO8AP1lO +U0NvbnRyb2xfEBV7ezEsIDE3fSwgezg0NSwgMTM5fX3SADoAOwGVAZakAZYA7gDvAD9aTlNDbGlwVmll +d9oAaAGYAA4AfABqAGMBmQBsAZoBmwCIAIgBngGfAHAAbQGhAIgBowGkWE5TVGFyZ2V0WE5TQWN0aW9u +Wk5TQ3VyVmFsdWVZTlNQZXJjZW50gBKAEoBGgESADoBFgBIjQEKAAAAAAAAjP8jtIqAAAABfEBZ7ezg0 +NiwgMTd9LCB7MTUsIDEzOX19XF9kb1Njcm9sbGVyOtIAOgA7AagBqaUBqQGSAO4A7wA/Wk5TU2Nyb2xs +ZXLaAGgBmAAOAHwAjABqAGMBmQBsAZsAiACIAZ4BrgGvAHAAbQGhAIgBs4ASgBKARoBIEAGADoBFgBIj +P+/2USAAAABfEBV7ezEsIDE1Nn0sIHs4NDUsIDE1fX3SAA4ARQB1AbeAO6EAy4AYXxATe3sxLCAwfSwg +ezg0NSwgMTd9fVp7ODYyLCAxNzJ90gA6ADsBvAG9pAG9AO4A7wA/XE5TU2Nyb2xsVmlld90AaAAOAb8A +uwB8ASoAaQBqAGMBwABsAcEBwgB3AcQBxQDIAcYBTAHIAckAbQDNAHcAzQHOXk5TVGFiVmlld0l0ZW1z +XxARTlNEcmF3c0JhY2tncm91bmRfEBZOU0FsbG93VHJ1bmNhdGVkTGFiZWxzXxAVTlNTZWxlY3RlZFRh +YlZpZXdJdGVtgBCA34BzgHKAL4BOECSADgmAEAmAdNIADgBFAHUB0YA7oQHSgE/XAGgADgB8AGkAagBj +AGwAiQBuAdYB1wBwAG0AiYBNgHGAcIBQgA6ATdIADgBFAHUB3IA7oQHdgFHdAGgADgB8Ad8B4AHhAGoB +4gHjAGMB5ABsAeUB0gHnAegAzQHqAesAggHsAM0AbQHsAdIB8VpBbGxvd3NVbmRvW1ByZWZlcmVuY2Vz +W05TRHJhZ1R5cGVzWUdyb3VwTmFtZV8QElVzZUJhY2tGb3J3YXJkTGlzdFlGcmFtZU5hbWVdTlNOZXh0 +S2V5Vmlld4BPgG+AYQmAZIBSgGMJgA6AY4BPgGLSAA4ARQBGAfSAYK0B9QH2AfcB+AH5AfoB+wH8Af0B +/gH/AgACAYBTgFSAVYBWgFeAWIBZgFqAW4BcgF2AXoBfXxAZTmVYVCBSVEZEIHBhc3RlYm9hcmQgdHlw +ZVpwdWJsaWMudXJsXxASTlNTdHJpbmdQYm9hcmRUeXBlXxAeTmVYVCBUSUZGIHY0LjAgcGFzdGVib2Fy +ZCB0eXBlXxAZQXBwbGUgVVJMIHBhc3RlYm9hcmQgdHlwZV8QIUFwcGxlIFdlYiBBcmNoaXZlIHBhc3Rl +Ym9hcmQgdHlwZV8QG1dlYlVSTHNXaXRoVGl0bGVzUGJvYXJkVHlwZV8QD3B1YmxpYy51cmwtbmFtZV8Q +GkFwcGxlIEhUTUwgcGFzdGVib2FyZCB0eXBlXxAVTlNGaWxlbmFtZXNQYm9hcmRUeXBlXxAXTlNDb2xv +ciBwYXN0ZWJvYXJkIHR5cGVfEBpBcHBsZSBQSUNUIHBhc3RlYm9hcmQgdHlwZV8QKk5lWFQgUmljaCBU +ZXh0IEZvcm1hdCB2MS4wIHBhc3RlYm9hcmQgdHlwZdIAOgA7AhACEaMCEQISAD9cTlNNdXRhYmxlU2V0 +VU5TU2V0XxAWe3stMywgLTN9LCB7ODQ4LCAxOTV9fVDTAA4CFgIXAhgB7AIaWklkZW50aWZpZXJWVmFs +dWVzgG6AY4Bl0wAOAhwARQIdAh4CI1dOUy5rZXlzgG2kAh8CIAIhAiKAZoBngGiAaaQCJAIlAiQCJ4Bq +gGuAaoBsXxAaV2ViS2l0RGVmYXVsdEZpeGVkRm9udFNpemVfEBVXZWJLaXRNaW5pbXVtRm9udFNpemVf +EBVXZWJLaXREZWZhdWx0Rm9udFNpemVfEBFXZWJLaXRKYXZhRW5hYmxlZBAMCNIAOgA7Ai8CMKMCMAIx +AD9fEBNOU011dGFibGVEaWN0aW9uYXJ5XE5TRGljdGlvbmFyedIAOgA7AjMCNKICNAA/XldlYlByZWZl +cmVuY2Vz0gA6ADsCNgI3pAI3AO4A7wA/V1dlYlZpZXdfEBZ7ezEwLCAzM30sIHs4NDIsIDE5NX190gA6 +ADsCOgDuowDuAO8AP18QFnt7MCwgMTczfSwgezg2MiwgMjQxfX3SAA4ARQB1Aj6AO6MBzgJAAkGAdIB6 +gNHWAA4CQwDuAkQBMgJFAkYCRwHSAIkCSgJLXE5TSWRlbnRpZmllcllOU1RhYlZpZXdXTlNMYWJlbIB5 +gHWAT4BNgHeAdlExV0RldGFpbHPVAA4BMgEsATQBNQEuAVgBOAJRATqAJ4AygHiAKVxjb250cm9sQ29s +b3LSADoAOwJVAlaiAlYAP11OU1RhYlZpZXdJdGVt1gAOAkMA7gJEATICRQJGAlkCWgCJAkoCXYB5gHuA +fIBNgHeA0FEy1QBoAA4AfABpAGoAKwBuAmICYwBwgACAcYDPgH3SAA4ARQB1AmaAO6ECZ4B+2wBoAIsA +DgB8AIwAaQBqAGwAkAHlAJECWgJqAJQCbAJtAm4AggJaAnACcQJxgHyAzIBMgM4QEoB/gHyAyoCAgIDS +AA4ARQB1AnWAO6MCcQJwAmqAgIDKgMzbAGgADgB8AnoAqABpAGoAqQCqAGwB5QJnAKwCfQJ+AK4CfwCw +AoAAzAJnAoBYTlNDdXJzb3KAfoBCgMaAx4CBgIKAPIB+gILSAA4ARQB1AoaAO6ECgICC2wBoAA4CiQKK +AosAagBrAFACjABsAo0CcQKPApABOAKRApICkwKUApUCcQArXxAPTlNUZXh0Q29udGFpbmVyWU5TVFZG +bGFnc1xOU1NoYXJlZERhdGFYTlNNaW5pemVaTlNEZWxlZ2F0ZYCAgMWAhIC3EQkSgIOAw4DEgICAAFl7 +ODMxLCA3MH3VApoADgKbAQICnAGvAp0CgAKfAqBZTlNUQ0ZsYWdzWk5TVGV4dFZpZXdfEA9OU0xheW91 +dE1hbmFnZXKAtoCCI0CJ+AAAAAAAgIXVAA4CogKjAqQCjQKlAqYCpwE4ACtfEBBOU1RleHRDb250YWlu +ZXJzXU5TVGV4dFN0b3JhZ2VZTlNMTUZsYWdzgLWAtICGgADUAA4CqgA+Ao0CqwKsAq0AK1xOU0F0dHJp +YnV0ZXOAs4CIgIeAANIADgA2ADcCsYAEXxECXkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBlciBlbGl0IGxh +bWV0LCBjb25zZWN0ZXRhdXIgY2lsbGl1bSBhZGlwaXNpY2luZyBwZWN1LCBzZWQgZG8gZWl1c21vZCB0 +ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBh +ZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5p +c2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9y +IGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBm +dWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24g +cHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQg +ZXN0IGxhYm9ydW0gRXQgaGFydW1kIHVuZCBsb29rdW0gbGlrZSBHcmVlayB0byBtZSwgZGVyZXVkIGZh +Y2lsaXMgZXN0IGVyIGV4cGVkaXQgZGlzdGluY3QuIE5hbSBsaWJlciB0ZSBjb25zY2llbnQgdG8gZmFj +dG9yIHR1bSBwb2VuIGxlZ3VtIG9kaW9xdWUgY2l2aXVkYdMADgIcAEUCswK0AreAsqICtQK2gImAiqIC +uAK5gIuAsF8QEE5TUGFyYWdyYXBoU3R5bGXTArwADgK9Ar4CvwENWk5TVGFiU3RvcHNbTlNBbGlnbm1l +bnSAjICv0gAOAEUCwQLCgK6vECACwwLEAsUCxgLHAsgCyQLKAssCzALNAs4CzwLQAtEC0gLTAtQC1QLW +AtcC2ALZAtoC2wLcAt0C3gLfAuAC4QLigI2Aj4CQgJGAkoCTgJSAlYCWgJeAmICZgJqAm4CcgJ2AnoCf +gKCAoYCigKOApIClgKaAp4CogKmAqoCrgKyArdIADgLkAuUC5lpOU0xvY2F0aW9ugI4jAAAAAAAAAADS +ADoAOwLoAumiAukAP1lOU1RleHRUYWLSAA4C5ALlAuyAjiNATAAAAAAAANIADgLkAuUC74COI0BcAAAA +AAAA0gAOAuQC5QLygI4jQGUAAAAAAADSAA4C5ALlAvWAjiNAbAAAAAAAANIADgLkAuUC+ICOI0BxgAAA +AAAA0gAOAuQC5QL7gI4jQHUAAAAAAADSAA4C5ALlAv6AjiNAeIAAAAAAANIADgLkAuUDAYCOI0B8AAAA +AAAA0gAOAuQC5QMEgI4jQH+AAAAAAADSAA4C5ALlAweAjiNAgYAAAAAAANIADgLkAuUDCoCOI0CDQAAA +AAAA0gAOAuQC5QMNgI4jQIUAAAAAAADSAA4C5ALlAxCAjiNAhsAAAAAAANIADgLkAuUDE4COI0CIgAAA +AAAA0gAOAuQC5QMWgI4jQIpAAAAAAADSAA4C5ALlAxmAjiNAjAAAAAAAANIADgLkAuUDHICOI0CNwAAA +AAAA0gAOAuQC5QMfgI4jQI+AAAAAAADSAA4C5ALlAyKAjiNAkKAAAAAAANIADgLkAuUDJYCOI0CRgAAA +AAAA0gAOAuQC5QMogI4jQJJgAAAAAADSAA4C5ALlAyuAjiNAk0AAAAAAANIADgLkAuUDLoCOI0CUIAAA +AAAA0gAOAuQC5QMxgI4jQJUAAAAAAADSAA4C5ALlAzSAjiNAleAAAAAAANIADgLkAuUDN4COI0CWwAAA +AAAA0gAOAuQC5QM6gI4jQJegAAAAAADSAA4C5ALlAz2AjiNAmIAAAAAAANIADgLkAuUDQICOI0CZYAAA +AAAA0gAOAuQC5QNDgI4jQJpAAAAAAADSAA4C5ALlA0aAjiNAmyAAAAAAANIAOgA7A0gBg6IBgwA/0gA6 +ADsDSgK6ogK6AD/UAA4BIAEhASIBIwNNA04DT4AlI0AkAAAAAAAAgLEQEFZNb25hY2/SADoAOwNSAjGi +AjEAP9IAOgA7A1QCo6QCowNVA1YAP18QGU5TTXV0YWJsZUF0dHJpYnV0ZWRTdHJpbmdfEBJOU0F0dHJp +YnV0ZWRTdHJpbmfSAA4ARQB1A1mAO6ECkICE0gA6ADsDXAKcogKcAD/SADoAOwNeAomiAokAP9gADgNg +A2EDYgC9A2MDZANlA2YDZwArATcAzANrACsDbVdOU0ZsYWdzXxAXTlNEZWZhdWx0UGFyYWdyYXBoU3R5 +bGVfEBBOU0luc2VydGlvbkNvbG9yXxAUTlNTZWxlY3RlZEF0dHJpYnV0ZXNfEBJOU01hcmtlZEF0dHJp +YnV0ZXNfEBBOU0xpbmtBdHRyaWJ1dGVzgMIRCUGAAIArgDyAuIAAgL/TAA4CHABFArMDcANzgLKiA3ED +coC5gLqiA3QDdYC7gL3VAA4BMgEsATQBNQEuAVgBOAN5ATqAJ4AygLyAKV8QG3NlbGVjdGVkVGV4dEJh +Y2tncm91bmRDb2xvctUADgEyASwBNAE1AS4BNwE4A38BOoAngCuAvoApXxARc2VsZWN0ZWRUZXh0Q29s +b3LTAA4CHABFArMDhAOHgLKiA3IDhoC6gMCiA4gCJYDBgGtbTlNVbmRlcmxpbmXTAA4BLAOMAS4BrwOO +VU5TUkdCgCdGMCAwIDEA0gA6ADsDkAORogORAD9fEBROU1RleHRWaWV3U2hhcmVkRGF0YVx7ODUxLCAx +ZSswN31YezIyMywgMH3SADoAOwOVApulApsDlgDuAO8AP1ZOU1RleHRfEBR7ezEsIDF9LCB7ODMxLCAx +OTN9fdMADgOZA5oDmwOcAa9ZTlNIb3RTcG90XE5TQ3Vyc29yVHlwZYDJgMhXezQsIC01fdIAOgA7A58C +eqICegA/2ABoAZgADgB8AGoBmQBsAZsCZwJnAZ4DpABwAaECZwOngH6AfoBGgMuARYB+Iz/p8imAAAAA +XxAVe3s4MzIsIDF9LCB7MTUsIDE5M3192gBoAZgADgB8AIwAagGZAGwBmgGbAmcCZwGeA60BrwBwAaEC +ZwOwA7GAfoB+gEaAzYBFgH4jP/AAAAAAAAAjP+5CyGAAAABfEBh7ey0xMDAsIC0xMDB9LCB7ODcsIDE4 +fX1TUmF31gAOAkMA7gJEATICRQJGA7YDtwCJAkoDuoB5gNKA04BNgHeA3lZJdGVtIDLVAGgADgB8AGkA +agArAG4DvwPAAHCAAIBxgN2A1NIADgBFAHUDw4A7oQPEgNXeAGgADgB8A8YDxwPIA8kAvgBqAMIDygPL +AGwDzAO3A84DzwPQA9ED0gPTAM0D1QDNA9cBOAO3Aa9fEA9OU1BhdGhTZXBhcmF0b3JZTlNCckZsYWdz +XxAVTlNQcmVmZXJlZENvbHVtbldpZHRoXxAPTlNDZWxsUHJvdG90eXBlXxAQTlNNaW5Db2x1bW5XaWR0 +aF8QGE5TTnVtYmVyT2ZWaXNpYmxlQ29sdW1uc18QFE5TQ29sdW1uUmVzaXppbmdUeXBlgNOA3IDWgNsS +HAFAACNAWQAAAAAAAIDXCREBDAkQZIDTXxAWe3sxNywgMTd9LCB7ODA4LCAxOTV9fdUBEwAOARQBFQEW +A9sD3APdA94BThIEAf5AgNqA2IDZUSDUAA4BIAEhASIBIwPiASUDT4AlI0AoAAAAAAAAgCTSADoAOwPl +A+ajA+YBRQA/XU5TQnJvd3NlckNlbGxRL9IAOgA7A+kD6qUD6gGSAO4A7wA/WU5TQnJvd3NlclRUcmVl +0gA6ADsD7QJEpAJEAO4A7wA/XxAVe3swLCAyNX0sIHs4NjIsIDQxNH190gA6ADsD8APxpAPxAO4A7wA/ +W05TU3BsaXRWaWV32ABoAA4AfAFFAGoAwgBjAGwAVQP0A/UD9gP3AM0AbQBVgA2A5oDjgOQRASQJgA6A +DV8QE3t7MywgMH0sIHszMDUsIDE3fX3YARMADgC9ARQBFQFHARYBFwPbAUkCSgP/AUwAeAQCAU+ANYB3 +gOWAL4DiEhBABACAM1VMYWJlbNIAOgA7BAYEB6UEBwGSAO4A7wA/W05TVGV4dEZpZWxk2ABoAA4AfAFF +AGoAwgBjAGwAVQP0BAsEDAPVAM0AbQBVgA2A5oDogOkJgA6ADV8QFXt7MywgNDQ3fSwgezE1OSwgMTd9 +fdgBEwAOAL0BFAEVAUcBFgEXA9sBSQJKBBQBTAB5BAIBT4A1gHeA6oAvgOeAM18QF1Nob3dpbmcgYnJh +bmNoICdtYXN0ZXIn2ABoAA4AfAFFAGoAwgBjAGwAVQQbBBwEHQQeAM0AbQBVgA2A/oDsgO0RAQkJgA6A +DV8QF3t7NjU5LCA0NDd9LCB7MTgzLCAyMn193QETAA4EJAC9ARUBRwEWBCUBwAQmBCcEKAEXBCkEKgQr +BCwBTAB6BC8BrwDNBDEEMgQzAU9fEBJOU0NhbmNlbEJ1dHRvbkNlbGxfEBBOU1RleHRCZXplbFN0eWxl +XxASTlNTZWFyY2hCdXR0b25DZWxsXxAQTlNNYXhpbXVtUmVjZW50c18QE05TUGxhY2Vob2xkZXJTdHJp +bmcSFHH+QID9gPWA74AvgOsSEAAEAAmA8RD/gO6AM9UADgEyASwBNAE1AS4AzAE4BDgBOoAngDyA8IAp +XxATdGV4dEJhY2tncm91bmRDb2xvctwBmAETAA4EPAQ9BD4BFAFHBD8BFgGZBEAEHQRCBEMERADIAewE +RgB6BEgAyARJBEpfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNCdXR0b25GbGFnczJfEA9OU0tleUVxdWl2 +YWxlbnRfEA9OU1BlcmlvZGljRGVsYXldTlNCdXR0b25GbGFnc4DtEgAB/gCA9BBLgGOA8oDrEQGQgPMS +CERA/1ZzZWFyY2hfEBNfc2VhcmNoRmllbGRTZWFyY2g60gA6ADsETgRPpARPAUQBRQA/XE5TQnV0dG9u +Q2VsbN0BmAETAA4EPAQ9BD4EUQEUAUcEPwEWAZkEQAQdBEIEQwREAMgB7ARVBFYAegRIAMgEWARKXxAj +TlNBY2Nlc3NpYmlsaXR5T3ZlcnJpZGRlbkF0dHJpYnV0ZXOA7YD0gGOA94D2gOuA/FVjbGVhctIADgBF +AHUEXIA7oQRdgPjTAA4CHABFAh0EYARjgG2iBGEEYoD5gPqiBGQCJYD7gGtdQVhEZXNjcmlwdGlvbl8Q +KU5TQWNjZXNzaWJpbGl0eUVuY29kZWRBdHRyaWJ1dGVzVmFsdWVUeXBlVmNhbmNlbF8QE19zZWFyY2hG +aWVsZENhbmNlbDrSADoAOwRrBGylBGwBQwFEAUUAP18QEU5TU2VhcmNoRmllbGRDZWxs0gA6ADsEbgRv +pgRvBAcBkgDuAO8AP11OU1NlYXJjaEZpZWxkWns4NjIsIDQ3NH1fEBZ7ezAsIDB9LCB7MTY4MCwgMTAy +OH19WnsyMTMsIDEyOX1fEBp7My40MDI4MmUrMzgsIDMuNDAyODJlKzM4fdIAOgA7BHUEdqIEdgA/XxAQ +TlNXaW5kb3dUZW1wbGF0ZdIADgBFAHUEeYA7rxAxBHoEewR8BH0EfgR/BIAEgQSCBIMEhASFBIYEhwSI +BIkEigSLBIwEjQSOBI8EkASRBJIEkwSUBJUElgSXBJgEmQSaBJsEnASdBJ4EnwSgBKEEogSjBKQEpQSm +BKcEqASpBKqBAQaBARSBASaBASiBASyBAS6BATOBATmBAT6BAUSBAUmBAU6BAVOBAViBAVyBAWCBAWWB +AWuBAXGBAXWBAXeBAXyBAYKBAYaBAYqBAY+BAZOBAZmBAZ6BAaCBAaWBAaqBAa+BAbSBAbiBAbyBAb2B +AcKBAcaBAcuBAc+BAdSBAdaBAduBAd+BAeKBAeWBAfOBAf3TAA4ErAJFBK0ErgSvWE5TU291cmNlgQET +gQEHgQES2AAOBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvgS/V05TVGl0bGVfEBFOU0tleUVxdWl2 +TW9kTWFza1pOU0tleUVxdWl2XU5TTW5lbW9uaWNMb2NZTlNPbkltYWdlXE5TTWl4ZWRJbWFnZVZOU01l +bnWBARGBAQkSABAAAIEBChJ/////gQELgQEPgQEI0wAOBLEEwQTCBMMExFtOU01lbnVJdGVtc4ECFoEC +CIECCWYAUAByAGkAbgB0ICZRcNMADgAyBMgEyQTKBMteTlNSZXNvdXJjZU5hbWWBAQ6BAQyBAQ1XTlNJ +bWFnZV8QD05TTWVudUNoZWNrbWFya9IAOgA7BM8E0KIE0AA/XxAQTlNDdXN0b21SZXNvdXJjZdMADgAy +BMgEyQTKBNSBAQ6BAQyBARBfEBBOU01lbnVNaXhlZFN0YXRl0gA6ADsE1wTYogTYAD9aTlNNZW51SXRl +bVZwcmludDrSADoAOwTbBNyjBNwE3QA/XxAVTlNOaWJDb250cm9sQ29ubmVjdG9yXk5TTmliQ29ubmVj +dG9y1AAOBN8ErAJFBOAE4QTiBONdTlNEZXN0aW5hdGlvboEBJYEBF4EBFYEBJNIADgAyADME5oAFgQEW +XxASUEJXZWJHaXRDb250cm9sbGVy2QTpAA4E6gTrBOwE7QTuBO8E8ADNBPIAzQT0AM0E9gDNAM0AzV8Q +Gk5TRmlsdGVyUmVzdHJpY3RzSW5zZXJ0aW9uXxAUTlNQcmVzZXJ2ZXNTZWxlY3Rpb25fEA9fTlNNYW5h +Z2VkUHJveHlaTlNFZGl0YWJsZV5OU0RlY2xhcmVkS2V5c18QIk5TQ2xlYXJzRmlsdGVyUHJlZGljYXRl +T25JbnNlcnRpb25fEBhOU1NlbGVjdHNJbnNlcnRlZE9iamVjdHNfEBZOU0F2b2lkc0VtcHR5U2VsZWN0 +aW9uCYEBIwmBASEJgQEYCQkJ0gAOAEUAdQT8gDuoBP0E/gT/BQAFAQUCBQMFBIEBGYEBGoEBG4EBHIEB +HYEBHoEBH4EBIFNhcnJUc2VsZlNzaGFXZGV0YWlsc1dzdWJqZWN0VkBjb3VudFtzZWxmLkBjb3VudFZh +dXRob3LRAA4FDoEBItIAOgA7BRAE66IE6wA/0gA6ADsFEgUTpAUTBRQFFQA/XxARTlNBcnJheUNvbnRy +b2xsZXJfEBJOU09iamVjdENvbnRyb2xsZXJcTlNDb250cm9sbGVyXxARY29tbWl0c0NvbnRyb2xsZXLS +ADoAOwUYBRmjBRkE3QA/XxAUTlNOaWJPdXRsZXRDb25uZWN0b3LUAA4E3wSsAkUE4AHdBOIFHoEBJYBR +gQEVgQEnVHZpZXfUAA4E3wSsAkUE4AUiBOIFJIEBJYEBKYEBFYEBK9IADgAyADMFJ4AFgQEqXxATR2l0 +VGVzdF9BcHBEZWxlZ2F0ZVpjb250cm9sbGVy1AAOBN8ErAJFBOAFIgAfBS6BASWBASmAAoEBLVhkZWxl +Z2F0ZdMADgSsAkUErQUyBTOBAROBAS+BATLYAA4EsQSyBLMEtAS1BLYEtwS4BTYEugHsBLwEvQS+BTqB +ARGBATGAY4EBC4EBD4EBMNMADgSxBMEEwgU9BT6BAhaBAjaBAjdWRGVsZXRlV2RlbGV0ZTrUAA4E3wSs +AkUErQAfBUQFRYEBE4ACgQE0gQE42AAOBLEEsgSzBLQEtQS2BLcEuAVIBLoFSQS8BL0EvgVMgQERgQE2 +gQE3gQELgQEPgQE11AAOBLEBIQTBBMIFTwVQBVGBAhaBAiGBAjKBAiNcSGlkZSBHaXRUZXN0UWhVaGlk +ZTrTAA4ErAJFBK0FVwVYgQETgQE6gQE91wAOBLEEswS0BLUEtgS3BLgFWwHsBLwEvQS+BV+BARGBATyA +Y4EBC4EBD4EBO9MADgSxBMEEwgViBWOBAhaBAlGBAlNdU3RvcCBTcGVha2luZ11zdG9wU3BlYWtpbmc6 +0wAOBKwCRQStBWgFaYEBE4EBP4EBQ9gADgSxBLIEswS0BLUEtgS3BLgFbAS6BW0EvAS9BL4FcIEBEYEB +QYEBQoEBC4EBD4EBQNMADgSxBMEEwgVzBXSBAhaBAmeBAmlcR2l0VGVzdCBIZWxwUT9Zc2hvd0hlbHA6 +0wAOBKwCRQStBXoFe4EBE4EBRYEBSNgADgSxBLIEswS0BLUEtgS3BLgFfgS6AewEvAS9BL4FgoEBEYEB +R4BjgQELgQEPgQFG1AAOBLEBIQTBBMIFhQWGBYeBAhaBAmKBAmWBAmNUWm9vbVxwZXJmb3JtWm9vbTrT +AA4ErAJFBK0FjAWNgQETgQFKgQFN2AAOBLEEsgSzBLQEtQS2BLcEuAWQBLoFkQS8BL0EvgS/gQERgQFL +gQFMgQELgQEPgQEIVUNsb3NlUXddcGVyZm9ybUNsb3NlOtMADgSsAkUErQWaBZuBAROBAU+BAVLYAA4E +sQSyBLMEtAS1BLYEtwS4BZ4EugWfBLwEvQS+BTqBARGBAVCBAVGBAQuBAQ+BATBUQ29weVFjVWNvcHk6 +0wAOBKwCRQStBagFqYEBE4EBVIEBV9gADgSxBLIEswS0BLUEtgS3BLgFrAS6Ba0EvAS9BL4FOoEBEYEB +VYEBVoEBC4EBD4EBMFRVbmRvUXpVdW5kbzrUAA4E3wSsAkUErQAfBbcFuIEBE4ACgQFZgQFb1wAOBLEE +swS0BLUEtgS3BLgFuwHsBLwEvQS+BUyBARGBAVqAY4EBC4EBD4EBNV1BYm91dCBHaXRUZXN0XxAdb3Jk +ZXJGcm9udFN0YW5kYXJkQWJvdXRQYW5lbDrUAA4E3wSsAkUErQAfBcUFxoEBE4ACgQFdgQFf2AAOBLEE +sgSzBLQEtQS2BLcEuAXJBLoB7AS8BL0EvgVMgQERgQFegGOBAQuBAQ+BATVYU2hvdyBBbGxfEBZ1bmhp +ZGVBbGxBcHBsaWNhdGlvbnM60wAOBKwCRQStBdIF04EBE4EBYYEBZNgADgSxBLIEswS0BLUEtgS3BLgF +1gS6BdcEvAS9BL4FgoEBEYEBYoEBY4EBC4EBD4EBRlhNaW5pbWl6ZVFtXxATcGVyZm9ybU1pbmlhdHVy +aXplOtMADgSsAkUErQXgBeGBAROBAWaBAWrYAA4EsQSyBLMEtAS1BLYEtwS4BeQEugXlBLwEvQS+BeiB +ARGBAWiBAWmBAQuBAQ+BAWfTAA4EsQTBBMIF6wXsgQIWgQJAgQJCXkNoZWNrIFNwZWxsaW5nUTteY2hl +Y2tTcGVsbGluZzrTAA4ErAJFBK0F8gXzgQETgQFsgQFw2QAOBLEEsgSzBLQEtQS2BLcF9QS4BfcEugX4 +BLwEvQS+BfsBDVVOU1RhZ4EBEYEBboEBb4EBC4EBD4EBbdMADgSxBMEEwgX+Bf+BAhaBAj2BAj5dRmlu +ZCBQcmV2aW91c1FHXxAXcGVyZm9ybUZpbmRQYW5lbEFjdGlvbjrTAA4ErAJFBK0GBQXzgQETgQFygQFw +2QAOBLEEsgSzBLQEtQS2BLcF9QS4BgkEugYKBLwEvQS+BfsBr4EBEYEBc4EBdIEBC4EBD4EBbWUARgBp +AG4AZCAmUWbUAA4E3wSsAkUE4ABIBSIGFIEBJYAIgQEpgQF2VndpbmRvd9MADgSsAkUErQYYBhmBAROB +AXiBAXvYAA4EsQSyBLMEtAS1BLYEtwS4BhwEugYdBLwEvQS+BfuBARGBAXmBAXqBAQuBAQ+BAW1fEBFK +dW1wIHRvIFNlbGVjdGlvblFqXxAdY2VudGVyU2VsZWN0aW9uSW5WaXNpYmxlQXJlYTrTAA4ErAJFBK0G +JgYngQETgQF9gQGB2AAOBLEEsgSzBLQEtQS2BLcEuAYqBisGLAS8BL0EvgYvgQERgQF/EgAYAACBAYCB +AQuBAQ+BAX7TAA4EsQTBBMIGMgYzgQIWgQJcgQJeXFNob3cgVG9vbGJhclF0XxATdG9nZ2xlVG9vbGJh +clNob3duOtMADgSsAkUErQY5BjqBAROBAYOBAYXYAA4EsQSyBLMEtAS1BLYEtwS4Bj0EugHsBLwEvQS+ +Bi+BARGBAYSAY4EBC4EBD4EBfm8QEgBDAHUAcwB0AG8AbQBpAHoAZQAgAFQAbwBvAGwAYgBhAHIgJl8Q +H3J1blRvb2xiYXJDdXN0b21pemF0aW9uUGFsZXR0ZTrTAA4ErAJFBK0GRgXzgQETgQGHgQFw2QAOBLEE +sgSzBLQEtQS2BLcF9QS4BkoEugZLBLwEvQS+BfsGT4EBEYEBiIEBiYEBC4EBD4EBbRAHXxAWVXNlIFNl +bGVjdGlvbiBmb3IgRmluZFFl0wAOBKwCRQStBlQGVYEBE4EBi4EBjtgADgSxBLIEswS0BLUEtgS3BLgG +WAS6AewEvAS9BL4GXIEBEYEBjYBjgQELgQEPgQGM1AAOBLEBIQTBBMIGXwZgBmGBAhaBAhOBAhWBAhRa +Q2xlYXIgTWVudV8QFWNsZWFyUmVjZW50RG9jdW1lbnRzOtMADgSsAkUErQZmBmeBAROBAZCBAZLXAA4E +sQSzBLQEtQS2BLcEuAZqAewEvAS9BL4FX4EBEYEBkYBjgQELgQEPgQE7XlN0YXJ0IFNwZWFraW5nXnN0 +YXJ0U3BlYWtpbmc60wAOBKwCRQStBnMGdIEBE4EBlIEBmNgADgSxBLIEswS0BLUEtgS3BLgGdwS6BngE +vAS9BL4Ge4EBEYEBloEBl4EBC4EBD4EBldMADgSxBMEEwgZ+Bn+BAhaBAleBAlhbU2hvdyBDb2xvcnNR +Q18QFW9yZGVyRnJvbnRDb2xvclBhbmVsOtMADgSsAkUErQaFBoaBAROBAZqBAZ3YAA4EsQSyBLMEtAS1 +BLYEtwS4BokEugaKBLwEvQS+BTqBARGBAZuBAZyBAQuBAQ+BATBTQ3V0UXhUY3V0OtQADgTfBKwCRQTg +BOIB3QaVgQElgQEVgFGBAZ9fEBFmcmFtZUxvYWREZWxlZ2F0ZdQADgTfBKwCRQStAB8GmgabgQETgAKB +AaGBAaTYAA4EsQSyBLMEtAS1BLYEtwS4Bp4EugafBLwEvQS+BUyBARGBAaKBAaOBAQuBAQ+BATVcUXVp +dCBHaXRUZXN0UXFadGVybWluYXRlOtMADgSsAkUErQaoBqmBAROBAaaBAanYAA4EsQSyBLMEtAS1BLYE +twS4BqwEugatBLwEvQS+BTqBARGBAaeBAaiBAQuBAQ+BATBUUmVkb1FaVXJlZG860wAOBKwCRQStBrYG +t4EBE4EBq4EBrtgADgSxBLIEswS0BLUEtgS3BLgGugS6BrsEvAS9BL4F6IEBEYEBrIEBrYEBC4EBD4EB +Z24AUwBoAG8AdwAgAFMAcABlAGwAbABpAG4AZyAmUTpfEA9zaG93R3Vlc3NQYW5lbDrUAA4E3wSsAkUE +rQUiBsUGxoEBE4EBKYEBsIEBs9gADgSxBLIEswS0BLUEtgS3BLgGyQS6BsoEvAS9BL4Ev4EBEYEBsYEB +soEBC4EBD4EBCFRTYXZlUXNbc2F2ZUFjdGlvbjrTAA4ErAJFBK0G0wbUgQETgQG1gQG32AAOBLEEsgSz +BLQEtQS2BLcEuAbXBLoB7AS8BL0EvgXogQERgQG2gGOBAQuBAQ+BAWdfEBtDaGVjayBTcGVsbGluZyBX +aGlsZSBUeXBpbmdfEB50b2dnbGVDb250aW51b3VzU3BlbGxDaGVja2luZzrUAA4E3wSsAkUErQAfBuEG +4oEBE4ACgQG5gQG72AAOBLEEsgSzBLQEtQS2BLcEuAblBisFSQS8BL0EvgVMgQERgQG6gQE3gQELgQEP +gQE1W0hpZGUgT3RoZXJzXxAWaGlkZU90aGVyQXBwbGljYXRpb25zOtQADgTfBKwCRQTgBSIASAUugQEl +gQEpgAiBAS3TAA4ErAJFBK0G8wb0gQETgQG+gQHB2AAOBLEEsgSzBLQEtQS2BLcEuAb3BLoG+AS8BL0E +vgS/gQERgQG/gQHAgQELgQEPgQEIawBQAGEAZwBlACAAUwBlAHQAdQBwICZRUF5ydW5QYWdlTGF5b3V0 +OtMADgSsAkUErQcBBwKBAROBAcOBAcXYAA4EsQSyBLMEtAS1BLYEtwS4BwUEugHsBLwEvQS+BYKBARGB +AcSAY4EBC4EBD4EBRl8QEkJyaW5nIEFsbCB0byBGcm9udF8QD2FycmFuZ2VJbkZyb250OtMADgSsAkUE +rQcOBw+BAROBAceBAcrYAA4EsQSyBLMEtAS1BLYEtwS4BxIEugcTBLwEvQS+BTqBARGBAciBAcmBAQuB +AQ+BATBVUGFzdGVRdlZwYXN0ZTrTAA4ErAJFBK0HHAXzgQETgQHMgQFw2QAOBLEEsgSzBLQEtQS2BLcF +9QS4ByAEugchBLwEvQS+BfsAXYEBEYEBzYEBzoEBC4EBD4EBbVlGaW5kIE5leHRRZ9MADgSsAkUErQcp +ByqBAROBAdCBAdPYAA4EsQSyBLMEtAS1BLYEtwS4By0EugcuBLwEvQS+BTqBARGBAdGBAdKBAQuBAQ+B +ATBaU2VsZWN0IEFsbFFhWnNlbGVjdEFsbDrUAA4E3wSsAkUE4AUiBOEHOYEBJYEBKYEBF4EB1Vdjb250 +ZW501wAOBN8HPAc9BKwCRQc+Bz8FIgdBB0IE4QdEAF1ZTlNLZXlQYXRoWU5TQmluZGluZ18QHE5TTmli +QmluZGluZ0Nvbm5lY3RvclZlcnNpb26BAdqBASmBAdmBAdiBAReBAddfECBjb250ZW50QXJyYXk6IHJl +cG9zaXRvcnkuY29tbWl0c1xjb250ZW50QXJyYXlfEBJyZXBvc2l0b3J5LmNvbW1pdHPSADoAOwdJB0qj +B0oE3QA/XxAVTlNOaWJCaW5kaW5nQ29ubmVjdG9y1wAOBN8HPAc9BKwCRQc+Bz8E4QdOB08A/gdRAF2B +AdqBAReBAd6BAd2AN4EB3F8QHXZhbHVlOiBhcnJhbmdlZE9iamVjdHMuYXV0aG9yVXZhbHVlXxAWYXJy +YW5nZWRPYmplY3RzLmF1dGhvctcADgTfBzwHPQSsAkUHPgc/BOEHWAdPAP0HWwBdgQHagQEXgQHhgQHd +gCCBAeBfEB52YWx1ZTogYXJyYW5nZWRPYmplY3RzLnN1YmplY3RfEBdhcnJhbmdlZE9iamVjdHMuc3Vi +amVjdNcADgTfBzwHPQSsAkUHPgc/BOEHYQdPAoAHZABdgQHagQEXgQHkgQHdgIKBAeNfEBh2YWx1ZTog +c2VsZWN0aW9uLmRldGFpbHNfEBFzZWxlY3Rpb24uZGV0YWlsc9gADgTfBzwHPQSsAkUHaAc+Bz8E4Qdr +B2wAeAduB28AXVlOU09wdGlvbnOBAdqBAReBAeiBAeeA4oEB5oEB6V8QLGRpc3BsYXlQYXR0ZXJuVmFs +dWUxOiBhcnJhbmdlZE9iamVjdHMuQGNvdW50XxAUZGlzcGxheVBhdHRlcm5WYWx1ZTFfEBZhcnJhbmdl +ZE9iamVjdHMuQGNvdW500wAOAhwARQKzB3UHfICypgd2B3cHeAd5B3oHe4EB6oEB64EB7IEB7YEB7oEB +76YHfQd+B38HfQd9B32BAfCBAfGBAfKBAfCBAfCBAfBfEBFOU051bGxQbGFjZWhvbGRlcl8QHE5TUmFp +c2VzRm9yTm90QXBwbGljYWJsZUtleXNfEBBOU0Rpc3BsYXlQYXR0ZXJuXxAaTlNOb3RBcHBsaWNhYmxl +UGxhY2Vob2xkZXJfEBhOU05vU2VsZWN0aW9uUGxhY2Vob2xkZXJfEBtOU011bHRpcGxlVmFsdWVzUGxh +Y2Vob2xkZXIJXxAZJXt2YWx1ZTF9QCBjb21taXRzIGxvYWRlZNgADgTfBzwHPQSsAkUHaAc+Bz8E4QeO +B48AegeRB5IAXYEB2oEBF4EB9oEB9YDrgQH0gQH3XxAacHJlZGljYXRlOiBmaWx0ZXJQcmVkaWNhdGVZ +cHJlZGljYXRlXxAPZmlsdGVyUHJlZGljYXRl0wAOAhwARQKzB5gHnoCypQd3B5oHmwecB52BAeuBAfiB +AfmBAfqBAfulB34CJwehAicEM4EB8YBsgQH8gGyA7l8QFk5TVmFsaWRhdGVzSW1tZWRpYXRlbHlfEBFO +U1ByZWRpY2F0ZUZvcm1hdF8QJk5TQWx3YXlzUHJlc2VudHNBcHBsaWNhdGlvbk1vZGFsQWxlcnRzXU5T +RGlzcGxheU5hbWVfEBpzdWJqZWN0IGNvbnRhaW5zW2NdICR2YWx1ZdkADgTfBzwHPQeqBKwCRQdoBz4H +PwThB44HrgSpAHoHsQeyAF1fEBNOU1ByZXZpb3VzQ29ubmVjdG9ygQHagQEXgQH2gQH/gQHzgOuBAf6B +AgBfEBtwcmVkaWNhdGUyOiBmaWx0ZXJQcmVkaWNhdGVacHJlZGljYXRlMtMADgIcAEUCswe3B72AsqUH +dweaB5sHnAedgQHrgQH4gQH5gQH6gQH7pQd+AicHwAInB8KBAfGAbIECAYBsgQICXxAWYXV0aG9yIGNv +bnRhaW5zICR2YWx1ZdIADgBFAsEHxoCurxBzB8cCZwB3B8oHywfMB80GJgWoBgUA/gJaBB0H1AZcBToF +ggbTB9kFaACJAEgH3QXSB98H4AfhB+IGOQfkAP0FegS/Bw4GcwHSB+sF4AbzBXAF+wCxBAwAkwO3AoAD +xAbhBnsAeQVfAQwBbwVEBhgH/gf/BcUFTAgCBlQCQQcpBqgGZgZGBK4ICggLBTIIDQDLAJ0D9ggRCBII +EwXoCBUIFggXCBgFVwbFAmoIHABVAIgGmgaFAd0IIgJACCQFmgB4Bi8FIgHOBOEIKwXyCC0HHAa2BbcI +MQgyBYwE4gJwBwEAegg4CDmBAgSAfoAQgQIFgQJmgQJkgQIsgQF9gQFUgQFygDeAfIDtgQIggQGMgQEw +gQFGgQG1gQIzgQE/gE2ACIECJYEBYYECWYECW4ECMIECToEBg4ECOIAggQFFgQEIgQHHgQGUgE+BAhuB +AWaBAb6BAUCBAW2AFoDpgEeA04CCgNWBAbmBAZWA54EBO4AtgDqBATSBAXiBAkWBAkyBAV2BATWBAhCB +AYuA0YEB0IEBpoEBkIEBh4EBB4ECQ4ECUIEBL4ECP4AYgEOA5IECHYECF4ECCoEBZ4ECSoECSIECKIEC +OoEBOoEBsIDMgQIxgA2AEoEBoYEBmoBRgQIpgHqBAg2BAU+A4oEBfoEBKYB0gQEXgQJrgQFsgQI5gQHM +gQGrgQFZgQJUgQIkgQFKgQEVgMqBAcOA64ECGIECX9oADgg7BLEEsgSzBLQEtQS2BLcBmQS4BL8IPgS6 +AewEvAS9BL4HyghDWU5TU3VibWVudYEBEYEBCIECBoBjgQELgQEPgQIFgQIH1AAOBLEBIQTBBMIIRghH +CEiBAhaBAh6BAmqBAh9URmlsZV5zdWJtZW51QWN0aW9uOtIADgA2ADcISYAE0gAOAEUAdQhPgDurCBMI +JAgCCBIFjAbFCDgH6wgRBvMEroECCoECDYECEIECF4EBSoEBsIECGIECG4ECHYEBvoEBB9gADgSxBLIE +swS0BLUEtgS3BLgIXQS6CF4EvAS9BL4Ev4EBEYECC4ECDIEBC4EBD4EBCFNOZXdRbtgADgSxBLIEswS0 +BLUEtgS3BLgIZgS6CGcEvAS9BL4Ev4EBEYECDoECD4EBC4EBD4EBCFdPcGVuLi4uUW/aAA4IOwSxBLIE +swS0BLUEtgS3AZkEuAZcCHAEugHsBLwEvQS+BL8IdYEBEYEBjIECEYBjgQELgQEPgQEIgQISW09wZW4g +UmVjZW500gAOADYANwh2gATSAA4ARQB1CHuAO6EGVIEBi18QFl9OU1JlY2VudERvY3VtZW50c01lbnXS +ADoAOwh/BLeiBLcAP9oADgSxBLIIgQSzCIIEtAS1BLYEtwS4AewEugDNAewAzQS8BL0EvgS/XU5TSXNT +ZXBhcmF0b3JcTlNJc0Rpc2FibGVkgQERgGMJgGMJgQELgQEPgQEI2AAOBLEEsgSzBLQEtQS2BLcEuAiN +BLoIjgS8BL0EvgS/gQERgQIZgQIagQELgQEPgQEIaABTAGEAdgBlACAAQQBzICZRU9cADgSxBLMEtAS1 +BLYEtwS4CJYB7AS8BL0EvgS/gQERgQIcgGOBAQuBAQ+BAQhfEA9SZXZlcnQgdG8gU2F2ZWTaAA4EsQSy +CIEEswiCBLQEtQS2BLcEuAHsBLoAzQHsAM0EvAS9BL4Ev4EBEYBjCYBjCYEBC4EBD4EBCFhNYWluTWVu +ddIADgBFAHUIqIA7pwfUB8cH2QgxB+AIOQfLgQIggQIEgQIzgQJUgQJbgQJfgQJm2gAOCDsEsQSyBLME +tAS1BLYEtwGZBLgFTAVPBLoB7AS8BL0EvgfKCLiBARGBATWBAiGAY4EBC4EBD4ECBYECIldHaXRUZXN0 +0gAOAEUAdQi8gDurBbcIMgfdCBcIIgfhBUQG4QXFCBwGmoEBWYECJIECJYECKIECKYECMIEBNIEBuYEB +XYECMYEBodoADgSxBLIIgQSzCIIEtAS1BLYEtwS4AewEugDNAewAzQS8BL0EvgVMgQERgGMJgGMJgQEL +gQEPgQE12AAOBLEEsgSzBLQEtQS2BLcEuAjTBLoI1AS8BL0EvgVMgQERgQImgQIngQELgQEPgQE1bABQ +AHIAZQBmAGUAcgBlAG4AYwBlAHMgJlEs2gAOBLEEsgiBBLMIggS0BLUEtgS3BLgB7AS6AM0B7ADNBLwE +vQS+BUyBARGAYwmAYwmBAQuBAQ+BATXaAA4IOwSxBLIEswS0BLUEtgS3AZkEuAfNCOYEugHsBLwEvQS+ +BUwI64EBEYECLIECKoBjgQELgQEPgQE1gQIrWFNlcnZpY2Vz1AAOBLEBIQTBBMII7wjwCPGBAhaBAi2B +Ai+BAi7SAA4ANgA3COyABNIADgBFAHUI9oA7oF8QD19OU1NlcnZpY2VzTWVuddoADgSxBLIIgQSzCIIE +tAS1BLYEtwS4AewEugDNAewAzQS8BL0EvgVMgQERgGMJgGMJgQELgQEPgQE12gAOBLEEsgiBBLMIggS0 +BLUEtgS3BLgB7AS6AM0B7ADNBLwEvQS+BUyBARGAYwmAYwmBAQuBAQ+BATVcX05TQXBwbGVNZW512gAO +CDsEsQSyBLMEtAS1BLYEtwGZBLgFOgkOBLoB7AS8BL0EvgfKCROBARGBATCBAjSAY4EBC4EBD4ECBYEC +NVRFZGl00gAOADYANwkUgATSAA4ARQB1CRmAO60FqAaoB+QGhQWaBw4FMgcpCC0IGAgNB/4IC4EBVIEB +poECOIEBmoEBT4EBx4EBL4EB0IECOYECOoECP4ECRYECUNoADgSxBLIIgQSzCIIEtAS1BLYEtwS4AewE +ugDNAewAzQS8BL0EvgU6gQERgGMJgGMJgQELgQEPgQEw2gAOBLEEsgiBBLMIggS0BLUEtgS3BLgB7AS6 +AM0B7ADNBLwEvQS+BTqBARGAYwmAYwmBAQuBAQ+BATDaAA4IOwSxBLIEswS0BLUEtgS3AZkEuAX7CTwE +ugHsBLwEvQS+BToJQYEBEYEBbYECO4BjgQELgQEPgQEwgQI8VEZpbmTSAA4ANgA3CUKABNIADgBFAHUJ +R4A7pQYFBxwF8gZGBhiBAXKBAcyBAWyBAYeBAXjaAA4IOwSxBLIEswS0BLUEtgS3AZkEuAXoBesEugHs +BLwEvQS+BToJVYEBEYEBZ4ECQIBjgQELgQEPgQEwgQJBXxAUU3BlbGxpbmcgYW5kIEdyYW1tYXLSAA4A +RQB1CVmAO6QGtgXgBtMICoEBq4EBZoEBtYECQ9gADgSxBLIEswS0BLUEtgS3BLgJYAS6AewEvAS9BL4F +6IEBEYECRIBjgQELgQEPgQFnXxAbQ2hlY2sgR3JhbW1hciBXaXRoIFNwZWxsaW5n2gAOCDsEsQSyBLME +tAS1BLYEtwGZBLgIFglpBLoB7AS8BL0EvgU6CW6BARGBAkiBAkaAY4EBC4EBD4EBMIECR11TdWJzdGl0 +dXRpb25z0wAOBLEEwQTCCWkJc4ECFoECRoECSdIADgBFAHUJdoA7owgVB/8H4oECSoECTIECTtgADgSx +BLIEswS0BLUEtgS3BLgJfAS6BgoEvAS9BL4IFoEBEYECS4EBdIEBC4EBD4ECSF8QEFNtYXJ0IENvcHkv +UGFzdGXYAA4EsQSyBLMEtAS1BLYEtwS4CYQEugchBLwEvQS+CBaBARGBAk2BAc6BAQuBAQ+BAkhcU21h +cnQgUXVvdGVz2AAOBLEEsgSzBLQEtQS2BLcEuAmMBLoF+AS8BL0EvggWgQERgQJPgQFvgQELgQEPgQJI +W1NtYXJ0IExpbmtz2gAOCDsEsQSyBLMEtAS1BLYEtwGZBLgFXwViBLoB7AS8BL0EvgU6CZqBARGBATuB +AlGAY4EBC4EBD4EBMIECUlZTcGVlY2jSAA4ARQB1CZ6AO6IGZgVXgQGQgQE62gAOCDsEsQSyBLMEtAS1 +BLYEtwGZBLgGewmkBLoB7AS8BL0EvgfKCamBARGBAZWBAlWAY4EBC4EBD4ECBYECVlZGb3JtYXTSAA4A +NgA3CaqABNIADgBFAHUJr4A7ogffBnOBAlmBAZTYAA4EsQSyBLMEtAS1BLYEtwS4CbQEugYsBLwEvQS+ +BnuBARGBAlqBAYCBAQuBAQ+BAZVaU2hvdyBGb250c9oADgg7BLEEsgSzBLQEtQS2BLcBmQS4Bi8GMgS6 +AewEvAS9BL4HygnCgQERgQF+gQJcgGOBAQuBAQ+BAgWBAl3SAA4ARQB1CcWAO6IGJgY5gQF9gQGD2gAO +CDsEsQSyBLMEtAS1BLYEtwGZBLgFggnLBLoB7AS8BL0EvgfKCdCBARGBAUaBAmCAY4EBC4EBD4ECBYEC +YVZXaW5kb3fSAA4ANgA3CdGABNIADgBFAHUJ1oA7pAXSBXoHzAcBgQFhgQFFgQJkgQHD2gAOBLEEsgiB +BLMIggS0BLUEtgS3BLgB7AS6AM0B7ADNBLwEvQS+BYKBARGAYwmAYwmBAQuBAQ+BAUZeX05TV2luZG93 +c01lbnXaAA4IOwSxBLIEswS0BLUEtgS3AZkEuAVwBXMEugHsBLwEvQS+B8oJ7YEBEYEBQIECZ4BjgQEL +gQEPgQIFgQJoVEhlbHDSAA4ARQB1CfGAO6EFaIEBP1tfTlNNYWluTWVuddIADgAyADMJ9oAFgQJs0gAO +AEUCwQn5gK6vEHMHygJaAFUAHwfKBYIIIgYvBToF+wCxAkAAegfKCAIH2Qg5BegHygVwAHcAHwVMBYIG +ewfKBUwIFgYvBToAsQWCB8cFOgZ7Ac4EvwXoBL8HywgYAIgAeQCIAkECZwO3BUwIMQBVCAsA/QD+BUwF ++wU6CBYFTAfUBL8GXACJBToFOgVfBfsEvwXoBToFOgU6AIgAiAB4BL8EvwS/CA0IFgf+BUwFOgVfBL8C +ZwVMAEgAdwVMBToB0gVMAIkEvwU6AFUH4AAfAIkAHwAfBfsFOgX7BegFTAfKBUwEvwAfAmcFggBVBL8H +yoECBYB8gA2AAoECBYEBRoECKYEBfoEBMIEBbYAWgHqA64ECBYECEIECM4ECX4EBZ4ECBYEBQIAQgAKB +ATWBAUaBAZWBAgWBATWBAkiBAX6BATCAFoEBRoECBIEBMIEBlYB0gQEIgQFngQEIgQJmgQI6gBKA54AS +gNGAfoDTgQE1gQJUgA2BAlCAIIA3gQE1gQFtgQEwgQJIgQE1gQIggQEIgQGMgE2BATCBATCBATuBAW2B +AQiBAWeBATCBATCBATCAEoASgOKBAQiBAQiBAQiBAj+BAkiBAkWBATWBATCBATuBAQiAfoEBNYAIgBCB +ATWBATCAT4EBNYBNgQEIgQEwgA2BAluAAoBNgAKAAoEBbYEBMIEBbYEBZ4EBNYECBYEBNYEBCIACgH6B +AUaADYEBCIECBdIADgBFAsEKb4CurxB0B8cHygfLAHcGJgfMB80CZwWoBgUA/gJaBB0H1AU6BlwFggbT +B9kFaACJAEgH3QXSB98H4AfhB+IGOQfkAP0FegS/Bw4GcwHSB+sF4AbzBXAF+wCxBAwG4QCTA7cGewPE +AoAAeQVfAQwBbwVEB/4H/wYYAB8FxQVMCAIHKQaoAkEGVAZmBkYErggLCAoFMggNAMsAnQP2CBEIEggT +BegIFQgWCBcIGAVXBsUCaggcAFUAiAaaBoUB3QgiAkAIJAUiAHgGLwWaAc4E4QgrBfIILQccBrYFtwgx +CDIE4gWMBwECcAB6CDgIOYECBIECBYECZoAQgQF9gQJkgQIsgH6BAVSBAXKAN4B8gO2BAiCBATCBAYyB +AUaBAbWBAjOBAT+ATYAIgQIlgQFhgQJZgQJbgQIwgQJOgQGDgQI4gCCBAUWBAQiBAceBAZSAT4ECG4EB +ZoEBvoEBQIEBbYAWgOmBAbmAR4DTgQGVgNWAgoDngQE7gC2AOoEBNIECRYECTIEBeIACgQFdgQE1gQIQ +gQHQgQGmgNGBAYuBAZCBAYeBAQeBAlCBAkOBAS+BAj+AGIBDgOSBAh2BAheBAgqBAWeBAkqBAkiBAiiB +AjqBATqBAbCAzIECMYANgBKBAaGBAZqAUYECKYB6gQINgQEpgOKBAX6BAU+AdIEBF4ECa4EBbIECOYEB +zIEBq4EBWYECVIECJIEBFYEBSoEBw4DKgOuBAhiBAl/SAA4ARQLBCuaArq8QdArnCEYK6QrqCusK7Art +Cu4K7wrwCvEK8grzCvQK9Qr2CvcK+Ar5CvoK+wnLCv0K/gr/CwALAQsCCwMLBAsFCwYLBwsICwkLCgsL +CwwLDQsOCw8LEAsRCxILEwYyCxULFgsXCxgLGQsaCxsLHAsdCx4LHwsgCyELIgsjCyQLJQsmCycLKAsp +CyoLKwssCy0LLgsvCzALMQsyCzMLNAs1CzYLNws4CzkLOgs7CzwLPQs+Cz8LQAtBC0ILQwtEC0UFJwtH +C0gLSQtKC0sLTAtNC04LTwtQC1ELUgtTC1QLVQtWC1cLWAtZC1qBAnCBAh6BAnGBAnKBAnOBAnSBAnWB +AnaBAneBAniBAnmBAnqBAnuBAnyBAn2BAn6BAn+BAoCBAoGBAoKBAoOBAmCBAoSBAoWBAoaBAoeBAoiB +AomBAoqBAouBAoyBAo2BAo6BAo+BApCBApGBApKBApOBApSBApWBApaBApeBApiBApmBApqBAlyBApuB +ApyBAp2BAp6BAp+BAqCBAqGBAqKBAqOBAqSBAqWBAqaBAqeBAqiBAqmBAqqBAquBAqyBAq2BAq6BAq+B +ArCBArGBArKBArOBArSBArWBAraBAreBAriBArmBArqBAruBAryBAr2BAr6BAr+BAsCBAsGBAsKBAsOB +AsSBAsWBAsaBAseBAsiBAsmBAsqBAsuBASqBAsyBAs2BAs6BAs+BAtCBAtGBAtKBAtOBAtSBAtWBAtaB +AteBAtiBAtmBAtqBAtuBAtyBAt2BAt6BAt9fEBBNZW51IEl0ZW0gKEZpbGUpXxAQTWVudSBJdGVtIChI +ZWxwKVpTcGxpdCBWaWV3XxAYTWVudSBJdGVtIChTaG93IFRvb2xiYXIpW1NlcGFyYXRvci04XxAPTWVu +dSAoU2VydmljZXMpXVNjcm9sbCBWaWV3LTFfEBBNZW51IEl0ZW0gKFVuZG8pbxARAE0AZQBuAHUAIABJ +AHQAZQBtACAAKABGAGkAbgBkICYAKV8QFVRhYmxlIENvbHVtbiAoQXV0aG9yKVZWaWV3LTFfEBFTZWFy +Y2ggRmllbGQgQ2VsbF8QE01lbnUgSXRlbSAoR2l0VGVzdClbTWVudSAoRWRpdClfEBJNZW51IChPcGVu +IFJlY2VudCldTWVudSAoV2luZG93KV8QJ01lbnUgSXRlbSAoQ2hlY2sgU3BlbGxpbmcgV2hpbGUgVHlw +aW5nKV8QEE1lbnUgSXRlbSAoRWRpdClfEBhNZW51IEl0ZW0gKEdpdFRlc3QgSGVscClfECFUb3AgVGFi +IFZpZXcgKERldGFpbHMsIFJhdywgVHJlZSlvEBgATQBlAG4AdQAgAEkAdABlAG0AIAAoAFAAcgBlAGYA +ZQByAGUAbgBjAGUAcyAmAClfEBRNZW51IEl0ZW0gKE1pbmltaXplKV8QFk1lbnUgSXRlbSAoU2hvdyBG +b250cylfEBBNZW51IEl0ZW0gKFZpZXcpW1NlcGFyYXRvci0yXxAXTWVudSBJdGVtIChTbWFydCBMaW5r +cylvEB4ATQBlAG4AdQAgAEkAdABlAG0AIAAoAEMAdQBzAHQAbwBtAGkAegBlACAAVABvAG8AbABiAGEA +ciAmAClbU2VwYXJhdG9yLTZfEBZUYWJsZSBDb2x1bW4gKFN1YmplY3QpXxAQTWVudSBJdGVtIChab29t +KVtNZW51IChGaWxlKV8QEU1lbnUgSXRlbSAoUGFzdGUpXxAXTWVudSBJdGVtIChTaG93IENvbG9ycylW +Vmlldy0yXxAbTWVudSBJdGVtIChSZXZlcnQgdG8gU2F2ZWQpXxAaTWVudSBJdGVtIChDaGVjayBTcGVs +bGluZylvEBcATQBlAG4AdQAgAEkAdABlAG0AIAAoAFAAYQBnAGUAIABTAGUAdAB1AHAgJgApW01lbnUg +KEhlbHApW01lbnUgKEZpbmQpXxAcVGFibGUgVmlldyAoU3ViamVjdCwgQXV0aG9yKV8QKVRleHQgRmll +bGQgQ2VsbCAoU2hvd2luZyBicmFuY2ggJ21hc3RlcicpXxAXTWVudSBJdGVtIChIaWRlIE90aGVycylf +EBNIb3Jpem9udGFsIFNjcm9sbGVyXU1lbnUgKEZvcm1hdClXQnJvd3NlcllUZXh0IFZpZXdfECVTdGF0 +aWMgVGV4dCAoU2hvd2luZyBicmFuY2ggJ21hc3RlcicpXU1lbnUgKFNwZWVjaClfEB1UZXh0IEZpZWxk +IENlbGwgKFRleHQgQ2VsbCktMV8QG1RleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKV8QGE1lbnUgSXRl +bSAoSGlkZSBHaXRUZXN0KV8QGU1lbnUgSXRlbSAoU3Vic3RpdHV0aW9ucylfEBhNZW51IEl0ZW0gKFNt +YXJ0IFF1b3RlcylfEB1NZW51IEl0ZW0gKEp1bXAgdG8gU2VsZWN0aW9uKVxGaWxlJ3MgT3duZXJfEBRN +ZW51IEl0ZW0gKFNob3cgQWxsKV5NZW51IChHaXRUZXN0KV8QF01lbnUgSXRlbSAoT3BlbiBSZWNlbnQp +XxAWTWVudSBJdGVtIChTZWxlY3QgQWxsKV8QEE1lbnUgSXRlbSAoUmVkbylfEBRUYWIgVmlldyBJdGVt +IChUcmVlKV8QFk1lbnUgSXRlbSAoQ2xlYXIgTWVudSlfEBpNZW51IEl0ZW0gKFN0YXJ0IFNwZWFraW5n +KV8QIk1lbnUgSXRlbSAoVXNlIFNlbGVjdGlvbiBmb3IgRmluZClvEBIATQBlAG4AdQAgAEkAdABlAG0A +IAAoAFAAcgBpAG4AdCAmAClfEBJNZW51IEl0ZW0gKFNwZWVjaClfECdNZW51IEl0ZW0gKENoZWNrIEdy +YW1tYXIgV2l0aCBTcGVsbGluZylfEBJNZW51IEl0ZW0gKERlbGV0ZSlfECBNZW51IEl0ZW0gKFNwZWxs +aW5nIGFuZCBHcmFtbWFyKV8QEVRhYmxlIEhlYWRlciBWaWV3XxARVmVydGljYWwgU2Nyb2xsZXJfEBdU +ZXh0IEZpZWxkIENlbGwgKExhYmVsKVlTZXBhcmF0b3JbU2VwYXJhdG9yLTFfEA9NZW51IEl0ZW0gKE5l +dylfEBtNZW51IChTcGVsbGluZyBhbmQgR3JhbW1hcilfEBxNZW51IEl0ZW0gKFNtYXJ0IENvcHkvUGFz +dGUpXxAUTWVudSAoU3Vic3RpdHV0aW9ucylbU2VwYXJhdG9yLTNfEBBNZW51IEl0ZW0gKEZpbmQpXxAZ +TWVudSBJdGVtIChTdG9wIFNwZWFraW5nKV8QEE1lbnUgSXRlbSAoU2F2ZSlfEBVIb3Jpem9udGFsIFNj +cm9sbGVyLTFbU2VwYXJhdG9yLTRcQ29udGVudCBWaWV3W1Njcm9sbCBWaWV3XxAYTWVudSBJdGVtIChR +dWl0IEdpdFRlc3QpXxAPTWVudSBJdGVtIChDdXQpWFdlYiBWaWV3XxAUTWVudSBJdGVtIChTZXJ2aWNl +cylfEBNUYWIgVmlldyBJdGVtIChSYXcpXxATTWVudSBJdGVtIChPcGVuLi4uKV8QE1N0YXRpYyBUZXh0 +IChMYWJlbClbTWVudSAoVmlldylfEBBNZW51IEl0ZW0gKENvcHkpXxAXVGFiIFZpZXcgSXRlbSAoRGV0 +YWlscylfEBFDb21taXRzQ29udHJvbGxlcltBcHBsaWNhdGlvbl8QGU1lbnUgSXRlbSAoRmluZCBQcmV2 +aW91cylbU2VwYXJhdG9yLTdfEBVNZW51IEl0ZW0gKEZpbmQgTmV4dClvEBoATQBlAG4AdQAgAEkAdABl +AG0AIAAoAFMAaABvAHcAIABTAHAAZQBsAGwAaQBuAGcgJgApXxAZTWVudSBJdGVtIChBYm91dCBHaXRU +ZXN0KV8QEk1lbnUgSXRlbSAoRm9ybWF0KVtTZXBhcmF0b3ItNV8QEldlYiBHaXQgQ29udHJvbGxlcl8Q +EU1lbnUgSXRlbSAoQ2xvc2UpXxAeTWVudSBJdGVtIChCcmluZyBBbGwgdG8gRnJvbnQpXxATVmVydGlj +YWwgU2Nyb2xsZXItMVxTZWFyY2ggRmllbGRvEBQATQBlAG4AdQAgAEkAdABlAG0AIAAoAFMAYQB2AGUA +IABBAHMgJgApXxASTWVudSBJdGVtIChXaW5kb3cp0gAOAEUCwQvNgK6g0gAOAEUCwQvQgK6g0gAOAEUC +wQvTgK6vEKUElwfHAmcAdwfKB8sHzAfNBiYEfwWoBgUA/gSSAloEkwSbBB0EoAfUBlwFOgWCBIYEegSZ +BtMH2QVoAIkEjwBIB90F0gffB+AH4QSDB+IEjAY5BJ8EkAfkAP0FegS/Bw4GcwHSB+sF4AbzBJwEjQVw +BfsAsQQMAJMDtwKAA8QG4QZ7BIIElQSiAHkFXwEMBJQBbwVEBhgH/gf/BJ4AHwXFBUwIAgZUAkEHKQao +BIAEfgSRBKEGZgSqBkYErgSKBJ0ICggLBTIEfQSBCA0EmADLBI4AnQP2CBEIEggTBegIFQSEBJoEpAgW +BKMIFwgYBVcElgbFBKYCaggcAFUAiAaaBoUEfAHdBIsIIgJACCQEhwWaAHgGLwUiAc4E4QSnCCsF8ggt +BxwGtgW3CDEEewSJBIUIMgSpBYwE4gSoAnAHAQB6CDgEpQSICDmBAaCBAgSAfoAQgQIFgQJmgQJkgQIs +gQF9gQEugQFUgQFygDeBAYqAfIEBj4EBtIDtgQHGgQIggQGMgQEwgQFGgQFTgQEGgQGqgQG1gQIzgQE/ +gE2BAXyACIECJYEBYYECWYECW4ECMIEBRIECToEBcYEBg4EBwoEBgoECOIAggQFFgQEIgQHHgQGUgE+B +AhuBAWaBAb6BAbiBAXWBAUCBAW2AFoDpgEeA04CCgNWBAbmBAZWBAT6BAZmBAc+A54EBO4AtgQGTgDqB +ATSBAXiBAkWBAkyBAb2AAoEBXYEBNYECEIEBi4DRgQHQgQGmgQEzgQEsgQGGgQHLgQGQgQH9gQGHgQEH +gQFlgQG8gQJDgQJQgQEvgQEogQE5gQI/gQGlgBiBAXeAQ4DkgQIdgQIXgQIKgQFngQJKgQFJgQGvgQHW +gQJIgQHUgQIogQI6gQE6gQGegQGwgQHfgMyBAjGADYASgQGhgQGagQEmgFGBAWuBAimAeoECDYEBWIEB +T4DigQF+gQEpgHSBAReBAeKBAmuBAWyBAjmBAcyBAauBAVmBAlSBARSBAWCBAU6BAiSBAfOBAUqBARWB +AeWAyoEBw4DrgQIYgQHbgQFcgQJf0gAOAEUCwQx7gK6vEKUMfAx9DH4MfwyADIEMggyDDIQMhQyGDIcM +iAyJDIoMiwyMDI0MjgyPDJAMkQySDJMMlAyVDJYMlwyYDJkMmgybDJwMnQyeDJ8MoAyhDKIMowykDKUM +pgynDKgMqQyqDKsMrAytDK4MrwywDLEMsgyzDLQMtQy2DLcMuAy5DLoMuwy8DL0Mvgy/DMAMwQzCDMMM +xAzFDMYMxwzIDMkMygzLDMwMzQzODM8M0AzRDNIM0wzUDNUM1gzXDNgM2QzaDNsM3AzdDN4M3wzgDOEM +4gzjDOQM5QzmDOcM6AzpDOoM6wzsDO0M7gzvDPAM8QzyDPMM9Az1DPYM9wz4DPkM+gz7DPwM/Qz+DP8N +AA0BDQINAw0EDQUNBg0HDQgNCQ0KDQsNDA0NDQ4NDw0QDRENEg0TDRQNFQ0WDRcNGA0ZDRoNGw0cDR0N +Hg0fDSCBAuSBAuWBAuaBAueBAuiBAumBAuqBAuuBAuyBAu2BAu6BAu+BAvCBAvGBAvKBAvOBAvSBAvWB +AvaBAveBAviBAvmBAvqBAvuBAvyBAv2BAv6BAv+BAwCBAwGBAwKBAwOBAwSBAwWBAwaBAweBAwiBAwmB +AwqBAwuBAwyBAw2BAw6BAw+BAxCBAxGBAxKBAxOBAxSBAxWBAxaBAxeBAxiBAxmBAxqBAxuBAxyBAx2B +Ax6BAx+BAyCBAyGBAyKBAyOBAySBAyWBAyaBAyeBAyiBAymBAyqBAyuBAyyBAy2BAy6BAy+BAzCBAzGB +AzKBAzOBAzSBAzWBAzaBAzeBAziBAzmBAzqBAzuBAzyBAz2BAz6BAz+BA0CBA0GBA0KBA0OBA0SBA0WB +A0aBA0eBA0iBA0mBA0qBA0uBA0yBA02BA06BA0+BA1CBA1GBA1KBA1OBA1SBA1WBA1aBA1eBA1iBA1mB +A1qBA1uBA1yBA12BA16BA1+BA2CBA2GBA2KBA2OBA2SBA2WBA2aBA2eBA2iBA2mBA2qBA2uBA2yBA22B +A26BA2+BA3CBA3GBA3KBA3OBA3SBA3WBA3aBA3eBA3iBA3mBA3qBA3uBA3yBA32BA36BA3+BA4CBA4GB +A4KBA4OBA4SBA4WBA4aBA4eBA4gQixBTEQI+EQG0EB0QZxDzEIIRAVUQwxCeEJoRAcUQfxECOREBARDA +EQIJELAQOBB9EKkQ8hC0EFYQvBC/EKMQbxECMREBVhAVEIEQ9hEBUBEBUhCQEPgQ2BDHEQFUEPkRAVcQ +nBEBxhD0EFEQqxEBURECNBBwEL0QTRCSENAQahCfEQHEEQH/EQHWEQJHEQJBEQJJEJERAQcQehCvELMR +Af4Q4REBxxEBWREByBCGEJsQ1hDbEFcRAlUQlhA5EHwQfhECRhCsEK0QmBDOEMoQyBDjEQIMEKEQThC+ +EM8Q1BDgEKQRAkwRAQIQuBCyEQHXEMsRAdURAfQQShBPEFIQuRDaEMEQ0xEBjxDXEQGMEI8QqBDkEQJU +EQINEQJAEJURAcAQiBCgEQJNEQJIEMkQgxECMhBIEI4QnREB8xEBUxDNEQIzEQGLEQJFE//////////9 +EKIQrhCnELsQOhEBBhECUxD3ELUQxBECCxBJEQJLEQH9EQI/EPURAggQUBECDhCZEPHSAA4ARQB1DcaA +O6DSAA4ARQLBDcmArqDSAA4ARQLBDcyArqDSADoAOw3ODc+iDc8AP15OU0lCT2JqZWN0RGF0YQAIABkA +IgAnADEAOgA/AEQAUgBUAGYHhAeKB9UH3AfjB/EIAwgfCC0IOQhFCFMIXghsCIgIlgipCLsI1QjfCOwI +7gjxCPQI9wj6CP0JAAkCCQUJCAkLCQ4JEAkSCRUJGAkbCR4JJwkzCTUJNwlACUoJTAlaCWMJbAl3CX4J +kAmZCaIJqwmwCb8J0gnbCeYJ6AnrCe0KHgorCjgKRgpQCl4Kawp1CocKmwqlCrEKswq2CrkKuwrACsIK +xArHCskKywrOCtAK6QruCvcLAAsCCwcLJAs2C0ELSgtWC2ILZAtmC2gLawttC28Lcgt7C30LhguIC4oL +jAuOC68LtwvGC8gLygvMC84L0QvTC9UL3gvgC+UL5wvpDCIMLgw3DEQMVwxkDHAMfgyADIIMhAyGDIgM +igyMDJ8MoQyjDKUMpwypDLIMtAy/DMEMwwzFDMcMyQzyDPwNBg0QDRINFA0WDRgNGg0dDR8NIQ0jDSUN +Lg0wDTMNNQ2IDaoNtA3BDdUN6g4EDiAOOw5FDlEOcA5/DosOjQ6PDpEOmg6cDp4Onw6hDqoOsw61DrYO +uA66DrwOvg7HDtIO7w77Dv0O/w8BDwMPBQ8HDzAPMg80DzYPOA86DzwPPg9AD0oPUw9cD3APdw+DD5wP +ng+gD6IPpA+mD70Pxg/PD90P5g/oD+0P7w/xEBoQKRA2ED4QSRBYEGMQbhB7EHwQfhCAEIkQixCNEJYQ +nxCgEKIQvxDLENYQ4BDtEPkQ/hEAEQIRBBEGEQgREBEhESgRLxE4EToRQxFFEUgRVRFeEWMRahF3EYQR +jBGOEZoRoxGoEbARxRHREd8R4RHjEeUR5xHpEfASAhIPEhESFBIdEigSPBJOElsSYhKDEpESlhKYEpoS +nBKeEqASoxKlEq8SwBLCEssSzRLQEuUS5xLpEusS7RMGExMTFRMhEzYTOBM6EzwTPhNRE1oTYxNsE3ET +fxOoE6kTqxOtE7YTuBO5E7sT2BPaE9wT3hPgE+IT6RQKFAwUDhQQFBIUFBQWFB8UJhQ1FD0UShRMFE8U +ZBRmFGgUahRsFHYUgxSFFIoUkxSeFKgUwBTJFNIU3RUGFQ8VGBUjFS0VLxUxFTMVNRU3FTkVOxVEFU0V +ZhVzFXwVhxWSFbsVvRW/FcEVwxXFFccVyRXLFdQV7BX1FfcV+hX8FhIWHRYmFi8WPBZxFoAWlBatFsUW +xxbJFssWzRbPFtEW0xbVFtYW2BbZFtsW5BbmFukW6xcIFwoXDBcOFxAXEhcUFx0XHxciFyQXWRdkF3AX +fBeGF5sXpRezF7UXtxe5F7oXvBe+F8AXwRfDF8UXxxfJF9IX1BfvF/EX8xf1F/cX+Rf7F/0X/xgBGAMY +BRgHGAkYJRgwGEUYZhiCGKYYxBjWGPMZCxklGUIZbxl4GX8ZjBmSGasZrBm5GcQZyxnNGc8Z0RneGeYZ +6BnxGfMZ9Rn3GfkaAhoEGgYaCBoKGicaPxpXGmsabRpuGncafhqUGqEaqhqvGr4axxrQGtga8Rr6GwEb +GhsjGyUbLBsuGzAbMhtLG1gbYhtqG2wbbhtwG3IbdBt2G3gbgBuVG5cbmRubG50bqhuzG7gbxhvfG+Eb +4xvlG+cb6RvrG+0cAhwEHAYcCBwKHBMcFRwYHBocRxxJHEscTRxPHFEcUxxVHFccWRxbHGQcZhxtHG8c +cRxzHKAcqRyrHK0crxyxHLMctRy3HLkcuxzEHMYcyRzLHPgdCh0UHSEdKh01HTcdOR07HT0dQB1CHUQd +Rh1IHUodVB1pHXMdfh2QHZIdlB2dHZ8dtB3HHdUd3x3hHeMd5R3nHfgeBR4HHgkeCx4NHhYeGCB6IIcg +iSCOIJAgkiCXIJkgmyCuILsgxiDSINQg1iDfIOEhJCEmISghKiEsIS4hMCEyITQhNiE4ITohPCE+IUAh +QiFEIUYhSCFKIUwhTiFQIVIhVCFWIVghWiFcIV4hYCFiIWQhbSF4IXohgyGMIZEhmyGkIaYhryG4Iboh +wyHMIc4h1yHgIeIh6yH0IfYh/yIIIgoiEyIcIh4iJyIwIjIiOyJEIkYiTyJYIloiYyJsIm4idyKAIoIi +iyKUIpYinyKoIqoisyK8Ir4ixyLQItIi2yLkIuYi7yL4IvojAyMMIw4jFyMgIyIjKyM0IzYjPyNII0oj +UyNcI14jZyNwI3IjeyOEI4YjjyOYI5ojoyOsI64jtyPAI8IjyyPUI9Yj3yPoI+oj8yP8I/4kByQQJBUk +HiQjJDQkNiQ/JEEkQyRKJFMkWCRhJGokhiSbJKQkpiSpJKsktCS5JMIkxyToJPAlCiUdJTQlSSVcJV4l +YSVjJWUlZyVpJWslbSV6JXwlgSWDJYUliiWMJY4loyWlJaclqSWrJckl3iXgJeIl5CXmJfomByYJJg4m +ECYSJhcmGSYbJicmNCY6JjwmQyZMJlEmaCZ1Jn4mhyaSJpkmsCa9Jscm1CbWJtgm4CbpJu4nDycRJxMn +FScXJxknGyckJzwnZSdnJ2knaydtJ28ncSd6J4MnnieiJ7snvSe/J8EnwyfFJ8cnzifjJ+Un5yfpJ+sn +9Cf2J/kn+yg0KEYoUChoKHoojSioKL8owSjDKMUoxyjMKNUo1yjYKNso3CjeKOAo+SkOKRMpFSkXKRkp +GyksKS4pNyk5KUIpSSlXKVkpYiltKXcpfCmFKY4ppimvKbgpxCnlKecp6SnrKe0p8CnxKfMp9SoLKiwq +LiowKjIqNCo2KjsqPSpDKkwqVypjKoQqhiqIKooqjCqNKo8qkSqpKsoqzCrOKtAq0irUKtYq8CsRKxMr +FSsXKxkrHCsdKx8rISs7K3ArhSuYK60rwCvWK9sr3SvfK+Er4yvlK+or6yvtK+8r8SvzLAgsCiwMLA4s +ECwmLFcsbCx7LI0snyytLK8stCy2LLgsuiy8LL4swSzDLMgszyzlLO4s9y0ELTktXy1hLWMtZS1nLWkt +ay1tLXMtfC1+LYEtgy2QLZItly2ZLZstoC2iLaQtsi3eLeUt+y4ELg8uIy4sLjkuRy5SLmsudi6TLpwu +oS60Lr0uvy8kLycvKi8tLzAvMy82LzkvPC8/L0IvRS9IL0svTi9RL1QvVy9aL10vYC9jL2YvaS9sL28v +ci91L3gvey9+L4EvhC+HL4ovjS+QL5Mvli+ZL5wvny+iL6UvqC+rL64vsS+0L7cvxC/NL9Av0y/WL/cv +/zATMB4wLDA2MEMwSjBNMFAwVTBYMF0wYDBjMGYwczB/MIIwhTCIMJUwlzCkMLMwtjC5MLwwxDDWMN8w +5DD3MQQxBzEKMQ0xIDEpMS4xOTFAMUkxUDFoMXcxiDGWMZkxnDGfMaIxqzGtMbAxxTHqMgcyHjIwMjsy +SjJvMooyozKkMqcyqDKrMqwyrzKwMrEysjK7Mr0yzjLRMtQy1zLaMt0y4DLjMuYy6jLvMvMy+zMDMwoz +FjMdMyIzJTMuMzMzPDNFM1kzbjN7M48zmDOfM7YzxzPKM8wzzzPSM9cz6DPrM+4z8TP0M/0z/zQCNBg0 +IzQ0NDc0OjQ8ND80SDRVNFg0WzReNH80gjSFNIc0ijSNNJA0nTSgNKM0pjStNLU0xjTJNMs0zjTRNPI0 +9TT4NPs0/jUBNQQ1FTUYNRs1HjUhNS41MDU2NUM1RjVJNUw1aTVsNW81cTV0NXc1ejWHNYo1jTWQNZ41 +rDW5Nbw1vzXCNeM15jXpNew17zXyNfU2AjYFNgg2CzYYNho2JDYxNjQ2NzY6Nls2XjZhNmM2ZjZpNmw2 +fTaANoM2hjaJNo42mzaoNqs2rjaxNtI21TbYNts23jbhNuQ26jbsNvo3BzcKNw03EDcxNzQ3Nzc6Nz03 +QDdDN0g3SjdQN103YDdjN2Y3hzeKN403kDeTN5Y3mTeeN6A3pje3N7o3vDe/N8I33zfiN+U35zfqN+03 +8Df+OB44LzgyODQ4Nzg6OFs4XjhhOGM4ZjhpOGw4dTiOOJs4njihOKQ4xTjIOMs4zjjRONQ41zjgOOI4 ++DkFOQg5CzkOOS85Mjk1OTg5Ozk+OUE5TjlROVQ5VzlmOWg5dzmEOYc5ijmNObI5uDm7Ob45wTnEOcc5 +yjnXOdo53TngOe458DoKOhc6GjodOiA6RTpIOks6TjpROlQ6VzpiOmQ6dTp4Ono6fTqAOoc6lDqXOpo6 +nTq+OsE6xDrHOso6zTrQOuQ65jsGOxM7FjsZOxw7PTtAO0M7SDtLO047UTtUO2E7ZDtnO2o7dzt5O487 +nDufO6I7pTvGO8k7zDvOO9E71DvXO/48IDwtPDA8Mzw2PFs8XjxhPGQ8ZzxqPG08bzyIPIo8lzyaPJ08 +oDzBPMQ8xzzJPMw8zzzSPOM85jzpPOw87zz6PRI9Hz0iPSU9KD1FPUg9Sz1NPVA9Uz1WPWU9dD2BPYQ9 +hz2KPas9rj2xPbQ9tz26Pb09yj3NPdA90z3fPeE9+T4GPgk+DD4PPjA+Mz42Pjk+PD4/PkI+Rj5IPk0+ +Xj5hPmQ+Zj5pPn0+jj6RPpM+lj6ZPro+vT7APsM+xj7JPsw+2T7bPuY+8z72Pvk+/D8dPyA/Iz8mPyk/ +LD8vPzQ/Nj88P0k/TD9PP1I/cz92P3k/fD9/P4I/hT+iP6Q/tj/HP8o/zT/QP9M/9D/3P/o//UAAQANA +BkALQA1AGUAmQClALEAvQFBAU0BWQFhAW0BeQGFAf0CgQLFAtEC2QLlAvEDdQOBA40DmQOlA7EDvQPtB +FEElQShBK0EtQTBBPUFAQUNBRkFnQWpBbUFwQXNBdkF5QZBBkkGhQa5BsUG0QbdB2EHbQd5B4EHjQeZB +6UH+QhBCHUIgQiNCJkJHQkpCTUJQQlNCVkJZQl9CYUJoQnVCeEJ7Qn5Co0KmQqlCrEKvQrJCtUK/QsFC +zkLRQtRC10L4QvtC/kMBQwRDB0MKQxVDF0MiQzNDNkM5QzxDP0NHQ2RDbkN4Q5dDmkOdQ6BDo0OmQ6lD +zEPZQ+5D90P+RBZEM0Q2RDlEPEQ/REFERERkRGpEg0SgRKNEpkSpRKxErkSxRNJE7EUJRQxFD0USRRVF +F0UaRTVFSUVqRXRFd0V6RX1FgEWCRYVFiEW3Rc5F50X0RfZGA0YGRglGDEYPRhJGFUYiRiVGKEYrRi5G +MUY0RkhGZ0Z6RpdGskbQRtFG7UcORxFHFEcXRxpHHEcfRyJHP0dJR1tHaEdqR3VHeEd7R35HgUeER49H +kkeUR5dHmUebR7RHyEfxR/9IHEhBSFdIWkhdSGBIY0hmSGhIa0huSIxIl0ikSKZIsUi0SLdIuki9SMBI +y0jOSNBI00jVSNhI8Uj6SPxJ5UnoSepJ7EnvSfJJ9Un4SftJ/koBSgNKBUoHSgpKDUoQShNKFkoZShxK +HkogSiNKJkopSixKL0oySjVKOEo6Sj1KQEpDSkZKSEpLSk5KUUpUSldKWUpbSl1KX0phSmNKZkppSmtK +bkpwSnJKdUp4SntKfkqBSoRKh0qKSoxKj0qSSpVKmEqbSp5KoUqkSqdKqUqrSq1KsEqzSrZKuUq8Sr9K +wkrFSshKy0rNStBK0krUStdK2krcSt9K4UrkSudK6UrsSu9K8Ur0SvdK+kr9SwBLA0sGSwlLDEsPSxJL +FEsXSxlLHEsfS0hLUktVS1hLW0tdS2BLY0tmS2lLekt9S4BLg0uGS4tLmkujS6VLrkuwS8dLykvNS9BL +00vWS9lL3EvfS+JL5UvoTAlMDEwPTBJMFUwYTBtMH0whTEJMRUxITEtMTkxRTFRMXExeTIdMikyNTJBM +kkyVTJhMm0yeTKpMs0y1TL5MwEzDTMZM30zoTO1NFk0kTTFNNE02TTdNOU06TT1NQE1DTWRNZ01qTW1N +cE1zTXZNh02JTaZNqU2sTa5NsU20TbdNyU3yTfVN9034TfpN+03+TgFOBE4NThZOGE4nTipOLU4wTjNO +Nk45TjxOZU5oTmtObk5wTnNOdk55TnxOhE6NTo9Opk6pTqxOr06yTrVOuE67Tr5OwU7ETsdO8E7zTvVO +9k74TvlO/E7/TwJPI08mTylPLE8vTzJPNU9OT1BPeU98T35Pf0+BT4JPhU+IT4tPtE+3T7pPvU+/T8JP +xU/IT8tP1E/lT+hP60/uT/FP+k/8UAVQB1AIUBpQQ1BGUEhQSVBLUExQT1BSUFVQflCBUINQhFCGUIdQ +ilCNUJBQnVDGUMlQzFDPUNFQ1FDXUNpQ3VDiUOtQ7VD2UPhRE1EWURlRHFEfUSJRJVEoUStRLlExUTRR +N1E6UWNRZlFoUWlRa1FsUW9RclF1UZ5RoVGjUaRRplGnUapRrVGwUdlR3FHfUeJR5FHnUepR7VHwUfVR +/lIAUglSC1IWUhlSHFIfUiJSJVJOUlFSVFJXUllSXFJfUmJSZVJ8UoVSh1KQUpNSllKZUpxSvVLAUsNS +xVLIUstSzlLsUxVTGFMbUx5TIFMjUyZTKVMsUzpTR1NKU01TUFNZU1tTYlNlU2hTa1OMU49TklOVU5hT +m1OeU7FT0lPVU9hT21PeU+FT5FPxVBJUFVQYVBtUHlQhVCRUMFRZVFxUX1RiVGRUZ1RqVG1UcFR3VIBU +glSHVIpUjVS2VLlUvFS/VMFUxFTHVMpUzVTUVN1U31ToVOpU71TyVPVVFlUZVRxVH1UiVSVVKFUzVVxV +X1ViVWVVZ1VqVW1VcFVzVXxVflWDVYZViVWyVbVVuFW7Vb1VwFXDVcZVyVXQVdlV21XkVeZV71XyVfVV ++FX7ViRWJ1YpVipWLFYtVjBWM1Y2VkVWblZxVnRWd1Z5VnxWf1aCVoVWilaTVpVWmFabVqdWsFayVrVW +vlbAV6lXrFeuV7BXsle1V7hXu1e+V8FXxFfGV8hXylfNV9BX01fWV9lX3FffV+FX41fmV+lX7FfvV/JX +9Vf4V/tX/VgAWANYBlgJWAtYDlgRWBRYF1gaWBxYHlggWCJYJFgmWClYLFguWDFYM1g1WDhYO1g+WEFY +RFhHWEpYTVhPWFJYVVhYWFtYXlhhWGRYZ1hqWGxYblhwWHNYdlh5WHxYf1iCWIVYiFiLWI5YkFiTWJVY +l1iaWJ1Yn1iiWKRYp1iqWKxYr1ixWLNYtVi3WLpYvVjAWMNYxljJWMxYz1jRWNNY1ljYWNtY3ljnWOlZ +1FnXWdpZ3VnfWeJZ5VnoWepZ7VnwWfJZ9Fn2WflZ/Fn/WgJaBVoIWgtaDVoPWhJaFVoYWhtaHlohWiRa +J1opWixaL1oyWjVaN1o6Wj1aQFpDWkZaSFpKWk1aT1pRWlRaVlpYWlpaXVpfWmFaZFpnWmpabVpvWnJa +dVp4WntaflqAWoNahlqJWoxaj1qSWpVamFqaWpxanlqhWqRap1qqWq1asFqzWrZauVq8Wr5awVrDWsVa +yFrLWs1a0FrSWtVa2FraWt1a4FriWuVa6FrrWu5a8Vr0Wvda+lr9WwBbA1sGWwhbClsNWxBbGVsbXAZc +CVwMXA9cElwVXBhcG1weXCFcJFwnXCpcLVwwXDNcNlw5XDxcP1xCXEVcSFxLXE5cUVxUXFdcWlxdXGBc +Y1xmXGlcbFxvXHJcdVx4XHtcflyBXIRch1yKXI1ckFyTXJZcmVycXJ9colylXKhcq1yuXLFctFy3XLpc +vVzAXMNcxlzJXMxcz1zSXNVc2FzbXN5c4VzkXOdc6lztXPBc81z2XPlc/Fz/XQJdBV0IXQtdDl0RXRRd +F10aXR1dIF0jXSZdKV0sXS9dMl01XThdO10+XUFdRF1HXUpdTV1QXVNdVl1ZXVxdX11iXXVdiF2TXa5d +ul3MXdpd7V4SXipeMV5FXlteZ158XopetF7HXuJfBl85X1BfaV98X4hfol/hX+1gBmAZYCVgOWBTYFpg +eGCVYMZg0mDeYP1hKWFDYVlhZ2FvYXlhoWGvYc9h7WIIYiRiP2JfYmxig2KSYqxixWLYYu9jCGMlY0pj +cWOGY7BjxWPoY/xkEGQqZDRkQGRSZHBkj2SmZLJkxWThZPRlDGUYZSVlMWVMZV5lZ2V+ZZRlqmXAZcxl +32X5Zg1mGWY1ZkFmWWaQZqxmwWbNZuJm9mcXZy1nOmdlZ3png2eFZ4Znj2eRZ5Jnm2edaOpo7WjwaPJo +9Gj3aPpo/WkAaQNpBmkJaQxpDmkRaRNpFmkZaRtpHmkhaSRpJ2kqaS1pMGkzaTZpOWk8aT5pQWlDaUZp +SWlMaU9pUmlVaVhpW2leaWFpZGlnaWlpbGlvaXJpdWl3aXppfWmAaYNphmmJaYxpjmmQaZJplGmWaZhp +m2meaaFppGmnaalprGmuabFps2m2ablpvGm/acJpxGnHacppzWnQadJp1WnYadtp3mnhaeRp52nqae1p +8GnzafZp+Wn8af9qAmoFaghqC2oNahBqEmoUahdqGmodaiBqI2omailqLGovajJqNWo4ajtqPmpBakRq +RmpJaktqTWpQalNqVmpYaltqXmpgamNqZmppamtqbmpxanNqdmp5anxqf2qCaoVqiGqLao5qkWqUapdq +mmqdaqBqo2qmaqhqq2qtarBqs2q2arlqwmrEbBFsFGwXbBpsHWwgbCNsJmwpbCxsL2wybDVsOGw7bD5s +QWxEbEdsSmxNbFBsU2xWbFlsXGxfbGJsZWxobGtsbmxxbHRsd2x6bH1sgGyDbIZsiWyMbI9skmyVbJhs +m2yebKFspGynbKpsrWywbLNstmy5bLxsv2zCbMVsyGzLbM5s0WzUbNds2mzdbOBs42zmbOls7GzvbPJs +9Wz4bPts/m0BbQRtB20KbQ1tEG0TbRZtGW0cbR9tIm0lbShtK20ubTFtNG03bTptPW1AbUNtRm1JbUxt +T21SbVVtWG1bbV5tYW1kbWdtam1tbXBtc212bXltfG1/bYJthW2IbYttjm2RbZRtl22abZ1toG2jbaZt +qW2sba9tsm21bbhtu22+bcFtxG3HbcptzW3QbdNt1m3Zbdxt323ibeVt6G3rbe5t8W30bfdt+m39bgBu +Am4EbgduCm4Mbg5uEG4SbhVuF24ZbhtuHm4gbiNuJm4obituLW4vbjFuM241bjduOW47bj1uP25BbkRu +R25JbktuTW5QblNuVW5XblluW25ebmBuY25lbmhuam5sbm5ucW50bnZueG56bnxufm6AboJuhW6Ibotu +jm6RbpRulm6ZbptunW6fbqJupG6nbqpurW6vbrFus261brduum68br5uwG7CbsVux27JbstuzW7PbtFu +027Wbthu2m7cbt5u4G7ibuRu527qbuxu7m7xbvNu9m75bvtu/W7/bwFvA28FbwdvCm8Mbw9vEW8TbxVv +GG8bbx5vIG8jbyVvJ28qby1vL28xbzRvNm84bzpvPW9Ab0JvRW9Ib0tvVG9Wb1hvWm9cb15vYW9kb2Zv +aG9qb21vb29yb3VveG96b31vf2+Cb4Rvhm+Pb5Fvkm+bb51vnm+nb6lvqm+zb7gAAAAAAAACAgAAAAAA +AA3QAAAAAAAAAAAAAAAAAABvxw diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 41fed78253f70f2f84ec285721e3eca6468fccfd..a6edb8f17b81ffc1d5610327f360fdc696258b6b 100644 GIT binary patch delta 23286 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 literal 36228 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 diff --git a/GitTest.xcodeproj/project.pbxproj b/GitTest.xcodeproj/project.pbxproj index 5461be1..db94630 100644 --- a/GitTest.xcodeproj/project.pbxproj +++ b/GitTest.xcodeproj/project.pbxproj @@ -18,6 +18,10 @@ F56526240E03D85900F03B52 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F56526230E03D85900F03B52 /* WebKit.framework */; }; F565262B0E03D89B00F03B52 /* PBWebGitController.m in Sources */ = {isa = PBXBuildFile; fileRef = F565262A0E03D89B00F03B52 /* PBWebGitController.m */; }; F565265A0E03E71B00F03B52 /* commit.html in Resources */ = {isa = PBXBuildFile; fileRef = F56526590E03E71B00F03B52 /* commit.html */; }; + F57ABDDF0E0441DE00A088B8 /* commit.js in Sources */ = {isa = PBXBuildFile; fileRef = F57ABDDE0E0441DE00A088B8 /* commit.js */; }; + F57ABE0B0E0442DD00A088B8 /* commit.js in Resources */ = {isa = PBXBuildFile; fileRef = F57ABDDE0E0441DE00A088B8 /* commit.js */; }; + F57ABE190E04431D00A088B8 /* prototype.js in Sources */ = {isa = PBXBuildFile; fileRef = F57ABE180E04431D00A088B8 /* prototype.js */; }; + F57ABE2B0E04435100A088B8 /* prototype.js in Resources */ = {isa = PBXBuildFile; fileRef = F57ABE180E04431D00A088B8 /* prototype.js */; }; F58A8F280E043698007E3FC0 /* commits.css in Resources */ = {isa = PBXBuildFile; fileRef = F58A8F270E043698007E3FC0 /* commits.css */; }; F5945E170E02B0C200706420 /* PBGitRepository.m in Sources */ = {isa = PBXBuildFile; fileRef = F5945E160E02B0C200706420 /* PBGitRepository.m */; }; /* End PBXBuildFile section */ @@ -44,6 +48,8 @@ F56526290E03D89B00F03B52 /* PBWebGitController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PBWebGitController.h; sourceTree = ""; }; F565262A0E03D89B00F03B52 /* PBWebGitController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PBWebGitController.m; sourceTree = ""; }; F56526590E03E71B00F03B52 /* commit.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = commit.html; path = html/commit.html; sourceTree = ""; }; + F57ABDDE0E0441DE00A088B8 /* commit.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = commit.js; path = html/commit.js; sourceTree = ""; }; + F57ABE180E04431D00A088B8 /* prototype.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = prototype.js; path = html/prototype.js; sourceTree = ""; }; F58A8F270E043698007E3FC0 /* commits.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; name = commits.css; path = html/commits.css; sourceTree = ""; }; F5945E150E02B0C200706420 /* PBGitRepository.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PBGitRepository.h; sourceTree = ""; }; F5945E160E02B0C200706420 /* PBGitRepository.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PBGitRepository.m; sourceTree = ""; }; @@ -161,6 +167,8 @@ children = ( F56526590E03E71B00F03B52 /* commit.html */, F58A8F270E043698007E3FC0 /* commits.css */, + F57ABDDE0E0441DE00A088B8 /* commit.js */, + F57ABE180E04431D00A088B8 /* prototype.js */, ); name = HTML; sourceTree = ""; @@ -211,6 +219,8 @@ 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, F565265A0E03E71B00F03B52 /* commit.html in Resources */, + F57ABE0B0E0442DD00A088B8 /* commit.js in Resources */, + F57ABE2B0E04435100A088B8 /* prototype.js in Resources */, F58A8F280E043698007E3FC0 /* commits.css in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -229,6 +239,8 @@ F56524BB0E02D22D00F03B52 /* NSFileHandleExt.m in Sources */, F56524F00E02D45200F03B52 /* PBGitCommit.m in Sources */, F565262B0E03D89B00F03B52 /* PBWebGitController.m in Sources */, + F57ABDDF0E0441DE00A088B8 /* commit.js in Sources */, + F57ABE190E04431D00A088B8 /* prototype.js in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/html/commit.html b/html/commit.html index 9f45e85..01ddaea 100644 --- a/html/commit.html +++ b/html/commit.html @@ -2,30 +2,8 @@
Details for commit - - + +
@@ -44,7 +22,7 @@ Subject: - Pieter de Bie + Pieter de Bie
diff --git a/html/commit.js b/html/commit.js new file mode 100644 index 0000000..2a8ba66 --- /dev/null +++ b/html/commit.js @@ -0,0 +1,49 @@ +var Commit = Class.create({ + initialize: function(obj) { + this.raw = obj.details(); + this.sha = this.raw.match(/^commit ([0-9a-f]{40,40})/)[1]; + + var match = this.raw.match(/\nauthor (.*) <(.*@.*)> ([0-9].*)/); + this.author_name = match[1]; + this.author_email = match[2]; + this.author_date = new Date(parseInt(match[3]) * 1000); + + match = this.raw.match(/\ncommitter (.*) <(.*@.*)> ([0-9].*)/); + this.committer_name = match[1]; + this.committer_email = match[2]; + this.committer_date = new Date(parseInt(match[3]) * 1000); + + this.parents = $A(this.raw.match(/\nparent ([0-9a-f]{40,40})/g)).map(function(x) { + return x.replace("\nparent ",""); + }); + }, +}); + +var doeHet = function() { + var commit = new Commit(CommitObject); + $("commitID").innerHTML = commit.sha; + $("authorID").innerHTML = commit.author_name + " <" + commit.author_email + ">"; + $("date").innerHTML = commit.author_date; + $("subjectID").innerHTML =CommitObject.subject; + + $A($("commit_header").rows).each(function(row) { + if (row.innerHTML.match(/Parent:/)) + row.remove(); + }); + commit.parents.each(function(parent) { + var new_row = $("commit_header").insertRow(-1); + new_row.innerHTML = "Parent:" + parent + ""; + }); + + details = CommitObject.details(); + messageStart = details.indexOf("\n\n") + 2; + diffStart = details.indexOf("diff"); + + header = details.substring(0, messageStart); + message = details.substring(messageStart, diffStart); + details = details.substring(diffStart); + + + $("message").innerHTML = message.replace(/\n/g,"
"); + $("details").innerHTML = details; +} diff --git a/html/prototype.js b/html/prototype.js new file mode 100644 index 0000000..6385503 --- /dev/null +++ b/html/prototype.js @@ -0,0 +1,4221 @@ +/* Prototype JavaScript framework, version 1.6.0.2 + * (c) 2005-2008 Sam Stephenson + * + * Prototype is freely distributable under the terms of an MIT-style license. + * For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ + +var Prototype = { + Version: '1.6.0.2', + + Browser: { + IE: !!(window.attachEvent && !window.opera), + Opera: !!window.opera, + WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, + Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1, + MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) + }, + + BrowserFeatures: { + XPath: !!document.evaluate, + ElementExtensions: !!window.HTMLElement, + SpecificElementExtensions: + document.createElement('div').__proto__ && + document.createElement('div').__proto__ !== + document.createElement('form').__proto__ + }, + + ScriptFragment: ']*>([\\S\\s]*?)<\/script>', + JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, + + emptyFunction: function() { }, + K: function(x) { return x } +}; + +if (Prototype.Browser.MobileSafari) + Prototype.BrowserFeatures.SpecificElementExtensions = false; + + +/* Based on Alex Arnell's inheritance implementation. */ +var Class = { + create: function() { + var parent = null, properties = $A(arguments); + if (Object.isFunction(properties[0])) + parent = properties.shift(); + + function klass() { + this.initialize.apply(this, arguments); + } + + Object.extend(klass, Class.Methods); + klass.superclass = parent; + klass.subclasses = []; + + if (parent) { + var subclass = function() { }; + subclass.prototype = parent.prototype; + klass.prototype = new subclass; + parent.subclasses.push(klass); + } + + for (var i = 0; i < properties.length; i++) + klass.addMethods(properties[i]); + + if (!klass.prototype.initialize) + klass.prototype.initialize = Prototype.emptyFunction; + + klass.prototype.constructor = klass; + + return klass; + } +}; + +Class.Methods = { + addMethods: function(source) { + var ancestor = this.superclass && this.superclass.prototype; + var properties = Object.keys(source); + + if (!Object.keys({ toString: true }).length) + properties.push("toString", "valueOf"); + + for (var i = 0, length = properties.length; i < length; i++) { + var property = properties[i], value = source[property]; + if (ancestor && Object.isFunction(value) && + value.argumentNames().first() == "$super") { + var method = value, value = Object.extend((function(m) { + return function() { return ancestor[m].apply(this, arguments) }; + })(property).wrap(method), { + valueOf: function() { return method }, + toString: function() { return method.toString() } + }); + } + this.prototype[property] = value; + } + + return this; + } +}; + +var Abstract = { }; + +Object.extend = function(destination, source) { + for (var property in source) + destination[property] = source[property]; + return destination; +}; + +Object.extend(Object, { + inspect: function(object) { + try { + if (Object.isUndefined(object)) return 'undefined'; + if (object === null) return 'null'; + return object.inspect ? object.inspect() : String(object); + } catch (e) { + if (e instanceof RangeError) return '...'; + throw e; + } + }, + + toJSON: function(object) { + var type = typeof object; + switch (type) { + case 'undefined': + case 'function': + case 'unknown': return; + case 'boolean': return object.toString(); + } + + if (object === null) return 'null'; + if (object.toJSON) return object.toJSON(); + if (Object.isElement(object)) return; + + var results = []; + for (var property in object) { + var value = Object.toJSON(object[property]); + if (!Object.isUndefined(value)) + results.push(property.toJSON() + ': ' + value); + } + + return '{' + results.join(', ') + '}'; + }, + + toQueryString: function(object) { + return $H(object).toQueryString(); + }, + + toHTML: function(object) { + return object && object.toHTML ? object.toHTML() : String.interpret(object); + }, + + keys: function(object) { + var keys = []; + for (var property in object) + keys.push(property); + return keys; + }, + + values: function(object) { + var values = []; + for (var property in object) + values.push(object[property]); + return values; + }, + + clone: function(object) { + return Object.extend({ }, object); + }, + + isElement: function(object) { + return object && object.nodeType == 1; + }, + + isArray: function(object) { + return object != null && typeof object == "object" && + 'splice' in object && 'join' in object; + }, + + isHash: function(object) { + return object instanceof Hash; + }, + + isFunction: function(object) { + return typeof object == "function"; + }, + + isString: function(object) { + return typeof object == "string"; + }, + + isNumber: function(object) { + return typeof object == "number"; + }, + + isUndefined: function(object) { + return typeof object == "undefined"; + } +}); + +Object.extend(Function.prototype, { + argumentNames: function() { + var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip"); + return names.length == 1 && !names[0] ? [] : names; + }, + + bind: function() { + if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; + var __method = this, args = $A(arguments), object = args.shift(); + return function() { + return __method.apply(object, args.concat($A(arguments))); + } + }, + + bindAsEventListener: function() { + var __method = this, args = $A(arguments), object = args.shift(); + return function(event) { + return __method.apply(object, [event || window.event].concat(args)); + } + }, + + curry: function() { + if (!arguments.length) return this; + var __method = this, args = $A(arguments); + return function() { + return __method.apply(this, args.concat($A(arguments))); + } + }, + + delay: function() { + var __method = this, args = $A(arguments), timeout = args.shift() * 1000; + return window.setTimeout(function() { + return __method.apply(__method, args); + }, timeout); + }, + + wrap: function(wrapper) { + var __method = this; + return function() { + return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); + } + }, + + methodize: function() { + if (this._methodized) return this._methodized; + var __method = this; + return this._methodized = function() { + return __method.apply(null, [this].concat($A(arguments))); + }; + } +}); + +Function.prototype.defer = Function.prototype.delay.curry(0.01); + +Date.prototype.toJSON = function() { + return '"' + this.getUTCFullYear() + '-' + + (this.getUTCMonth() + 1).toPaddedString(2) + '-' + + this.getUTCDate().toPaddedString(2) + 'T' + + this.getUTCHours().toPaddedString(2) + ':' + + this.getUTCMinutes().toPaddedString(2) + ':' + + this.getUTCSeconds().toPaddedString(2) + 'Z"'; +}; + +var Try = { + these: function() { + var returnValue; + + for (var i = 0, length = arguments.length; i < length; i++) { + var lambda = arguments[i]; + try { + returnValue = lambda(); + break; + } catch (e) { } + } + + return returnValue; + } +}; + +RegExp.prototype.match = RegExp.prototype.test; + +RegExp.escape = function(str) { + return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); +}; + +/*--------------------------------------------------------------------------*/ + +var PeriodicalExecuter = Class.create({ + initialize: function(callback, frequency) { + this.callback = callback; + this.frequency = frequency; + this.currentlyExecuting = false; + + this.registerCallback(); + }, + + registerCallback: function() { + this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); + }, + + execute: function() { + this.callback(this); + }, + + stop: function() { + if (!this.timer) return; + clearInterval(this.timer); + this.timer = null; + }, + + onTimerEvent: function() { + if (!this.currentlyExecuting) { + try { + this.currentlyExecuting = true; + this.execute(); + } finally { + this.currentlyExecuting = false; + } + } + } +}); +Object.extend(String, { + interpret: function(value) { + return value == null ? '' : String(value); + }, + specialChar: { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '\\': '\\\\' + } +}); + +Object.extend(String.prototype, { + gsub: function(pattern, replacement) { + var result = '', source = this, match; + replacement = arguments.callee.prepareReplacement(replacement); + + while (source.length > 0) { + if (match = source.match(pattern)) { + result += source.slice(0, match.index); + result += String.interpret(replacement(match)); + source = source.slice(match.index + match[0].length); + } else { + result += source, source = ''; + } + } + return result; + }, + + sub: function(pattern, replacement, count) { + replacement = this.gsub.prepareReplacement(replacement); + count = Object.isUndefined(count) ? 1 : count; + + return this.gsub(pattern, function(match) { + if (--count < 0) return match[0]; + return replacement(match); + }); + }, + + scan: function(pattern, iterator) { + this.gsub(pattern, iterator); + return String(this); + }, + + truncate: function(length, truncation) { + length = length || 30; + truncation = Object.isUndefined(truncation) ? '...' : truncation; + return this.length > length ? + this.slice(0, length - truncation.length) + truncation : String(this); + }, + + strip: function() { + return this.replace(/^\s+/, '').replace(/\s+$/, ''); + }, + + stripTags: function() { + return this.replace(/<\/?[^>]+>/gi, ''); + }, + + stripScripts: function() { + return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); + }, + + extractScripts: function() { + var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); + var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); + return (this.match(matchAll) || []).map(function(scriptTag) { + return (scriptTag.match(matchOne) || ['', ''])[1]; + }); + }, + + evalScripts: function() { + return this.extractScripts().map(function(script) { return eval(script) }); + }, + + escapeHTML: function() { + var self = arguments.callee; + self.text.data = this; + return self.div.innerHTML; + }, + + unescapeHTML: function() { + var div = new Element('div'); + div.innerHTML = this.stripTags(); + return div.childNodes[0] ? (div.childNodes.length > 1 ? + $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : + div.childNodes[0].nodeValue) : ''; + }, + + toQueryParams: function(separator) { + var match = this.strip().match(/([^?#]*)(#.*)?$/); + if (!match) return { }; + + return match[1].split(separator || '&').inject({ }, function(hash, pair) { + if ((pair = pair.split('='))[0]) { + var key = decodeURIComponent(pair.shift()); + var value = pair.length > 1 ? pair.join('=') : pair[0]; + if (value != undefined) value = decodeURIComponent(value); + + if (key in hash) { + if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; + hash[key].push(value); + } + else hash[key] = value; + } + return hash; + }); + }, + + toArray: function() { + return this.split(''); + }, + + succ: function() { + return this.slice(0, this.length - 1) + + String.fromCharCode(this.charCodeAt(this.length - 1) + 1); + }, + + times: function(count) { + return count < 1 ? '' : new Array(count + 1).join(this); + }, + + camelize: function() { + var parts = this.split('-'), len = parts.length; + if (len == 1) return parts[0]; + + var camelized = this.charAt(0) == '-' + ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) + : parts[0]; + + for (var i = 1; i < len; i++) + camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); + + return camelized; + }, + + capitalize: function() { + return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); + }, + + underscore: function() { + return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); + }, + + dasherize: function() { + return this.gsub(/_/,'-'); + }, + + inspect: function(useDoubleQuotes) { + var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { + var character = String.specialChar[match[0]]; + return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); + }); + if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; + return "'" + escapedString.replace(/'/g, '\\\'') + "'"; + }, + + toJSON: function() { + return this.inspect(true); + }, + + unfilterJSON: function(filter) { + return this.sub(filter || Prototype.JSONFilter, '#{1}'); + }, + + isJSON: function() { + var str = this; + if (str.blank()) return false; + str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); + return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); + }, + + evalJSON: function(sanitize) { + var json = this.unfilterJSON(); + try { + if (!sanitize || json.isJSON()) return eval('(' + json + ')'); + } catch (e) { } + throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); + }, + + include: function(pattern) { + return this.indexOf(pattern) > -1; + }, + + startsWith: function(pattern) { + return this.indexOf(pattern) === 0; + }, + + endsWith: function(pattern) { + var d = this.length - pattern.length; + return d >= 0 && this.lastIndexOf(pattern) === d; + }, + + empty: function() { + return this == ''; + }, + + blank: function() { + return /^\s*$/.test(this); + }, + + interpolate: function(object, pattern) { + return new Template(this, pattern).evaluate(object); + } +}); + +if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { + escapeHTML: function() { + return this.replace(/&/g,'&').replace(//g,'>'); + }, + unescapeHTML: function() { + return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); + } +}); + +String.prototype.gsub.prepareReplacement = function(replacement) { + if (Object.isFunction(replacement)) return replacement; + var template = new Template(replacement); + return function(match) { return template.evaluate(match) }; +}; + +String.prototype.parseQuery = String.prototype.toQueryParams; + +Object.extend(String.prototype.escapeHTML, { + div: document.createElement('div'), + text: document.createTextNode('') +}); + +with (String.prototype.escapeHTML) div.appendChild(text); + +var Template = Class.create({ + initialize: function(template, pattern) { + this.template = template.toString(); + this.pattern = pattern || Template.Pattern; + }, + + evaluate: function(object) { + if (Object.isFunction(object.toTemplateReplacements)) + object = object.toTemplateReplacements(); + + return this.template.gsub(this.pattern, function(match) { + if (object == null) return ''; + + var before = match[1] || ''; + if (before == '\\') return match[2]; + + var ctx = object, expr = match[3]; + var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + match = pattern.exec(expr); + if (match == null) return before; + + while (match != null) { + var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; + ctx = ctx[comp]; + if (null == ctx || '' == match[3]) break; + expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); + match = pattern.exec(expr); + } + + return before + String.interpret(ctx); + }); + } +}); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; + +var $break = { }; + +var Enumerable = { + each: function(iterator, context) { + var index = 0; + iterator = iterator.bind(context); + try { + this._each(function(value) { + iterator(value, index++); + }); + } catch (e) { + if (e != $break) throw e; + } + return this; + }, + + eachSlice: function(number, iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var index = -number, slices = [], array = this.toArray(); + while ((index += number) < array.length) + slices.push(array.slice(index, index+number)); + return slices.collect(iterator, context); + }, + + all: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result = true; + this.each(function(value, index) { + result = result && !!iterator(value, index); + if (!result) throw $break; + }); + return result; + }, + + any: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result = false; + this.each(function(value, index) { + if (result = !!iterator(value, index)) + throw $break; + }); + return result; + }, + + collect: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var results = []; + this.each(function(value, index) { + results.push(iterator(value, index)); + }); + return results; + }, + + detect: function(iterator, context) { + iterator = iterator.bind(context); + var result; + this.each(function(value, index) { + if (iterator(value, index)) { + result = value; + throw $break; + } + }); + return result; + }, + + findAll: function(iterator, context) { + iterator = iterator.bind(context); + var results = []; + this.each(function(value, index) { + if (iterator(value, index)) + results.push(value); + }); + return results; + }, + + grep: function(filter, iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var results = []; + + if (Object.isString(filter)) + filter = new RegExp(filter); + + this.each(function(value, index) { + if (filter.match(value)) + results.push(iterator(value, index)); + }); + return results; + }, + + include: function(object) { + if (Object.isFunction(this.indexOf)) + if (this.indexOf(object) != -1) return true; + + var found = false; + this.each(function(value) { + if (value == object) { + found = true; + throw $break; + } + }); + return found; + }, + + inGroupsOf: function(number, fillWith) { + fillWith = Object.isUndefined(fillWith) ? null : fillWith; + return this.eachSlice(number, function(slice) { + while(slice.length < number) slice.push(fillWith); + return slice; + }); + }, + + inject: function(memo, iterator, context) { + iterator = iterator.bind(context); + this.each(function(value, index) { + memo = iterator(memo, value, index); + }); + return memo; + }, + + invoke: function(method) { + var args = $A(arguments).slice(1); + return this.map(function(value) { + return value[method].apply(value, args); + }); + }, + + max: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result; + this.each(function(value, index) { + value = iterator(value, index); + if (result == null || value >= result) + result = value; + }); + return result; + }, + + min: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var result; + this.each(function(value, index) { + value = iterator(value, index); + if (result == null || value < result) + result = value; + }); + return result; + }, + + partition: function(iterator, context) { + iterator = iterator ? iterator.bind(context) : Prototype.K; + var trues = [], falses = []; + this.each(function(value, index) { + (iterator(value, index) ? + trues : falses).push(value); + }); + return [trues, falses]; + }, + + pluck: function(property) { + var results = []; + this.each(function(value) { + results.push(value[property]); + }); + return results; + }, + + reject: function(iterator, context) { + iterator = iterator.bind(context); + var results = []; + this.each(function(value, index) { + if (!iterator(value, index)) + results.push(value); + }); + return results; + }, + + sortBy: function(iterator, context) { + iterator = iterator.bind(context); + return this.map(function(value, index) { + return {value: value, criteria: iterator(value, index)}; + }).sort(function(left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }).pluck('value'); + }, + + toArray: function() { + return this.map(); + }, + + zip: function() { + var iterator = Prototype.K, args = $A(arguments); + if (Object.isFunction(args.last())) + iterator = args.pop(); + + var collections = [this].concat(args).map($A); + return this.map(function(value, index) { + return iterator(collections.pluck(index)); + }); + }, + + size: function() { + return this.toArray().length; + }, + + inspect: function() { + return '#'; + } +}; + +Object.extend(Enumerable, { + map: Enumerable.collect, + find: Enumerable.detect, + select: Enumerable.findAll, + filter: Enumerable.findAll, + member: Enumerable.include, + entries: Enumerable.toArray, + every: Enumerable.all, + some: Enumerable.any +}); +function $A(iterable) { + if (!iterable) return []; + if (iterable.toArray) return iterable.toArray(); + var length = iterable.length || 0, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; +} + +if (Prototype.Browser.WebKit) { + $A = function(iterable) { + if (!iterable) return []; + if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') && + iterable.toArray) return iterable.toArray(); + var length = iterable.length || 0, results = new Array(length); + while (length--) results[length] = iterable[length]; + return results; + }; +} + +Array.from = $A; + +Object.extend(Array.prototype, Enumerable); + +if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; + +Object.extend(Array.prototype, { + _each: function(iterator) { + for (var i = 0, length = this.length; i < length; i++) + iterator(this[i]); + }, + + clear: function() { + this.length = 0; + return this; + }, + + first: function() { + return this[0]; + }, + + last: function() { + return this[this.length - 1]; + }, + + compact: function() { + return this.select(function(value) { + return value != null; + }); + }, + + flatten: function() { + return this.inject([], function(array, value) { + return array.concat(Object.isArray(value) ? + value.flatten() : [value]); + }); + }, + + without: function() { + var values = $A(arguments); + return this.select(function(value) { + return !values.include(value); + }); + }, + + reverse: function(inline) { + return (inline !== false ? this : this.toArray())._reverse(); + }, + + reduce: function() { + return this.length > 1 ? this : this[0]; + }, + + uniq: function(sorted) { + return this.inject([], function(array, value, index) { + if (0 == index || (sorted ? array.last() != value : !array.include(value))) + array.push(value); + return array; + }); + }, + + intersect: function(array) { + return this.uniq().findAll(function(item) { + return array.detect(function(value) { return item === value }); + }); + }, + + clone: function() { + return [].concat(this); + }, + + size: function() { + return this.length; + }, + + inspect: function() { + return '[' + this.map(Object.inspect).join(', ') + ']'; + }, + + toJSON: function() { + var results = []; + this.each(function(object) { + var value = Object.toJSON(object); + if (!Object.isUndefined(value)) results.push(value); + }); + return '[' + results.join(', ') + ']'; + } +}); + +// use native browser JS 1.6 implementation if available +if (Object.isFunction(Array.prototype.forEach)) + Array.prototype._each = Array.prototype.forEach; + +if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { + i || (i = 0); + var length = this.length; + if (i < 0) i = length + i; + for (; i < length; i++) + if (this[i] === item) return i; + return -1; +}; + +if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { + i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; + var n = this.slice(0, i).reverse().indexOf(item); + return (n < 0) ? n : i - n - 1; +}; + +Array.prototype.toArray = Array.prototype.clone; + +function $w(string) { + if (!Object.isString(string)) return []; + string = string.strip(); + return string ? string.split(/\s+/) : []; +} + +if (Prototype.Browser.Opera){ + Array.prototype.concat = function() { + var array = []; + for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); + for (var i = 0, length = arguments.length; i < length; i++) { + if (Object.isArray(arguments[i])) { + for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) + array.push(arguments[i][j]); + } else { + array.push(arguments[i]); + } + } + return array; + }; +} +Object.extend(Number.prototype, { + toColorPart: function() { + return this.toPaddedString(2, 16); + }, + + succ: function() { + return this + 1; + }, + + times: function(iterator) { + $R(0, this, true).each(iterator); + return this; + }, + + toPaddedString: function(length, radix) { + var string = this.toString(radix || 10); + return '0'.times(length - string.length) + string; + }, + + toJSON: function() { + return isFinite(this) ? this.toString() : 'null'; + } +}); + +$w('abs round ceil floor').each(function(method){ + Number.prototype[method] = Math[method].methodize(); +}); +function $H(object) { + return new Hash(object); +}; + +var Hash = Class.create(Enumerable, (function() { + + function toQueryPair(key, value) { + if (Object.isUndefined(value)) return key; + return key + '=' + encodeURIComponent(String.interpret(value)); + } + + return { + initialize: function(object) { + this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); + }, + + _each: function(iterator) { + for (var key in this._object) { + var value = this._object[key], pair = [key, value]; + pair.key = key; + pair.value = value; + iterator(pair); + } + }, + + set: function(key, value) { + return this._object[key] = value; + }, + + get: function(key) { + return this._object[key]; + }, + + unset: function(key) { + var value = this._object[key]; + delete this._object[key]; + return value; + }, + + toObject: function() { + return Object.clone(this._object); + }, + + keys: function() { + return this.pluck('key'); + }, + + values: function() { + return this.pluck('value'); + }, + + index: function(value) { + var match = this.detect(function(pair) { + return pair.value === value; + }); + return match && match.key; + }, + + merge: function(object) { + return this.clone().update(object); + }, + + update: function(object) { + return new Hash(object).inject(this, function(result, pair) { + result.set(pair.key, pair.value); + return result; + }); + }, + + toQueryString: function() { + return this.map(function(pair) { + var key = encodeURIComponent(pair.key), values = pair.value; + + if (values && typeof values == 'object') { + if (Object.isArray(values)) + return values.map(toQueryPair.curry(key)).join('&'); + } + return toQueryPair(key, values); + }).join('&'); + }, + + inspect: function() { + return '#'; + }, + + toJSON: function() { + return Object.toJSON(this.toObject()); + }, + + clone: function() { + return new Hash(this); + } + } +})()); + +Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; +Hash.from = $H; +var ObjectRange = Class.create(Enumerable, { + initialize: function(start, end, exclusive) { + this.start = start; + this.end = end; + this.exclusive = exclusive; + }, + + _each: function(iterator) { + var value = this.start; + while (this.include(value)) { + iterator(value); + value = value.succ(); + } + }, + + include: function(value) { + if (value < this.start) + return false; + if (this.exclusive) + return value < this.end; + return value <= this.end; + } +}); + +var $R = function(start, end, exclusive) { + return new ObjectRange(start, end, exclusive); +}; + +var Ajax = { + getTransport: function() { + return Try.these( + function() {return new XMLHttpRequest()}, + function() {return new ActiveXObject('Msxml2.XMLHTTP')}, + function() {return new ActiveXObject('Microsoft.XMLHTTP')} + ) || false; + }, + + activeRequestCount: 0 +}; + +Ajax.Responders = { + responders: [], + + _each: function(iterator) { + this.responders._each(iterator); + }, + + register: function(responder) { + if (!this.include(responder)) + this.responders.push(responder); + }, + + unregister: function(responder) { + this.responders = this.responders.without(responder); + }, + + dispatch: function(callback, request, transport, json) { + this.each(function(responder) { + if (Object.isFunction(responder[callback])) { + try { + responder[callback].apply(responder, [request, transport, json]); + } catch (e) { } + } + }); + } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ + onCreate: function() { Ajax.activeRequestCount++ }, + onComplete: function() { Ajax.activeRequestCount-- } +}); + +Ajax.Base = Class.create({ + initialize: function(options) { + this.options = { + method: 'post', + asynchronous: true, + contentType: 'application/x-www-form-urlencoded', + encoding: 'UTF-8', + parameters: '', + evalJSON: true, + evalJS: true + }; + Object.extend(this.options, options || { }); + + this.options.method = this.options.method.toLowerCase(); + + if (Object.isString(this.options.parameters)) + this.options.parameters = this.options.parameters.toQueryParams(); + else if (Object.isHash(this.options.parameters)) + this.options.parameters = this.options.parameters.toObject(); + } +}); + +Ajax.Request = Class.create(Ajax.Base, { + _complete: false, + + initialize: function($super, url, options) { + $super(options); + this.transport = Ajax.getTransport(); + this.request(url); + }, + + request: function(url) { + this.url = url; + this.method = this.options.method; + var params = Object.clone(this.options.parameters); + + if (!['get', 'post'].include(this.method)) { + // simulate other verbs over post + params['_method'] = this.method; + this.method = 'post'; + } + + this.parameters = params; + + if (params = Object.toQueryString(params)) { + // when GET, append parameters to URL + if (this.method == 'get') + this.url += (this.url.include('?') ? '&' : '?') + params; + else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) + params += '&_='; + } + + try { + var response = new Ajax.Response(this); + if (this.options.onCreate) this.options.onCreate(response); + Ajax.Responders.dispatch('onCreate', this, response); + + this.transport.open(this.method.toUpperCase(), this.url, + this.options.asynchronous); + + if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); + + this.transport.onreadystatechange = this.onStateChange.bind(this); + this.setRequestHeaders(); + + this.body = this.method == 'post' ? (this.options.postBody || params) : null; + this.transport.send(this.body); + + /* Force Firefox to handle ready state 4 for synchronous requests */ + if (!this.options.asynchronous && this.transport.overrideMimeType) + this.onStateChange(); + + } + catch (e) { + this.dispatchException(e); + } + }, + + onStateChange: function() { + var readyState = this.transport.readyState; + if (readyState > 1 && !((readyState == 4) && this._complete)) + this.respondToReadyState(this.transport.readyState); + }, + + setRequestHeaders: function() { + var headers = { + 'X-Requested-With': 'XMLHttpRequest', + 'X-Prototype-Version': Prototype.Version, + 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' + }; + + if (this.method == 'post') { + headers['Content-type'] = this.options.contentType + + (this.options.encoding ? '; charset=' + this.options.encoding : ''); + + /* Force "Connection: close" for older Mozilla browsers to work + * around a bug where XMLHttpRequest sends an incorrect + * Content-length header. See Mozilla Bugzilla #246651. + */ + if (this.transport.overrideMimeType && + (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) + headers['Connection'] = 'close'; + } + + // user-defined headers + if (typeof this.options.requestHeaders == 'object') { + var extras = this.options.requestHeaders; + + if (Object.isFunction(extras.push)) + for (var i = 0, length = extras.length; i < length; i += 2) + headers[extras[i]] = extras[i+1]; + else + $H(extras).each(function(pair) { headers[pair.key] = pair.value }); + } + + for (var name in headers) + this.transport.setRequestHeader(name, headers[name]); + }, + + success: function() { + var status = this.getStatus(); + return !status || (status >= 200 && status < 300); + }, + + getStatus: function() { + try { + return this.transport.status || 0; + } catch (e) { return 0 } + }, + + respondToReadyState: function(readyState) { + var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); + + if (state == 'Complete') { + try { + this._complete = true; + (this.options['on' + response.status] + || this.options['on' + (this.success() ? 'Success' : 'Failure')] + || Prototype.emptyFunction)(response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + var contentType = response.getHeader('Content-type'); + if (this.options.evalJS == 'force' + || (this.options.evalJS && this.isSameOrigin() && contentType + && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) + this.evalResponse(); + } + + try { + (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); + Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); + } catch (e) { + this.dispatchException(e); + } + + if (state == 'Complete') { + // avoid memory leak in MSIE: clean up + this.transport.onreadystatechange = Prototype.emptyFunction; + } + }, + + isSameOrigin: function() { + var m = this.url.match(/^\s*https?:\/\/[^\/]*/); + return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ + protocol: location.protocol, + domain: document.domain, + port: location.port ? ':' + location.port : '' + })); + }, + + getHeader: function(name) { + try { + return this.transport.getResponseHeader(name) || null; + } catch (e) { return null } + }, + + evalResponse: function() { + try { + return eval((this.transport.responseText || '').unfilterJSON()); + } catch (e) { + this.dispatchException(e); + } + }, + + dispatchException: function(exception) { + (this.options.onException || Prototype.emptyFunction)(this, exception); + Ajax.Responders.dispatch('onException', this, exception); + } +}); + +Ajax.Request.Events = + ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + +Ajax.Response = Class.create({ + initialize: function(request){ + this.request = request; + var transport = this.transport = request.transport, + readyState = this.readyState = transport.readyState; + + if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { + this.status = this.getStatus(); + this.statusText = this.getStatusText(); + this.responseText = String.interpret(transport.responseText); + this.headerJSON = this._getHeaderJSON(); + } + + if(readyState == 4) { + var xml = transport.responseXML; + this.responseXML = Object.isUndefined(xml) ? null : xml; + this.responseJSON = this._getResponseJSON(); + } + }, + + status: 0, + statusText: '', + + getStatus: Ajax.Request.prototype.getStatus, + + getStatusText: function() { + try { + return this.transport.statusText || ''; + } catch (e) { return '' } + }, + + getHeader: Ajax.Request.prototype.getHeader, + + getAllHeaders: function() { + try { + return this.getAllResponseHeaders(); + } catch (e) { return null } + }, + + getResponseHeader: function(name) { + return this.transport.getResponseHeader(name); + }, + + getAllResponseHeaders: function() { + return this.transport.getAllResponseHeaders(); + }, + + _getHeaderJSON: function() { + var json = this.getHeader('X-JSON'); + if (!json) return null; + json = decodeURIComponent(escape(json)); + try { + return json.evalJSON(this.request.options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + }, + + _getResponseJSON: function() { + var options = this.request.options; + if (!options.evalJSON || (options.evalJSON != 'force' && + !(this.getHeader('Content-type') || '').include('application/json')) || + this.responseText.blank()) + return null; + try { + return this.responseText.evalJSON(options.sanitizeJSON || + !this.request.isSameOrigin()); + } catch (e) { + this.request.dispatchException(e); + } + } +}); + +Ajax.Updater = Class.create(Ajax.Request, { + initialize: function($super, container, url, options) { + this.container = { + success: (container.success || container), + failure: (container.failure || (container.success ? null : container)) + }; + + options = Object.clone(options); + var onComplete = options.onComplete; + options.onComplete = (function(response, json) { + this.updateContent(response.responseText); + if (Object.isFunction(onComplete)) onComplete(response, json); + }).bind(this); + + $super(url, options); + }, + + updateContent: function(responseText) { + var receiver = this.container[this.success() ? 'success' : 'failure'], + options = this.options; + + if (!options.evalScripts) responseText = responseText.stripScripts(); + + if (receiver = $(receiver)) { + if (options.insertion) { + if (Object.isString(options.insertion)) { + var insertion = { }; insertion[options.insertion] = responseText; + receiver.insert(insertion); + } + else options.insertion(receiver, responseText); + } + else receiver.update(responseText); + } + } +}); + +Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { + initialize: function($super, container, url, options) { + $super(options); + this.onComplete = this.options.onComplete; + + this.frequency = (this.options.frequency || 2); + this.decay = (this.options.decay || 1); + + this.updater = { }; + this.container = container; + this.url = url; + + this.start(); + }, + + start: function() { + this.options.onComplete = this.updateComplete.bind(this); + this.onTimerEvent(); + }, + + stop: function() { + this.updater.options.onComplete = undefined; + clearTimeout(this.timer); + (this.onComplete || Prototype.emptyFunction).apply(this, arguments); + }, + + updateComplete: function(response) { + if (this.options.decay) { + this.decay = (response.responseText == this.lastText ? + this.decay * this.options.decay : 1); + + this.lastText = response.responseText; + } + this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); + }, + + onTimerEvent: function() { + this.updater = new Ajax.Updater(this.container, this.url, this.options); + } +}); +function $(element) { + if (arguments.length > 1) { + for (var i = 0, elements = [], length = arguments.length; i < length; i++) + elements.push($(arguments[i])); + return elements; + } + if (Object.isString(element)) + element = document.getElementById(element); + return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { + document._getElementsByXPath = function(expression, parentElement) { + var results = []; + var query = document.evaluate(expression, $(parentElement) || document, + null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + for (var i = 0, length = query.snapshotLength; i < length; i++) + results.push(Element.extend(query.snapshotItem(i))); + return results; + }; +} + +/*--------------------------------------------------------------------------*/ + +if (!window.Node) var Node = { }; + +if (!Node.ELEMENT_NODE) { + // DOM level 2 ECMAScript Language Binding + Object.extend(Node, { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + ENTITY_REFERENCE_NODE: 5, + ENTITY_NODE: 6, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, + NOTATION_NODE: 12 + }); +} + +(function() { + var element = this.Element; + this.Element = function(tagName, attributes) { + attributes = attributes || { }; + tagName = tagName.toLowerCase(); + var cache = Element.cache; + if (Prototype.Browser.IE && attributes.name) { + tagName = '<' + tagName + ' name="' + attributes.name + '">'; + delete attributes.name; + return Element.writeAttribute(document.createElement(tagName), attributes); + } + if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); + return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); + }; + Object.extend(this.Element, element || { }); +}).call(window); + +Element.cache = { }; + +Element.Methods = { + visible: function(element) { + return $(element).style.display != 'none'; + }, + + toggle: function(element) { + element = $(element); + Element[Element.visible(element) ? 'hide' : 'show'](element); + return element; + }, + + hide: function(element) { + $(element).style.display = 'none'; + return element; + }, + + show: function(element) { + $(element).style.display = ''; + return element; + }, + + remove: function(element) { + element = $(element); + element.parentNode.removeChild(element); + return element; + }, + + update: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) return element.update().insert(content); + content = Object.toHTML(content); + element.innerHTML = content.stripScripts(); + content.evalScripts.bind(content).defer(); + return element; + }, + + replace: function(element, content) { + element = $(element); + if (content && content.toElement) content = content.toElement(); + else if (!Object.isElement(content)) { + content = Object.toHTML(content); + var range = element.ownerDocument.createRange(); + range.selectNode(element); + content.evalScripts.bind(content).defer(); + content = range.createContextualFragment(content.stripScripts()); + } + element.parentNode.replaceChild(content, element); + return element; + }, + + insert: function(element, insertions) { + element = $(element); + + if (Object.isString(insertions) || Object.isNumber(insertions) || + Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) + insertions = {bottom:insertions}; + + var content, insert, tagName, childNodes; + + for (var position in insertions) { + content = insertions[position]; + position = position.toLowerCase(); + insert = Element._insertionTranslations[position]; + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + insert(element, content); + continue; + } + + content = Object.toHTML(content); + + tagName = ((position == 'before' || position == 'after') + ? element.parentNode : element).tagName.toUpperCase(); + + childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + + if (position == 'top' || position == 'after') childNodes.reverse(); + childNodes.each(insert.curry(element)); + + content.evalScripts.bind(content).defer(); + } + + return element; + }, + + wrap: function(element, wrapper, attributes) { + element = $(element); + if (Object.isElement(wrapper)) + $(wrapper).writeAttribute(attributes || { }); + else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); + else wrapper = new Element('div', wrapper); + if (element.parentNode) + element.parentNode.replaceChild(wrapper, element); + wrapper.appendChild(element); + return wrapper; + }, + + inspect: function(element) { + element = $(element); + var result = '<' + element.tagName.toLowerCase(); + $H({'id': 'id', 'className': 'class'}).each(function(pair) { + var property = pair.first(), attribute = pair.last(); + var value = (element[property] || '').toString(); + if (value) result += ' ' + attribute + '=' + value.inspect(true); + }); + return result + '>'; + }, + + recursivelyCollect: function(element, property) { + element = $(element); + var elements = []; + while (element = element[property]) + if (element.nodeType == 1) + elements.push(Element.extend(element)); + return elements; + }, + + ancestors: function(element) { + return $(element).recursivelyCollect('parentNode'); + }, + + descendants: function(element) { + return $(element).select("*"); + }, + + firstDescendant: function(element) { + element = $(element).firstChild; + while (element && element.nodeType != 1) element = element.nextSibling; + return $(element); + }, + + immediateDescendants: function(element) { + if (!(element = $(element).firstChild)) return []; + while (element && element.nodeType != 1) element = element.nextSibling; + if (element) return [element].concat($(element).nextSiblings()); + return []; + }, + + previousSiblings: function(element) { + return $(element).recursivelyCollect('previousSibling'); + }, + + nextSiblings: function(element) { + return $(element).recursivelyCollect('nextSibling'); + }, + + siblings: function(element) { + element = $(element); + return element.previousSiblings().reverse().concat(element.nextSiblings()); + }, + + match: function(element, selector) { + if (Object.isString(selector)) + selector = new Selector(selector); + return selector.match($(element)); + }, + + up: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(element.parentNode); + var ancestors = element.ancestors(); + return Object.isNumber(expression) ? ancestors[expression] : + Selector.findElement(ancestors, expression, index); + }, + + down: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return element.firstDescendant(); + return Object.isNumber(expression) ? element.descendants()[expression] : + element.select(expression)[index || 0]; + }, + + previous: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); + var previousSiblings = element.previousSiblings(); + return Object.isNumber(expression) ? previousSiblings[expression] : + Selector.findElement(previousSiblings, expression, index); + }, + + next: function(element, expression, index) { + element = $(element); + if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); + var nextSiblings = element.nextSiblings(); + return Object.isNumber(expression) ? nextSiblings[expression] : + Selector.findElement(nextSiblings, expression, index); + }, + + select: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element, args); + }, + + adjacent: function() { + var args = $A(arguments), element = $(args.shift()); + return Selector.findChildElements(element.parentNode, args).without(element); + }, + + identify: function(element) { + element = $(element); + var id = element.readAttribute('id'), self = arguments.callee; + if (id) return id; + do { id = 'anonymous_element_' + self.counter++ } while ($(id)); + element.writeAttribute('id', id); + return id; + }, + + readAttribute: function(element, name) { + element = $(element); + if (Prototype.Browser.IE) { + var t = Element._attributeTranslations.read; + if (t.values[name]) return t.values[name](element, name); + if (t.names[name]) name = t.names[name]; + if (name.include(':')) { + return (!element.attributes || !element.attributes[name]) ? null : + element.attributes[name].value; + } + } + return element.getAttribute(name); + }, + + writeAttribute: function(element, name, value) { + element = $(element); + var attributes = { }, t = Element._attributeTranslations.write; + + if (typeof name == 'object') attributes = name; + else attributes[name] = Object.isUndefined(value) ? true : value; + + for (var attr in attributes) { + name = t.names[attr] || attr; + value = attributes[attr]; + if (t.values[attr]) name = t.values[attr](element, value); + if (value === false || value === null) + element.removeAttribute(name); + else if (value === true) + element.setAttribute(name, name); + else element.setAttribute(name, value); + } + return element; + }, + + getHeight: function(element) { + return $(element).getDimensions().height; + }, + + getWidth: function(element) { + return $(element).getDimensions().width; + }, + + classNames: function(element) { + return new Element.ClassNames(element); + }, + + hasClassName: function(element, className) { + if (!(element = $(element))) return; + var elementClassName = element.className; + return (elementClassName.length > 0 && (elementClassName == className || + new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); + }, + + addClassName: function(element, className) { + if (!(element = $(element))) return; + if (!element.hasClassName(className)) + element.className += (element.className ? ' ' : '') + className; + return element; + }, + + removeClassName: function(element, className) { + if (!(element = $(element))) return; + element.className = element.className.replace( + new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); + return element; + }, + + toggleClassName: function(element, className) { + if (!(element = $(element))) return; + return element[element.hasClassName(className) ? + 'removeClassName' : 'addClassName'](className); + }, + + // removes whitespace-only text node children + cleanWhitespace: function(element) { + element = $(element); + var node = element.firstChild; + while (node) { + var nextNode = node.nextSibling; + if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) + element.removeChild(node); + node = nextNode; + } + return element; + }, + + empty: function(element) { + return $(element).innerHTML.blank(); + }, + + descendantOf: function(element, ancestor) { + element = $(element), ancestor = $(ancestor); + var originalAncestor = ancestor; + + if (element.compareDocumentPosition) + return (element.compareDocumentPosition(ancestor) & 8) === 8; + + if (element.sourceIndex && !Prototype.Browser.Opera) { + var e = element.sourceIndex, a = ancestor.sourceIndex, + nextAncestor = ancestor.nextSibling; + if (!nextAncestor) { + do { ancestor = ancestor.parentNode; } + while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode); + } + if (nextAncestor && nextAncestor.sourceIndex) + return (e > a && e < nextAncestor.sourceIndex); + } + + while (element = element.parentNode) + if (element == originalAncestor) return true; + return false; + }, + + scrollTo: function(element) { + element = $(element); + var pos = element.cumulativeOffset(); + window.scrollTo(pos[0], pos[1]); + return element; + }, + + getStyle: function(element, style) { + element = $(element); + style = style == 'float' ? 'cssFloat' : style.camelize(); + var value = element.style[style]; + if (!value) { + var css = document.defaultView.getComputedStyle(element, null); + value = css ? css[style] : null; + } + if (style == 'opacity') return value ? parseFloat(value) : 1.0; + return value == 'auto' ? null : value; + }, + + getOpacity: function(element) { + return $(element).getStyle('opacity'); + }, + + setStyle: function(element, styles) { + element = $(element); + var elementStyle = element.style, match; + if (Object.isString(styles)) { + element.style.cssText += ';' + styles; + return styles.include('opacity') ? + element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; + } + for (var property in styles) + if (property == 'opacity') element.setOpacity(styles[property]); + else + elementStyle[(property == 'float' || property == 'cssFloat') ? + (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : + property] = styles[property]; + + return element; + }, + + setOpacity: function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + return element; + }, + + getDimensions: function(element) { + element = $(element); + var display = $(element).getStyle('display'); + if (display != 'none' && display != null) // Safari bug + return {width: element.offsetWidth, height: element.offsetHeight}; + + // All *Width and *Height properties give 0 on elements with display none, + // so enable the element temporarily + var els = element.style; + var originalVisibility = els.visibility; + var originalPosition = els.position; + var originalDisplay = els.display; + els.visibility = 'hidden'; + els.position = 'absolute'; + els.display = 'block'; + var originalWidth = element.clientWidth; + var originalHeight = element.clientHeight; + els.display = originalDisplay; + els.position = originalPosition; + els.visibility = originalVisibility; + return {width: originalWidth, height: originalHeight}; + }, + + makePositioned: function(element) { + element = $(element); + var pos = Element.getStyle(element, 'position'); + if (pos == 'static' || !pos) { + element._madePositioned = true; + element.style.position = 'relative'; + // Opera returns the offset relative to the positioning context, when an + // element is position relative but top and left have not been defined + if (window.opera) { + element.style.top = 0; + element.style.left = 0; + } + } + return element; + }, + + undoPositioned: function(element) { + element = $(element); + if (element._madePositioned) { + element._madePositioned = undefined; + element.style.position = + element.style.top = + element.style.left = + element.style.bottom = + element.style.right = ''; + } + return element; + }, + + makeClipping: function(element) { + element = $(element); + if (element._overflow) return element; + element._overflow = Element.getStyle(element, 'overflow') || 'auto'; + if (element._overflow !== 'hidden') + element.style.overflow = 'hidden'; + return element; + }, + + undoClipping: function(element) { + element = $(element); + if (!element._overflow) return element; + element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; + element._overflow = null; + return element; + }, + + cumulativeOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + positionedOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + element = element.offsetParent; + if (element) { + if (element.tagName == 'BODY') break; + var p = Element.getStyle(element, 'position'); + if (p !== 'static') break; + } + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + absolutize: function(element) { + element = $(element); + if (element.getStyle('position') == 'absolute') return; + // Position.prepare(); // To be done manually by Scripty when it needs it. + + var offsets = element.positionedOffset(); + var top = offsets[1]; + var left = offsets[0]; + var width = element.clientWidth; + var height = element.clientHeight; + + element._originalLeft = left - parseFloat(element.style.left || 0); + element._originalTop = top - parseFloat(element.style.top || 0); + element._originalWidth = element.style.width; + element._originalHeight = element.style.height; + + element.style.position = 'absolute'; + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.width = width + 'px'; + element.style.height = height + 'px'; + return element; + }, + + relativize: function(element) { + element = $(element); + if (element.getStyle('position') == 'relative') return; + // Position.prepare(); // To be done manually by Scripty when it needs it. + + element.style.position = 'relative'; + var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); + var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); + + element.style.top = top + 'px'; + element.style.left = left + 'px'; + element.style.height = element._originalHeight; + element.style.width = element._originalWidth; + return element; + }, + + cumulativeScrollOffset: function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.scrollTop || 0; + valueL += element.scrollLeft || 0; + element = element.parentNode; + } while (element); + return Element._returnOffset(valueL, valueT); + }, + + getOffsetParent: function(element) { + if (element.offsetParent) return $(element.offsetParent); + if (element == document.body) return $(element); + + while ((element = element.parentNode) && element != document.body) + if (Element.getStyle(element, 'position') != 'static') + return $(element); + + return $(document.body); + }, + + viewportOffset: function(forElement) { + var valueT = 0, valueL = 0; + + var element = forElement; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + + // Safari fix + if (element.offsetParent == document.body && + Element.getStyle(element, 'position') == 'absolute') break; + + } while (element = element.offsetParent); + + element = forElement; + do { + if (!Prototype.Browser.Opera || element.tagName == 'BODY') { + valueT -= element.scrollTop || 0; + valueL -= element.scrollLeft || 0; + } + } while (element = element.parentNode); + + return Element._returnOffset(valueL, valueT); + }, + + clonePosition: function(element, source) { + var options = Object.extend({ + setLeft: true, + setTop: true, + setWidth: true, + setHeight: true, + offsetTop: 0, + offsetLeft: 0 + }, arguments[2] || { }); + + // find page position of source + source = $(source); + var p = source.viewportOffset(); + + // find coordinate system to use + element = $(element); + var delta = [0, 0]; + var parent = null; + // delta [0,0] will do fine with position: fixed elements, + // position:absolute needs offsetParent deltas + if (Element.getStyle(element, 'position') == 'absolute') { + parent = element.getOffsetParent(); + delta = parent.viewportOffset(); + } + + // correct by body offsets (fixes Safari) + if (parent == document.body) { + delta[0] -= document.body.offsetLeft; + delta[1] -= document.body.offsetTop; + } + + // set position + if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; + if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; + if (options.setWidth) element.style.width = source.offsetWidth + 'px'; + if (options.setHeight) element.style.height = source.offsetHeight + 'px'; + return element; + } +}; + +Element.Methods.identify.counter = 1; + +Object.extend(Element.Methods, { + getElementsBySelector: Element.Methods.select, + childElements: Element.Methods.immediateDescendants +}); + +Element._attributeTranslations = { + write: { + names: { + className: 'class', + htmlFor: 'for' + }, + values: { } + } +}; + +if (Prototype.Browser.Opera) { + Element.Methods.getStyle = Element.Methods.getStyle.wrap( + function(proceed, element, style) { + switch (style) { + case 'left': case 'top': case 'right': case 'bottom': + if (proceed(element, 'position') === 'static') return null; + case 'height': case 'width': + // returns '0px' for hidden elements; we want it to return null + if (!Element.visible(element)) return null; + + // returns the border-box dimensions rather than the content-box + // dimensions, so we subtract padding and borders from the value + var dim = parseInt(proceed(element, style), 10); + + if (dim !== element['offset' + style.capitalize()]) + return dim + 'px'; + + var properties; + if (style === 'height') { + properties = ['border-top-width', 'padding-top', + 'padding-bottom', 'border-bottom-width']; + } + else { + properties = ['border-left-width', 'padding-left', + 'padding-right', 'border-right-width']; + } + return properties.inject(dim, function(memo, property) { + var val = proceed(element, property); + return val === null ? memo : memo - parseInt(val, 10); + }) + 'px'; + default: return proceed(element, style); + } + } + ); + + Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( + function(proceed, element, attribute) { + if (attribute === 'title') return element.title; + return proceed(element, attribute); + } + ); +} + +else if (Prototype.Browser.IE) { + // IE doesn't report offsets correctly for static elements, so we change them + // to "relative" to get the values, then change them back. + Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( + function(proceed, element) { + element = $(element); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + + $w('positionedOffset viewportOffset').each(function(method) { + Element.Methods[method] = Element.Methods[method].wrap( + function(proceed, element) { + element = $(element); + var position = element.getStyle('position'); + if (position !== 'static') return proceed(element); + // Trigger hasLayout on the offset parent so that IE6 reports + // accurate offsetTop and offsetLeft values for position: fixed. + var offsetParent = element.getOffsetParent(); + if (offsetParent && offsetParent.getStyle('position') === 'fixed') + offsetParent.setStyle({ zoom: 1 }); + element.setStyle({ position: 'relative' }); + var value = proceed(element); + element.setStyle({ position: position }); + return value; + } + ); + }); + + Element.Methods.getStyle = function(element, style) { + element = $(element); + style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); + var value = element.style[style]; + if (!value && element.currentStyle) value = element.currentStyle[style]; + + if (style == 'opacity') { + if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) + if (value[1]) return parseFloat(value[1]) / 100; + return 1.0; + } + + if (value == 'auto') { + if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) + return element['offset' + style.capitalize()] + 'px'; + return null; + } + return value; + }; + + Element.Methods.setOpacity = function(element, value) { + function stripAlpha(filter){ + return filter.replace(/alpha\([^\)]*\)/gi,''); + } + element = $(element); + var currentStyle = element.currentStyle; + if ((currentStyle && !currentStyle.hasLayout) || + (!currentStyle && element.style.zoom == 'normal')) + element.style.zoom = 1; + + var filter = element.getStyle('filter'), style = element.style; + if (value == 1 || value === '') { + (filter = stripAlpha(filter)) ? + style.filter = filter : style.removeAttribute('filter'); + return element; + } else if (value < 0.00001) value = 0; + style.filter = stripAlpha(filter) + + 'alpha(opacity=' + (value * 100) + ')'; + return element; + }; + + Element._attributeTranslations = { + read: { + names: { + 'class': 'className', + 'for': 'htmlFor' + }, + values: { + _getAttr: function(element, attribute) { + return element.getAttribute(attribute, 2); + }, + _getAttrNode: function(element, attribute) { + var node = element.getAttributeNode(attribute); + return node ? node.value : ""; + }, + _getEv: function(element, attribute) { + attribute = element.getAttribute(attribute); + return attribute ? attribute.toString().slice(23, -2) : null; + }, + _flag: function(element, attribute) { + return $(element).hasAttribute(attribute) ? attribute : null; + }, + style: function(element) { + return element.style.cssText.toLowerCase(); + }, + title: function(element) { + return element.title; + } + } + } + }; + + Element._attributeTranslations.write = { + names: Object.extend({ + cellpadding: 'cellPadding', + cellspacing: 'cellSpacing' + }, Element._attributeTranslations.read.names), + values: { + checked: function(element, value) { + element.checked = !!value; + }, + + style: function(element, value) { + element.style.cssText = value ? value : ''; + } + } + }; + + Element._attributeTranslations.has = {}; + + $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + + 'encType maxLength readOnly longDesc').each(function(attr) { + Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; + Element._attributeTranslations.has[attr.toLowerCase()] = attr; + }); + + (function(v) { + Object.extend(v, { + href: v._getAttr, + src: v._getAttr, + type: v._getAttr, + action: v._getAttrNode, + disabled: v._flag, + checked: v._flag, + readonly: v._flag, + multiple: v._flag, + onload: v._getEv, + onunload: v._getEv, + onclick: v._getEv, + ondblclick: v._getEv, + onmousedown: v._getEv, + onmouseup: v._getEv, + onmouseover: v._getEv, + onmousemove: v._getEv, + onmouseout: v._getEv, + onfocus: v._getEv, + onblur: v._getEv, + onkeypress: v._getEv, + onkeydown: v._getEv, + onkeyup: v._getEv, + onsubmit: v._getEv, + onreset: v._getEv, + onselect: v._getEv, + onchange: v._getEv + }); + })(Element._attributeTranslations.read.values); +} + +else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1) ? 0.999999 : + (value === '') ? '' : (value < 0.00001) ? 0 : value; + return element; + }; +} + +else if (Prototype.Browser.WebKit) { + Element.Methods.setOpacity = function(element, value) { + element = $(element); + element.style.opacity = (value == 1 || value === '') ? '' : + (value < 0.00001) ? 0 : value; + + if (value == 1) + if(element.tagName == 'IMG' && element.width) { + element.width++; element.width--; + } else try { + var n = document.createTextNode(' '); + element.appendChild(n); + element.removeChild(n); + } catch (e) { } + + return element; + }; + + // Safari returns margins on body which is incorrect if the child is absolutely + // positioned. For performance reasons, redefine Element#cumulativeOffset for + // KHTML/WebKit only. + Element.Methods.cumulativeOffset = function(element) { + var valueT = 0, valueL = 0; + do { + valueT += element.offsetTop || 0; + valueL += element.offsetLeft || 0; + if (element.offsetParent == document.body) + if (Element.getStyle(element, 'position') == 'absolute') break; + + element = element.offsetParent; + } while (element); + + return Element._returnOffset(valueL, valueT); + }; +} + +if (Prototype.Browser.IE || Prototype.Browser.Opera) { + // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements + Element.Methods.update = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) return element.update().insert(content); + + content = Object.toHTML(content); + var tagName = element.tagName.toUpperCase(); + + if (tagName in Element._insertionTranslations.tags) { + $A(element.childNodes).each(function(node) { element.removeChild(node) }); + Element._getContentFromAnonymousElement(tagName, content.stripScripts()) + .each(function(node) { element.appendChild(node) }); + } + else element.innerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +if ('outerHTML' in document.createElement('div')) { + Element.Methods.replace = function(element, content) { + element = $(element); + + if (content && content.toElement) content = content.toElement(); + if (Object.isElement(content)) { + element.parentNode.replaceChild(content, element); + return element; + } + + content = Object.toHTML(content); + var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); + + if (Element._insertionTranslations.tags[tagName]) { + var nextSibling = element.next(); + var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + parent.removeChild(element); + if (nextSibling) + fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); + else + fragments.each(function(node) { parent.appendChild(node) }); + } + else element.outerHTML = content.stripScripts(); + + content.evalScripts.bind(content).defer(); + return element; + }; +} + +Element._returnOffset = function(l, t) { + var result = [l, t]; + result.left = l; + result.top = t; + return result; +}; + +Element._getContentFromAnonymousElement = function(tagName, html) { + var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; + if (t) { + div.innerHTML = t[0] + html + t[1]; + t[2].times(function() { div = div.firstChild }); + } else div.innerHTML = html; + return $A(div.childNodes); +}; + +Element._insertionTranslations = { + before: function(element, node) { + element.parentNode.insertBefore(node, element); + }, + top: function(element, node) { + element.insertBefore(node, element.firstChild); + }, + bottom: function(element, node) { + element.appendChild(node); + }, + after: function(element, node) { + element.parentNode.insertBefore(node, element.nextSibling); + }, + tags: { + TABLE: ['', '
', 1], + TBODY: ['', '
', 2], + TR: ['', '
', 3], + TD: ['
', '
', 4], + SELECT: ['', 1] + } +}; + +(function() { + Object.extend(this.tags, { + THEAD: this.tags.TBODY, + TFOOT: this.tags.TBODY, + TH: this.tags.TD + }); +}).call(Element._insertionTranslations); + +Element.Methods.Simulated = { + hasAttribute: function(element, attribute) { + attribute = Element._attributeTranslations.has[attribute] || attribute; + var node = $(element).getAttributeNode(attribute); + return node && node.specified; + } +}; + +Element.Methods.ByTag = { }; + +Object.extend(Element, Element.Methods); + +if (!Prototype.BrowserFeatures.ElementExtensions && + document.createElement('div').__proto__) { + window.HTMLElement = { }; + window.HTMLElement.prototype = document.createElement('div').__proto__; + Prototype.BrowserFeatures.ElementExtensions = true; +} + +Element.extend = (function() { + if (Prototype.BrowserFeatures.SpecificElementExtensions) + return Prototype.K; + + var Methods = { }, ByTag = Element.Methods.ByTag; + + var extend = Object.extend(function(element) { + if (!element || element._extendedByPrototype || + element.nodeType != 1 || element == window) return element; + + var methods = Object.clone(Methods), + tagName = element.tagName, property, value; + + // extend methods for specific tags + if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); + + for (property in methods) { + value = methods[property]; + if (Object.isFunction(value) && !(property in element)) + element[property] = value.methodize(); + } + + element._extendedByPrototype = Prototype.emptyFunction; + return element; + + }, { + refresh: function() { + // extend methods for all tags (Safari doesn't need this) + if (!Prototype.BrowserFeatures.ElementExtensions) { + Object.extend(Methods, Element.Methods); + Object.extend(Methods, Element.Methods.Simulated); + } + } + }); + + extend.refresh(); + return extend; +})(); + +Element.hasAttribute = function(element, attribute) { + if (element.hasAttribute) return element.hasAttribute(attribute); + return Element.Methods.Simulated.hasAttribute(element, attribute); +}; + +Element.addMethods = function(methods) { + var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; + + if (!methods) { + Object.extend(Form, Form.Methods); + Object.extend(Form.Element, Form.Element.Methods); + Object.extend(Element.Methods.ByTag, { + "FORM": Object.clone(Form.Methods), + "INPUT": Object.clone(Form.Element.Methods), + "SELECT": Object.clone(Form.Element.Methods), + "TEXTAREA": Object.clone(Form.Element.Methods) + }); + } + + if (arguments.length == 2) { + var tagName = methods; + methods = arguments[1]; + } + + if (!tagName) Object.extend(Element.Methods, methods || { }); + else { + if (Object.isArray(tagName)) tagName.each(extend); + else extend(tagName); + } + + function extend(tagName) { + tagName = tagName.toUpperCase(); + if (!Element.Methods.ByTag[tagName]) + Element.Methods.ByTag[tagName] = { }; + Object.extend(Element.Methods.ByTag[tagName], methods); + } + + function copy(methods, destination, onlyIfAbsent) { + onlyIfAbsent = onlyIfAbsent || false; + for (var property in methods) { + var value = methods[property]; + if (!Object.isFunction(value)) continue; + if (!onlyIfAbsent || !(property in destination)) + destination[property] = value.methodize(); + } + } + + function findDOMClass(tagName) { + var klass; + var trans = { + "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", + "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", + "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", + "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", + "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": + "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": + "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": + "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": + "FrameSet", "IFRAME": "IFrame" + }; + if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName + 'Element'; + if (window[klass]) return window[klass]; + klass = 'HTML' + tagName.capitalize() + 'Element'; + if (window[klass]) return window[klass]; + + window[klass] = { }; + window[klass].prototype = document.createElement(tagName).__proto__; + return window[klass]; + } + + if (F.ElementExtensions) { + copy(Element.Methods, HTMLElement.prototype); + copy(Element.Methods.Simulated, HTMLElement.prototype, true); + } + + if (F.SpecificElementExtensions) { + for (var tag in Element.Methods.ByTag) { + var klass = findDOMClass(tag); + if (Object.isUndefined(klass)) continue; + copy(T[tag], klass.prototype); + } + } + + Object.extend(Element, Element.Methods); + delete Element.ByTag; + + if (Element.extend.refresh) Element.extend.refresh(); + Element.cache = { }; +}; + +document.viewport = { + getDimensions: function() { + var dimensions = { }; + var B = Prototype.Browser; + $w('width height').each(function(d) { + var D = d.capitalize(); + dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] : + (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D]; + }); + return dimensions; + }, + + getWidth: function() { + return this.getDimensions().width; + }, + + getHeight: function() { + return this.getDimensions().height; + }, + + getScrollOffsets: function() { + return Element._returnOffset( + window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, + window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); + } +}; +/* Portions of the Selector class are derived from Jack Slocum’s DomQuery, + * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style + * license. Please see http://www.yui-ext.com/ for more information. */ + +var Selector = Class.create({ + initialize: function(expression) { + this.expression = expression.strip(); + this.compileMatcher(); + }, + + shouldUseXPath: function() { + if (!Prototype.BrowserFeatures.XPath) return false; + + var e = this.expression; + + // Safari 3 chokes on :*-of-type and :empty + if (Prototype.Browser.WebKit && + (e.include("-of-type") || e.include(":empty"))) + return false; + + // XPath can't do namespaced attributes, nor can it read + // the "checked" property from DOM nodes + if ((/(\[[\w-]*?:|:checked)/).test(this.expression)) + return false; + + return true; + }, + + compileMatcher: function() { + if (this.shouldUseXPath()) + return this.compileXPathMatcher(); + + var e = this.expression, ps = Selector.patterns, h = Selector.handlers, + c = Selector.criteria, le, p, m; + + if (Selector._cache[e]) { + this.matcher = Selector._cache[e]; + return; + } + + this.matcher = ["this.matcher = function(root) {", + "var r = root, h = Selector.handlers, c = false, n;"]; + + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + p = ps[i]; + if (m = e.match(p)) { + this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : + new Template(c[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.matcher.push("return h.unique(n);\n}"); + eval(this.matcher.join('\n')); + Selector._cache[this.expression] = this.matcher; + }, + + compileXPathMatcher: function() { + var e = this.expression, ps = Selector.patterns, + x = Selector.xpath, le, m; + + if (Selector._cache[e]) { + this.xpath = Selector._cache[e]; return; + } + + this.matcher = ['.//*']; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + if (m = e.match(ps[i])) { + this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : + new Template(x[i]).evaluate(m)); + e = e.replace(m[0], ''); + break; + } + } + } + + this.xpath = this.matcher.join(''); + Selector._cache[this.expression] = this.xpath; + }, + + findElements: function(root) { + root = root || document; + if (this.xpath) return document._getElementsByXPath(this.xpath, root); + return this.matcher(root); + }, + + match: function(element) { + this.tokens = []; + + var e = this.expression, ps = Selector.patterns, as = Selector.assertions; + var le, p, m; + + while (e && le !== e && (/\S/).test(e)) { + le = e; + for (var i in ps) { + p = ps[i]; + if (m = e.match(p)) { + // use the Selector.assertions methods unless the selector + // is too complex. + if (as[i]) { + this.tokens.push([i, Object.clone(m)]); + e = e.replace(m[0], ''); + } else { + // reluctantly do a document-wide search + // and look for a match in the array + return this.findElements(document).include(element); + } + } + } + } + + var match = true, name, matches; + for (var i = 0, token; token = this.tokens[i]; i++) { + name = token[0], matches = token[1]; + if (!Selector.assertions[name](element, matches)) { + match = false; break; + } + } + + return match; + }, + + toString: function() { + return this.expression; + }, + + inspect: function() { + return "#"; + } +}); + +Object.extend(Selector, { + _cache: { }, + + xpath: { + descendant: "//*", + child: "/*", + adjacent: "/following-sibling::*[1]", + laterSibling: '/following-sibling::*', + tagName: function(m) { + if (m[1] == '*') return ''; + return "[local-name()='" + m[1].toLowerCase() + + "' or local-name()='" + m[1].toUpperCase() + "']"; + }, + className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", + id: "[@id='#{1}']", + attrPresence: function(m) { + m[1] = m[1].toLowerCase(); + return new Template("[@#{1}]").evaluate(m); + }, + attr: function(m) { + m[1] = m[1].toLowerCase(); + m[3] = m[5] || m[6]; + return new Template(Selector.xpath.operators[m[2]]).evaluate(m); + }, + pseudo: function(m) { + var h = Selector.xpath.pseudos[m[1]]; + if (!h) return ''; + if (Object.isFunction(h)) return h(m); + return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); + }, + operators: { + '=': "[@#{1}='#{3}']", + '!=': "[@#{1}!='#{3}']", + '^=': "[starts-with(@#{1}, '#{3}')]", + '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", + '*=': "[contains(@#{1}, '#{3}')]", + '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", + '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" + }, + pseudos: { + 'first-child': '[not(preceding-sibling::*)]', + 'last-child': '[not(following-sibling::*)]', + 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', + 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]", + 'checked': "[@checked]", + 'disabled': "[@disabled]", + 'enabled': "[not(@disabled)]", + 'not': function(m) { + var e = m[6], p = Selector.patterns, + x = Selector.xpath, le, v; + + var exclusion = []; + while (e && le != e && (/\S/).test(e)) { + le = e; + for (var i in p) { + if (m = e.match(p[i])) { + v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); + exclusion.push("(" + v.substring(1, v.length - 1) + ")"); + e = e.replace(m[0], ''); + break; + } + } + } + return "[not(" + exclusion.join(" and ") + ")]"; + }, + 'nth-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); + }, + 'nth-last-child': function(m) { + return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); + }, + 'nth-of-type': function(m) { + return Selector.xpath.pseudos.nth("position() ", m); + }, + 'nth-last-of-type': function(m) { + return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); + }, + 'first-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); + }, + 'last-of-type': function(m) { + m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); + }, + 'only-of-type': function(m) { + var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); + }, + nth: function(fragment, m) { + var mm, formula = m[6], predicate; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + if (mm = formula.match(/^(\d+)$/)) // digit only + return '[' + fragment + "= " + mm[1] + ']'; + if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (mm[1] == "-") mm[1] = -1; + var a = mm[1] ? Number(mm[1]) : 1; + var b = mm[2] ? Number(mm[2]) : 0; + predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + + "((#{fragment} - #{b}) div #{a} >= 0)]"; + return new Template(predicate).evaluate({ + fragment: fragment, a: a, b: b }); + } + } + } + }, + + criteria: { + tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', + className: 'n = h.className(n, r, "#{1}", c); c = false;', + id: 'n = h.id(n, r, "#{1}", c); c = false;', + attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', + attr: function(m) { + m[3] = (m[5] || m[6]); + return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); + }, + pseudo: function(m) { + if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); + return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); + }, + descendant: 'c = "descendant";', + child: 'c = "child";', + adjacent: 'c = "adjacent";', + laterSibling: 'c = "laterSibling";' + }, + + patterns: { + // combinators must be listed first + // (and descendant needs to be last combinator) + laterSibling: /^\s*~\s*/, + child: /^\s*>\s*/, + adjacent: /^\s*\+\s*/, + descendant: /^\s/, + + // selectors follow + tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, + id: /^#([\w\-\*]+)(\b|$)/, + className: /^\.([\w\-\*]+)(\b|$)/, + pseudo: +/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, + attrPresence: /^\[([\w]+)\]/, + attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ + }, + + // for Selector.match and Element#match + assertions: { + tagName: function(element, matches) { + return matches[1].toUpperCase() == element.tagName.toUpperCase(); + }, + + className: function(element, matches) { + return Element.hasClassName(element, matches[1]); + }, + + id: function(element, matches) { + return element.id === matches[1]; + }, + + attrPresence: function(element, matches) { + return Element.hasAttribute(element, matches[1]); + }, + + attr: function(element, matches) { + var nodeValue = Element.readAttribute(element, matches[1]); + return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); + } + }, + + handlers: { + // UTILITY FUNCTIONS + // joins two collections + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + a.push(node); + return a; + }, + + // marks an array of nodes for counting + mark: function(nodes) { + var _true = Prototype.emptyFunction; + for (var i = 0, node; node = nodes[i]; i++) + node._countedByPrototype = _true; + return nodes; + }, + + unmark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node._countedByPrototype = undefined; + return nodes; + }, + + // mark each child node with its position (for nth calls) + // "ofType" flag indicates whether we're indexing for nth-of-type + // rather than nth-child + index: function(parentNode, reverse, ofType) { + parentNode._countedByPrototype = Prototype.emptyFunction; + if (reverse) { + for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { + var node = nodes[i]; + if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; + } + } else { + for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) + if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; + } + }, + + // filters out duplicates and extends all nodes + unique: function(nodes) { + if (nodes.length == 0) return nodes; + var results = [], n; + for (var i = 0, l = nodes.length; i < l; i++) + if (!(n = nodes[i])._countedByPrototype) { + n._countedByPrototype = Prototype.emptyFunction; + results.push(Element.extend(n)); + } + return Selector.handlers.unmark(results); + }, + + // COMBINATOR FUNCTIONS + descendant: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName('*')); + return results; + }, + + child: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) { + for (var j = 0, child; child = node.childNodes[j]; j++) + if (child.nodeType == 1 && child.tagName != '!') results.push(child); + } + return results; + }, + + adjacent: function(nodes) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + var next = this.nextElementSibling(node); + if (next) results.push(next); + } + return results; + }, + + laterSibling: function(nodes) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + h.concat(results, Element.nextSiblings(node)); + return results; + }, + + nextElementSibling: function(node) { + while (node = node.nextSibling) + if (node.nodeType == 1) return node; + return null; + }, + + previousElementSibling: function(node) { + while (node = node.previousSibling) + if (node.nodeType == 1) return node; + return null; + }, + + // TOKEN FUNCTIONS + tagName: function(nodes, root, tagName, combinator) { + var uTagName = tagName.toUpperCase(); + var results = [], h = Selector.handlers; + if (nodes) { + if (combinator) { + // fastlane for ordinary descendant combinators + if (combinator == "descendant") { + for (var i = 0, node; node = nodes[i]; i++) + h.concat(results, node.getElementsByTagName(tagName)); + return results; + } else nodes = this[combinator](nodes); + if (tagName == "*") return nodes; + } + for (var i = 0, node; node = nodes[i]; i++) + if (node.tagName.toUpperCase() === uTagName) results.push(node); + return results; + } else return root.getElementsByTagName(tagName); + }, + + id: function(nodes, root, id, combinator) { + var targetNode = $(id), h = Selector.handlers; + if (!targetNode) return []; + if (!nodes && root == document) return [targetNode]; + if (nodes) { + if (combinator) { + if (combinator == 'child') { + for (var i = 0, node; node = nodes[i]; i++) + if (targetNode.parentNode == node) return [targetNode]; + } else if (combinator == 'descendant') { + for (var i = 0, node; node = nodes[i]; i++) + if (Element.descendantOf(targetNode, node)) return [targetNode]; + } else if (combinator == 'adjacent') { + for (var i = 0, node; node = nodes[i]; i++) + if (Selector.handlers.previousElementSibling(targetNode) == node) + return [targetNode]; + } else nodes = h[combinator](nodes); + } + for (var i = 0, node; node = nodes[i]; i++) + if (node == targetNode) return [targetNode]; + return []; + } + return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; + }, + + className: function(nodes, root, className, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + return Selector.handlers.byClassName(nodes, root, className); + }, + + byClassName: function(nodes, root, className) { + if (!nodes) nodes = Selector.handlers.descendant([root]); + var needle = ' ' + className + ' '; + for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { + nodeClassName = node.className; + if (nodeClassName.length == 0) continue; + if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) + results.push(node); + } + return results; + }, + + attrPresence: function(nodes, root, attr, combinator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + if (nodes && combinator) nodes = this[combinator](nodes); + var results = []; + for (var i = 0, node; node = nodes[i]; i++) + if (Element.hasAttribute(node, attr)) results.push(node); + return results; + }, + + attr: function(nodes, root, attr, value, operator, combinator) { + if (!nodes) nodes = root.getElementsByTagName("*"); + if (nodes && combinator) nodes = this[combinator](nodes); + var handler = Selector.operators[operator], results = []; + for (var i = 0, node; node = nodes[i]; i++) { + var nodeValue = Element.readAttribute(node, attr); + if (nodeValue === null) continue; + if (handler(nodeValue, value)) results.push(node); + } + return results; + }, + + pseudo: function(nodes, name, value, root, combinator) { + if (nodes && combinator) nodes = this[combinator](nodes); + if (!nodes) nodes = root.getElementsByTagName("*"); + return Selector.pseudos[name](nodes, value, root); + } + }, + + pseudos: { + 'first-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.previousElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'last-child': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + if (Selector.handlers.nextElementSibling(node)) continue; + results.push(node); + } + return results; + }, + 'only-child': function(nodes, value, root) { + var h = Selector.handlers; + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) + results.push(node); + return results; + }, + 'nth-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root); + }, + 'nth-last-child': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true); + }, + 'nth-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, false, true); + }, + 'nth-last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, formula, root, true, true); + }, + 'first-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, false, true); + }, + 'last-of-type': function(nodes, formula, root) { + return Selector.pseudos.nth(nodes, "1", root, true, true); + }, + 'only-of-type': function(nodes, formula, root) { + var p = Selector.pseudos; + return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); + }, + + // handles the an+b logic + getIndices: function(a, b, total) { + if (a == 0) return b > 0 ? [b] : []; + return $R(1, total).inject([], function(memo, i) { + if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); + return memo; + }); + }, + + // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type + nth: function(nodes, formula, root, reverse, ofType) { + if (nodes.length == 0) return []; + if (formula == 'even') formula = '2n+0'; + if (formula == 'odd') formula = '2n+1'; + var h = Selector.handlers, results = [], indexed = [], m; + h.mark(nodes); + for (var i = 0, node; node = nodes[i]; i++) { + if (!node.parentNode._countedByPrototype) { + h.index(node.parentNode, reverse, ofType); + indexed.push(node.parentNode); + } + } + if (formula.match(/^\d+$/)) { // just a number + formula = Number(formula); + for (var i = 0, node; node = nodes[i]; i++) + if (node.nodeIndex == formula) results.push(node); + } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b + if (m[1] == "-") m[1] = -1; + var a = m[1] ? Number(m[1]) : 1; + var b = m[2] ? Number(m[2]) : 0; + var indices = Selector.pseudos.getIndices(a, b, nodes.length); + for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { + for (var j = 0; j < l; j++) + if (node.nodeIndex == indices[j]) results.push(node); + } + } + h.unmark(nodes); + h.unmark(indexed); + return results; + }, + + 'empty': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) { + // IE treats comments as element nodes + if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue; + results.push(node); + } + return results; + }, + + 'not': function(nodes, selector, root) { + var h = Selector.handlers, selectorType, m; + var exclusions = new Selector(selector).findElements(root); + h.mark(exclusions); + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node._countedByPrototype) results.push(node); + h.unmark(exclusions); + return results; + }, + + 'enabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (!node.disabled) results.push(node); + return results; + }, + + 'disabled': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.disabled) results.push(node); + return results; + }, + + 'checked': function(nodes, value, root) { + for (var i = 0, results = [], node; node = nodes[i]; i++) + if (node.checked) results.push(node); + return results; + } + }, + + operators: { + '=': function(nv, v) { return nv == v; }, + '!=': function(nv, v) { return nv != v; }, + '^=': function(nv, v) { return nv.startsWith(v); }, + '$=': function(nv, v) { return nv.endsWith(v); }, + '*=': function(nv, v) { return nv.include(v); }, + '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, + '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); } + }, + + split: function(expression) { + var expressions = []; + expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { + expressions.push(m[1].strip()); + }); + return expressions; + }, + + matchElements: function(elements, expression) { + var matches = $$(expression), h = Selector.handlers; + h.mark(matches); + for (var i = 0, results = [], element; element = elements[i]; i++) + if (element._countedByPrototype) results.push(element); + h.unmark(matches); + return results; + }, + + findElement: function(elements, expression, index) { + if (Object.isNumber(expression)) { + index = expression; expression = false; + } + return Selector.matchElements(elements, expression || '*')[index || 0]; + }, + + findChildElements: function(element, expressions) { + expressions = Selector.split(expressions.join(',')); + var results = [], h = Selector.handlers; + for (var i = 0, l = expressions.length, selector; i < l; i++) { + selector = new Selector(expressions[i].strip()); + h.concat(results, selector.findElements(element)); + } + return (l > 1) ? h.unique(results) : results; + } +}); + +if (Prototype.Browser.IE) { + Object.extend(Selector.handlers, { + // IE returns comment nodes on getElementsByTagName("*"). + // Filter them out. + concat: function(a, b) { + for (var i = 0, node; node = b[i]; i++) + if (node.tagName !== "!") a.push(node); + return a; + }, + + // IE improperly serializes _countedByPrototype in (inner|outer)HTML. + unmark: function(nodes) { + for (var i = 0, node; node = nodes[i]; i++) + node.removeAttribute('_countedByPrototype'); + return nodes; + } + }); +} + +function $$() { + return Selector.findChildElements(document, $A(arguments)); +} +var Form = { + reset: function(form) { + $(form).reset(); + return form; + }, + + serializeElements: function(elements, options) { + if (typeof options != 'object') options = { hash: !!options }; + else if (Object.isUndefined(options.hash)) options.hash = true; + var key, value, submitted = false, submit = options.submit; + + var data = elements.inject({ }, function(result, element) { + if (!element.disabled && element.name) { + key = element.name; value = $(element).getValue(); + if (value != null && (element.type != 'submit' || (!submitted && + submit !== false && (!submit || key == submit) && (submitted = true)))) { + if (key in result) { + // a key is already present; construct an array of values + if (!Object.isArray(result[key])) result[key] = [result[key]]; + result[key].push(value); + } + else result[key] = value; + } + } + return result; + }); + + return options.hash ? data : Object.toQueryString(data); + } +}; + +Form.Methods = { + serialize: function(form, options) { + return Form.serializeElements(Form.getElements(form), options); + }, + + getElements: function(form) { + return $A($(form).getElementsByTagName('*')).inject([], + function(elements, child) { + if (Form.Element.Serializers[child.tagName.toLowerCase()]) + elements.push(Element.extend(child)); + return elements; + } + ); + }, + + getInputs: function(form, typeName, name) { + form = $(form); + var inputs = form.getElementsByTagName('input'); + + if (!typeName && !name) return $A(inputs).map(Element.extend); + + for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { + var input = inputs[i]; + if ((typeName && input.type != typeName) || (name && input.name != name)) + continue; + matchingInputs.push(Element.extend(input)); + } + + return matchingInputs; + }, + + disable: function(form) { + form = $(form); + Form.getElements(form).invoke('disable'); + return form; + }, + + enable: function(form) { + form = $(form); + Form.getElements(form).invoke('enable'); + return form; + }, + + findFirstElement: function(form) { + var elements = $(form).getElements().findAll(function(element) { + return 'hidden' != element.type && !element.disabled; + }); + var firstByIndex = elements.findAll(function(element) { + return element.hasAttribute('tabIndex') && element.tabIndex >= 0; + }).sortBy(function(element) { return element.tabIndex }).first(); + + return firstByIndex ? firstByIndex : elements.find(function(element) { + return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); + }); + }, + + focusFirstElement: function(form) { + form = $(form); + form.findFirstElement().activate(); + return form; + }, + + request: function(form, options) { + form = $(form), options = Object.clone(options || { }); + + var params = options.parameters, action = form.readAttribute('action') || ''; + if (action.blank()) action = window.location.href; + options.parameters = form.serialize(true); + + if (params) { + if (Object.isString(params)) params = params.toQueryParams(); + Object.extend(options.parameters, params); + } + + if (form.hasAttribute('method') && !options.method) + options.method = form.method; + + return new Ajax.Request(action, options); + } +}; + +/*--------------------------------------------------------------------------*/ + +Form.Element = { + focus: function(element) { + $(element).focus(); + return element; + }, + + select: function(element) { + $(element).select(); + return element; + } +}; + +Form.Element.Methods = { + serialize: function(element) { + element = $(element); + if (!element.disabled && element.name) { + var value = element.getValue(); + if (value != undefined) { + var pair = { }; + pair[element.name] = value; + return Object.toQueryString(pair); + } + } + return ''; + }, + + getValue: function(element) { + element = $(element); + var method = element.tagName.toLowerCase(); + return Form.Element.Serializers[method](element); + }, + + setValue: function(element, value) { + element = $(element); + var method = element.tagName.toLowerCase(); + Form.Element.Serializers[method](element, value); + return element; + }, + + clear: function(element) { + $(element).value = ''; + return element; + }, + + present: function(element) { + return $(element).value != ''; + }, + + activate: function(element) { + element = $(element); + try { + element.focus(); + if (element.select && (element.tagName.toLowerCase() != 'input' || + !['button', 'reset', 'submit'].include(element.type))) + element.select(); + } catch (e) { } + return element; + }, + + disable: function(element) { + element = $(element); + element.blur(); + element.disabled = true; + return element; + }, + + enable: function(element) { + element = $(element); + element.disabled = false; + return element; + } +}; + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = { + input: function(element, value) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + return Form.Element.Serializers.inputSelector(element, value); + default: + return Form.Element.Serializers.textarea(element, value); + } + }, + + inputSelector: function(element, value) { + if (Object.isUndefined(value)) return element.checked ? element.value : null; + else element.checked = !!value; + }, + + textarea: function(element, value) { + if (Object.isUndefined(value)) return element.value; + else element.value = value; + }, + + select: function(element, index) { + if (Object.isUndefined(index)) + return this[element.type == 'select-one' ? + 'selectOne' : 'selectMany'](element); + else { + var opt, value, single = !Object.isArray(index); + for (var i = 0, length = element.length; i < length; i++) { + opt = element.options[i]; + value = this.optionValue(opt); + if (single) { + if (value == index) { + opt.selected = true; + return; + } + } + else opt.selected = index.include(value); + } + } + }, + + selectOne: function(element) { + var index = element.selectedIndex; + return index >= 0 ? this.optionValue(element.options[index]) : null; + }, + + selectMany: function(element) { + var values, length = element.length; + if (!length) return null; + + for (var i = 0, values = []; i < length; i++) { + var opt = element.options[i]; + if (opt.selected) values.push(this.optionValue(opt)); + } + return values; + }, + + optionValue: function(opt) { + // extend element because hasAttribute may not be native + return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; + } +}; + +/*--------------------------------------------------------------------------*/ + +Abstract.TimedObserver = Class.create(PeriodicalExecuter, { + initialize: function($super, element, frequency, callback) { + $super(callback, frequency); + this.element = $(element); + this.lastValue = this.getValue(); + }, + + execute: function() { + var value = this.getValue(); + if (Object.isString(this.lastValue) && Object.isString(value) ? + this.lastValue != value : String(this.lastValue) != String(value)) { + this.callback(this.element, value); + this.lastValue = value; + } + } +}); + +Form.Element.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.Observer = Class.create(Abstract.TimedObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); + +/*--------------------------------------------------------------------------*/ + +Abstract.EventObserver = Class.create({ + initialize: function(element, callback) { + this.element = $(element); + this.callback = callback; + + this.lastValue = this.getValue(); + if (this.element.tagName.toLowerCase() == 'form') + this.registerFormCallbacks(); + else + this.registerCallback(this.element); + }, + + onElementEvent: function() { + var value = this.getValue(); + if (this.lastValue != value) { + this.callback(this.element, value); + this.lastValue = value; + } + }, + + registerFormCallbacks: function() { + Form.getElements(this.element).each(this.registerCallback, this); + }, + + registerCallback: function(element) { + if (element.type) { + switch (element.type.toLowerCase()) { + case 'checkbox': + case 'radio': + Event.observe(element, 'click', this.onElementEvent.bind(this)); + break; + default: + Event.observe(element, 'change', this.onElementEvent.bind(this)); + break; + } + } + } +}); + +Form.Element.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.Element.getValue(this.element); + } +}); + +Form.EventObserver = Class.create(Abstract.EventObserver, { + getValue: function() { + return Form.serialize(this.element); + } +}); +if (!window.Event) var Event = { }; + +Object.extend(Event, { + KEY_BACKSPACE: 8, + KEY_TAB: 9, + KEY_RETURN: 13, + KEY_ESC: 27, + KEY_LEFT: 37, + KEY_UP: 38, + KEY_RIGHT: 39, + KEY_DOWN: 40, + KEY_DELETE: 46, + KEY_HOME: 36, + KEY_END: 35, + KEY_PAGEUP: 33, + KEY_PAGEDOWN: 34, + KEY_INSERT: 45, + + cache: { }, + + relatedTarget: function(event) { + var element; + switch(event.type) { + case 'mouseover': element = event.fromElement; break; + case 'mouseout': element = event.toElement; break; + default: return null; + } + return Element.extend(element); + } +}); + +Event.Methods = (function() { + var isButton; + + if (Prototype.Browser.IE) { + var buttonMap = { 0: 1, 1: 4, 2: 2 }; + isButton = function(event, code) { + return event.button == buttonMap[code]; + }; + + } else if (Prototype.Browser.WebKit) { + isButton = function(event, code) { + switch (code) { + case 0: return event.which == 1 && !event.metaKey; + case 1: return event.which == 1 && event.metaKey; + default: return false; + } + }; + + } else { + isButton = function(event, code) { + return event.which ? (event.which === code + 1) : (event.button === code); + }; + } + + return { + isLeftClick: function(event) { return isButton(event, 0) }, + isMiddleClick: function(event) { return isButton(event, 1) }, + isRightClick: function(event) { return isButton(event, 2) }, + + element: function(event) { + var node = Event.extend(event).target; + return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node); + }, + + findElement: function(event, expression) { + var element = Event.element(event); + if (!expression) return element; + var elements = [element].concat(element.ancestors()); + return Selector.findElement(elements, expression, 0); + }, + + pointer: function(event) { + return { + x: event.pageX || (event.clientX + + (document.documentElement.scrollLeft || document.body.scrollLeft)), + y: event.pageY || (event.clientY + + (document.documentElement.scrollTop || document.body.scrollTop)) + }; + }, + + pointerX: function(event) { return Event.pointer(event).x }, + pointerY: function(event) { return Event.pointer(event).y }, + + stop: function(event) { + Event.extend(event); + event.preventDefault(); + event.stopPropagation(); + event.stopped = true; + } + }; +})(); + +Event.extend = (function() { + var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { + m[name] = Event.Methods[name].methodize(); + return m; + }); + + if (Prototype.Browser.IE) { + Object.extend(methods, { + stopPropagation: function() { this.cancelBubble = true }, + preventDefault: function() { this.returnValue = false }, + inspect: function() { return "[object Event]" } + }); + + return function(event) { + if (!event) return false; + if (event._extendedByPrototype) return event; + + event._extendedByPrototype = Prototype.emptyFunction; + var pointer = Event.pointer(event); + Object.extend(event, { + target: event.srcElement, + relatedTarget: Event.relatedTarget(event), + pageX: pointer.x, + pageY: pointer.y + }); + return Object.extend(event, methods); + }; + + } else { + Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__; + Object.extend(Event.prototype, methods); + return Prototype.K; + } +})(); + +Object.extend(Event, (function() { + var cache = Event.cache; + + function getEventID(element) { + if (element._prototypeEventID) return element._prototypeEventID[0]; + arguments.callee.id = arguments.callee.id || 1; + return element._prototypeEventID = [++arguments.callee.id]; + } + + function getDOMEventName(eventName) { + if (eventName && eventName.include(':')) return "dataavailable"; + return eventName; + } + + function getCacheForID(id) { + return cache[id] = cache[id] || { }; + } + + function getWrappersForEventName(id, eventName) { + var c = getCacheForID(id); + return c[eventName] = c[eventName] || []; + } + + function createWrapper(element, eventName, handler) { + var id = getEventID(element); + var c = getWrappersForEventName(id, eventName); + if (c.pluck("handler").include(handler)) return false; + + var wrapper = function(event) { + if (!Event || !Event.extend || + (event.eventName && event.eventName != eventName)) + return false; + + Event.extend(event); + handler.call(element, event); + }; + + wrapper.handler = handler; + c.push(wrapper); + return wrapper; + } + + function findWrapper(id, eventName, handler) { + var c = getWrappersForEventName(id, eventName); + return c.find(function(wrapper) { return wrapper.handler == handler }); + } + + function destroyWrapper(id, eventName, handler) { + var c = getCacheForID(id); + if (!c[eventName]) return false; + c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); + } + + function destroyCache() { + for (var id in cache) + for (var eventName in cache[id]) + cache[id][eventName] = null; + } + + if (window.attachEvent) { + window.attachEvent("onunload", destroyCache); + } + + return { + observe: function(element, eventName, handler) { + element = $(element); + var name = getDOMEventName(eventName); + + var wrapper = createWrapper(element, eventName, handler); + if (!wrapper) return element; + + if (element.addEventListener) { + element.addEventListener(name, wrapper, false); + } else { + element.attachEvent("on" + name, wrapper); + } + + return element; + }, + + stopObserving: function(element, eventName, handler) { + element = $(element); + var id = getEventID(element), name = getDOMEventName(eventName); + + if (!handler && eventName) { + getWrappersForEventName(id, eventName).each(function(wrapper) { + element.stopObserving(eventName, wrapper.handler); + }); + return element; + + } else if (!eventName) { + Object.keys(getCacheForID(id)).each(function(eventName) { + element.stopObserving(eventName); + }); + return element; + } + + var wrapper = findWrapper(id, eventName, handler); + if (!wrapper) return element; + + if (element.removeEventListener) { + element.removeEventListener(name, wrapper, false); + } else { + element.detachEvent("on" + name, wrapper); + } + + destroyWrapper(id, eventName, handler); + + return element; + }, + + fire: function(element, eventName, memo) { + element = $(element); + if (element == document && document.createEvent && !element.dispatchEvent) + element = document.documentElement; + + var event; + if (document.createEvent) { + event = document.createEvent("HTMLEvents"); + event.initEvent("dataavailable", true, true); + } else { + event = document.createEventObject(); + event.eventType = "ondataavailable"; + } + + event.eventName = eventName; + event.memo = memo || { }; + + if (document.createEvent) { + element.dispatchEvent(event); + } else { + element.fireEvent(event.eventType, event); + } + + return Event.extend(event); + } + }; +})()); + +Object.extend(Event, Event.Methods); + +Element.addMethods({ + fire: Event.fire, + observe: Event.observe, + stopObserving: Event.stopObserving +}); + +Object.extend(document, { + fire: Element.Methods.fire.methodize(), + observe: Element.Methods.observe.methodize(), + stopObserving: Element.Methods.stopObserving.methodize(), + loaded: false +}); + +(function() { + /* Support for the DOMContentLoaded event is based on work by Dan Webb, + Matthias Miller, Dean Edwards and John Resig. */ + + var timer; + + function fireContentLoadedEvent() { + if (document.loaded) return; + if (timer) window.clearInterval(timer); + document.fire("dom:loaded"); + document.loaded = true; + } + + if (document.addEventListener) { + if (Prototype.Browser.WebKit) { + timer = window.setInterval(function() { + if (/loaded|complete/.test(document.readyState)) + fireContentLoadedEvent(); + }, 0); + + Event.observe(window, "load", fireContentLoadedEvent); + + } else { + document.addEventListener("DOMContentLoaded", + fireContentLoadedEvent, false); + } + + } else { + document.write("