Commit 86bc845
committed
Move Timing-Allow-Origin checks to the network process
https://bugs.webkit.org/show_bug.cgi?id=226678
<rdar://problem/45227788>
Reviewed by Chris Dumez.
LayoutTests/imported/w3c:
* web-platform-tests/resource-timing/CodingConventions.md: Added.
* web-platform-tests/resource-timing/SO-XO-SO-redirect-chain-tao.https-expected.txt: Added.
* web-platform-tests/resource-timing/SO-XO-SO-redirect-chain-tao.https.html: Added.
* web-platform-tests/resource-timing/SyntheticResponse.py:
(main):
* web-platform-tests/resource-timing/TAO-match-expected.txt: Added.
* web-platform-tests/resource-timing/TAO-match.html: Added.
* web-platform-tests/resource-timing/TAO-null-opaque-origin-expected.txt: Added.
* web-platform-tests/resource-timing/TAO-null-opaque-origin.html: Added.
* web-platform-tests/resource-timing/TAO-port-mismatch-means-crossorigin-expected.txt: Added.
* web-platform-tests/resource-timing/TAO-port-mismatch-means-crossorigin.html: Added.
* web-platform-tests/resource-timing/__init__.py: Added.
* web-platform-tests/resource-timing/buffer-full-add-after-full-event-expected.txt:
* web-platform-tests/resource-timing/buffer-full-add-after-full-event.html:
* web-platform-tests/resource-timing/buffer-full-add-entries-during-callback-expected.txt:
* web-platform-tests/resource-timing/buffer-full-add-entries-during-callback-that-drop.html:
* web-platform-tests/resource-timing/buffer-full-add-entries-during-callback.html:
* web-platform-tests/resource-timing/buffer-full-add-then-clear-expected.txt:
* web-platform-tests/resource-timing/buffer-full-add-then-clear.html:
* web-platform-tests/resource-timing/buffer-full-decrease-buffer-during-callback.html:
* web-platform-tests/resource-timing/buffer-full-increase-buffer-during-callback-expected.txt:
* web-platform-tests/resource-timing/buffer-full-increase-buffer-during-callback.html:
* web-platform-tests/resource-timing/buffer-full-inspect-buffer-during-callback-expected.txt:
* web-platform-tests/resource-timing/buffer-full-inspect-buffer-during-callback.html:
* web-platform-tests/resource-timing/buffer-full-set-to-current-buffer-expected.txt:
* web-platform-tests/resource-timing/buffer-full-set-to-current-buffer.html:
* web-platform-tests/resource-timing/buffer-full-store-and-clear-during-callback-expected.txt:
* web-platform-tests/resource-timing/buffer-full-store-and-clear-during-callback.html:
* web-platform-tests/resource-timing/buffer-full-then-increased-expected.txt:
* web-platform-tests/resource-timing/buffer-full-then-increased.html:
* web-platform-tests/resource-timing/buffer-full-when-populate-entries-expected.txt:
* web-platform-tests/resource-timing/buffer-full-when-populate-entries.html:
All these buffer-full tests start failing when I update them.
That is an unrelated bug. Firefox has the same bug, and we had the same bug before and after this change.
* web-platform-tests/resource-timing/connection-reuse-expected.txt: Added.
* web-platform-tests/resource-timing/connection-reuse.html: Added.
* web-platform-tests/resource-timing/connection-reuse.https-expected.txt: Added.
* web-platform-tests/resource-timing/connection-reuse.https.html: Added.
* web-platform-tests/resource-timing/cross-origin-start-end-time-with-redirects-expected.txt: Added.
* web-platform-tests/resource-timing/cross-origin-start-end-time-with-redirects.html: Added.
* web-platform-tests/resource-timing/cross-origin-status-codes.html:
* web-platform-tests/resource-timing/document-domain-no-impact-opener-expected.txt: Added.
* web-platform-tests/resource-timing/document-domain-no-impact-opener.html: Added.
* web-platform-tests/resource-timing/entry-attributes-expected.txt: Added.
* web-platform-tests/resource-timing/entry-attributes.html: Added.
* web-platform-tests/resource-timing/fetch-cross-origin-redirect.https-expected.txt: Added.
* web-platform-tests/resource-timing/fetch-cross-origin-redirect.https.html: Added.
* web-platform-tests/resource-timing/font-timestamps-expected.txt: Added.
* web-platform-tests/resource-timing/font-timestamps.html: Added.
* web-platform-tests/resource-timing/iframe-failed-commit-expected.txt: Added.
* web-platform-tests/resource-timing/iframe-failed-commit.html: Added.
* web-platform-tests/resource-timing/initiator-type-for-script-expected.txt: Added.
* web-platform-tests/resource-timing/initiator-type-for-script.html: Added.
* web-platform-tests/resource-timing/nextHopProtocol-is-tao-protected.https-expected.txt: Added.
* web-platform-tests/resource-timing/nextHopProtocol-is-tao-protected.https.html: Added.
* web-platform-tests/resource-timing/object-not-found-after-TAO-cross-origin-redirect-expected.txt: Added.
* web-platform-tests/resource-timing/object-not-found-after-TAO-cross-origin-redirect.html: Added.
* web-platform-tests/resource-timing/object-not-found-after-cross-origin-redirect-expected.txt: Added.
* web-platform-tests/resource-timing/object-not-found-after-cross-origin-redirect.html: Added.
* web-platform-tests/resource-timing/redirects-expected.txt: Added.
* web-platform-tests/resource-timing/redirects.html: Added.
* web-platform-tests/resource-timing/resource-ignore-data-url-expected.txt: Added.
* web-platform-tests/resource-timing/resource-ignore-data-url.html: Added.
* web-platform-tests/resource-timing/resource_TAO_cross_origin_redirect_chain-expected.txt:
This apparent regression is actually a progression.
When this test is run from our test infrastructure, Chrome and Firefox fail the same tests that you see now failing here,
indicating that something is wrong with our test infrastructure. When run on wpt.live, all browsers pass this test
after this change.
* web-platform-tests/resource-timing/resource_cached.html: Added.
* web-platform-tests/resource-timing/resource_initiator_types.html:
* web-platform-tests/resource-timing/resource_nested_dedicated_worker.worker.js:
(async_test):
(async_test.async const): Deleted.
* web-platform-tests/resource-timing/resource_timing_content_length-expected.txt: Added.
* web-platform-tests/resource-timing/resource_timing_content_length.html: Added.
* web-platform-tests/resource-timing/resources/200_empty.asis: Added.
* web-platform-tests/resource-timing/resources/TAOResponse.py:
(main):
* web-platform-tests/resource-timing/resources/all_resource_types.html: Added.
* web-platform-tests/resource-timing/resources/buffer-full-utilities.js:
(const.waitForNextTask):
(const.forceBufferFullEvent.async clearBufferAndSetSize):
(const.forceBufferFullEvent):
(const.fillUpTheBufferWithTwoResources.async clearBufferAndSetSize):
(async const.fillUpTheBufferWithSingleResource.async clearBufferAndSetSize):
(async const):
(let.appendScript): Deleted.
(let.waitForNextTask): Deleted.
(let.waitUntilConditionIsMet.cond.return.new.Promise.resolve.let.checkCondition): Deleted.
(let.waitForEventToFire.return.new.Promise): Deleted.
(let.waitForEventToFire): Deleted.
(let.fillUpTheBufferWithTwoResources.async src): Deleted.
* web-platform-tests/resource-timing/resources/cacheable-and-validated.py: Added.
(main):
* web-platform-tests/resource-timing/resources/connection-reuse-test.js: Added.
(attribute_test.async client):
(attribute_test):
* web-platform-tests/resource-timing/resources/csp-default-none.html: Added.
* web-platform-tests/resource-timing/resources/csp-default-none.html.headers: Added.
* web-platform-tests/resource-timing/resources/document-domain-no-impact.html: Added.
* web-platform-tests/resource-timing/resources/document-refreshed.html: Added.
* web-platform-tests/resource-timing/resources/document-that-refreshes.html: Added.
* web-platform-tests/resource-timing/resources/embed-refresh.html: Added.
* web-platform-tests/resource-timing/resources/green-frame.html: Added.
* web-platform-tests/resource-timing/resources/green.html: Added.
* web-platform-tests/resource-timing/resources/green.html.headers: Added.
* web-platform-tests/resource-timing/resources/gzip_xml.py:
* web-platform-tests/resource-timing/resources/iframe-refresh.html: Added.
* web-platform-tests/resource-timing/resources/iframe-reload-TAO.sub.html:
* web-platform-tests/resource-timing/resources/multi_redirect.py:
(main):
* web-platform-tests/resource-timing/resources/object-refresh.html: Added.
* web-platform-tests/resource-timing/resources/redirect-cors.py: Added.
(main):
* web-platform-tests/resource-timing/resources/resource-timing-content-length.py: Added.
(main):
* web-platform-tests/resource-timing/resources/resource_timing_test0.xml:
* web-platform-tests/resource-timing/resources/sizes-helper.js: Added.
(const.checkSizeFields):
* web-platform-tests/resource-timing/resources/status-code.py:
(main):
* web-platform-tests/resource-timing/resources/webperftestharness.js:
(test_namespace):
(test_attribute_exists):
(test_enum):
* web-platform-tests/resource-timing/resources/webperftestharnessextension.js:
(test_method_exists):
* web-platform-tests/resource-timing/same-origin-from-cross-origin-redirect-expected.txt: Added.
* web-platform-tests/resource-timing/same-origin-from-cross-origin-redirect.html: Added.
* web-platform-tests/resource-timing/sizes-cache.any.js: Added.
(const.accumulateEntries):
(const.checkResourceSizes.list.let.entry.of.entries.else):
(promise_test):
* web-platform-tests/resource-timing/sizes-redirect-img-expected.txt: Added.
* web-platform-tests/resource-timing/sizes-redirect-img.html: Added.
* web-platform-tests/resource-timing/sizes-redirect.any.js: Added.
(const.accumulateEntry):
(const.checkResourceSizes):
(const.redirectUrl):
(promise_test):
* web-platform-tests/resource-timing/status-codes-create-entry.html:
* web-platform-tests/resource-timing/test_resource_timing-expected.txt:
* web-platform-tests/resource-timing/test_resource_timing.https-expected.txt:
* web-platform-tests/resource-timing/workerStart-tao-protected.https.html:
Source/WebCore:
We tried hard to do it in the web process by keeping track of whether the last redirect was cross-origin
and checking the final response and original security origin. We got many tests to pass, but to get the rest
and be correct, we need to check the Timing-Allow-Origin header field of each redirect against the original security origin.
Tests: imported/w3c/web-platform-tests/resource-timing/SO-XO-SO-redirect-chain-tao.https.html
imported/w3c/web-platform-tests/resource-timing/TAO-match.html
imported/w3c/web-platform-tests/resource-timing/TAO-null-opaque-origin.html
imported/w3c/web-platform-tests/resource-timing/TAO-port-mismatch-means-crossorigin.html
imported/w3c/web-platform-tests/resource-timing/connection-reuse.html
imported/w3c/web-platform-tests/resource-timing/connection-reuse.https.html
imported/w3c/web-platform-tests/resource-timing/cross-origin-start-end-time-with-redirects.html
imported/w3c/web-platform-tests/resource-timing/document-domain-no-impact-opener.html
imported/w3c/web-platform-tests/resource-timing/entry-attributes.html
imported/w3c/web-platform-tests/resource-timing/fetch-cross-origin-redirect.https.html
imported/w3c/web-platform-tests/resource-timing/font-timestamps.html
imported/w3c/web-platform-tests/resource-timing/iframe-failed-commit.html
imported/w3c/web-platform-tests/resource-timing/initiator-type-for-script.html
imported/w3c/web-platform-tests/resource-timing/nextHopProtocol-is-tao-protected.https.html
imported/w3c/web-platform-tests/resource-timing/object-not-found-after-TAO-cross-origin-redirect.html
imported/w3c/web-platform-tests/resource-timing/object-not-found-after-cross-origin-redirect.html
imported/w3c/web-platform-tests/resource-timing/redirects.html
imported/w3c/web-platform-tests/resource-timing/resource-ignore-data-url.html
imported/w3c/web-platform-tests/resource-timing/resource_cached.html
imported/w3c/web-platform-tests/resource-timing/resource_timing_content_length.html
imported/w3c/web-platform-tests/resource-timing/same-origin-from-cross-origin-redirect.html
imported/w3c/web-platform-tests/resource-timing/sizes-redirect-img.html
* Headers.cmake:
* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* loader/ResourceLoader.cpp:
(WebCore::ResourceLoader::start):
Get a SecurityOrigin for our WebKitLegacy ResourceHandle use like we do in WebLoaderStrategy::scheduleLoadFromNetworkProcess
* loader/ResourceTiming.cpp:
(WebCore::ResourceTiming::ResourceTiming):
(WebCore::ResourceTiming::initServerTiming):
(WebCore::ResourceTiming::isolatedCopy const):
(WebCore::passesTimingAllowCheck): Deleted.
* loader/ResourceTiming.h:
(WebCore::ResourceTiming::networkLoadMetrics const):
(WebCore::ResourceTiming::ResourceTiming):
(WebCore::ResourceTiming::allowTimingDetails const): Deleted.
(): Deleted.
* page/PerformanceNavigation.cpp:
(WebCore::PerformanceNavigation::redirectCount const):
* page/PerformanceNavigationTiming.cpp:
(WebCore::PerformanceNavigationTiming::sameOriginCheckFails const):
(WebCore::PerformanceNavigationTiming::redirectCount const):
* page/PerformanceResourceTiming.cpp:
(WebCore::entryStartTime):
(WebCore::entryEndTime):
(WebCore::PerformanceResourceTiming::redirectStart const):
(WebCore::PerformanceResourceTiming::redirectEnd const):
(WebCore::PerformanceResourceTiming::domainLookupStart const):
(WebCore::PerformanceResourceTiming::domainLookupEnd const):
(WebCore::PerformanceResourceTiming::connectStart const):
(WebCore::PerformanceResourceTiming::connectEnd const):
(WebCore::PerformanceResourceTiming::secureConnectionStart const):
(WebCore::PerformanceResourceTiming::requestStart const):
(WebCore::PerformanceResourceTiming::responseStart const):
(WebCore::PerformanceResourceTiming::transferSize const):
(WebCore::PerformanceResourceTiming::encodedBodySize const):
(WebCore::PerformanceResourceTiming::decodedBodySize const):
* page/PerformanceTiming.cpp:
(WebCore::PerformanceTiming::unloadEventStart const):
(WebCore::PerformanceTiming::unloadEventEnd const):
(WebCore::PerformanceTiming::redirectStart const):
(WebCore::PerformanceTiming::redirectEnd const):
* platform/network/BlobResourceHandle.cpp:
(WebCore::BlobResourceHandle::BlobResourceHandle):
* platform/network/NetworkLoadMetrics.h:
(WebCore::NetworkLoadMetrics::isolatedCopy const):
(WebCore::NetworkLoadMetrics::operator== const):
(WebCore::NetworkLoadMetrics::encode const):
(WebCore::NetworkLoadMetrics::decode):
* platform/network/ResourceHandle.cpp:
(WebCore::ResourceHandle::ResourceHandle):
(WebCore::ResourceHandle::create):
(WebCore::ResourceHandle::loadResourceSynchronously):
(WebCore::ResourceHandle::isCrossOriginWithoutTAO const):
(WebCore::ResourceHandle::markAsCrossOriginWithoutTAO):
(WebCore::ResourceHandle::sourceOrigin const):
(WebCore::ResourceHandle::hasCrossOriginRedirect const): Deleted.
(WebCore::ResourceHandle::setHasCrossOriginRedirect): Deleted.
* platform/network/ResourceHandle.h:
* platform/network/ResourceHandleInternal.h:
(WebCore::ResourceHandleInternal::ResourceHandleInternal):
* platform/network/TimingAllowOrigin.cpp: Added.
(WebCore::passesTimingAllowOriginCheck):
* platform/network/TimingAllowOrigin.h: Added.
* platform/network/cocoa/NetworkLoadMetrics.mm:
(WebCore::packageTimingData):
(WebCore::copyTimingData):
* platform/network/mac/ResourceHandleMac.mm:
(WebCore::ResourceHandle::platformLoadResourceSynchronously):
* platform/network/mac/WebCoreResourceHandleAsOperationQueueDelegate.mm:
(-[WebCoreResourceHandleAsOperationQueueDelegate connection:willSendRequest:redirectResponse:]):
(-[WebCoreResourceHandleAsOperationQueueDelegate connection:didReceiveResponse:]):
Source/WebKit:
* NetworkProcess/NetworkLoadParameters.h:
* NetworkProcess/NetworkResourceLoadParameters.h:
* NetworkProcess/NetworkResourceLoader.cpp:
(WebKit::sendReplyToSynchronousRequest):
Pass complete metrics with sync xhr responses. Many of the tests use sync xhr.
(WebKit::NetworkResourceLoader::didFinishLoading):
(WebKit::NetworkResourceLoader::didFailLoading):
(WebKit::NetworkResourceLoader::didRetrieveCacheEntry):
* NetworkProcess/cocoa/NetworkDataTaskCocoa.h:
* NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:
(WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):
(WebKit::NetworkDataTaskCocoa::willPerformHTTPRedirection):
* NetworkProcess/cocoa/NetworkSessionCocoa.mm:
(-[WKNetworkSessionDelegate URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:]):
(-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
Source/WebKitLegacy:
* WebCoreSupport/PingHandle.h:
* WebCoreSupport/WebResourceLoadScheduler.cpp:
(WebResourceLoadScheduler::loadResourceSynchronously):
LayoutTests:
* TestExpectations:
Canonical link: https://commits.webkit.org/238700@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@278738 268f45cc-cd09-0410-ab3c-d52691b4dbfc1 parent 66c5526 commit 86bc845
147 files changed
Lines changed: 2549 additions & 391 deletions
File tree
- LayoutTests
- imported/w3c
- web-platform-tests/resource-timing
- resources
- platform
- mac-wk1/imported/w3c/web-platform-tests
- resource-timing
- win
- Source
- WebCore
- WebCore.xcodeproj
- loader
- page
- platform/network
- cf
- cocoa
- curl
- mac
- soup
- WebKitLegacy
- WebCoreSupport
- WebKit
- NetworkProcess
- cocoa
- soup
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
1 | 11 | | |
2 | 12 | | |
3 | 13 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
933 | 933 | | |
934 | 934 | | |
935 | 935 | | |
| 936 | + | |
| 937 | + | |
| 938 | + | |
| 939 | + | |
936 | 940 | | |
937 | 941 | | |
938 | 942 | | |
| |||
942 | 946 | | |
943 | 947 | | |
944 | 948 | | |
| 949 | + | |
945 | 950 | | |
946 | 951 | | |
| 952 | + | |
| 953 | + | |
| 954 | + | |
947 | 955 | | |
948 | 956 | | |
949 | 957 | | |
| |||
1390 | 1398 | | |
1391 | 1399 | | |
1392 | 1400 | | |
| 1401 | + | |
| 1402 | + | |
1393 | 1403 | | |
1394 | 1404 | | |
1395 | 1405 | | |
1396 | 1406 | | |
1397 | 1407 | | |
| 1408 | + | |
| 1409 | + | |
| 1410 | + | |
1398 | 1411 | | |
1399 | | - | |
1400 | | - | |
1401 | 1412 | | |
1402 | 1413 | | |
1403 | 1414 | | |
| |||
4881 | 4892 | | |
4882 | 4893 | | |
4883 | 4894 | | |
4884 | | - | |
| 4895 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
1 | 154 | | |
2 | 155 | | |
3 | 156 | | |
| |||
Lines changed: 77 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
0 commit comments