Import Cobalt 21.lts.6.305476
diff --git a/src/.pylintrc b/src/.pylintrc
index e167680..b8232b8 100644
--- a/src/.pylintrc
+++ b/src/.pylintrc
@@ -72,6 +72,7 @@
         cmp-method,
         coerce-builtin,
         coerce-method,
+        consider-using-f-string,
         delslice-method,
         div-method,
         duplicate-code,
@@ -118,9 +119,11 @@
         old-raise-syntax,
         parameter-unpacking,
         print-statement,
+        raise-missing-from,
         raising-string,
         range-builtin-not-iterating,
         raw_input-builtin,
+        redundant-u-string-prefix,
         rdiv-method,
         reduce-builtin,
         relative-import,
@@ -129,6 +132,7 @@
         setslice-method,
         signature-differs,
         standarderror-builtin,
+        super-with-arguments,
         suppressed-message,
         sys-max-int,
         too-few-public-methods,
@@ -147,6 +151,8 @@
         unicode-builtin,
         unnecessary-pass,
         unpacking-in-except,
+        unspecified-encoding,
+        use-maxsplit-arg,
         useless-else-on-loop,
         useless-object-inheritance,
         useless-suppression,
diff --git a/src/cobalt/audio/audio_destination_node.cc b/src/cobalt/audio/audio_destination_node.cc
index 6f82ba8..3f0505f 100644
--- a/src/cobalt/audio/audio_destination_node.cc
+++ b/src/cobalt/audio/audio_destination_node.cc
@@ -62,11 +62,15 @@
     SB_LOG(INFO) << "Created audio device " << audio_device_.get() << '.';
     context()->PreventGarbageCollection();
   }
-  audio_device_to_delete_ = NULL;
+  delete_audio_device_ = false;
 }
 
 void AudioDestinationNode::FillAudioBus(bool all_consumed, AudioBus* audio_bus,
                                         bool* silence) {
+  if (delete_audio_device_) {
+    return;
+  }
+
   // This is called on Audio thread.
   AudioLock::AutoLock lock(audio_lock());
 
@@ -74,11 +78,10 @@
   DCHECK_EQ(number_of_inputs(), 1u);
   bool all_finished = true;
   Input(0)->FillAudioBus(audio_bus, silence, &all_finished);
-  if (all_consumed && all_finished &&
-      audio_device_to_delete_ != audio_device_.get()) {
+  if (all_consumed && all_finished) {
     SB_LOG(INFO) << "Schedule to destroy audio device " << audio_device_.get()
                  << '.';
-    audio_device_to_delete_ = audio_device_.get();
+    delete_audio_device_ = true;
     message_loop_->task_runner()->PostTask(
         FROM_HERE, base::Bind(&AudioDestinationNode::DestroyAudioDevice,
                               base::Unretained(this)));
@@ -90,10 +93,11 @@
   if (!audio_device_.get()) {
     return;
   }
-  if (audio_device_.get() == audio_device_to_delete_) {
+  if (delete_audio_device_) {
     SB_LOG(INFO) << "Destroying audio device " << audio_device_.get() << '.';
     audio_device_.reset();
     context()->AllowGarbageCollection();
+    delete_audio_device_ = false;
   }
 }
 
diff --git a/src/cobalt/audio/audio_destination_node.h b/src/cobalt/audio/audio_destination_node.h
index b758d92..77cee04 100644
--- a/src/cobalt/audio/audio_destination_node.h
+++ b/src/cobalt/audio/audio_destination_node.h
@@ -74,7 +74,7 @@
   uint32 max_channel_count_;
 
   std::unique_ptr<AudioDevice> audio_device_;
-  AudioDevice* audio_device_to_delete_ = NULL;
+  std::atomic_bool delete_audio_device_ = {false};
 
   DISALLOW_COPY_AND_ASSIGN(AudioDestinationNode);
 };
diff --git a/src/cobalt/build/build.id b/src/cobalt/build/build.id
index bd3b8b4..c0e0577 100644
--- a/src/cobalt/build/build.id
+++ b/src/cobalt/build/build.id
@@ -1 +1 @@
-304347
\ No newline at end of file
+305476
\ No newline at end of file
diff --git a/src/cobalt/build/gyp_cobalt b/src/cobalt/build/gyp_cobalt
index b570b65..ecccabd 100755
--- a/src/cobalt/build/gyp_cobalt
+++ b/src/cobalt/build/gyp_cobalt
@@ -113,7 +113,12 @@
     logging.error('GYP_DEFINES environment variable is not supported.')
     return RETVAL_ERROR
 
-  options.build_number = gyp_utils.GetBuildNumber()
+  build_id_server_url = os.environ.get('BUILD_ID_SERVER_URL')
+  if build_id_server_url:
+    options.build_number = gyp_utils.GetBuildNumber(
+      version_server=build_id_server_url)
+  else:
+    options.build_number = gyp_utils.GetBuildNumber()
 
   try:
     gyp_runner = GypRunner(options)
diff --git a/src/cobalt/content/ssl/certs/2e5ac55d.0 b/src/cobalt/content/ssl/certs/2e5ac55d.0
deleted file mode 100644
index b2e43c9..0000000
--- a/src/cobalt/content/ssl/certs/2e5ac55d.0
+++ /dev/null
@@ -1,20 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
-MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
-DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
-PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
-Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
-rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
-OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
-xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
-7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
-aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
-HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
-SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
-ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
-AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
-R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
-JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
-Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
diff --git a/src/cobalt/debug/remote/devtools/copy_devtools_modules.rsp b/src/cobalt/debug/remote/devtools/copy_devtools_modules.rsp
deleted file mode 100644
index 39ad8b2..0000000
--- a/src/cobalt/debug/remote/devtools/copy_devtools_modules.rsp
+++ /dev/null
@@ -1,476 +0,0 @@
-front_end/network/network.js
-front_end/network/SignedExchangeInfoView.js
-front_end/network/ResourceWebSocketFrameView.js
-front_end/network/RequestTimingView.js
-front_end/network/RequestResponseView.js
-front_end/network/RequestPreviewView.js
-front_end/network/RequestInitiatorView.js
-front_end/network/RequestHeadersView.js
-front_end/network/RequestHTMLView.js
-front_end/network/RequestCookiesView.js
-front_end/network/NetworkWaterfallColumn.js
-front_end/network/NetworkTimeCalculator.js
-front_end/network/NetworkSearchScope.js
-front_end/network/NetworkPanel.js
-front_end/network/NetworkOverview.js
-front_end/network/NetworkManageCustomHeadersView.js
-front_end/network/NetworkLogViewColumns.js
-front_end/network/NetworkLogView.js
-front_end/network/NetworkItemView.js
-front_end/network/NetworkFrameGrouper.js
-front_end/network/NetworkDataGridNode.js
-front_end/network/NetworkConfigView.js
-front_end/network/HARWriter.js
-front_end/network/EventSourceMessagesView.js
-front_end/network/BlockedURLsPane.js
-front_end/network/BinaryResourceView.js
-front_end/test_runner/test_runner.js
-front_end/test_runner/TestRunner.js
-front_end/emulation/emulation.js
-front_end/emulation/SensorsView.js
-front_end/emulation/MediaQueryInspector.js
-front_end/emulation/InspectedPagePlaceholder.js
-front_end/emulation/GeolocationsSettingsTab.js
-front_end/emulation/EmulatedDevices.js
-front_end/emulation/DevicesSettingsTab.js
-front_end/emulation/DeviceModeWrapper.js
-front_end/emulation/DeviceModeView.js
-front_end/emulation/DeviceModeToolbar.js
-front_end/emulation/DeviceModeModel.js
-front_end/emulation/AdvancedApp.js
-front_end/inspector_main/inspector_main.js
-front_end/inspector_main/RenderingOptions.js
-front_end/inspector_main/InspectorMain.js
-front_end/js_main/js_main.js
-front_end/js_main/JsMain.js
-front_end/search/search.js
-front_end/search/SearchView.js
-front_end/search/SearchResultsPane.js
-front_end/search/SearchConfig.js
-front_end/screencast/screencast.js
-front_end/screencast/ScreencastView.js
-front_end/screencast/ScreencastApp.js
-front_end/screencast/InputModel.js
-front_end/performance_monitor/performance_monitor.js
-front_end/performance_monitor/PerformanceMonitor.js
-front_end/main/main.js
-front_end/main/SimpleApp.js
-front_end/main/MainImpl.js
-front_end/main/ExecutionContextSelector.js
-front_end/snippets/snippets.js
-front_end/snippets/SnippetsQuickOpen.js
-front_end/snippets/ScriptSnippetFileSystem.js
-front_end/settings/settings.js
-front_end/settings/SettingsScreen.js
-front_end/settings/FrameworkBlackboxSettingsTab.js
-front_end/security/security.js
-front_end/security/SecurityPanel.js
-front_end/security/SecurityModel.js
-front_end/javascript_metadata/javascript_metadata.js
-front_end/javascript_metadata/NativeFunctions.js
-front_end/javascript_metadata/JavaScriptMetadata.js
-front_end/har_importer/har_importer.js
-front_end/har_importer/HARImporter.js
-front_end/har_importer/HARFormat.js
-front_end/browser_debugger/browser_debugger.js
-front_end/browser_debugger/XHRBreakpointsSidebarPane.js
-front_end/browser_debugger/ObjectEventListenersSidebarPane.js
-front_end/browser_debugger/EventListenerBreakpointsSidebarPane.js
-front_end/browser_debugger/DOMBreakpointsSidebarPane.js
-front_end/layer_viewer/layer_viewer.js
-front_end/layer_viewer/TransformController.js
-front_end/layer_viewer/PaintProfilerView.js
-front_end/layer_viewer/Layers3DView.js
-front_end/layer_viewer/LayerViewHost.js
-front_end/layer_viewer/LayerTreeOutline.js
-front_end/layer_viewer/LayerDetailsView.js
-front_end/cm_web_modes/cm_web_modes.js
-front_end/cm_web_modes/cm_web_modes_cm.js
-front_end/cm_web_modes/cm_web_modes_headless.js
-front_end/cm_web_modes/css.js
-front_end/cm_web_modes/javascript.js
-front_end/cm_web_modes/xml.js
-front_end/cm_web_modes/htmlmixed.js
-front_end/cm_web_modes/htmlembedded.js
-front_end/text_editor/text_editor.js
-front_end/text_editor/TextEditorAutocompleteController.js
-front_end/text_editor/CodeMirrorUtils.js
-front_end/text_editor/CodeMirrorTextEditor.js
-front_end/quick_open/quick_open.js
-front_end/quick_open/QuickOpen.js
-front_end/quick_open/HelpQuickOpen.js
-front_end/quick_open/FilteredListWidget.js
-front_end/quick_open/CommandMenu.js
-front_end/elements/elements.js
-front_end/elements/elements-legacy.js
-front_end/elements/StylesSidebarPane.js
-front_end/elements/StylePropertyTreeElement.js
-front_end/elements/StylePropertyHighlighter.js
-front_end/elements/PropertiesWidget.js
-front_end/elements/PlatformFontsWidget.js
-front_end/elements/NodeStackTraceWidget.js
-front_end/elements/MetricsSidebarPane.js
-front_end/elements/MarkerDecorator.js
-front_end/elements/InspectElementModeController.js
-front_end/elements/EventListenersWidget.js
-front_end/elements/ElementsTreeOutline.js
-front_end/elements/ElementsTreeElement.js
-front_end/elements/ElementsTreeElementHighlighter.js
-front_end/elements/ElementStatePaneWidget.js
-front_end/elements/ElementsSidebarPane.js
-front_end/elements/ElementsPanel.js
-front_end/elements/ElementsBreadcrumbs.js
-front_end/elements/DOMPath.js
-front_end/elements/DOMLinkifier.js
-front_end/elements/ComputedStyleWidget.js
-front_end/elements/ComputedStyleModel.js
-front_end/elements/ColorSwatchPopoverIcon.js
-front_end/elements/ClassesPaneWidget.js
-front_end/timeline_model/timeline_model.js
-front_end/timeline_model/TracingLayerTree.js
-front_end/timeline_model/TimelineProfileTree.js
-front_end/timeline_model/TimelineModel.js
-front_end/timeline_model/TimelineModelFilter.js
-front_end/timeline_model/TimelineJSProfile.js
-front_end/timeline_model/TimelineIRModel.js
-front_end/timeline_model/TimelineFrameModel.js
-front_end/help/help.js
-front_end/help/ReleaseNoteView.js
-front_end/help/ReleaseNoteText.js
-front_end/help/HelpImpl.js
-front_end/workspace_diff/workspace_diff.js
-front_end/workspace_diff/WorkspaceDiff.js
-front_end/mobile_throttling/mobile_throttling.js
-front_end/mobile_throttling/ThrottlingSettingsTab.js
-front_end/mobile_throttling/ThrottlingPresets.js
-front_end/mobile_throttling/ThrottlingManager.js
-front_end/mobile_throttling/NetworkThrottlingSelector.js
-front_end/mobile_throttling/NetworkPanelIndicator.js
-front_end/mobile_throttling/MobileThrottlingSelector.js
-front_end/event_listeners/event_listeners.js
-front_end/event_listeners/EventListenersView.js
-front_end/event_listeners/EventListenersUtils.js
-front_end/object_ui/object_ui.js
-front_end/object_ui/RemoteObjectPreviewFormatter.js
-front_end/object_ui/ObjectPropertiesSection.js
-front_end/object_ui/ObjectPopoverHelper.js
-front_end/object_ui/JavaScriptREPL.js
-front_end/object_ui/JavaScriptAutocomplete.js
-front_end/object_ui/CustomPreviewComponent.js
-front_end/cookie_table/cookie_table.js
-front_end/cookie_table/CookiesTable.js
-front_end/cm_modes/cm_modes.js
-front_end/cm_modes/DefaultCodeMirrorMimeMode.js
-front_end/cm_modes/clike.js
-front_end/cm_modes/coffeescript.js
-front_end/cm_modes/php.js
-front_end/cm_modes/python.js
-front_end/cm_modes/shell.js
-front_end/cm_modes/livescript.js
-front_end/cm_modes/markdown.js
-front_end/cm_modes/clojure.js
-front_end/cm_modes/jsx.js
-front_end/css_overview/css_overview.js
-front_end/css_overview/CSSOverviewUnusedDeclarations.js
-front_end/css_overview/CSSOverviewStartView.js
-front_end/css_overview/CSSOverviewSidebarPanel.js
-front_end/css_overview/CSSOverviewProcessingView.js
-front_end/css_overview/CSSOverviewPanel.js
-front_end/css_overview/CSSOverviewModel.js
-front_end/css_overview/CSSOverviewController.js
-front_end/css_overview/CSSOverviewCompletedView.js
-front_end/console/console.js
-front_end/console/ConsoleContextSelector.js
-front_end/console/ConsoleFilter.js
-front_end/console/ConsoleSidebar.js
-front_end/console/ConsolePanel.js
-front_end/console/ConsolePinPane.js
-front_end/console/ConsolePrompt.js
-front_end/console/ConsoleView.js
-front_end/console/ConsoleViewMessage.js
-front_end/console/ConsoleViewport.js
-front_end/source_frame/source_frame.js
-front_end/source_frame/XMLView.js
-front_end/source_frame/SourcesTextEditor.js
-front_end/source_frame/SourceFrame.js
-front_end/source_frame/source_frame.js
-front_end/source_frame/SourceCodeDiff.js
-front_end/source_frame/ResourceSourceFrame.js
-front_end/source_frame/PreviewFactory.js
-front_end/source_frame/JSONView.js
-front_end/source_frame/ImageView.js
-front_end/source_frame/FontView.js
-front_end/source_frame/BinaryResourceViewFactory.js
-front_end/inline_editor/inline_editor.js
-front_end/inline_editor/SwatchPopoverHelper.js
-front_end/inline_editor/CSSShadowModel.js
-front_end/inline_editor/CSSShadowEditor.js
-front_end/inline_editor/ColorSwatch.js
-front_end/inline_editor/BezierUI.js
-front_end/inline_editor/BezierEditor.js
-front_end/diff/diff.js
-front_end/diff/diff_match_patch.js
-front_end/diff/DiffWrapper.js
-front_end/formatter/formatter.js
-front_end/formatter/ScriptFormatter.js
-front_end/formatter/FormatterWorkerPool.js
-front_end/color_picker/color_picker.js
-front_end/color_picker/Spectrum.js
-front_end/color_picker/ContrastOverlay.js
-front_end/color_picker/ContrastInfo.js
-front_end/color_picker/ContrastDetails.js
-front_end/cm/cm.js
-front_end/cm/active-line.js
-front_end/cm/brace-fold.js
-front_end/cm/closebrackets.js
-front_end/cm/codemirror.js
-front_end/cm/comment.js
-front_end/cm/foldcode.js
-front_end/cm/foldgutter.js
-front_end/cm/mark-selection.js
-front_end/cm/matchbrackets.js
-front_end/cm/multiplex.js
-front_end/cm/overlay.js
-front_end/formatter_worker.unbundled.js
-front_end/heap_snapshot_worker.unbundled.js
-front_end/heap_snapshot_model/heap_snapshot_model.js
-front_end/heap_snapshot_model/HeapSnapshotModel.js
-front_end/heap_snapshot_worker/heap_snapshot_worker.js
-front_end/heap_snapshot_worker/AllocationProfile.js
-front_end/heap_snapshot_worker/HeapSnapshot.js
-front_end/heap_snapshot_worker/HeapSnapshotLoader.js
-front_end/heap_snapshot_worker/HeapSnapshotWorker.js
-front_end/heap_snapshot_worker/HeapSnapshotWorkerDispatcher.js
-front_end/text_utils/text_utils.js
-front_end/text_utils/TextUtils.js
-front_end/text_utils/TextRange.js
-front_end/text_utils/Text.js
-front_end/formatter_worker/formatter_worker.js
-front_end/formatter_worker/RelaxedJSONParser.js
-front_end/formatter_worker/JavaScriptOutline.js
-front_end/formatter_worker/JavaScriptFormatter.js
-front_end/formatter_worker/IdentityFormatter.js
-front_end/formatter_worker/HTMLFormatter.js
-front_end/formatter_worker/FormatterWorker.js
-front_end/formatter_worker/FormattedContentBuilder.js
-front_end/formatter_worker/ESTreeWalker.js
-front_end/formatter_worker/CSSRuleParser.js
-front_end/formatter_worker/CSSFormatter.js
-front_end/formatter_worker/AcornTokenizer.js
-front_end/cm_headless/cm_headless.js
-front_end/cm_headless/headlesscodemirror.js
-front_end/data_grid/data_grid.js
-front_end/data_grid/ViewportDataGrid.js
-front_end/data_grid/SortableDataGrid.js
-front_end/data_grid/ShowMoreDataGridNode.js
-front_end/data_grid/DataGrid.js
-front_end/protocol_monitor/protocol_monitor.js
-front_end/protocol_monitor/ProtocolMonitor.js
-front_end/console_counters/console_counters.js
-front_end/console_counters/WarningErrorCounter.js
-front_end/extensions/extensions.js
-front_end/extensions/ExtensionAPI.js
-front_end/extensions/ExtensionPanel.js
-front_end/extensions/ExtensionServer.js
-front_end/extensions/ExtensionTraceProvider.js
-front_end/extensions/ExtensionView.js
-front_end/browser_sdk/browser_sdk.js
-front_end/browser_sdk/LogManager.js
-front_end/persistence/persistence.js
-front_end/persistence/WorkspaceSettingsTab.js
-front_end/persistence/PlatformFileSystem.js
-front_end/persistence/PersistenceUtils.js
-front_end/persistence/PersistenceImpl.js
-front_end/persistence/PersistenceActions.js
-front_end/persistence/NetworkPersistenceManager.js
-front_end/persistence/IsolatedFileSystemManager.js
-front_end/persistence/IsolatedFileSystem.js
-front_end/persistence/FileSystemWorkspaceBinding.js
-front_end/persistence/EditFileSystemView.js
-front_end/persistence/Automapping.js
-front_end/components/components.js
-front_end/components/TargetDetachedDialog.js
-front_end/components/Reload.js
-front_end/components/Linkifier.js
-front_end/components/JSPresentationUtils.js
-front_end/components/ImagePreview.js
-front_end/components/DockController.js
-front_end/bindings/bindings.js
-front_end/bindings/TempFile.js
-front_end/bindings/StylesSourceMapping.js
-front_end/bindings/SASSSourceMapping.js
-front_end/bindings/ResourceUtils.js
-front_end/bindings/ResourceScriptMapping.js
-front_end/bindings/ResourceMapping.js
-front_end/bindings/PresentationConsoleMessageHelper.js
-front_end/bindings/NetworkProject.js
-front_end/bindings/LiveLocation.js
-front_end/bindings/FileUtils.js
-front_end/bindings/DefaultScriptMapping.js
-front_end/bindings/DebuggerWorkspaceBinding.js
-front_end/bindings/CSSWorkspaceBinding.js
-front_end/bindings/ContentProviderBasedProject.js
-front_end/bindings/CompilerScriptMapping.js
-front_end/bindings/BreakpointManager.js
-front_end/bindings/BlackboxManager.js
-front_end/workspace/workspace.js
-front_end/workspace/WorkspaceImpl.js
-front_end/workspace/UISourceCode.js
-front_end/workspace/FileManager.js
-front_end/services/services.js
-front_end/services/ServiceManager.js
-front_end/sdk/sdk.js
-front_end/sdk/TracingModel.js
-front_end/sdk/TracingManager.js
-front_end/sdk/TargetManager.js
-front_end/sdk/Target.js
-front_end/sdk/SourceMapManager.js
-front_end/sdk/SourceMap.js
-front_end/sdk/ServiceWorkerManager.js
-front_end/sdk/ServiceWorkerCacheModel.js
-front_end/sdk/ServerTiming.js
-front_end/sdk/SecurityOriginManager.js
-front_end/sdk/SDKModel.js
-front_end/sdk/Script.js
-front_end/sdk/ScreenCaptureModel.js
-front_end/sdk/RuntimeModel.js
-front_end/sdk/ResourceTreeModel.js
-front_end/sdk/Resource.js
-front_end/sdk/RemoteObject.js
-front_end/sdk/ProfileTreeModel.js
-front_end/sdk/IssuesModel.js
-front_end/sdk/PerformanceMetricsModel.js
-front_end/sdk/PaintProfiler.js
-front_end/sdk/OverlayModel.js
-front_end/sdk/NetworkRequest.js
-front_end/sdk/NetworkManager.js
-front_end/sdk/NetworkLog.js
-front_end/sdk/LogModel.js
-front_end/sdk/LayerTreeBase.js
-front_end/sdk/IsolateManager.js
-front_end/sdk/HeapProfilerModel.js
-front_end/sdk/HARLog.js
-front_end/sdk/FilmStripModel.js
-front_end/sdk/EmulationModel.js
-front_end/sdk/DOMModel.js
-front_end/sdk/DOMDebuggerModel.js
-front_end/sdk/DebuggerModel.js
-front_end/sdk/CSSStyleSheetHeader.js
-front_end/sdk/CSSStyleDeclaration.js
-front_end/sdk/CSSRule.js
-front_end/sdk/CSSProperty.js
-front_end/sdk/CSSModel.js
-front_end/sdk/CSSMetadata.js
-front_end/sdk/CSSMedia.js
-front_end/sdk/CSSMatchedStyles.js
-front_end/sdk/CPUProfilerModel.js
-front_end/sdk/CPUProfileDataModel.js
-front_end/sdk/CookieParser.js
-front_end/sdk/CookieModel.js
-front_end/sdk/CompilerSourceMappingContentProvider.js
-front_end/sdk/ConsoleModel.js
-front_end/sdk/Connections.js
-front_end/sdk/ChildTargetManager.js
-front_end/protocol/protocol.js
-front_end/protocol/NodeURL.js
-front_end/protocol/InspectorBackend.js
-front_end/host/host.js
-front_end/host/UserMetrics.js
-front_end/host/ResourceLoader.js
-front_end/host/Platform.js
-front_end/host/InspectorFrontendHost.js
-front_end/host/InspectorFrontendHostAPI.js
-front_end/dom_extension/DOMExtension.js
-front_end/dom_extension/dom_extension.js
-front_end/root.js
-front_end/Runtime.js
-front_end/platform/utilities.js
-front_end/platform/platform.js
-front_end/ui/ARIAUtils.js
-front_end/ui/ZoomManager.js
-front_end/ui/XWidget.js
-front_end/ui/XLink.js
-front_end/ui/XElement.js
-front_end/ui/Widget.js
-front_end/ui/View.js
-front_end/ui/ViewManager.js
-front_end/ui/UIUtils.js
-front_end/ui/ui.js
-front_end/ui/Treeoutline.js
-front_end/ui/Tooltip.js
-front_end/ui/Toolbar.js
-front_end/ui/ThrottledWidget.js
-front_end/ui/TextPrompt.js
-front_end/ui/TextEditor.js
-front_end/ui/TargetCrashedScreen.js
-front_end/ui/TabbedPane.js
-front_end/ui/SyntaxHighlighter.js
-front_end/ui/SuggestBox.js
-front_end/ui/SplitWidget.js
-front_end/ui/SoftDropDown.js
-front_end/ui/SoftContextMenu.js
-front_end/ui/ShortcutsScreen.js
-front_end/ui/ShortcutRegistry.js
-front_end/ui/SettingsUI.js
-front_end/ui/SegmentedButton.js
-front_end/ui/SearchableView.js
-front_end/ui/RootView.js
-front_end/ui/ResizerWidget.js
-front_end/ui/ReportView.js
-front_end/ui/RemoteDebuggingTerminatedScreen.js
-front_end/ui/ProgressIndicator.js
-front_end/ui/PopoverHelper.js
-front_end/ui/Panel.js
-front_end/ui/ListWidget.js
-front_end/ui/ListModel.js
-front_end/ui/ListControl.js
-front_end/ui/KeyboardShortcut.js
-front_end/ui/InspectorView.js
-front_end/ui/InplaceEditor.js
-front_end/ui/Infobar.js
-front_end/ui/Icon.js
-front_end/ui/HistoryInput.js
-front_end/ui/GlassPane.js
-front_end/ui/Geometry.js
-front_end/ui/Fragment.js
-front_end/ui/ForwardedInputEventHandler.js
-front_end/ui/FilterSuggestionBuilder.js
-front_end/ui/FilterBar.js
-front_end/ui/EmptyWidget.js
-front_end/ui/DropTarget.js
-front_end/ui/Dialog.js
-front_end/ui/ContextMenu.js
-front_end/ui/Context.js
-front_end/ui/ARIAUtils.js
-front_end/ui/ActionRegistry.js
-front_end/ui/Action.js
-front_end/ui/ActionDelegate.js
-front_end/ui/ContextFlavorListener.js
-front_end/root.js
-front_end/common/common.js
-front_end/common/common-legacy.js
-front_end/common/App.js
-front_end/common/AppProvider.js
-front_end/common/CharacterIdMap.js
-front_end/common/Color.js
-front_end/common/ContentProvider.js
-front_end/common/EventTarget.js
-front_end/common/JavaScriptMetaData.js
-front_end/common/Linkifier.js
-front_end/common/Object.js
-front_end/common/Console.js
-front_end/common/ParsedURL.js
-front_end/common/Progress.js
-front_end/common/QueryParamHandler.js
-front_end/common/ResourceType.js
-front_end/common/Revealer.js
-front_end/common/Runnable.js
-front_end/common/SegmentedRange.js
-front_end/common/Settings.js
-front_end/common/StaticContentProvider.js
-front_end/common/StringOutputStream.js
-front_end/common/TextDictionary.js
-front_end/common/Throttler.js
-front_end/common/Trie.js
-front_end/common/UIString.js
-front_end/common/Worker.js
diff --git a/src/cobalt/extension/extension_test.cc b/src/cobalt/extension/extension_test.cc
index 246ef55..178b897 100644
--- a/src/cobalt/extension/extension_test.cc
+++ b/src/cobalt/extension/extension_test.cc
@@ -20,6 +20,7 @@
 #include "cobalt/extension/graphics.h"
 #include "cobalt/extension/installation_manager.h"
 #include "cobalt/extension/javascript_cache.h"
+#include "cobalt/extension/memory_mapped_file.h"
 #include "cobalt/extension/platform_service.h"
 #include "cobalt/extension/updater_notification.h"
 #include "cobalt/extension/url_fetcher_observer.h"
@@ -287,6 +288,26 @@
       << "Extension struct should be a singleton";
 }
 
+TEST(ExtensionTest, MemoryMappedFile) {
+  typedef CobaltExtensionMemoryMappedFileApi ExtensionApi;
+  const char* kExtensionName = kCobaltExtensionMemoryMappedFileName;
+
+  const ExtensionApi* extension_api =
+      static_cast<const ExtensionApi*>(SbSystemGetExtension(kExtensionName));
+  if (!extension_api) {
+    return;
+  }
+
+  EXPECT_STREQ(extension_api->name, kExtensionName);
+  EXPECT_EQ(extension_api->version, 1u);
+  EXPECT_NE(extension_api->MemoryMapFile, nullptr);
+
+  const ExtensionApi* second_extension_api =
+      static_cast<const ExtensionApi*>(SbSystemGetExtension(kExtensionName));
+  EXPECT_EQ(second_extension_api, extension_api)
+      << "Extension struct should be a singleton";
+}
+
 }  // namespace extension
 }  // namespace cobalt
 #endif  // SB_API_VERSION >= 11
diff --git a/src/cobalt/extension/memory_mapped_file.h b/src/cobalt/extension/memory_mapped_file.h
new file mode 100644
index 0000000..7c1c4bb
--- /dev/null
+++ b/src/cobalt/extension/memory_mapped_file.h
@@ -0,0 +1,58 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+#ifndef COBALT_EXTENSION_MEMORY_MAPPED_FILE_H_
+#define COBALT_EXTENSION_MEMORY_MAPPED_FILE_H_
+
+#include <stdint.h>
+
+#include "starboard/memory.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define kCobaltExtensionMemoryMappedFileName \
+  "dev.cobalt.extension.MemoryMappedFile"
+
+typedef struct CobaltExtensionMemoryMappedFileApi {
+  // Name should be the string |kCobaltExtensionMemoryMappedFileName|.
+  // This helps to validate that the extension API is correct.
+  const char* name;
+
+  // This specifies the version of the API that is implemented.
+  uint32_t version;
+
+  // The fields below this point were added in version 1 or later.
+
+  // Memory maps a file at the specified |address| starting at |file_offset|
+  // and  mapping |size| bytes. The |address| argument can be NULL in which
+  // case new memory buffer will be allocated. If a non NULL |address| is
+  // passed the memory should be resreved in advance through |SbMemoryMap|.
+  // To release the memory call |SbMemoryUnmap|.
+  // The |file_offset| must be a multiple of |kSbMemoryPageSize|.
+  // Returns NULL or error.
+  void* (*MemoryMapFile)(void* address, const char* path,
+                         SbMemoryMapFlags flags, int64_t file_offset,
+                         int64_t size);
+
+} CobaltExtensionMemoryMappedFileApi;
+
+#ifdef __cplusplus
+}  // extern "C"
+#endif
+
+#endif  // COBALT_EXTENSION_MEMORY_MAPPED_FILE_H_
diff --git a/src/cobalt/h5vcc/dial/dial_http_response.cc b/src/cobalt/h5vcc/dial/dial_http_response.cc
index 6531a3e..3fcd329 100644
--- a/src/cobalt/h5vcc/dial/dial_http_response.cc
+++ b/src/cobalt/h5vcc/dial/dial_http_response.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include <memory>
+#include <utility>
 
 #include "cobalt/h5vcc/dial/dial_http_response.h"
 
@@ -24,7 +25,7 @@
 namespace dial {
 DialHttpResponse::DialHttpResponse(const std::string& path,
                                    const std::string& method)
-    : path_(path), method_(method), response_code_(0) {}
+    : path_(path), method_(method), response_code_(500) {}
 
 void DialHttpResponse::AddHeader(const std::string& header,
                                  const std::string& value) {
diff --git a/src/cobalt/renderer/pipeline.cc b/src/cobalt/renderer/pipeline.cc
index 75a5a1e..ee0bbf2 100644
--- a/src/cobalt/renderer/pipeline.cc
+++ b/src/cobalt/renderer/pipeline.cc
@@ -26,10 +26,9 @@
 #include "cobalt/base/polymorphic_downcast.h"
 #include "cobalt/extension/graphics.h"
 #include "cobalt/math/rect_f.h"
-#include "cobalt/render_tree/brush.h"
+#include "cobalt/render_tree/clear_rect_node.h"
 #include "cobalt/render_tree/composition_node.h"
 #include "cobalt/render_tree/dump_render_tree_to_string.h"
-#include "cobalt/render_tree/rect_node.h"
 #include "nb/memory_scope.h"
 #include "starboard/system.h"
 
@@ -66,7 +65,7 @@
 // How many entries the rasterize periodic timer will contain before updating.
 const size_t kRasterizePeriodicTimerEntriesPerUpdate = 60;
 
-// The maxiumum numer of entries that the rasterize animations timer can contain
+// The maximum number of entries that the rasterize animations timer can contain
 // before automatically updating. In the typical use case, the update will
 // occur manually when the animations expire.
 const size_t kRasterizeAnimationsTimerMaxEntries = 60;
@@ -660,11 +659,10 @@
   render_tree::ColorRGBA clear_color;
   if (render_target_ && clear_on_shutdown_mode_ == kClearAccordingToPlatform &&
       ShouldClearFrameOnShutdown(&clear_color)) {
-    rasterizer_->Submit(new render_tree::RectNode(
-                            math::RectF(render_target_->GetSize()),
-                            std::unique_ptr<render_tree::Brush>(
-                                new render_tree::SolidColorBrush(clear_color))),
-                        render_target_);
+    rasterizer_->Submit(
+        new render_tree::ClearRectNode(math::RectF(render_target_->GetSize()),
+                                       clear_color),
+        render_target_);
   }
 
   // This potential reference to a render tree whose animations may have ended
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc
index 4890e72..67fe50a 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontConfigParser_cobalt.cc
@@ -324,6 +324,10 @@
         LOG(ERROR) << "---- Invalid fallback priority [" << value << "]";
         NOTREACHED();
       }
+    } else if (name_len == 15 &&
+               strncmp("disable_caching", name, name_len) == 0) {
+      family->disable_caching =
+          strcmp("true", value) == 0 || strcmp("1", value) == 0;
     } else {
       LOG(ERROR) << "---- Unsupported family attribute [" << name << "]";
       NOTREACHED();
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
index 8d92c16..6862a5e 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.cc
@@ -91,6 +91,7 @@
   }
 
   character_map_ = base::MakeRefCounted<font_character_map::CharacterMap>();
+  disable_character_map_ = family_info.disable_caching;
 
   family_name_ = family_info.names[0];
   SkTHashMap<SkString, int> styles_index_map;
@@ -392,10 +393,12 @@
               << "(" << style_entry->font_style.weight() << ", "
               << style_entry->font_style.width() << ", "
               << style_entry->font_style.slant() << ")";
+    scoped_refptr<font_character_map::CharacterMap> map =
+        disable_character_map_ ? NULL : character_map_;
     style_entry->typeface.reset(new SkTypeface_CobaltStreamProvider(
         stream_provider, style_entry->face_index, style_entry->font_style,
         style_entry->face_is_fixed_pitch, family_name_,
-        style_entry->disable_synthetic_bolding, character_map_));
+        style_entry->disable_synthetic_bolding, map));
   } else {
     LOG(ERROR) << "Failed to scan font: "
                << style_entry->font_file_path.c_str();
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
index 33ec970..774a90f 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontStyleSet_cobalt.h
@@ -135,6 +135,9 @@
   SkLanguage language_;
   font_character_map::PageRanges page_ranges_;
 
+  // Used when the styles in the styleset have different character mappings.
+  bool disable_character_map_;
+
   // NOTE: The following characters require locking when being accessed.
   bool is_character_map_generated_;
   scoped_refptr<font_character_map::CharacterMap> character_map_;
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
index 4f0f1c3..c6a3c97 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkFontUtil_cobalt.h
@@ -167,7 +167,8 @@
 // determine that a family cannot support a character, without needing to
 // generate a full mapping of the family's characters.
 struct FontFamilyInfo {
-  FontFamilyInfo() : is_fallback_family(true), fallback_priority(0) {}
+  FontFamilyInfo()
+      : is_fallback_family(true), fallback_priority(0), disable_caching(0) {}
 
   SkTArray<SkString> names;
   SkTArray<FontFileInfo> fonts;
@@ -175,6 +176,7 @@
   bool is_fallback_family;
   int fallback_priority;
   font_character_map::PageRanges page_ranges;
+  bool disable_caching;
 };
 
 #endif  // COBALT_RENDERER_RASTERIZER_SKIA_SKIA_SRC_PORTS_SKFONTUTIL_COBALT_H_
diff --git a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
index 8f9cce8..a116c2c 100644
--- a/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
+++ b/src/cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.cc
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 #include <memory>
+#include <utility>
 
 #include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h"
 
@@ -44,16 +45,18 @@
 
 SkGlyphID SkTypeface_Cobalt::characterMapGetGlyphIdForCharacter(
     SkUnichar character) const {
-  CHECK(character_map_);
-
-  // Check whether the character is cached in the character map.
-  font_character_map::Character c = character_map_->Find(character);
-  if (c.is_set) return c.id;
+  if (character_map_) {
+    // Check whether the character is cached in the character map.
+    font_character_map::Character c = character_map_->Find(character);
+    if (c.is_set) return c.id;
+  }
 
   // If the character isn't there, look it up with FreeType, then cache it.
   SkGlyphID glyphs[1] = {0};
   SkTypeface_FreeType::onCharsToGlyphs(&character, 1, glyphs);
-  character_map_->Insert(character, glyphs[0]);
+  if (character_map_) {
+    character_map_->Insert(character, glyphs[0]);
+  }
   return glyphs[0];
 }
 
@@ -119,7 +122,6 @@
   *face_index = face_index_;
   return std::unique_ptr<SkFileMemoryChunkStream>(
       stream_provider_->OpenStream());
-  ;
 }
 
 size_t SkTypeface_CobaltStreamProvider::GetStreamLength() const {
diff --git a/src/cobalt/version.h b/src/cobalt/version.h
index e014a72..738430b 100644
--- a/src/cobalt/version.h
+++ b/src/cobalt/version.h
@@ -35,6 +35,6 @@
 //                  release is cut.
 //.
 
-#define COBALT_VERSION "21.lts.5"
+#define COBALT_VERSION "21.lts.6"
 
 #endif  // COBALT_VERSION_H_
diff --git a/src/starboard/android/shared/media_is_video_supported.cc b/src/starboard/android/shared/media_is_video_supported.cc
index 332e4b2..202adc8 100644
--- a/src/starboard/android/shared/media_is_video_supported.cc
+++ b/src/starboard/android/shared/media_is_video_supported.cc
@@ -42,13 +42,13 @@
     return false;
   }
   JniEnvExt* env = JniEnvExt::Get();
+  ScopedLocalJavaRef<jstring> j_mime(env->NewStringStandardUTFOrAbort(mime));
 
   // An HDR capable VP9 or AV1 decoder is needed to handle HDR at all.
   bool has_hdr_capable_decoder =
       JniEnvExt::Get()->CallStaticBooleanMethodOrAbort(
           "dev/cobalt/media/MediaCodecUtil", "hasHdrCapableVideoDecoder",
-          "(Ljava/lang/String;)Z",
-          env->NewStringStandardUTFOrAbort(mime)) == JNI_TRUE;
+          "(Ljava/lang/String;)Z", j_mime.Get()) == JNI_TRUE;
   if (!has_hdr_capable_decoder) {
     return false;
   }
diff --git a/src/starboard/build/collect_deploy_content.gypi b/src/starboard/build/collect_deploy_content.gypi
index a9a5064..6bee14a 100644
--- a/src/starboard/build/collect_deploy_content.gypi
+++ b/src/starboard/build/collect_deploy_content.gypi
@@ -46,11 +46,6 @@
         'collect_deploy_content_extra_args': [ '--use_absolute_symlinks' ],
       }
     }],
-    ['cobalt_docker_build == 1 and host_os == "win"', {
-      'variables': {
-        'collect_deploy_content_extra_args': [ '--copy_override' ],
-      }
-    }],
   ],
   'actions': [{
     'action_name': 'collect_deploy_content',
diff --git a/src/starboard/build/collect_deploy_content.py b/src/starboard/build/collect_deploy_content.py
index 49bf9af..bc548cc 100644
--- a/src/starboard/build/collect_deploy_content.py
+++ b/src/starboard/build/collect_deploy_content.py
@@ -12,16 +12,15 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-"""Builds a symlink farm pointing to specified subdirectories of the input dir."""
+"""Builds a symlink farm pointing to specified subdirs of the input dir."""
 
 import argparse
 import logging
 import os
-import shutil
 import sys
 
 import _env  # pylint: disable=unused-import
-import starboard.tools.port_symlink as port_symlink
+from starboard.tools import port_symlink
 
 # The name of an environment variable that when set to |'1'|, signals to us that
 # we should log all output directories that we have populated.
@@ -40,21 +39,6 @@
   port_symlink.Rmtree(path)
 
 
-def _CopyTree(src_path, dst_path):
-  """
-  Copy tree with a safeguard for windows long path (>260).
-  On Windows Python is facing long path limitation, for more details see
-  https://bugs.python.org/issue27730
-  """
-  if os.sep == r'\\':
-    prefix = r'\\\\?\\'
-    if prefix not in src_path:
-      src_path = prefix + src_path
-    if prefix not in dst_path:
-      dst_path = prefix + dst_path
-  shutil.copytree(src_path, dst_path)
-
-
 def main(argv):
   parser = argparse.ArgumentParser()
   parser.add_argument(
@@ -75,11 +59,6 @@
       metavar='subdirs',
       nargs='*',
       help='subdirectories within both the input and output directories')
-  parser.add_argument(
-      '--copy_override',
-      action='store_true',
-      help='Overrides the behavior of collect_deploy_content to copy files, '
-      'instead of symlinking them.')
   options = parser.parse_args(argv[1:])
 
   if os.environ.get(_SHOULD_LOG_ENV_KEY, None) == '1':
@@ -128,9 +107,7 @@
           msg += ' path points to an unknown type'
         logging.error(msg)
 
-    if options.copy_override:
-      _CopyTree(src_path, dst_path)
-    elif options.use_absolute_symlinks:
+    if options.use_absolute_symlinks:
       port_symlink.MakeSymLink(
           target_path=os.path.abspath(src_path),
           link_path=os.path.abspath(dst_path))
diff --git a/src/starboard/elf_loader/elf_header_test.cc b/src/starboard/elf_loader/elf_header_test.cc
index b58c2a9..e6feea5 100644
--- a/src/starboard/elf_loader/elf_header_test.cc
+++ b/src/starboard/elf_loader/elf_header_test.cc
@@ -14,6 +14,8 @@
 
 #include "starboard/elf_loader/elf_header.h"
 
+#include <string>
+
 #include "starboard/common/scoped_ptr.h"
 #include "starboard/elf_loader/file.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -30,7 +32,10 @@
  public:
   DummyFile(const char* buffer, int size) : buffer_(buffer), size_(size) {}
 
-  bool Open(const char* name) { return true; }
+  bool Open(const char* name) {
+    name_ = name;
+    return true;
+  }
   bool ReadFromOffset(int64_t offset, char* buffer, int size) {
     SB_LOG(INFO) << "ReadFromOffset";
     if (offset != 0) {
@@ -46,9 +51,12 @@
   }
   void Close() {}
 
+  const std::string& GetName() { return name_; }
+
  private:
   const char* buffer_;
   int size_;
+  std::string name_;
 };
 
 class ElfHeaderTest : public ::testing::Test {
diff --git a/src/starboard/elf_loader/elf_loader.gyp b/src/starboard/elf_loader/elf_loader.gyp
index af34367..8417649 100644
--- a/src/starboard/elf_loader/elf_loader.gyp
+++ b/src/starboard/elf_loader/elf_loader.gyp
@@ -139,6 +139,7 @@
       ],
       'dependencies': [
         'elf_loader_sys',
+        '<(DEPTH)/starboard/elf_loader/sabi_string.gyp:sabi_string',
         '<(DEPTH)/starboard/starboard.gyp:starboard',
       ],
       'sources': [
diff --git a/src/starboard/elf_loader/elf_loader_impl.cc b/src/starboard/elf_loader/elf_loader_impl.cc
index 3bfc632..9afb791 100644
--- a/src/starboard/elf_loader/elf_loader_impl.cc
+++ b/src/starboard/elf_loader/elf_loader_impl.cc
@@ -46,7 +46,18 @@
 
   SB_DLOG(INFO) << "Loaded ELF header";
 
-  program_table_.reset(new ProgramTable());
+  const auto* memory_mapped_file_extension =
+      reinterpret_cast<const CobaltExtensionMemoryMappedFileApi*>(
+          SbSystemGetExtension(kCobaltExtensionMemoryMappedFileName));
+  if (memory_mapped_file_extension &&
+      SbStringCompareAll(memory_mapped_file_extension->name,
+             kCobaltExtensionMemoryMappedFileName) == 0 &&
+      memory_mapped_file_extension->version >= 1) {
+    program_table_.reset(new ProgramTable(memory_mapped_file_extension));
+  } else {
+    program_table_.reset(new ProgramTable(nullptr));
+  }
+
   program_table_->LoadProgramHeader(elf_header_loader_->GetHeader(),
                                     elf_file_.get());
 
diff --git a/src/starboard/elf_loader/file.h b/src/starboard/elf_loader/file.h
index 90296e7..a25e8bc 100644
--- a/src/starboard/elf_loader/file.h
+++ b/src/starboard/elf_loader/file.h
@@ -17,6 +17,8 @@
 
 #include "starboard/elf_loader/elf.h"
 
+#include <string>
+
 namespace starboard {
 namespace elf_loader {
 
@@ -35,6 +37,9 @@
   // Closes the underlying file.
   virtual void Close() = 0;
 
+  // Returns the name of the file.
+  virtual const std::string& GetName() = 0;
+
   virtual ~File() {}
 };
 
diff --git a/src/starboard/elf_loader/file_impl.cc b/src/starboard/elf_loader/file_impl.cc
index 94ee465..951db5f 100644
--- a/src/starboard/elf_loader/file_impl.cc
+++ b/src/starboard/elf_loader/file_impl.cc
@@ -39,6 +39,7 @@
 
 bool FileImpl::Open(const char* name) {
   SB_DLOG(INFO) << "Loading: " << name;
+  name_ = name;
   file_ = SbFileOpen(name, kSbFileOpenOnly | kSbFileRead, NULL, NULL);
   if (!file_) {
     return false;
@@ -72,5 +73,9 @@
   }
 }
 
+const std::string& FileImpl::GetName() {
+  return name_;
+}
+
 }  // namespace elf_loader
 }  // namespace starboard
diff --git a/src/starboard/elf_loader/file_impl.h b/src/starboard/elf_loader/file_impl.h
index 9407c95..988a554 100644
--- a/src/starboard/elf_loader/file_impl.h
+++ b/src/starboard/elf_loader/file_impl.h
@@ -20,6 +20,8 @@
 #include "starboard/elf_loader/file.h"
 #include "starboard/file.h"
 
+#include <string>
+
 namespace starboard {
 namespace elf_loader {
 
@@ -31,9 +33,11 @@
   bool Open(const char* name);
   bool ReadFromOffset(int64_t offset, char* buffer, int size);
   void Close();
+  const std::string& GetName() override;
 
  private:
   SbFile file_;
+  std::string name_;
 
   SB_DISALLOW_COPY_AND_ASSIGN(FileImpl);
 };
diff --git a/src/starboard/elf_loader/program_table.cc b/src/starboard/elf_loader/program_table.cc
index 425c16d..079253a 100644
--- a/src/starboard/elf_loader/program_table.cc
+++ b/src/starboard/elf_loader/program_table.cc
@@ -34,14 +34,16 @@
 namespace starboard {
 namespace elf_loader {
 
-ProgramTable::ProgramTable()
+ProgramTable::ProgramTable(
+    const CobaltExtensionMemoryMappedFileApi* memory_mapped_file_extension)
     : phdr_num_(0),
       phdr_mmap_(NULL),
       phdr_table_(NULL),
       phdr_size_(0),
       load_start_(NULL),
       load_size_(0),
-      base_memory_address_(0) {}
+      base_memory_address_(0),
+      memory_mapped_file_extension_(memory_mapped_file_extension) {}
 
 bool ProgramTable::LoadProgramHeader(const Ehdr* elf_header, File* elf_file) {
   if (!elf_header) {
@@ -76,39 +78,52 @@
 
   SB_DLOG(INFO) << "page_max - page_min=" << page_max - page_min;
 
-#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
-  phdr_mmap_ =
-      SbMemoryMap(phdr_size_, kSbMemoryMapProtectWrite, "program_header");
-  if (!phdr_mmap_) {
-    SB_LOG(ERROR) << "Failed to allocate memory";
-    return false;
-  }
+  if (memory_mapped_file_extension_) {
+    SB_DLOG(INFO) << "Memory mapped file for the program header";
+    phdr_mmap_ = memory_mapped_file_extension_->MemoryMapFile(
+        NULL, elf_file->GetName().c_str(), kSbMemoryMapProtectRead, page_min,
+        phdr_size_);
+    if (!phdr_mmap_) {
+      SB_LOG(ERROR) << "Failed to memory map the program header";
+      return false;
+    }
 
-  SB_DLOG(INFO) << "Allocated address=" << phdr_mmap_;
-#else
-  SB_CHECK(false);
-#endif
-  if (!elf_file->ReadFromOffset(page_min, reinterpret_cast<char*>(phdr_mmap_),
-                                phdr_size_)) {
-    SB_LOG(ERROR) << "Failed to read program header from file offset: "
-                  << page_min;
-    return false;
-  }
+    SB_DLOG(INFO) << "Allocated address=" << phdr_mmap_;
+  } else {
 #if SB_API_VERSION >= 12 || SB_HAS(MMAP)
-  bool mp_result =
-      SbMemoryProtect(phdr_mmap_, phdr_size_, kSbMemoryMapProtectRead);
-  SB_DLOG(INFO) << "mp_result=" << mp_result;
-  if (!mp_result) {
-    SB_LOG(ERROR) << "Failed to protect program header";
-    return false;
-  }
+    phdr_mmap_ =
+        SbMemoryMap(phdr_size_, kSbMemoryMapProtectWrite, "program_header");
+    if (!phdr_mmap_) {
+      SB_LOG(ERROR) << "Failed to allocate memory";
+      return false;
+    }
+
+    SB_DLOG(INFO) << "Allocated address=" << phdr_mmap_;
 #else
-  SB_CHECK(false);
+    SB_CHECK(false);
 #endif
+    if (!elf_file->ReadFromOffset(page_min, reinterpret_cast<char*>(phdr_mmap_),
+                                  phdr_size_)) {
+      SB_LOG(ERROR) << "Failed to read program header from file offset: "
+                    << page_min;
+      return false;
+    }
+#if SB_API_VERSION >= 12 || SB_HAS(MMAP)
+    bool mp_result =
+        SbMemoryProtect(phdr_mmap_, phdr_size_, kSbMemoryMapProtectRead);
+    SB_DLOG(INFO) << "mp_result=" << mp_result;
+    if (!mp_result) {
+      SB_LOG(ERROR) << "Failed to protect program header";
+      return false;
+    }
+#else
+    SB_CHECK(false);
+#endif
+  }
 
   phdr_table_ = reinterpret_cast<Phdr*>(reinterpret_cast<char*>(phdr_mmap_) +
                                         page_offset);
-
+  SB_DLOG(INFO) << "phdr_table_=" << phdr_table_;
   return true;
 }
 
@@ -185,20 +200,33 @@
       SB_DLOG(INFO) << "segment prot_flags=" << std::hex << prot_flags;
 
       void* seg_addr = reinterpret_cast<void*>(seg_page_start);
-      bool mp_ret =
-          SbMemoryProtect(seg_addr, file_length, kSbMemoryMapProtectWrite);
-      SB_DLOG(INFO) << "segment vaddress=" << seg_addr;
+      bool mp_ret = false;
+      if (memory_mapped_file_extension_) {
+        SB_DLOG(INFO) << "Using Memory Mapped File for Loading the Segment";
+        void* p = memory_mapped_file_extension_->MemoryMapFile(
+            seg_addr, elf_file->GetName().c_str(), kSbMemoryMapProtectRead,
+            file_page_start, file_length);
+        if (!p) {
+          SB_LOG(ERROR) << "Failed to memory map file: " << elf_file->GetName();
+          return false;
+        }
+      } else {
+        SB_DLOG(INFO) << "Not using Memory Mapped Files";
+        mp_ret =
+            SbMemoryProtect(seg_addr, file_length, kSbMemoryMapProtectWrite);
+        SB_DLOG(INFO) << "segment vaddress=" << seg_addr;
 
-      if (!mp_ret) {
-        SB_LOG(ERROR) << "Failed to unprotect segment";
-        return false;
-      }
-      if (!elf_file->ReadFromOffset(file_page_start,
-                                    reinterpret_cast<char*>(seg_addr),
-                                    file_length)) {
-        SB_DLOG(INFO) << "Failed to read segment from file offset: "
-                      << file_page_start;
-        return false;
+        if (!mp_ret) {
+          SB_LOG(ERROR) << "Failed to unprotect segment";
+          return false;
+        }
+        if (!elf_file->ReadFromOffset(file_page_start,
+                                      reinterpret_cast<char*>(seg_addr),
+                                      file_length)) {
+          SB_DLOG(INFO) << "Failed to read segment from file offset: "
+                        << file_page_start;
+          return false;
+        }
       }
       mp_ret = SbMemoryProtect(seg_addr, file_length, prot_flags);
       SB_DLOG(INFO) << "mp_ret=" << mp_ret;
@@ -313,7 +341,7 @@
     SB_DLOG(INFO) << "Reading at vaddr: " << phdr->p_vaddr;
     *dynamic = reinterpret_cast<Dyn*>(base_memory_address_ + phdr->p_vaddr);
     if (dynamic_count) {
-      *dynamic_count = (size_t)(phdr->p_memsz / sizeof(Dyn));
+      *dynamic_count = static_cast<size_t>((phdr->p_memsz / sizeof(Dyn)));
     }
     if (dynamic_flags) {
       *dynamic_flags = phdr->p_flags;
diff --git a/src/starboard/elf_loader/program_table.h b/src/starboard/elf_loader/program_table.h
index d08301c..be81458 100644
--- a/src/starboard/elf_loader/program_table.h
+++ b/src/starboard/elf_loader/program_table.h
@@ -17,6 +17,7 @@
 
 #include <vector>
 
+#include "cobalt/extension/memory_mapped_file.h"
 #include "starboard/elf_loader/elf.h"
 #include "starboard/elf_loader/file.h"
 
@@ -36,7 +37,8 @@
 
 class ProgramTable {
  public:
-  ProgramTable();
+  explicit ProgramTable(
+      const CobaltExtensionMemoryMappedFileApi* memory_mapped_file_extension);
 
   // Loads the program header.
   bool LoadProgramHeader(const Ehdr* elf_header, File* elf_file);
@@ -90,6 +92,8 @@
   // from the ELF file are offsets from this address.
   Addr base_memory_address_;
 
+  const CobaltExtensionMemoryMappedFileApi* memory_mapped_file_extension_;
+
   SB_DISALLOW_COPY_AND_ASSIGN(ProgramTable);
 };
 
diff --git a/src/starboard/elf_loader/program_table_test.cc b/src/starboard/elf_loader/program_table_test.cc
index e1716f3..d8f728c 100644
--- a/src/starboard/elf_loader/program_table_test.cc
+++ b/src/starboard/elf_loader/program_table_test.cc
@@ -14,6 +14,7 @@
 
 #include "starboard/elf_loader/program_table.h"
 
+#include <string>
 #include <vector>
 
 #include "starboard/common/scoped_ptr.h"
@@ -41,7 +42,11 @@
   explicit DummyFile(const std::vector<FileChunk>& file_chunks)
       : file_chunks_(file_chunks), read_index_(0) {}
 
-  bool Open(const char* name) { return true; }
+  bool Open(const char* name) {
+    name_ = name;
+    return true;
+  }
+
   bool ReadFromOffset(int64_t offset, char* buffer, int size) {
     SB_LOG(INFO) << "ReadFromOffset offset=" << offset << " size=" << size
                  << " read_index_=" << read_index_;
@@ -64,18 +69,19 @@
     return true;
   }
   void Close() {}
-
+  const std::string& GetName() { return name_; }
  private:
   int file_offset_;
   const char* buffer_;
   int size_;
   std::vector<FileChunk> file_chunks_;
   int read_index_;
+  std::string name_;
 };
 
 class ProgramTableTest : public ::testing::Test {
  protected:
-  ProgramTableTest() { program_table_.reset(new ProgramTable()); }
+  ProgramTableTest() { program_table_.reset(new ProgramTable(nullptr)); }
   ~ProgramTableTest() {}
 
   void HelperMethod() {}
diff --git a/src/starboard/linux/shared/BUILD.gn b/src/starboard/linux/shared/BUILD.gn
index 73fe377..fe59192 100644
--- a/src/starboard/linux/shared/BUILD.gn
+++ b/src/starboard/linux/shared/BUILD.gn
@@ -371,6 +371,8 @@
     "//starboard/shared/posix/log_is_tty.cc",
     "//starboard/shared/posix/log_raw.cc",
     "//starboard/shared/posix/memory_flush.cc",
+    "//starboard/shared/posix/memory_mapped_file.cc",
+    "//starboard/shared/posix/memory_mapped_file.h",
     "//starboard/shared/posix/set_non_blocking_internal.cc",
     "//starboard/shared/posix/socket_accept.cc",
     "//starboard/shared/posix/socket_bind.cc",
diff --git a/src/starboard/linux/shared/starboard_platform.gypi b/src/starboard/linux/shared/starboard_platform.gypi
index d2cc26a..5d48e02 100644
--- a/src/starboard/linux/shared/starboard_platform.gypi
+++ b/src/starboard/linux/shared/starboard_platform.gypi
@@ -142,6 +142,8 @@
       '<(DEPTH)/starboard/shared/posix/log_is_tty.cc',
       '<(DEPTH)/starboard/shared/posix/log_raw.cc',
       '<(DEPTH)/starboard/shared/posix/memory_flush.cc',
+      '<(DEPTH)/starboard/shared/posix/memory_mapped_file.cc',
+      '<(DEPTH)/starboard/shared/posix/memory_mapped_file.h',
       '<(DEPTH)/starboard/shared/posix/set_non_blocking_internal.cc',
       '<(DEPTH)/starboard/shared/posix/socket_accept.cc',
       '<(DEPTH)/starboard/shared/posix/socket_bind.cc',
diff --git a/src/starboard/linux/shared/system_get_extensions.cc b/src/starboard/linux/shared/system_get_extensions.cc
index 390aa38..f56a6e5 100644
--- a/src/starboard/linux/shared/system_get_extensions.cc
+++ b/src/starboard/linux/shared/system_get_extensions.cc
@@ -16,7 +16,9 @@
 
 #include "cobalt/extension/configuration.h"
 #include "cobalt/extension/crash_handler.h"
+#include "cobalt/extension/memory_mapped_file.h"
 #include "starboard/common/string.h"
+#include "starboard/shared/posix/memory_mapped_file.h"
 #include "starboard/shared/starboard/crash_handler.h"
 #if SB_IS(EVERGREEN_COMPATIBLE)
 #include "starboard/elf_loader/evergreen_config.h"
@@ -41,5 +43,8 @@
   if (SbStringCompareAll(name, kCobaltExtensionCrashHandlerName) == 0) {
     return starboard::common::GetCrashHandlerApi();
   }
+  if (SbStringCompareAll(name, kCobaltExtensionMemoryMappedFileName) == 0) {
+    return starboard::shared::posix::GetMemoryMappedFileApi();
+  }
   return NULL;
 }
diff --git a/src/starboard/shared/dlmalloc/page_internal.h b/src/starboard/shared/dlmalloc/page_internal.h
index b4df31f..e72fd75 100644
--- a/src/starboard/shared/dlmalloc/page_internal.h
+++ b/src/starboard/shared/dlmalloc/page_internal.h
@@ -19,6 +19,7 @@
 #ifndef STARBOARD_SHARED_DLMALLOC_PAGE_INTERNAL_H_
 #define STARBOARD_SHARED_DLMALLOC_PAGE_INTERNAL_H_
 
+#include "starboard/memory.h"
 #include "starboard/shared/internal_only.h"
 #include "starboard/types.h"
 
@@ -115,6 +116,17 @@
 // allocated by dlmalloc isn't counted twice.
 void* SbPageMapUntracked(size_t size_bytes, int flags, const char* name);
 
+// Memory maps a file to the specified |addr| starting with |file_offset| and
+// mapping |size| bytes. The |addr| should be reserved before calling. If
+// NULL |addr| is passed a new memory block would be allocated and the address
+// returned. The file_offset must be a multiple of |kSbMemoryPageSize|.
+// On error returns NULL.
+void* SbPageMapFile(void* addr,
+                    const char* path,
+                    SbMemoryMapFlags flags,
+                    int64_t file_offset,
+                    int64_t size);
+
 // Unmap |size_bytes| of physical pages starting from |virtual_address|,
 // returning true on success. After this, [virtual_address, virtual_address +
 // size_bytes) will not be read/writable. SbUnmap() can unmap multiple
diff --git a/src/starboard/shared/linux/page_internal.cc b/src/starboard/shared/linux/page_internal.cc
index bd8c444..5e9c4a4 100644
--- a/src/starboard/shared/linux/page_internal.cc
+++ b/src/starboard/shared/linux/page_internal.cc
@@ -17,8 +17,10 @@
 
 #include "starboard/shared/dlmalloc/page_internal.h"
 
+#include <fcntl.h>
 #include <stdio.h>
 #include <sys/mman.h>
+#include <unistd.h>
 
 #include "starboard/atomic.h"
 #include "starboard/common/log.h"
@@ -85,6 +87,38 @@
   return mem;
 }
 
+void* SbPageMapFile(void* addr,
+                    const char* path,
+                    SbMemoryMapFlags flags,
+                    int64_t file_offset,
+                    int64_t size) {
+  int fd = open(path, O_RDONLY);
+  if (fd == -1) {
+    return nullptr;
+  }
+
+  void* p = nullptr;
+  if (addr != nullptr) {
+    p = mmap(addr, size, SbMemoryMapFlagsToMmapProtect(flags),
+             MAP_PRIVATE | MAP_FIXED, fd, file_offset);
+    if (p == MAP_FAILED) {
+      close(fd);
+      return nullptr;
+    }
+  } else {
+    p = mmap(addr, size, SbMemoryMapFlagsToMmapProtect(flags), MAP_PRIVATE, fd,
+             file_offset);
+    if (p == MAP_FAILED) {
+      close(fd);
+      return nullptr;
+    }
+  }
+  // It is OK to close the file descriptor as the memory
+  // mapping keeps the file open.
+  close(fd);
+  return p;
+}
+
 bool SbPageUnmap(void* ptr, size_t size_bytes) {
   SbAtomicNoBarrier_Increment(&s_tracked_page_count, -GetPageCount(size_bytes));
   return SbPageUnmapUntracked(ptr, size_bytes);
diff --git a/src/starboard/shared/posix/memory_mapped_file.cc b/src/starboard/shared/posix/memory_mapped_file.cc
new file mode 100644
index 0000000..d9a3dfb
--- /dev/null
+++ b/src/starboard/shared/posix/memory_mapped_file.cc
@@ -0,0 +1,39 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "starboard/shared/posix/memory_mapped_file.h"
+
+#include "cobalt/extension/memory_mapped_file.h"
+#include "starboard/common/log.h"
+#include "starboard/shared/dlmalloc/page_internal.h"
+
+namespace starboard {
+namespace shared {
+namespace posix {
+
+namespace {
+
+const CobaltExtensionMemoryMappedFileApi kMemoryMappedFileApi = {
+    kCobaltExtensionMemoryMappedFileName, 1, &SbPageMapFile,
+};
+
+}  // namespace
+
+const void* GetMemoryMappedFileApi() {
+  return &kMemoryMappedFileApi;
+}
+
+}  // namespace posix
+}  // namespace shared
+}  // namespace starboard
diff --git a/src/starboard/shared/posix/memory_mapped_file.h b/src/starboard/shared/posix/memory_mapped_file.h
new file mode 100644
index 0000000..46e47fe
--- /dev/null
+++ b/src/starboard/shared/posix/memory_mapped_file.h
@@ -0,0 +1,28 @@
+// Copyright 2021 The Cobalt Authors. All Rights Reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef STARBOARD_SHARED_POSIX_MEMORY_MAPPED_FILE_H_
+#define STARBOARD_SHARED_POSIX_MEMORY_MAPPED_FILE_H_
+
+namespace starboard {
+namespace shared {
+namespace posix {
+
+const void* GetMemoryMappedFileApi();
+
+}  // namespace posix
+}  // namespace shared
+}  // namespace starboard
+
+#endif  // STARBOARD_SHARED_POSIX_MEMORY_MAPPED_FILE_H_
diff --git a/src/starboard/tools/app_launcher_packager.py b/src/starboard/tools/app_launcher_packager.py
index b547660..48a80f4 100644
--- a/src/starboard/tools/app_launcher_packager.py
+++ b/src/starboard/tools/app_launcher_packager.py
@@ -31,8 +31,9 @@
 import _env  # pylint: disable=unused-import
 from paths import REPOSITORY_ROOT
 from paths import THIRD_PARTY_ROOT
+
 sys.path.append(THIRD_PARTY_ROOT)
-# pylint: disable=g-import-not-at-top,g-bad-import-order
+# pylint: disable=g-import-not-at-top,g-bad-import-order,wrong-import-position
 from starboard.tools import port_symlink
 import starboard.tools.platform
 
@@ -44,6 +45,7 @@
     ('buildbot/device_server/shared/ssl_certs', '*'),
     ('cobalt', '*.py'),
     ('starboard', '*.py'),
+    ('starboard', '*.pfx'),
     ('starboard/tools', 'platform.py.template')
 ]
 
@@ -130,11 +132,11 @@
     # Store posix paths even on Windows so MH Linux hosts can use them.
     # The template has code to re-normalize them when used on Windows hosts.
     platforms_map[p] = platform_path.replace('\\', '/')
-  template = string.Template(
-      open(os.path.join(current_dir, 'platform.py.template')).read())
-  with open(os.path.join(dest_dir, 'platform.py'), 'w+') as f:
-    sub = template.substitute(platforms_map=platforms_map)
-    f.write(sub.encode('utf-8'))
+  with open(os.path.join(current_dir, 'platform.py.template')) as c:
+    template = string.Template(c.read())
+    with open(os.path.join(dest_dir, 'platform.py'), 'w+') as f:
+      sub = template.substitute(platforms_map=platforms_map)
+      f.write(sub.encode('utf-8'))
   logging.info('Finished baking in platform info files.')
 
 
diff --git a/src/starboard/tools/net_args.py b/src/starboard/tools/net_args.py
index b77d658..9e84048 100644
--- a/src/starboard/tools/net_args.py
+++ b/src/starboard/tools/net_args.py
@@ -12,37 +12,32 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-
 """Example script for getting the Net Args."""
 
 from __future__ import print_function
 
-import pprint
-
 import argparse
 import socket
 import sys
-import thread
 import time
 import threading
 
+
 # Returns |True| if a connection was made and the NetArg payload was delivered.
 # Example:
 #  TryConnectAndSendNetArgs('1.2.3.4', '1234', ['--argument', '--switch=value'])
-def TryConnectAndSendNetArgs(host, port, arg_list):
-  arg_string = '\n'.join(arg_list)
-
+def TryConnectAndSendNetArgs(host, port):
   try:
-    server_socket = socket.create_connection((host, port), timeout = .5)
-    result = server_socket.sendall(arg_string)
+    server_socket = socket.create_connection((host, port), timeout=.5)
     server_socket.close()
     return True
-  except socket.timeout as err:
+  except socket.timeout:
     return False
-  except socket.error as (err_no, err_str):
-    print(err_no, err_str)
+  except socket.error as e:
+    print(e.errno, e.strerror)
     return False
 
+
 class NetArgsThread(threading.Thread):
   """Threaded version of NetArgs"""
 
@@ -71,32 +66,35 @@
       with self.mutex:
         if self.join_called:
           break
-      connected_and_sent = TryConnectAndSendNetArgs(
-          self.host, self.port, self.arg_list)
+      connected_and_sent = TryConnectAndSendNetArgs(self.host, self.port)
       if connected_and_sent:
         with self.mutex:
           self.args_sent = True
           break
 
+
 def main(argv):
-  parser = argparse.ArgumentParser(description = 'Connects to the weblog.')
-  parser.add_argument('--host', type=str, required = False,
-                      default = 'localhost',
-                      help = "Example localhost or 1.2.3.4")
-  parser.add_argument('--port', type=int, required = False, default = '49355')
-  parser.add_argument('--arg', type=str, required = True)
+  parser = argparse.ArgumentParser(description='Connects to the weblog.')
+  parser.add_argument(
+      '--host',
+      type=str,
+      required=False,
+      default='localhost',
+      help='Example localhost or 1.2.3.4')
+  parser.add_argument('--port', type=int, required=False, default='49355')
+  parser.add_argument('--arg', type=str, required=True)
   args = parser.parse_args(argv)
 
-  net_args_thread = NetArgsThread(
-          args.host, args.port, [args.arg])
+  net_args_thread = NetArgsThread(args.host, args.port, [args.arg])
 
   while not net_args_thread.ArgsSent():
-    print("Waiting to send arg " + args.arg + " to " + str(args.host) +
-          ":" + str(args.port) + "...")
+    print('Waiting to send arg ' + args.arg + ' to ' + str(args.host) + ':' +
+          str(args.port) + '...')
     time.sleep(.5)
 
-  print("Argument", args.arg, "was sent to", \
-        args.host + ":" + str(args.port))
+  print('Argument', args.arg, 'was sent to', \
+        args.host + ':' + str(args.port))
+
 
 if __name__ == '__main__':
   sys.exit(main(sys.argv[1:]))
diff --git a/src/starboard/tools/net_log.py b/src/starboard/tools/net_log.py
index 0b85cfa..aaa9797 100644
--- a/src/starboard/tools/net_log.py
+++ b/src/starboard/tools/net_log.py
@@ -13,24 +13,24 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-
 """Example script for getting the Net log."""
 
 from __future__ import print_function
 
 import argparse
-import pprint
 import select
 import socket
 import sys
 import time
 import threading
 
+
 class NetLog:
   """
   Uses a non-blocking socket to establish a connection with a
   NetLog and then will allow the log to be fetched.
   """
+
   def __init__(self, host, port):
     self.host = host
     self.port = port
@@ -47,9 +47,9 @@
         self.server_socket = None
       else:
         return log
-    except socket.error as (err_no, err_str):
-      print(__file__ + ": Socket error while reading log:" \
-            + str(err_no) + " - " + str(err_str))
+    except socket.error as e:
+      print(__file__ + ': Socket error while reading log:' \
+            + str(e.errno) + ' - ' + str(e.strerror))
       self.server_socket = None
       return None
 
@@ -64,28 +64,31 @@
       if len(result) == 0:
         return None
       return result
-    except socket.error as (err_no, err_str):
-      if err_no == 10035:  # Data not ready yet.
+    except socket.error as e:
+      if e.errno == 10035:  # Data not ready yet.
         return ''
       else:
         raise
 
   def _TryCreateSocketConnection(self):
     try:
-      print("Waiting for connection to " + str(self.host) + ':' + str(self.port))
+      print('Waiting for connection to ' + str(self.host) + ':' +
+            str(self.port))
 
-      server_socket = socket.create_connection((self.host, self.port), timeout = 1)
+      server_socket = socket.create_connection((self.host, self.port),
+                                               timeout=1)
       server_socket.setblocking(0)
       return server_socket
-    except socket.timeout as err:
+    except socket.timeout:
       return None
     except socket.error as err:
-      print("Error while trying to create socket: " + str(err))
+      print('Error while trying to create socket: ' + str(err))
       return None
 
 
 class NetLogThread(threading.Thread):
   """Threaded version of NetLog"""
+
   def __init__(self, host, port):
     super(NetLogThread, self).__init__()
     self.web_log = NetLog(host, port)
@@ -111,8 +114,9 @@
         with self.log_mutex:
           self.log.extend(new_log)
 
+
 def TestNetLog(host, port):
-  print("Started...")
+  print('Started...')
   web_log = NetLog(host, port)
 
   while True:
@@ -123,11 +127,14 @@
 
 
 def main(argv):
-  parser = argparse.ArgumentParser(description = 'Connects to the weblog.')
-  parser.add_argument('--host', type=str, required = False,
-                      default = 'localhost',
-                      help = "Example localhost or 1.2.3.4")
-  parser.add_argument('--port', type=int, required = False, default = '49353')
+  parser = argparse.ArgumentParser(description='Connects to the weblog.')
+  parser.add_argument(
+      '--host',
+      type=str,
+      required=False,
+      default='localhost',
+      help='Example localhost or 1.2.3.4')
+  parser.add_argument('--port', type=int, required=False, default='49353')
   args = parser.parse_args(argv)
 
   thread = NetLogThread(args.host, args.port)
@@ -136,13 +143,14 @@
     while True:
       print(thread.GetLog(), end='')
       time.sleep(.1)
-  except KeyboardInterrupt as ki:
-    print("\nUser canceled.")
+  except KeyboardInterrupt:
+    print('\nUser canceled.')
     pass
 
-  print("Waiting to join...")
+  print('Waiting to join...')
   thread.join()
   return 0
 
+
 if __name__ == '__main__':
   sys.exit(main(sys.argv[1:]))
diff --git a/src/third_party/crashpad/handler/handler.gyp b/src/third_party/crashpad/handler/handler.gyp
index 1275a4d..d862d70 100644
--- a/src/third_party/crashpad/handler/handler.gyp
+++ b/src/third_party/crashpad/handler/handler.gyp
@@ -102,6 +102,7 @@
           'ldflags': [
             '-Wl,--as-needed',
             '-Wl,-gc-sections',
+            '-Wl,-z,noexecstack',
           ],
         }],
         ['OS=="win"',  {
diff --git a/src/tools/gyp/pylib/gyp/msvs_emulation.py b/src/tools/gyp/pylib/gyp/msvs_emulation.py
index 3951c19..068ad1e 100755
--- a/src/tools/gyp/pylib/gyp/msvs_emulation.py
+++ b/src/tools/gyp/pylib/gyp/msvs_emulation.py
@@ -747,7 +747,6 @@
       'cell_.*',
       'sn_.*',
       'sce_.*',
-      'is_docker',
   )
   env = {}
   for line in output_of_set.splitlines():