Просмотр исходного кода

merge:仿真迭代需求代码合并上线

linchengzhe 1 год назад
Родитель
Сommit
49ff3225ac
75 измененных файлов с 32406 добавлено и 5824 удалено
  1. BIN
      dist.zip
  2. 142 512
      package-lock.json
  3. 2 0
      package.json
  4. 3 0
      public/css/font-awesome.min.css
  5. 0 0
      public/css/notyf.min.css
  6. BIN
      public/glb/car.glb
  7. 5 0
      public/hdr/050.hdr
  8. 5 0
      public/hdr/christmas-sky.hdr
  9. 5 0
      public/hdr/index8.hdr
  10. BIN
      public/hdr/robot_background.hdr
  11. 58 0
      public/index.html
  12. 236 0
      public/js/InfiniteGridHelper.js
  13. 47 0
      public/js/controls.js
  14. 12 0
      public/js/dat.gui.min.js
  15. 2555 0
      public/js/libOpenDrive.js
  16. BIN
      public/js/libOpenDrive.wasm
  17. 0 0
      public/js/notyf.min.js
  18. 6 0
      public/js/orbitcontrols.min.js
  19. 1 0
      public/js/three.min.js
  20. 2784 0
      public/map/mine3.xodr
  21. 898 0
      public/map/mine4.xodr
  22. 236 0
      src/InfiniteGridHelper.js
  23. 4 2
      src/api/index.js
  24. 25 0
      src/api/multimode.js
  25. 33 1
      src/api/sceneLibrary.js
  26. 28 2
      src/api/workManagement.js
  27. BIN
      src/assets/common/image/report_banner.png
  28. 16 1
      src/axios/filter.js
  29. 1 0
      src/components/HelloWorld.vue
  30. 3 1
      src/components/grid/TableList.vue
  31. 19 1
      src/lib/util.js
  32. 1 1
      src/main.js
  33. 147 0
      src/mixin/workManagement/getStdMapMixin.js
  34. 868 0
      src/mixin/workManagement/openDriveMixin.js
  35. 0 1
      src/router/filter.js
  36. 111 94
      src/router/index.js
  37. 45 0
      src/router/multimodeSimulation.js
  38. 21 0
      src/router/sceneLibrary.js
  39. 108 33
      src/router/workManagement.js
  40. 27 7
      src/store/index.js
  41. 262 231
      src/views/page/breadCrumb.vue
  42. 714 0
      src/views/sceneLibrary/benchmarkScenarioList.vue
  43. 18 0
      src/views/sceneLibrary/common.js
  44. 182 0
      src/views/sceneLibrary/components/benchmarkEdit.vue
  45. 1638 857
      src/views/sceneLibrary/components/realSceneList.vue
  46. 16 25
      src/views/sceneLibrary/generalizationScenarioList.vue
  47. 281 195
      src/views/sceneLibrary/gradingRuleDetail.vue
  48. 433 286
      src/views/sceneLibrary/gradingRulesList.vue
  49. 539 559
      src/views/sceneLibrary/naturalDrivingScenarioList.vue
  50. 215 0
      src/views/sceneLibrary/sceneEvaluation.vue
  51. 14 1
      src/views/sceneLibrary/scenePacketList.vue
  52. 404 291
      src/views/sceneLibrary/standardRegulationSimulationScenarioList.vue
  53. 505 400
      src/views/sceneLibrary/trafficAccidentSimulationScenarioList.vue
  54. 668 0
      src/views/systemManagement/sceneLibraryManagement/benchmarkScenario.vue
  55. 16 0
      src/views/systemManagement/sceneLibraryManagement/generalizationScene.vue
  56. 579 520
      src/views/systemManagement/sceneLibraryManagement/naturalDrivingScene.vue
  57. 157 145
      src/views/systemManagement/sceneLibraryManagement/sceneLibraryManagement.vue
  58. 428 332
      src/views/systemManagement/sceneLibraryManagement/standardRegulationSimulationScene.vue
  59. 532 443
      src/views/systemManagement/sceneLibraryManagement/trafficAccidentSimulationScene.vue
  60. 508 465
      src/views/systemManagement/sceneUploadList.vue
  61. 131 0
      src/views/workManagement/components/openDriver.vue
  62. 189 0
      src/views/workManagement/components/pathDialog.vue
  63. 398 0
      src/views/workManagement/components/simulationTable.vue
  64. 187 0
      src/views/workManagement/evaluationResults.vue
  65. 509 397
      src/views/workManagement/manualRunProjectDetail.vue
  66. 48 4
      src/views/workManagement/manualRunProjectList.vue
  67. 316 0
      src/views/workManagement/multimodeSimulationEdit.vue
  68. 157 10
      src/views/workManagement/projectInfo.vue
  69. 1846 0
      src/views/workManagement/sceneReport.vue
  70. 352 0
      src/views/workManagement/simulationEdit.vue
  71. 435 0
      src/views/workManagement/simulationEvaluate.vue
  72. 287 0
      src/views/workManagement/simulationHome.vue
  73. 371 0
      src/views/workManagement/simulationMap.vue
  74. 7 7
      vue.config.js
  75. 10612 0
      yarn.lock

Разница между файлами не показана из-за своего большого размера
+ 142 - 512
package-lock.json


+ 2 - 0
package.json

@@ -19,8 +19,10 @@
     "element-resize-detector": "^1.1.15",
     "element-ui": "^2.10.1",
     "font-awesome": "^4.7.0",
+    "html2canvas": "^1.4.1",
     "jquery": "^3.4.1",
     "js-file-download": "^0.4.8",
+    "jspdf": "^2.5.1",
     "moment": "^2.24.0",
     "popper.js": "^1.15.0",
     "quill-image-drop-module": "^1.0.3",

Разница между файлами не показана из-за своего большого размера
+ 3 - 0
public/css/font-awesome.min.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
public/css/notyf.min.css


BIN
public/glb/car.glb


Разница между файлами не показана из-за своего большого размера
+ 5 - 0
public/hdr/050.hdr


Разница между файлами не показана из-за своего большого размера
+ 5 - 0
public/hdr/christmas-sky.hdr


Разница между файлами не показана из-за своего большого размера
+ 5 - 0
public/hdr/index8.hdr


BIN
public/hdr/robot_background.hdr


+ 58 - 0
public/index.html

@@ -5,14 +5,72 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+	<link rel="stylesheet" href="./css/notyf.min.css">
+	<link rel="stylesheet" href="./css/font-awesome.min.css">
     <!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
     <title>云仿真测试系统</title>
+	<script src="./js/dat.gui.min.js"></script>
+	<script src="./js/libOpenDrive.js"></script>
+	<script src="./js/notyf.min.js"></script>
+	<script id="idVertexShader" type="x-shader/x-vertex">
+	    attribute vec4 id;
+	    varying vec4 vId;
+	
+	    void main() { 
+	        vId = id;
+	        gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
+	    }
+	</script>
+	
+	<script id="idFragmentShader" type="x-shader/x-vertex">
+	    varying vec4 vId;
+	    
+	    void main() {
+	        gl_FragColor = vId;
+	    }
+	</script>
+	
+	<script id="xyzVertexShader" type="x-shader/x-vertex">
+	    varying vec3 vXYZ;
+	
+	    void main() { 
+	        vXYZ = position;
+	        gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
+	    }
+	</script>
+	
+	<script id="xyzFragmentShader" type="x-shader/x-vertex">
+	    varying vec3 vXYZ;
+	    
+	    void main() {
+	        gl_FragColor = vec4(vXYZ, 1.0);
+	    }
+	</script>
+	
+	<script id="stVertexShader" type="x-shader/x-vertex">
+	    attribute vec2 st;
+	    varying vec2 vST;
+	
+	    void main() { 
+	        vST = st;
+	        gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
+	    }
+	</script>
+	
+	<script id="stFragmentShader" type="x-shader/x-vertex">
+	    varying vec2 vST;
+	    
+	    void main() {
+	        gl_FragColor = vec4(vST.x, vST.y, 0.0, 1.0);
+	    }
+	</script>
   </head>
   <body>
     <noscript>
       <strong>We're sorry but 仿真云平台 doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
     </noscript>
     <div id="app"></div>
+	<script src="./js/controls.js"></script>
     <!-- built files will be auto injected -->
   </body>
 </html>

+ 236 - 0
public/js/InfiniteGridHelper.js

@@ -0,0 +1,236 @@
+// Author: Fyrestar https://mevedia.com (https://github.com/Fyrestar/THREE.InfiniteGridHelper)
+
+THREE.InfiniteGridHelper = function InfiniteGridHelper( size1, size2, color, distance, axes = 'xzy' ) {
+
+	color = color || new THREE.Color( 'white' );
+	size1 = size1 || 10;
+	size2 = size2 || 100;
+
+	distance = distance || 8000;
+
+
+
+	const planeAxes = axes.substr( 0, 2 );
+
+	const geometry = new THREE.PlaneBufferGeometry( 2, 2, 1, 1 );
+
+	const material = new THREE.ShaderMaterial( {
+
+		side: THREE.DoubleSide,
+
+		uniforms: {
+			uSize1: {
+				value: size1
+			},
+			uSize2: {
+				value: size2
+			},
+			uColor: {
+				value: color
+			},
+			uDistance: {
+				value: distance
+			}
+		},
+		transparent: true,
+		vertexShader: `
+           
+           varying vec3 worldPosition;
+		   
+           uniform float uDistance;
+           
+           void main() {
+           
+                vec3 pos = position.${axes} * uDistance;
+                pos.${planeAxes} += cameraPosition.${planeAxes};
+                
+                worldPosition = pos;
+                
+                gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
+           
+           }
+           `,
+
+
+		fragmentShader: `
+           
+           varying vec3 worldPosition;
+           
+           uniform float uSize1;
+           uniform float uSize2;
+           uniform vec3 uColor;
+           uniform float uDistance;
+            
+            
+            
+            float getGrid(float size) {
+            
+                vec2 r = worldPosition.${planeAxes} / size;
+                
+                
+                vec2 grid = abs(fract(r - 0.5) - 0.5) / fwidth(r);
+                float line = min(grid.x, grid.y);
+                
+            
+                return 1.0 - min(line, 1.0);
+            }
+            
+           void main() {
+           
+                
+                  float d = 1.0 - min(distance(cameraPosition.${planeAxes}, worldPosition.${planeAxes}) / uDistance, 1.0);
+                
+                  float g1 = getGrid(uSize1);
+                  float g2 = getGrid(uSize2);
+                  
+                  
+                  gl_FragColor = vec4(uColor.rgb, mix(g2, g1, g1) * pow(d, 3.0));
+                  gl_FragColor.a = mix(0.5 * gl_FragColor.a, gl_FragColor.a, g2);
+                
+                  if ( gl_FragColor.a <= 0.0 ) discard;
+                
+           
+           }
+           
+           `,
+
+		extensions: {
+			derivatives: true
+		}
+
+	} );
+
+
+	THREE.Mesh.call( this, geometry, material );
+
+	this.frustumCulled = false;
+
+};
+
+THREE.InfiniteGridHelper.prototype = {
+	...THREE.Mesh.prototype,
+	...THREE.Object3D.prototype,
+	...THREE.EventDispatcher.prototype
+};
+
+if ( parseInt( THREE.REVISION ) > 126 ) {
+
+	class InfiniteGridHelper extends THREE.Mesh {
+
+		constructor ( size1, size2, color, distance, axes = 'xzy' ) {
+
+
+			color = color || new THREE.Color( 'white' );
+			size1 = size1 || 10;
+			size2 = size2 || 100;
+
+			distance = distance || 8000;
+
+
+
+			const planeAxes = axes.substr( 0, 2 );
+
+			const geometry = new THREE.PlaneBufferGeometry( 2, 2, 1, 1 );
+
+			const material = new THREE.ShaderMaterial( {
+
+				side: THREE.DoubleSide,
+
+				uniforms: {
+					uSize1: {
+						value: size1
+					},
+					uSize2: {
+						value: size2
+					},
+					uColor: {
+						value: color
+					},
+					uDistance: {
+						value: distance
+					}
+				},
+				transparent: true,
+				vertexShader: `
+           
+           varying vec3 worldPosition;
+		   
+           uniform float uDistance;
+           
+           void main() {
+           
+                vec3 pos = position.${axes} * uDistance;
+                pos.${planeAxes} += cameraPosition.${planeAxes};
+                
+                worldPosition = pos;
+                
+                gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
+           
+           }
+           `,
+
+
+				fragmentShader: `
+           
+           varying vec3 worldPosition;
+           
+           uniform float uSize1;
+           uniform float uSize2;
+           uniform vec3 uColor;
+           uniform float uDistance;
+            
+            
+            
+            float getGrid(float size) {
+            
+                vec2 r = worldPosition.${planeAxes} / size;
+                
+                
+                vec2 grid = abs(fract(r - 0.5) - 0.5) / fwidth(r);
+                float line = min(grid.x, grid.y);
+                
+            
+                return 1.0 - min(line, 1.0);
+            }
+            
+           void main() {
+           
+                
+                  float d = 1.0 - min(distance(cameraPosition.${planeAxes}, worldPosition.${planeAxes}) / uDistance, 1.0);
+                
+                  float g1 = getGrid(uSize1);
+                  float g2 = getGrid(uSize2);
+                  
+                  
+                  gl_FragColor = vec4(uColor.rgb, mix(g2, g1, g1) * pow(d, 3.0));
+                  gl_FragColor.a = mix(0.5 * gl_FragColor.a, gl_FragColor.a, g2);
+                
+                  if ( gl_FragColor.a <= 0.0 ) discard;
+                
+           
+           }
+           
+           `,
+
+				extensions: {
+					derivatives: true
+				}
+
+			} );
+
+			super( geometry, material );
+
+			this.frustumCulled = false;
+
+		}
+
+	}
+	
+	Object.assign( InfiniteGridHelper.prototype, THREE.InfiniteGridHelper.prototype );
+
+	THREE.InfiniteGridHelper = InfiniteGridHelper;
+
+}
+
+module.exports.InfiniteGridHelper = THREE.InfiniteGridHelper
+// module.exports.InfiniteGridHelper  =THREE.InfiniteGridHelper;

+ 47 - 0
public/js/controls.js

@@ -0,0 +1,47 @@
+var PARAMS = {
+    load_file : () => { document.getElementById('xodr_file_input').click(); },
+    resolution : 0.02,
+    ref_line : true,
+    roadmarks : true,
+    wireframe : false,
+    spotlight : true,
+    fitView : () => { fitViewToObj(refline_lines); },
+    lateralProfile : true,
+    laneHeight : true,
+    reload_map : () => { reloadOdrMap(); },
+    view_mode : 'Default',
+};
+
+// const gui = new dat.GUI();
+// gui.add(PARAMS, 'load_file').name('📁 打开.xodr');
+// gui.add(PARAMS, 'resolution', { 低 : 1.0, 中等 : 0.3, 高 : 0.02 }).name('📏  细节级别').onChange((val) => {
+//     loadOdrMap(true, false);
+// });
+// gui.add(PARAMS, 'spotlight').name("🔦 开启聚光灯");
+// gui.add(PARAMS, 'fitView').name("⟲ 复位摄像机");
+
+// var gui_view_folder = gui.addFolder('查看');
+// gui_view_folder.add(PARAMS, 'view_mode', { '默认' : 'Default', '轮廓' : 'Outlines' }).name("查看模式").onChange((val) => {
+//     if (val == 'Default') {
+//         road_network_mesh.visible = true;
+//         roadmarks_mesh.visible = PARAMS.roadmarks;
+//     } else if (val == 'Outlines') {
+//         road_network_mesh.visible = false;
+//         roadmarks_mesh.visible = false;
+//     }
+// });
+// gui_view_folder.add(PARAMS, 'ref_line').name("参考线").onChange((val) => {
+//     refline_lines.visible = val;
+// });
+// gui_view_folder.add(PARAMS, 'roadmarks').name("路面标线").onChange((val) => {
+//     roadmarks_mesh.visible = val;
+//     roadmark_outline_lines.visible = val;
+// });
+// gui_view_folder.add(PARAMS, 'wireframe').name("显示线框").onChange((val) => {
+//     road_network_material.wireframe = val;
+// });
+
+// var gui_attributes_folder = gui.addFolder('加载属性');
+// gui_attributes_folder.add(PARAMS, 'lateralProfile').name("横向分布");
+// gui_attributes_folder.add(PARAMS, 'laneHeight').name("车道高度");
+// gui_attributes_folder.add(PARAMS, 'reload_map').name("重新加载地图");

Разница между файлами не показана из-за своего большого размера
+ 12 - 0
public/js/dat.gui.min.js


Разница между файлами не показана из-за своего большого размера
+ 2555 - 0
public/js/libOpenDrive.js


BIN
public/js/libOpenDrive.wasm


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
public/js/notyf.min.js


Разница между файлами не показана из-за своего большого размера
+ 6 - 0
public/js/orbitcontrols.min.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 0
public/js/three.min.js


+ 2784 - 0
public/map/mine3.xodr

@@ -0,0 +1,2784 @@
+<?xml version="1.0" standalone="yes"?>
+<OpenDRIVE>
+    <header revMajor="1" revMinor="4" name="" version="1.00" date="Wed Mar 27 14:06:10 2024" north="0.0000000000000000e+00" south="0.0000000000000000e+00" east="0.0000000000000000e+00" west="0.0000000000000000e+00">
+    </header>
+    <road name="" length="1.0000000000000000e+01" id="7" junction="-1">
+        <link>
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-2.0000000000000000e+01" y="2.0000000000000000e+01" hdg="-1.5707963267998624e+00" length="1.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.1197787143782139e+03" id="131" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="2" />
+            <successor elementType="junction" elementId="5" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.8000000000000000e+02" y="2.0000000000000000e+02" hdg="0.0000000000000000e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="2.0000000000000000e+01" x="2.9999999781449264e+02" y="2.0000000000000000e+02" hdg="-1.2414513861358500e-12" length="7.8539816339744831e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="9.8539816339744831e+01" x="3.4999999781443057e+02" y="1.4999999999993793e+02" hdg="-1.5707963267998650e+00" length="5.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4853981633974485e+02" x="3.4999999781418217e+02" y="1.0000000437151138e+02" hdg="-1.5707963267986234e+00" length="1.5707963267948966e+02">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="3.0561944901923448e+02" x="4.4999999781418217e+02" y="1.0000000437064206e+02" hdg="1.5707963267948948e+00" length="1.5000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="4.5561944901923448e+02" x="4.4999999781492738e+02" y="2.5000000437076622e+02" hdg="1.5707963267936531e+00" length="1.5707963267948966e+02">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="6.1269908169872417e+02" x="5.4999999781492738e+02" y="2.5000000437014523e+02" hdg="-1.5707963268048326e+00" length="1.5000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="7.6269908169872417e+02" x="5.4999999781343695e+02" y="1.0000000874196708e+02" hdg="-1.5707963268035909e+00" length="1.5707963267948966e+02">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="9.1977871437821386e+02" x="6.4999999781343695e+02" y="1.0000000874060109e+02" hdg="1.5707963267849603e+00" length="1.9999999999999997e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9325957145940458e+02" id="132" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="3" />
+            <successor elementType="road" elementId="133" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0100000000000000e+03" y="2.0000000000000000e+02" hdg="3.1415926535897931e+00" length="1.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.0000000000000000e+01" x="9.9999999781436850e+02" y="2.0000000000000000e+02" hdg="3.1415926535885514e+00" length="5.2359877559829883e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="6.2359877559829883e+01" x="9.5669872840232767e+02" y="2.2500000000010752e+02" hdg="2.0943951023944365e+00" length="5.2359877559829883e+01">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="1.1471975511965977e+02" x="9.1339746039858210e+02" y="2.5000000000005377e+02" hdg="3.1415926535897931e+00" length="7.8539816339744831e+01">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9325957145940458e+02" id="133" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="3" />
+            <successor elementType="road" elementId="132" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0100000000000000e+03" y="2.0000000000000000e+02" hdg="3.1415926535897931e+00" length="1.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.0000000000000000e+01" x="1.0000000021855074e+03" y="2.0000000000000000e+02" hdg="-3.1415926535885514e+00" length="5.2359877559829883e+01">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="6.2359877559829883e+01" x="9.5669873277346665e+02" y="1.7500000298012475e+02" hdg="-2.0943951023944365e+00" length="5.2359877559829883e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="1.1471975511965977e+02" x="9.1339746039858221e+02" y="1.5000000298017849e+02" hdg="-3.1415926535897922e+00" length="7.8539816339744831e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.0570796326794898e+03" id="140" junction="-1">
+        <link>
+            <successor elementType="junction" elementId="5" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="3.0000000000000000e+02" y="5.0000000000000000e+01" hdg="3.1415926535897931e+00" length="2.0000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="2.0000000000000000e+02" x="9.9999997814368498e+01" y="5.0000000000000000e+01" hdg="3.1415926535885514e+00" length="7.8539816339744831e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="2.7853981633974485e+02" x="4.9999997814430586e+01" y="1.0000000000006212e+02" hdg="1.5707963267948959e+00" length="2.0000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="4.7853981633974485e+02" x="4.9999997814430728e+01" y="3.0000000000018628e+02" hdg="1.5707963267936544e+00" length="7.8539816339744831e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="5.5707963267948969e+02" x="9.9999997814492858e+01" y="3.5000000000012415e+02" hdg="-9.9342756243459007e-12" length="5.0000000000000000e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9325957145940458e+02" id="141" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="2" />
+            <successor elementType="road" elementId="142" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.6000000000000000e+02" y="2.0000000000000000e+02" hdg="3.1415926535897931e+00" length="1.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.0000000000000000e+01" x="2.4999999781436847e+02" y="2.0000000000000000e+02" hdg="3.1415926535885514e+00" length="5.2359877559829883e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="6.2359877559829883e+01" x="2.0669872840232779e+02" y="2.2500000000010752e+02" hdg="2.0943951023944365e+00" length="5.2359877559829883e+01">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="1.1471975511965977e+02" x="1.6339746039858215e+02" y="2.5000000000005377e+02" hdg="3.1415926535897931e+00" length="7.8539816339744831e+01">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9325957145940458e+02" id="142" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="2" />
+            <successor elementType="road" elementId="141" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.6000000000000000e+02" y="2.0000000000000000e+02" hdg="3.1415926535897931e+00" length="1.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.0000000000000000e+01" x="2.5000000218550736e+02" y="2.0000000000000000e+02" hdg="-3.1415926535885514e+00" length="5.2359877559829883e+01">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="6.2359877559829883e+01" x="2.0669873277346665e+02" y="1.7500000298012475e+02" hdg="-2.0943951023944365e+00" length="5.2359877559829883e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="1.1471975511965977e+02" x="1.6339746039858224e+02" y="1.5000000298017849e+02" hdg="-3.1415926535897922e+00" length="7.8539816339744831e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9325957145940458e+02" id="151" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="1" />
+            <successor elementType="road" elementId="152" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0400000000000000e+03" y="5.5000000000000000e+02" hdg="0.0000000000000000e+00" length="1.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.0000000000000000e+01" x="1.0500000021856315e+03" y="5.5000000000000000e+02" hdg="1.2414513861358500e-12" length="5.2359877559829883e+01">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="6.2359877559829883e+01" x="1.0933012715976722e+03" y="5.7500000000010755e+02" hdg="1.0471975511965976e+00" length="1.3089969389957471e+02">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9325957145940458e+02" id="152" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="1" />
+            <successor elementType="road" elementId="151" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0400000000000000e+03" y="5.5000000000000000e+02" hdg="0.0000000000000000e+00" length="1.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.0000000000000000e+01" x="1.0499999978144926e+03" y="5.5000000000000000e+02" hdg="-1.2414513861358500e-12" length="5.2359877559829883e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="6.2359877559829883e+01" x="1.0933012672264092e+03" y="5.2499999850999131e+02" hdg="-1.0471975512015632e+00" length="1.3089969389957471e+02">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.0841593462708120e+03" id="159" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="1" />
+            <successor elementType="junction" elementId="6" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0200000000000000e+03" y="5.5000000000000000e+02" hdg="3.1415926535897931e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="2.0000000000000000e+01" x="1.0000000000000000e+03" y="5.5000000000000000e+02" hdg="3.1415926535897931e+00" length="1.5000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="1.7000000000000000e+02" x="8.5000000218550849e+02" y="5.5000000000000000e+02" hdg="-3.1415926535885514e+00" length="1.5707971359132225e+02">
+                <arc curvature="1.9999989697990817e-02"/>
+            </geometry>
+            <geometry s="3.2707971359132227e+02" x="8.5000000218563264e+02" y="4.4999994848992753e+02" hdg="4.9681148084346208e-12" length="3.0000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="6.2707971359132227e+02" x="1.1499999999998770e+03" y="4.4999994849141797e+02" hdg="3.7265746044568004e-12" length="1.5707963267948966e+02">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="7.8415934627081197e+02" x="1.1500000000002494e+03" y="3.4999994849141797e+02" hdg="3.1415926535897931e+00" length="3.0000000000000000e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.0000000000000000e+01" id="162" junction="1">
+        <link>
+            <predecessor elementType="road" elementId="151" contactPoint="start" />
+            <successor elementType="road" elementId="159" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0400000000000000e+03" y="5.5000000000000000e+02" hdg="3.1415926535897931e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.0000000000000000e+01" id="165" junction="1">
+        <link>
+            <predecessor elementType="road" elementId="159" contactPoint="start" />
+            <successor elementType="road" elementId="152" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0200000000000000e+03" y="5.5000000000000000e+02" hdg="0.0000000000000000e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.0556194490192347e+03" id="166" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="4" />
+            <successor elementType="junction" elementId="5" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.7000000000000000e+02" y="5.0000000000000000e+02" hdg="3.1415926535897931e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="2.0000000000000000e+01" x="2.5000000000000000e+02" y="5.0000000000000000e+02" hdg="3.1415926535897931e+00" length="1.5000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="1.7000000000000000e+02" x="9.9999997814368498e+01" y="5.0000000000000000e+02" hdg="3.1415926535885514e+00" length="1.5707963267948966e+02">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="3.2707963267948969e+02" x="9.9999997814492716e+01" y="6.0000000000000000e+02" hdg="-9.9342756243459007e-12" length="5.0000000000000006e+02">
+                <line/>
+            </geometry>
+            <geometry s="8.2707963267948981e+02" x="5.9999999841129568e+02" y="5.9999999999751594e+02" hdg="-1.1175060876666976e-11" length="7.8539816339744831e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="9.0561944901923459e+02" x="6.4999999841073691e+02" y="5.4999999999695717e+02" hdg="-1.5707963268097984e+00" length="1.5000000000000000e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9325957145940458e+02" id="167" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="4" />
+            <successor elementType="road" elementId="168" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.9000000000000000e+02" y="5.0000000000000000e+02" hdg="0.0000000000000000e+00" length="1.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.0000000000000000e+01" x="3.0000000218563150e+02" y="5.0000000000000000e+02" hdg="1.2414513861358500e-12" length="5.2359877559829883e+01">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="6.2359877559829883e+01" x="3.4330127159767221e+02" y="5.2500000000010755e+02" hdg="1.0471975511965976e+00" length="1.3089969389957471e+02">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9325957145940458e+02" id="168" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="4" />
+            <successor elementType="road" elementId="167" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.9000000000000000e+02" y="5.0000000000000000e+02" hdg="0.0000000000000000e+00" length="1.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.0000000000000000e+01" x="2.9999999781449264e+02" y="5.0000000000000000e+02" hdg="-1.2414513861358500e-12" length="5.2359877559829883e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="6.2359877559829883e+01" x="3.4330126722640921e+02" y="4.7499999850999137e+02" hdg="-1.0471975512015632e+00" length="1.3089969389957471e+02">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.0000000000000000e+01" id="171" junction="4">
+        <link>
+            <predecessor elementType="road" elementId="166" contactPoint="start" />
+            <successor elementType="road" elementId="168" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.7000000000000000e+02" y="5.0000000000000000e+02" hdg="0.0000000000000000e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.0000000000000000e+01" id="174" junction="4">
+        <link>
+            <predecessor elementType="road" elementId="167" contactPoint="start" />
+            <successor elementType="road" elementId="166" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.9000000000000000e+02" y="5.0000000000000000e+02" hdg="3.1415926535897931e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="5.0000000000000000e+01" id="175" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="5" />
+            <successor elementType="junction" elementId="6" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="7.0000000000000000e+02" y="3.5000000000000000e+02" hdg="0.0000000000000000e+00" length="5.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092354309025481e+01" id="178" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="131" contactPoint="end" />
+            <successor elementType="road" elementId="175" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="6.4999999781542419e+02" y="3.0000000874060106e+02" hdg="1.5707963267948966e+00" length="1.4593745713159024e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593745713159024e+01" x="6.4999999781542419e+02" y="3.1459375445376008e+02" hdg="1.5707963267948966e+00" length="1.9634950652510192e+01">
+                <spiral curvStart="-0.0000000000000000e+00" curvEnd="-4.0000006992482080e-02"/>
+            </geometry>
+            <geometry s="3.4228696365669215e+01" x="6.5254203406506997e+02" y="3.3392806361188894e+02" hdg="1.1780972450974139e+00" length="1.9634950652510184e+01">
+                <arc curvature="-4.0000006992482080e-02"/>
+            </geometry>
+            <geometry s="5.3863647018179400e+01" x="6.6607193420353531e+02" y="3.4745796375035422e+02" hdg="3.9269908169996537e-01" length="1.9634950652510192e+01">
+                 <spiral curvStart="-4.0000006992482080e-02" curvEnd="-0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498597670689591e+01" x="6.8540624336166411e+02" y="3.5000000000000000e+02" hdg="0.0000000000000000e+00" length="1.4593756638335890e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="9.9999991256356111e+01" id="181" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="131" contactPoint="end" />
+            <successor elementType="road" elementId="166" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="6.4999999781542419e+02" y="3.0000000874060106e+02" hdg="1.5707963208566733e+00" length="9.9999991256356111e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092352123361451e+01" id="184" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="131" contactPoint="end" />
+            <successor elementType="road" elementId="140" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="6.4999999781542419e+02" y="3.0000000874060106e+02" hdg="1.5707963267948966e+00" length="1.4593745712297277e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593745712297277e+01" x="6.4999999781542419e+02" y="3.1459375445289834e+02" hdg="1.5707963267948966e+00" length="1.9634950651459260e+01">
+                <spiral curvStart="0.0000000000000000e+00" curvEnd="4.0000006994369987e-02"/>
+            </geometry>
+            <geometry s="3.4228696363756541e+01" x="6.4745796156593019e+02" y="3.3392806360999617e+02" hdg="1.9634954084898952e+00" length="1.9634950651459267e+01">
+                <arc curvature="4.0000006994369987e-02"/>
+            </geometry>
+            <geometry s="5.3863647015215804e+01" x="6.3392806142825191e+02" y="3.4745796374780900e+02" hdg="2.7488935718823755e+00" length="1.9634950651459260e+01">
+                 <spiral curvStart="4.0000006994369987e-02" curvEnd="0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498597666675067e+01" x="6.1459375227117926e+02" y="3.4999999999749508e+02" hdg="3.1415926535798571e+00" length="1.4593754456686383e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092352123701517e+01" id="187" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="140" contactPoint="end" />
+            <successor elementType="road" elementId="131" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="5.9999999781449287e+02" y="3.4999999999764009e+02" hdg="-1.4901857525728701e-11" length="1.4593754457211162e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593754457211162e+01" x="6.1459375227170403e+02" y="3.4999999999749508e+02" hdg="-1.4901857525728701e-11" length="1.9634950651388365e+01">
+                <spiral curvStart="-0.0000000000000000e+00" curvEnd="-4.0000006994767440e-02"/>
+            </geometry>
+            <geometry s="3.4228705108599527e+01" x="6.3392806142870290e+02" y="3.4745796374780241e+02" hdg="-3.9269908171238477e-01" length="1.9634950651388372e+01">
+                <arc curvature="-4.0000006994767440e-02"/>
+            </geometry>
+            <geometry s="5.3863655759987900e+01" x="6.4745796156626079e+02" y="3.3392806360997565e+02" hdg="-1.1780972451098330e+00" length="1.9634950651388365e+01">
+                 <spiral curvStart="-4.0000006994767440e-02" curvEnd="-0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498606411376272e+01" x="6.4999999781556915e+02" y="3.1459375445292631e+02" hdg="-1.5707963268097949e+00" length="1.4593745712325244e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.0000000218550713e+02" id="190" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="140" contactPoint="end" />
+            <successor elementType="road" elementId="175" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="5.9999999781449287e+02" y="3.4999999999764009e+02" hdg="2.3599113258492752e-11" length="1.0000000218550713e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092359377591166e+01" id="193" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="140" contactPoint="end" />
+            <successor elementType="road" elementId="166" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="5.9999999781449287e+02" y="3.4999999999764009e+02" hdg="-1.4901857525728701e-11" length="1.4593748858545382e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593748858545382e+01" x="6.1459374667303825e+02" y="3.4999999999749508e+02" hdg="-1.4901857525728701e-11" length="1.9634954084898489e+01">
+                <spiral curvStart="0.0000000000000000e+00" curvEnd="3.9999999999950617e-02"/>
+            </geometry>
+            <geometry s="3.4228702943443871e+01" x="6.3392805921103991e+02" y="3.5254203669121858e+02" hdg="3.9269908168134116e-01" length="1.9634954084898482e+01">
+                <arc curvature="3.9999999999950617e-02"/>
+            </geometry>
+            <geometry s="5.3863657028342352e+01" x="6.4745796171490622e+02" y="3.6607193919461457e+02" hdg="1.1780972450763114e+00" length="1.9634954084898489e+01">
+                 <spiral curvStart="3.9999999999950617e-02" curvEnd="0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498611113240841e+01" x="6.4999999840902910e+02" y="3.8540625173260685e+02" hdg="1.5707963267800020e+00" length="1.4593748264350324e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092359377906490e+01" id="196" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="166" contactPoint="end" />
+            <successor elementType="road" elementId="140" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="6.4999999840924647e+02" y="3.9999999999695717e+02" hdg="-1.5707963267998624e+00" length="1.4593748264294959e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593748264294959e+01" x="6.4999999840924647e+02" y="3.8540625173266221e+02" hdg="-1.5707963267998624e+00" length="1.9634954084792287e+01">
+                <spiral curvStart="-0.0000000000000000e+00" curvEnd="-4.0000000000546342e-02"/>
+            </geometry>
+            <geometry s="3.4228702349087243e+01" x="6.4745796171524876e+02" y="3.6607193919486593e+02" hdg="-1.9634954084998304e+00" length="1.9634954084792295e+01">
+                <arc curvature="-4.0000000000546342e-02"/>
+            </geometry>
+            <geometry s="5.3863656433879541e+01" x="6.3392805921160641e+02" y="3.5254203669132454e+02" hdg="-2.7488935719022494e+00" length="1.9634954084792287e+01">
+                 <spiral curvStart="-4.0000000000546342e-02" curvEnd="-0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498610518671825e+01" x="6.1459374667372754e+02" y="3.4999999999749508e+02" hdg="3.1415926535798571e+00" length="1.4593748859234665e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="9.9999991256356111e+01" id="199" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="166" contactPoint="end" />
+            <successor elementType="road" elementId="131" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="6.4999999840924647e+02" y="3.9999999999695717e+02" hdg="-1.5707963327380856e+00" length="9.9999991256356111e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092360371945560e+01" id="202" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="166" contactPoint="end" />
+            <successor elementType="road" elementId="175" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="6.4999999840924647e+02" y="3.9999999999695717e+02" hdg="-1.5707963267998624e+00" length="1.4593748263555767e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593748263555767e+01" x="6.4999999840924647e+02" y="3.8540625173340140e+02" hdg="-1.5707963267948966e+00" length="1.9634954083679226e+01">
+                <spiral curvStart="0.0000000000000000e+00" curvEnd="4.0000000002434248e-02"/>
+            </geometry>
+            <geometry s="3.4228702347234993e+01" x="6.5254203510310026e+02" y="3.6607193919663814e+02" hdg="-1.1780972450986553e+00" length="1.9634954083679219e+01">
+                <arc curvature="4.0000000002434248e-02"/>
+            </geometry>
+            <geometry s="5.3863656430914212e+01" x="6.6607193760585767e+02" y="3.5254203669381354e+02" hdg="-3.9269908170368950e-01" length="1.9634954083679226e+01">
+                 <spiral curvStart="4.0000000002434248e-02" curvEnd="0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498610514593437e+01" x="6.8540625014264788e+02" y="3.5000000000000000e+02" hdg="0.0000000000000000e+00" length="1.4593749857352122e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092360372261595e+01" id="205" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="175" contactPoint="start" />
+            <successor elementType="road" elementId="166" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="7.0000000000000000e+02" y="3.5000000000000000e+02" hdg="3.1415926535897931e+00" length="1.4593749858041861e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593749858041861e+01" x="6.8540625014195814e+02" y="3.5000000000000000e+02" hdg="3.1415926535848273e+00" length="1.9634954083572961e+01">
+                <spiral curvStart="-0.0000000000000000e+00" curvEnd="-4.0000000003029973e-02"/>
+            </geometry>
+            <geometry s="3.4228703941614825e+01" x="6.6607193760531777e+02" y="3.5254203669395957e+02" hdg="2.7488935718848628e+00" length="1.9634954083572968e+01">
+                <arc curvature="-4.0000000003029973e-02"/>
+            </geometry>
+            <geometry s="5.3863658025187789e+01" x="6.5254203510274101e+02" y="3.6607193919680498e+02" hdg="1.9634954084824510e+00" length="1.9634954083572961e+01">
+                 <spiral curvStart="-4.0000000003029973e-02" curvEnd="-0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498612108760753e+01" x="6.4999999840902910e+02" y="3.8540625173345632e+02" hdg="1.5707963267800020e+00" length="1.4593748263500856e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.0000000218550713e+02" id="208" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="175" contactPoint="start" />
+            <successor elementType="road" elementId="140" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="7.0000000000000000e+02" y="3.5000000000000000e+02" hdg="-3.1415926535711600e+00" length="1.0000000218550713e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092354308685671e+01" id="211" junction="5">
+        <link>
+            <predecessor elementType="road" elementId="175" contactPoint="start" />
+            <successor elementType="road" elementId="131" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="7.0000000000000000e+02" y="3.5000000000000000e+02" hdg="3.1415926535897931e+00" length="1.4593756637811225e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593756637811225e+01" x="6.8540624336218877e+02" y="3.5000000000000000e+02" hdg="3.1415926535897931e+00" length="1.9634950652581090e+01">
+                <spiral curvStart="0.0000000000000000e+00" curvEnd="4.0000006992084627e-02"/>
+            </geometry>
+            <geometry s="3.4228707290392315e+01" x="6.6607193420398630e+02" y="3.4745796375036076e+02" hdg="-2.7488935718947944e+00" length="1.9634950652581097e+01">
+                <arc curvature="4.0000006992084627e-02"/>
+            </geometry>
+            <geometry s="5.3863657942973411e+01" x="6.5254203406540046e+02" y="3.3392806361190935e+02" hdg="-1.9634954085023146e+00" length="1.9634950652581090e+01">
+                 <spiral curvStart="4.0000006992084627e-02" curvEnd="0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498608595554501e+01" x="6.4999999781556915e+02" y="3.1459375445373223e+02" hdg="-1.5707963268097949e+00" length="1.4593745713131170e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.0000000000026270e+02" id="220" junction="6">
+        <link>
+            <predecessor elementType="road" elementId="159" contactPoint="end" />
+            <successor elementType="road" elementId="175" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="8.5000000000024943e+02" y="3.4999994849141802e+02" hdg="3.1415921385039733e+00" length="1.0000000000026270e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.0000000000026270e+02" id="229" junction="6">
+        <link>
+            <predecessor elementType="road" elementId="175" contactPoint="end" />
+            <successor elementType="road" elementId="159" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="7.5000000000000000e+02" y="3.5000000000000000e+02" hdg="-5.1509078513589657e-07" length="1.0000000000026270e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.0000000000000000e+01" id="233" junction="2">
+        <link>
+            <predecessor elementType="road" elementId="131" contactPoint="start" />
+            <successor elementType="road" elementId="141" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.8000000000000000e+02" y="2.0000000000000000e+02" hdg="3.1415926535897931e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.0000000000000000e+01" id="236" junction="2">
+        <link>
+            <predecessor elementType="road" elementId="142" contactPoint="start" />
+            <successor elementType="road" elementId="131" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="2.6000000000000000e+02" y="2.0000000000000000e+02" hdg="0.0000000000000000e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.0000000000000000e+01" id="238" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="3" />
+            <successor elementType="road" elementId="239" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0300000000000000e+03" y="2.0000000000000000e+02" hdg="0.0000000000000000e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.3561944901923448e+02" id="239" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="238" contactPoint="end" />
+            <successor elementType="road" elementId="240" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0500000021856315e+03" y="2.0000000000000000e+02" hdg="1.2414513861358500e-12" length="7.8539816339744831e+01">
+                <arc curvature="2.0000000000000000e-02"/>
+            </geometry>
+            <geometry s="7.8539816339744831e+01" x="1.1000000021855694e+03" y="2.5000000000018625e+02" hdg="1.5707963267948963e+00" length="1.5707963267948966e+02">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.5000000000000000e+02" id="240" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="239" contactPoint="end" />
+            <successor elementType="road" elementId="241" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.2000000021855694e+03" y="2.5000000000006210e+02" hdg="-1.5707963268048193e+00" length="1.5000000000000000e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="7.8539816339744831e+01" id="241" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="240" contactPoint="end" />
+            <successor elementType="road" elementId="242" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.2000000021848259e+03" y="9.9999995628365042e+01" hdg="-1.5707963268048193e+00" length="7.8539816339744831e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="3.0000000000000000e+02" id="242" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="241" contactPoint="end" />
+            <successor elementType="road" elementId="243" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.1500000021842677e+03" y="4.9999995628923273e+01" hdg="3.1415926535798699e+00" length="3.0000000000000000e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="7.8539816339744831e+01" id="243" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="242" contactPoint="end" />
+            <successor elementType="road" elementId="244" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="8.4999999999814008e+02" y="4.9999995631900262e+01" hdg="3.1415926535798704e+00" length="7.8539816339744831e+01">
+                <arc curvature="-2.0000000000000000e-02"/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9999999999999997e+02" id="244" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="243" contactPoint="end" />
+            <successor elementType="junction" elementId="6" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="7.9999999999869829e+02" y="9.9999995632458450e+01" hdg="1.5707963267849718e+00" length="1.9999999999999997e+02">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="none" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.3000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.0000000000000000e+01" id="247" junction="3">
+        <link>
+            <predecessor elementType="road" elementId="133" contactPoint="start" />
+            <successor elementType="road" elementId="238" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0100000000000000e+03" y="2.0000000000000000e+02" hdg="0.0000000000000000e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="2.0000000000000000e+01" id="250" junction="3">
+        <link>
+            <predecessor elementType="road" elementId="238" contactPoint="start" />
+            <successor elementType="road" elementId="132" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="1.0300000000000000e+03" y="2.0000000000000000e+02" hdg="3.1415926535897931e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092322868749676e+01" id="253" junction="6">
+        <link>
+            <predecessor elementType="road" elementId="244" contactPoint="end" />
+            <successor elementType="road" elementId="159" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="8.0000000000068326e+02" y="2.9999999563245842e+02" hdg="1.5707963267948966e+00" length="1.4593734505032160e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593734505032160e+01" x="8.0000000000068326e+02" y="3.1459373013749058e+02" hdg="1.5707963267948966e+00" length="1.9634935572692928e+01">
+                <spiral curvStart="-0.0000000000000000e+00" curvEnd="-4.0000037712867885e-02"/>
+            </geometry>
+            <geometry s="3.4228670077725084e+01" x="8.0254203429799873e+02" y="3.3392802444664017e+02" hdg="1.1780972450974141e+00" length="1.9634935572692921e+01">
+                <arc curvature="-4.0000037712867885e-02"/>
+            </geometry>
+            <geometry s="5.3863605650418009e+01" x="8.1607192404540376e+02" y="3.4745791419407880e+02" hdg="3.9269908169996537e-01" length="1.9634935572692928e+01">
+                 <spiral curvStart="-4.0000037712867885e-02" curvEnd="-0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498541223110934e+01" x="8.3540621835461070e+02" y="3.4999994849141802e+02" hdg="0.0000000000000000e+00" length="1.4593781645638728e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092363151514093e+01" id="256" junction="6">
+        <link>
+            <predecessor elementType="road" elementId="244" contactPoint="end" />
+            <successor elementType="road" elementId="175" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="8.0000000000068326e+02" y="2.9999999563245842e+02" hdg="1.5707963267948966e+00" length="1.4593752631379459e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593752631379459e+01" x="8.0000000000068326e+02" y="3.1459374826383788e+02" hdg="1.5707963267948966e+00" length="1.9634954085204516e+01">
+                <spiral curvStart="0.0000000000000000e+00" curvEnd="3.9999999999453403e-02"/>
+            </geometry>
+            <geometry s="3.4228706716583972e+01" x="7.9745796330664791e+02" y="3.3392806080204383e+02" hdg="1.9634954084923790e+00" length="1.9634954085204509e+01">
+                <arc curvature="3.9999999999453403e-02"/>
+            </geometry>
+            <geometry s="5.3863660801788484e+01" x="7.8392806080278433e+02" y="3.4745796330594095e+02" hdg="2.7488935718898277e+00" length="1.9634954085204516e+01">
+                 <spiral curvStart="3.9999999999453403e-02" curvEnd="0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498614886992996e+01" x="7.6459374826452108e+02" y="3.5000000000000000e+02" hdg="3.1415926535897931e+00" length="1.4593748264521082e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092322868410662e+01" id="259" junction="6">
+        <link>
+            <predecessor elementType="road" elementId="159" contactPoint="end" />
+            <successor elementType="road" elementId="244" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="8.5000000000024943e+02" y="3.4999994849141802e+02" hdg="3.1415926535897931e+00" length="1.4593781645115314e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593781645115314e+01" x="8.3540621835513411e+02" y="3.4999994849141802e+02" hdg="3.1415926535897931e+00" length="1.9634935572763663e+01">
+                <spiral curvStart="0.0000000000000000e+00" curvEnd="4.0000037712471341e-02"/>
+            </geometry>
+            <geometry s="3.4228717217878980e+01" x="8.1607192404585373e+02" y="3.4745791419408533e+02" hdg="-2.7488935718947887e+00" length="1.9634935572763670e+01">
+                <arc curvature="4.0000037712471341e-02"/>
+            </geometry>
+            <geometry s="5.3863652790642647e+01" x="8.0254203429835229e+02" y="3.3392802444671787e+02" hdg="-1.9634954085022969e+00" length="1.9634935572763663e+01">
+                 <spiral curvStart="4.0000037712471341e-02" curvEnd="0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498588363406313e+01" x="8.0000000000082798e+02" y="3.1459373013746279e+02" hdg="-1.5707963268097789e+00" length="1.4593734505004363e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="8.8092363151735057e+01" id="262" junction="6">
+        <link>
+            <predecessor elementType="road" elementId="175" contactPoint="end" />
+            <successor elementType="road" elementId="244" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="7.5000000000000000e+02" y="3.5000000000000000e+02" hdg="0.0000000000000000e+00" length="1.4593748264693545e+01">
+                <line/>
+            </geometry>
+            <geometry s="1.4593748264693545e+01" x="7.6459374826469355e+02" y="3.5000000000000000e+02" hdg="0.0000000000000000e+00" length="1.9634954085328442e+01">
+                <spiral curvStart="-0.0000000000000000e+00" curvEnd="-3.9999999999453403e-02"/>
+            </geometry>
+            <geometry s="3.4228702350021990e+01" x="7.8392806080307514e+02" y="3.4745796330590917e+02" hdg="-3.9269908169996182e-01" length="1.9634954085328435e+01">
+                <arc curvature="-3.9999999999453403e-02"/>
+            </geometry>
+            <geometry s="5.3863656435350421e+01" x="7.9745796330692883e+02" y="3.3392806080192133e+02" hdg="-1.1780972451023661e+00" length="1.9634954085328442e+01">
+                 <spiral curvStart="-3.9999999999453403e-02" curvEnd="-0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="7.3498610520678866e+01" x="8.0000000000082798e+02" y="3.1459374826351461e+02" hdg="-1.5707963268097789e+00" length="1.4593752631056191e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.5000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="shoulder" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="5.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <junction name="" id="1">
+        <connection id="0" incomingRoad="151" connectingRoad="162" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+        </connection>
+        <connection id="1" incomingRoad="159" connectingRoad="165" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+        </connection>
+    </junction>
+    <junction name="" id="4">
+        <connection id="0" incomingRoad="166" connectingRoad="171" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+        </connection>
+        <connection id="1" incomingRoad="167" connectingRoad="174" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+        </connection>
+    </junction>
+    <junction name="" id="5">
+        <connection id="0" incomingRoad="131" connectingRoad="178" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+            <laneLink from="-2" to="-2"/>
+        </connection>
+        <connection id="1" incomingRoad="131" connectingRoad="181" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+        </connection>
+        <connection id="2" incomingRoad="131" connectingRoad="184" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+        </connection>
+        <connection id="3" incomingRoad="140" connectingRoad="187" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+            <laneLink from="-2" to="-2"/>
+        </connection>
+        <connection id="4" incomingRoad="140" connectingRoad="190" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+        </connection>
+        <connection id="5" incomingRoad="140" connectingRoad="193" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+        </connection>
+        <connection id="6" incomingRoad="166" connectingRoad="196" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+            <laneLink from="-2" to="-2"/>
+        </connection>
+        <connection id="7" incomingRoad="166" connectingRoad="199" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+        </connection>
+        <connection id="8" incomingRoad="166" connectingRoad="202" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+        </connection>
+        <connection id="9" incomingRoad="175" connectingRoad="205" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+            <laneLink from="2" to="-2"/>
+        </connection>
+        <connection id="10" incomingRoad="175" connectingRoad="208" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+        </connection>
+        <connection id="11" incomingRoad="175" connectingRoad="211" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+        </connection>
+    </junction>
+    <junction name="" id="6">
+        <connection id="0" incomingRoad="244" connectingRoad="253" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+            <laneLink from="-2" to="-2"/>
+        </connection>
+        <connection id="1" incomingRoad="244" connectingRoad="256" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+        </connection>
+        <connection id="2" incomingRoad="159" connectingRoad="220" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+            <laneLink from="-2" to="-2"/>
+        </connection>
+        <connection id="3" incomingRoad="159" connectingRoad="259" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+        </connection>
+        <connection id="4" incomingRoad="175" connectingRoad="262" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+            <laneLink from="-2" to="-2"/>
+        </connection>
+        <connection id="5" incomingRoad="175" connectingRoad="229" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+        </connection>
+    </junction>
+    <junction name="" id="2">
+        <connection id="0" incomingRoad="131" connectingRoad="233" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+            <laneLink from="2" to="-2"/>
+        </connection>
+        <connection id="1" incomingRoad="142" connectingRoad="236" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+            <laneLink from="2" to="-2"/>
+        </connection>
+    </junction>
+    <junction name="" id="3">
+        <connection id="0" incomingRoad="133" connectingRoad="247" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+            <laneLink from="2" to="-2"/>
+        </connection>
+        <connection id="1" incomingRoad="238" connectingRoad="250" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+            <laneLink from="2" to="-2"/>
+        </connection>
+    </junction>
+</OpenDRIVE>

+ 898 - 0
public/map/mine4.xodr

@@ -0,0 +1,898 @@
+<?xml version="1.0" standalone="yes"?>
+<OpenDRIVE>
+    <header revMajor="1" revMinor="4" name="" version="1.00" date="Sun Feb  4 17:46:03 2024" north="0.0000000000000000e+00" south="0.0000000000000000e+00" east="0.0000000000000000e+00" west="0.0000000000000000e+00">
+    </header>
+    <road name="" length="1.3054250000000002e+03" id="1" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="1" />
+            <successor elementType="road" elementId="3" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.5000000000000000e+02" y="0.0000000000000000e+00" hdg="0.0000000000000000e+00" length="3.1000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="3.1000000000000000e+02" x="1.5999999934454104e+02" y="0.0000000000000000e+00" hdg="-1.2414513861358500e-12" length="4.7109999999999999e+01">
+                <arc curvature="-6.6686322513050164e-02"/>
+            </geometry>
+            <geometry s="3.5711000000000001e+02" x="1.5999999934450381e+02" y="-2.9991157476236758e+01" hdg="3.1415926535848264e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="3.7711000000000001e+02" x="1.4000000000003726e+02" y="-2.9991157476137420e+01" hdg="3.1415926535860681e+00" length="4.7109999999999999e+01">
+                <arc curvature="6.6686322513050164e-02"/>
+            </geometry>
+            <geometry s="4.2422000000000003e+02" x="1.3999999999992554e+02" y="-5.9982314952374182e+01" hdg="0.0000000000000000e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="4.4422000000000003e+02" x="1.5999999344477953e+02" y="-5.9982314952374196e+01" hdg="-1.2414513861358500e-12" length="2.3557000000000002e+02">
+                <arc curvature="-6.6680660813978705e-03"/>
+            </geometry>
+            <geometry s="6.7979000000000008e+02" x="3.0996851322122450e+02" y="-2.0995083472919160e+02" hdg="-1.5707963267998650e+00" length="2.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="6.9979000000000008e+02" x="3.0996851322112514e+02" y="-2.2995083560308785e+02" hdg="-1.5707963268011058e+00" length="1.5699999999999999e+01">
+                <arc curvature="-1.0005072145190425e-01"/>
+            </geometry>
+            <geometry s="7.1549000000000012e+02" x="2.9997358279484234e+02" y="-2.3994576602914719e+02" hdg="3.1415926535848198e+00" length="4.0000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="1.1154900000000002e+03" x="-1.0002642026516023e+02" y="-2.3994576602517148e+02" hdg="3.1415926535835785e+00" length="1.0993500000000002e+02">
+                <arc curvature="-1.4288409758447231e-02"/>
+            </geometry>
+            <geometry s="1.2254250000000002e+03" x="-1.7001321493960779e+02" y="-1.6995897134915899e+02" hdg="1.5707963267849576e+00" length="7.9999999999999972e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="2.0506205094709340e+01" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="2.0000000000000000e-03" d="0.0000000000000000e+00"/>
+            <elevation s="6.9493794905290656e+01" a="4.7995679108995404e+00" b="1.9595035924232529e-01" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="8.5665212279555845e+01" a="7.9683629548443848e+00" b="1.9595035924232529e-01" c="-2.3809523809523812e-03" d="0.0000000000000000e+00"/>
+            <elevation s="1.2681478772044414e+02" a="1.2000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="1.4566521227955585e+02" a="1.2000000000000000e+01" b="0.0000000000000000e+00" c="-2.3809523809523812e-03" d="0.0000000000000000e+00"/>
+            <elevation s="1.8681478772044417e+02" a="7.9683629548443813e+00" b="-1.9595035924232534e-01" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="2.0298620509470933e+02" a="4.7995679108995413e+00" b="-1.9595035924232534e-01" c="2.0000000000000000e-03" d="0.0000000000000000e+00"/>
+            <elevation s="2.5197379490529065e+02" a="-2.6645352591003757e-15" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="3.0000000000000000e+02" a="-2.6645352591003757e-15" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="7.3692767405063296e+02" a="-2.6645352591003757e-15" b="0.0000000000000000e+00" c="2.0000000000000000e-03" d="0.0000000000000000e+00"/>
+            <elevation s="7.7401232594936710e+02" a="2.7505428129005685e+00" b="1.4833860759493686e-01" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="7.9045444620253159e+02" a="5.1895440371634995e+00" b="1.4833860759493686e-01" c="-2.3809523809523812e-03" d="0.0000000000000000e+00"/>
+            <elevation s="8.2160555379746836e+02" a="7.4999999999999893e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="8.5045444620253159e+02" a="7.4999999999999893e+00" b="0.0000000000000000e+00" c="-2.3809523809523812e-03" d="0.0000000000000000e+00"/>
+            <elevation s="8.8160555379746836e+02" a="5.1895440371634951e+00" b="-1.4833860759493653e-01" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="8.9804767405063296e+02" a="2.7505428129005525e+00" b="-1.4833860759493653e-01" c="2.0000000000000000e-03" d="0.0000000000000000e+00"/>
+            <elevation s="9.3513232594936710e+02" a="-1.7763568394002505e-14" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="3" type="border" level="false">
+                        <link>
+                            <successor id="3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.1000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="2" type="border" level="false">
+                        <link>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <successor id="-3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+            <object type="tree" name="VegTree03b.flt" id="0" s="6.8534812500000015e+00" t="1.1635900022198609e+01" zOffset="-9.9350000000000005e-01" validLength="0.0000000000000000e+00" orientation="none" length="6.5800000000000001e+00" width="6.5289999999999999e+00" height="1.1785000000000000e+01" hdg="3.1415926535897931e+00" pitch="0.0000000000000000e+00" roll="0.0000000000000000e+00">
+                <repeat s="6.8534812500000015e+00" length="1.2992038000000002e+03" distance="2.0000000000000000e+01" tStart="1.1635900022198609e+01" tEnd="1.1635900022198609e+01" widthStart="6.5289999999999999e+00" widthEnd="6.5289999999999999e+00" heightStart="1.1785000000000000e+01" heightEnd="1.1785000000000000e+01" zOffsetStart="-9.9350000000000005e-01" zOffsetEnd="-9.9350000000000005e-01" />
+            </object>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="5.0000000000000000e+01" id="2" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="3" contactPoint="end" />
+            <successor elementType="junction" elementId="1" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.7000000000000000e+02" y="-7.0000000000000000e+01" hdg="1.5707963267948966e+00" length="5.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="3" type="border" level="false">
+                        <link>
+                            <predecessor id="3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.1000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="2" type="border" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <predecessor id="-3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+            <object type="tree" name="VegTree03c.flt" id="1" s="6.8812499999999837e+00" t="9.1320001676795926e+00" zOffset="-1.0265000000000004e+00" validLength="0.0000000000000000e+00" orientation="none" length="7.3280000000000003e+00" width="7.2709999999999999e+00" height="1.5663000000000000e+01" hdg="3.1415926535897931e+00" pitch="0.0000000000000000e+00" roll="0.0000000000000000e+00">
+                <repeat s="6.8812499999999837e+00" length="4.3437500000000000e+01" distance="2.0000000000000000e+01" tStart="9.1320001676795926e+00" tEnd="9.1320001676795926e+00" widthStart="7.2709999999999999e+00" widthEnd="7.2709999999999999e+00" heightStart="1.5663000000000000e+01" heightEnd="1.5663000000000000e+01" zOffsetStart="-1.0265000000000004e+00" zOffsetEnd="-1.0265000000000004e+00" />
+            </object>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9958975723998392e+01" id="3" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="1" contactPoint="end" />
+            <successor elementType="road" elementId="2" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.7001321493881267e+02" y="-8.9958971349158986e+01" hdg="1.5701342216868519e+00" length="1.9958975723998392e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="3" type="border" level="false">
+                        <link>
+                            <predecessor id="3"/>
+                            <successor id="3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.1000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="2" type="border" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <predecessor id="-3"/>
+                            <successor id="-3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+            <object type="tree" name="VegTree03b.flt" id="2" s="3.7273387164567020e+00" t="1.0946191104230174e+01" zOffset="-9.9350000000000005e-01" validLength="0.0000000000000000e+00" orientation="none" length="6.5800000000000001e+00" width="6.5289999999999999e+00" height="1.1785000000000000e+01" hdg="3.1415926535897931e+00" pitch="0.0000000000000000e+00" roll="0.0000000000000000e+00">
+            </object>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="3.5236943513380737e+01" id="6" junction="1">
+        <link>
+            <predecessor elementType="road" elementId="1" contactPoint="start" />
+            <successor elementType="road" elementId="2" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.5000000000000000e+02" y="0.0000000000000000e+00" hdg="3.1415926535897931e+00" length="5.8374993057286417e+00">
+                <line/>
+            </geometry>
+            <geometry s="5.8374993057286417e+00" x="-1.5583749930572864e+02" y="1.0369481816725298e-15" hdg="3.1415926535897931e+00" length="7.8539816339744792e+00">
+                <spiral curvStart="0.0000000000000000e+00" curvEnd="1.0000000000000002e-01"/>
+            </geometry>
+            <geometry s="1.3691480939703121e+01" x="-1.6357122432092828e+02" y="-1.0168146776097373e+00" hdg="-2.7488935718923106e+00" length="7.8539816339744810e+00">
+                <arc curvature="1.0000000000000002e-01"/>
+            </geometry>
+            <geometry s="2.1545462573677604e+01" x="-1.6898318532239975e+02" y="-6.4287756790946418e+00" hdg="-1.9634954084948619e+00" length="7.8539816339744792e+00">
+                 <spiral curvStart="1.0000000000000002e-01" curvEnd="0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="2.9399444207652081e+01" x="-1.7000000000000000e+02" y="-1.4162500694271348e+01" hdg="-1.5707963267998624e+00" length="5.8374993057286524e+00">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <predecessor id="3"/>
+                            <successor id="3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.1000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="3.5236943513380716e+01" id="9" junction="1">
+        <link>
+            <predecessor elementType="road" elementId="2" contactPoint="end" />
+            <successor elementType="road" elementId="1" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.7000000000000000e+02" y="-2.0000000000000000e+01" hdg="1.5707963267948966e+00" length="5.8374993057286328e+00">
+                <line/>
+            </geometry>
+            <geometry s="5.8374993057286328e+00" x="-1.7000000000000000e+02" y="-1.4162500694271367e+01" hdg="1.5707963267948966e+00" length="7.8539816339744792e+00">
+                <spiral curvStart="-0.0000000000000000e+00" curvEnd="-1.0000000000000002e-01"/>
+            </geometry>
+            <geometry s="1.3691480939703112e+01" x="-1.6898318532239026e+02" y="-6.4287756790717197e+00" hdg="1.1780972450974141e+00" length="7.8539816339744810e+00">
+                <arc curvature="-1.0000000000000002e-01"/>
+            </geometry>
+            <geometry s="2.1545462573677593e+01" x="-1.6357122432092828e+02" y="-1.0168146776097515e+00" hdg="3.9269908169996537e-01" length="7.8539816339744792e+00">
+                 <spiral curvStart="-1.0000000000000002e-01" curvEnd="-0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="2.9399444207652074e+01" x="-1.5583749930572864e+02" y="7.1488748397854891e-16" hdg="-4.9658055445434002e-12" length="5.8374993057286417e+00">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <predecessor id="-3"/>
+                            <successor id="-3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.0797970000000000e+03" id="11" junction="-1">
+        <link>
+            <predecessor elementType="junction" elementId="2" />
+            <successor elementType="road" elementId="13" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.5000000000000000e+02" y="-3.0000000000000000e+02" hdg="0.0000000000000000e+00" length="3.2000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="3.2000000000000000e+02" x="1.6999999562980989e+02" y="-3.0000000000000000e+02" hdg="-1.2414513861358500e-12" length="1.5705000000000001e+02">
+                <arc curvature="-1.0001886830913062e-02"/>
+            </geometry>
+            <geometry s="4.7705000000000001e+02" x="2.6998113088001446e+02" y="-3.9998113525045278e+02" hdg="-1.5707963267998650e+00" length="3.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="5.0705000000000001e+02" x="2.6998113087986542e+02" y="-4.2998113612434906e+02" hdg="-1.5707963268011058e+00" length="1.5699999999999999e+01">
+                <arc curvature="-1.0005072145190425e-01"/>
+            </geometry>
+            <geometry s="5.2275000000000000e+02" x="2.5998620045358268e+02" y="-4.3997606655040840e+02" hdg="3.1415926535848286e+00" length="5.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="5.7275000000000000e+02" x="2.0998620001657872e+02" y="-4.3997606654991188e+02" hdg="3.1415926535835874e+00" length="1.5699999999999999e+01">
+                <arc curvature="-1.0005072145190425e-01"/>
+            </geometry>
+            <geometry s="5.8845000000000005e+02" x="1.9999126959051935e+02" y="-4.2998113612362914e+02" hdg="1.5707963267899290e+00" length="3.0000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="6.1845000000000005e+02" x="1.9999126959081735e+02" y="-3.9998113612362914e+02" hdg="1.5707963267911706e+00" length="4.7115000000000002e+01">
+                <arc curvature="6.6679245539420423e-02"/>
+            </geometry>
+            <geometry s="6.6556500000000005e+02" x="1.6999692901571876e+02" y="-3.9998113612336846e+02" hdg="-1.5707963268048308e+00" length="2.5000000000000000e+01">
+                <line/>
+            </geometry>
+            <geometry s="6.9056500000000005e+02" x="1.6999692901547041e+02" y="-4.2498113743484396e+02" hdg="-1.5707963268060725e+00" length="2.3559999999999999e+01">
+                <arc curvature="-6.6672170067695102e-02"/>
+            </geometry>
+            <geometry s="7.1412500000000000e+02" x="1.5499816717824814e+02" y="-4.3997989927158210e+02" hdg="3.1415926535798602e+00" length="2.8000000000000000e+02">
+                <line/>
+            </geometry>
+            <geometry s="9.9412500000000000e+02" x="-1.2500183478910552e+02" y="-4.3997989926741042e+02" hdg="3.1415926535786189e+00" length="7.0671999999999997e+01">
+                <arc curvature="-2.2226572430310398e-02"/>
+            </geometry>
+            <geometry s="1.0647970000000000e+03" x="-1.6999302734114107e+02" y="-3.9498870671392251e+02" hdg="1.5707963267799980e+00" length="1.5000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="6.1457674050632917e+01" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="2.0000000000000000e-03" d="0.0000000000000000e+00"/>
+            <elevation s="9.8542325949367083e+01" a="2.7505428129005751e+00" b="1.4833860759493669e-01" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="1.1424275316455697e+02" a="5.0795223246474928e+00" b="1.4833860759493669e-01" c="-2.2727272727272726e-03" d="0.0000000000000000e+00"/>
+            <elevation s="1.4687724683544303e+02" a="7.5000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="1.7424275316455697e+02" a="7.5000000000000000e+00" b="0.0000000000000000e+00" c="-2.2727272727272726e-03" d="0.0000000000000000e+00"/>
+            <elevation s="2.0687724683544303e+02" a="5.0795223246474954e+00" b="-1.4833860759493669e-01" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+            <elevation s="2.2257767405063291e+02" a="2.7505428129005796e+00" b="-1.4833860759493669e-01" c="2.0000000000000000e-03" d="0.0000000000000000e+00"/>
+            <elevation s="2.5966232594936707e+02" a="3.5527136788005009e-15" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="3" type="border" level="false">
+                        <link>
+                            <successor id="3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.1000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="2" type="border" level="false">
+                        <link>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <successor id="-3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+            <object type="tree" name="VegTree02v9m.flt" id="3" s="6.5504872695312502e+00" t="1.0859100054431494e+01" zOffset="-5.9850000000000048e-01" validLength="0.0000000000000000e+00" orientation="none" length="9.1140000000000008e+00" width="8.9309999999999992e+00" height="1.0201000000000001e+01" hdg="3.1415926535897931e+00" pitch="0.0000000000000000e+00" roll="0.0000000000000000e+00">
+                <repeat s="6.5504872695312502e+00" length="1.0723356000000001e+03" distance="2.0000000000000000e+01" tStart="1.0859100054431494e+01" tEnd="1.0859100054431494e+01" widthStart="8.9309999999999992e+00" widthEnd="8.9309999999999992e+00" heightStart="1.0201000000000001e+01" heightEnd="1.0201000000000001e+01" zOffsetStart="-5.9850000000000048e-01" zOffsetEnd="-5.9850000000000048e-01" />
+            </object>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="4.0000000000000000e+01" id="12" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="13" contactPoint="end" />
+            <successor elementType="junction" elementId="2" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.7000000000000000e+02" y="-3.6000000000000000e+02" hdg="1.5707963267948966e+00" length="4.0000000000000000e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="3" type="border" level="false">
+                        <link>
+                            <predecessor id="3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.1000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="2" type="border" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <predecessor id="-3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+            <object type="tree" name="VegTree02v13m.flt" id="4" s="6.1400000000000050e+00" t="1.2137900370739581e+01" zOffset="-8.1500000000000039e-01" validLength="0.0000000000000000e+00" orientation="none" length="1.2407999999999999e+01" width="1.2160000000000000e+01" height="1.3888000000000000e+01" hdg="3.1415926535897931e+00" pitch="0.0000000000000000e+00" roll="0.0000000000000000e+00">
+                <repeat s="6.1400000000000050e+00" length="3.3699999999999996e+01" distance="2.5000000000000000e+01" tStart="1.2137900370739581e+01" tEnd="1.2137900370739581e+01" widthStart="1.2160000000000000e+01" widthEnd="1.2160000000000000e+01" heightStart="1.3888000000000000e+01" heightEnd="1.3888000000000000e+01" zOffsetStart="-8.1500000000000039e-01" zOffsetEnd="-8.1500000000000039e-01" />
+            </object>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="1.9988707930058549e+01" id="13" junction="-1">
+        <link>
+            <predecessor elementType="road" elementId="11" contactPoint="end" />
+            <successor elementType="road" elementId="12" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.6999302734091759e+02" y="-3.7998870671392251e+02" hdg="1.5711451567066754e+00" length="1.9988707930058549e+01">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <left>
+                    <lane id="3" type="border" level="false">
+                        <link>
+                            <predecessor id="3"/>
+                            <successor id="3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.1000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="2" type="border" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </left>
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                        <roadMark sOffset="0.0000000000000000e+00" type="broken" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="both" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <roadMark sOffset="0.0000000000000000e+00" type="solid" weight="standard" color="standard" width="1.2000000000000000e-01" laneChange="none" height="1.9999999552965164e-02">
+                        </roadMark>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <predecessor id="-3"/>
+                            <successor id="-3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+            <object type="tree" name="VegTree02v13m.flt" id="5" s="8.6401190027677792e+00" t="1.2959100006773735e+01" zOffset="-8.1500000000000039e-01" validLength="0.0000000000000000e+00" orientation="none" length="1.2407999999999999e+01" width="1.2160000000000000e+01" height="1.3888000000000000e+01" hdg="3.1415926535897931e+00" pitch="0.0000000000000000e+00" roll="0.0000000000000000e+00">
+            </object>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="3.5236943513380709e+01" id="16" junction="2">
+        <link>
+            <predecessor elementType="road" elementId="11" contactPoint="start" />
+            <successor elementType="road" elementId="12" contactPoint="end" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.5000000000000000e+02" y="-3.0000000000000000e+02" hdg="3.1415926535897931e+00" length="5.8374993057286417e+00">
+                <line/>
+            </geometry>
+            <geometry s="5.8374993057286417e+00" x="-1.5583749930572864e+02" y="-3.0000000000000000e+02" hdg="3.1415926535897931e+00" length="7.8539816339744855e+00">
+                <spiral curvStart="0.0000000000000000e+00" curvEnd="9.9999999999999978e-02"/>
+            </geometry>
+            <geometry s="1.3691480939703126e+01" x="-1.6357122432090534e+02" y="-3.0101681467760022e+02" hdg="-2.7488935718923102e+00" length="7.8539816339744837e+00">
+                <arc curvature="9.9999999999999978e-02"/>
+            </geometry>
+            <geometry s="2.1545462573677611e+01" x="-1.6898318532239026e+02" y="-3.0642877567907169e+02" hdg="-1.9634954084948619e+00" length="7.8539816339744855e+00">
+                 <spiral curvStart="9.9999999999999978e-02" curvEnd="0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="2.9399444207652095e+01" x="-1.7000000000000000e+02" y="-3.1416250069427139e+02" hdg="-1.5707963267998624e+00" length="5.8374993057286133e+00">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="1"/>
+                            <successor id="1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <predecessor id="2"/>
+                            <successor id="2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <predecessor id="3"/>
+                            <successor id="3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.1000000000000000e+01" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <road name="" length="3.5236943513380680e+01" id="19" junction="2">
+        <link>
+            <predecessor elementType="road" elementId="12" contactPoint="end" />
+            <successor elementType="road" elementId="11" contactPoint="start" />
+        </link>
+        <planView>
+            <geometry s="0.0000000000000000e+00" x="-1.7000000000000000e+02" y="-3.2000000000000000e+02" hdg="1.5707963267948966e+00" length="5.8374993057286133e+00">
+                <line/>
+            </geometry>
+            <geometry s="5.8374993057286133e+00" x="-1.7000000000000000e+02" y="-3.1416250069427139e+02" hdg="1.5707963267948966e+00" length="7.8539816339744855e+00">
+                <spiral curvStart="-0.0000000000000000e+00" curvEnd="-9.9999999999999978e-02"/>
+            </geometry>
+            <geometry s="1.3691480939703098e+01" x="-1.6898318532239975e+02" y="-3.0642877567909466e+02" hdg="1.1780972450974139e+00" length="7.8539816339744837e+00">
+                <arc curvature="-9.9999999999999978e-02"/>
+            </geometry>
+            <geometry s="2.1545462573677582e+01" x="-1.6357122432092828e+02" y="-3.0101681467760977e+02" hdg="3.9269908169996537e-01" length="7.8539816339744855e+00">
+                 <spiral curvStart="-9.9999999999999978e-02" curvEnd="-0.0000000000000000e+00"/>
+            </geometry>
+            <geometry s="2.9399444207652067e+01" x="-1.5583749930572861e+02" y="-3.0000000000000000e+02" hdg="0.0000000000000000e+00" length="5.8374993057286133e+00">
+                <line/>
+            </geometry>
+        </planView>
+        <elevationProfile>
+            <elevation s="0.0000000000000000e+00" a="0.0000000000000000e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+        </elevationProfile>
+        <lateralProfile>
+        </lateralProfile>
+        <lanes>
+            <laneSection s="0.0000000000000000e+00">
+                <center>
+                    <lane id="0" type="driving" level="false">
+                        <link>
+                        </link>
+                    </lane>
+                </center>
+                <right>
+                    <lane id="-1" type="driving" level="false">
+                        <link>
+                            <predecessor id="-1"/>
+                            <successor id="-1"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="3.5699999999999998e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-2" type="border" level="false">
+                        <link>
+                            <predecessor id="-2"/>
+                            <successor id="-2"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                    <lane id="-3" type="border" level="false">
+                        <link>
+                            <predecessor id="-3"/>
+                            <successor id="-3"/>
+                        </link>
+                        <width sOffset="0.0000000000000000e+00" a="1.6799999999999999e+00" b="0.0000000000000000e+00" c="0.0000000000000000e+00" d="0.0000000000000000e+00"/>
+                        <height sOffset="0.0000000000000000e+00" inner="0.0000000000000000e+00" outer="0.0000000000000000e+00"/>
+                    </lane>
+                </right>
+            </laneSection>
+        </lanes>
+        <objects>
+        </objects>
+        <signals>
+        </signals>
+        <surface>
+        </surface>
+    </road>
+    <junction name="" id="1">
+        <connection id="0" incomingRoad="1" connectingRoad="6" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+            <laneLink from="2" to="-2"/>
+            <laneLink from="3" to="-3"/>
+        </connection>
+        <connection id="1" incomingRoad="2" connectingRoad="9" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+            <laneLink from="-2" to="-2"/>
+            <laneLink from="-3" to="-3"/>
+        </connection>
+    </junction>
+    <junction name="" id="2">
+        <connection id="0" incomingRoad="11" connectingRoad="16" contactPoint="start">
+            <laneLink from="1" to="-1"/>
+            <laneLink from="2" to="-2"/>
+            <laneLink from="3" to="-3"/>
+        </connection>
+        <connection id="1" incomingRoad="12" connectingRoad="19" contactPoint="start">
+            <laneLink from="-1" to="-1"/>
+            <laneLink from="-2" to="-2"/>
+            <laneLink from="-3" to="-3"/>
+        </connection>
+    </junction>
+</OpenDRIVE>

+ 236 - 0
src/InfiniteGridHelper.js

@@ -0,0 +1,236 @@
+// Author: Fyrestar https://mevedia.com (https://github.com/Fyrestar/THREE.InfiniteGridHelper)
+import * as THREE from "three";
+THREE.InfiniteGridHelper = function InfiniteGridHelper( size1, size2, color, distance, axes = 'xzy' ) {
+
+	color = color || new THREE.Color( 'white' );
+	size1 = size1 || 10;
+	size2 = size2 || 100;
+
+	distance = distance || 8000;
+
+
+
+	const planeAxes = axes.substr( 0, 2 );
+
+	const geometry = new THREE.PlaneBufferGeometry( 2, 2, 1, 1 );
+
+	const material = new THREE.ShaderMaterial( {
+
+		side: THREE.DoubleSide,
+
+		uniforms: {
+			uSize1: {
+				value: size1
+			},
+			uSize2: {
+				value: size2
+			},
+			uColor: {
+				value: color
+			},
+			uDistance: {
+				value: distance
+			}
+		},
+		transparent: true,
+		vertexShader: `
+           
+           varying vec3 worldPosition;
+		   
+           uniform float uDistance;
+           
+           void main() {
+           
+                vec3 pos = position.${axes} * uDistance;
+                pos.${planeAxes} += cameraPosition.${planeAxes};
+                
+                worldPosition = pos;
+                
+                gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
+           
+           }
+           `,
+
+
+		fragmentShader: `
+           
+           varying vec3 worldPosition;
+           
+           uniform float uSize1;
+           uniform float uSize2;
+           uniform vec3 uColor;
+           uniform float uDistance;
+            
+            
+            
+            float getGrid(float size) {
+            
+                vec2 r = worldPosition.${planeAxes} / size;
+                
+                
+                vec2 grid = abs(fract(r - 0.5) - 0.5) / fwidth(r);
+                float line = min(grid.x, grid.y);
+                
+            
+                return 1.0 - min(line, 1.0);
+            }
+            
+           void main() {
+           
+                
+                  float d = 1.0 - min(distance(cameraPosition.${planeAxes}, worldPosition.${planeAxes}) / uDistance, 1.0);
+                
+                  float g1 = getGrid(uSize1);
+                  float g2 = getGrid(uSize2);
+                  
+                  
+                  gl_FragColor = vec4(uColor.rgb, mix(g2, g1, g1) * pow(d, 3.0));
+                  gl_FragColor.a = mix(0.5 * gl_FragColor.a, gl_FragColor.a, g2);
+                
+                  if ( gl_FragColor.a <= 0.0 ) discard;
+                
+           
+           }
+           
+           `,
+
+		extensions: {
+			derivatives: true
+		}
+
+	} );
+
+
+	THREE.Mesh.call( this, geometry, material );
+
+	this.frustumCulled = false;
+
+};
+
+THREE.InfiniteGridHelper.prototype = {
+	...THREE.Mesh.prototype,
+	...THREE.Object3D.prototype,
+	...THREE.EventDispatcher.prototype
+};
+
+if ( parseInt( THREE.REVISION ) > 126 ) {
+
+	class InfiniteGridHelper extends THREE.Mesh {
+
+		constructor ( size1, size2, color, distance, axes = 'xzy' ) {
+
+
+			color = color || new THREE.Color( 'white' );
+			size1 = size1 || 10;
+			size2 = size2 || 100;
+
+			distance = distance || 8000;
+
+
+
+			const planeAxes = axes.substr( 0, 2 );
+
+			const geometry = new THREE.PlaneBufferGeometry( 2, 2, 1, 1 );
+
+			const material = new THREE.ShaderMaterial( {
+
+				side: THREE.DoubleSide,
+
+				uniforms: {
+					uSize1: {
+						value: size1
+					},
+					uSize2: {
+						value: size2
+					},
+					uColor: {
+						value: color
+					},
+					uDistance: {
+						value: distance
+					}
+				},
+				transparent: true,
+				vertexShader: `
+           
+           varying vec3 worldPosition;
+		   
+           uniform float uDistance;
+           
+           void main() {
+           
+                vec3 pos = position.${axes} * uDistance;
+                pos.${planeAxes} += cameraPosition.${planeAxes};
+                
+                worldPosition = pos;
+                
+                gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
+           
+           }
+           `,
+
+
+				fragmentShader: `
+           
+           varying vec3 worldPosition;
+           
+           uniform float uSize1;
+           uniform float uSize2;
+           uniform vec3 uColor;
+           uniform float uDistance;
+            
+            
+            
+            float getGrid(float size) {
+            
+                vec2 r = worldPosition.${planeAxes} / size;
+                
+                
+                vec2 grid = abs(fract(r - 0.5) - 0.5) / fwidth(r);
+                float line = min(grid.x, grid.y);
+                
+            
+                return 1.0 - min(line, 1.0);
+            }
+            
+           void main() {
+           
+                
+                  float d = 1.0 - min(distance(cameraPosition.${planeAxes}, worldPosition.${planeAxes}) / uDistance, 1.0);
+                
+                  float g1 = getGrid(uSize1);
+                  float g2 = getGrid(uSize2);
+                  
+                  
+                  gl_FragColor = vec4(uColor.rgb, mix(g2, g1, g1) * pow(d, 3.0));
+                  gl_FragColor.a = mix(0.5 * gl_FragColor.a, gl_FragColor.a, g2);
+                
+                  if ( gl_FragColor.a <= 0.0 ) discard;
+                
+           
+           }
+           
+           `,
+
+				extensions: {
+					derivatives: true
+				}
+
+			} );
+
+			super( geometry, material );
+
+			this.frustumCulled = false;
+
+		}
+
+	}
+	
+	Object.assign( InfiniteGridHelper.prototype, THREE.InfiniteGridHelper.prototype );
+
+	THREE.InfiniteGridHelper = InfiniteGridHelper;
+
+}
+
+// module.exports.InfiniteGridHelper = THREE.InfiniteGridHelper
+// module.exports.InfiniteGridHelper  =THREE.InfiniteGridHelper;

+ 4 - 2
src/api/index.js

@@ -7,7 +7,8 @@ import modelLibrary from './modelLibrary.js' // 模型库
 import algorithmsLibrary from './algorithmsLibrary.js' // 算法库
 import mainPage from './mainPage.js' // 首页
 import systemManagement from "./systemManagement.js"; //系统管理
-import userInfo from "./userInfo.js";
+import userInfo from "./userInfo.js"; 
+import multimode  from "./multimode.js"; // 多模式仿真
 
 const api = {
     common,
@@ -17,7 +18,8 @@ const api = {
     algorithmsLibrary,
     mainPage,
     systemManagement,
-    userInfo
+    userInfo,
+    multimode
 }
 
 export default api;

+ 25 - 0
src/api/multimode.js

@@ -0,0 +1,25 @@
+const basePart = '/simulation/resource/server';
+
+
+
+export default{
+  queryMulationList: basePart+'/simulationProject/selectMultiSimulationProject', // 获取仿真任务列表
+  deleteMulationById:basePart + '/simulationProject/deleteMultiSimulationProject', // 删除仿真任务
+  updateMulationStatus:basePart + '/simulationProject/updateMultiSimulationProjectStatus', // 更新任务状态
+  queryMulationDetailById: basePart + '/simulationProject/getMultiSimulationProjectDetail', // 获取仿真任务详情 
+  queryMulationSceneList :basePart + '/simulationProject/selectMultiSimulationSceneList', // 任务场景列表
+  viewMulationSceneResult: basePart +'/simulationProject/viewMultiSimulationProjectResult', // 查看场景评价结果
+  createMulationTask:basePart + '/simulationProject/addMultiSimulationProject', // 创建仿真任务
+  addMulationSceneList:basePart + '/simulationProject/addMultiSimulationScene', // 添加仿真场景列表数据
+  updateMulationSceneList:basePart + '/simulationProject/updateMultiSimulationProjectDetail', // 更新仿真场景列表
+  deleteMulationScene :basePart + '/simulationProject/deleteMultiSimulationScene', // 删除多模式场景
+  copyMulationScene:basePart+'/simulationProject/copyMultiSimulationScene', // 复制场景列表
+  saveMulationTask : basePart + '/simulationProject/submitMultiSimulationProjectDetail', // 提交多模式任务
+  downloadMulation:basePart + '/simulationProject/downloadMultiSimulationProjectResult', // 多仿真任务下载
+  queryMulationMapList:basePart + '/simulationMap/selectSimulationMapList', // 地图上传列表
+  addMulationMap : basePart + '/simulationMap/uploadSimulationMap', //新增多模式仿真地图
+  queryMapDetailByID: basePart + '/simulationMap/getSimulationMap', // 获取地图详情
+  updateMapDetail:basePart + '/simulationMap/updateSimulationMap', // 更新地图信息
+  deleteMapById:basePart + '/simulationMap/deleteSimulationMap', // 删除地图列表
+}
+

+ 33 - 1
src/api/sceneLibrary.js

@@ -2,12 +2,24 @@ const basePart = '/simulation/resource/server';
 
 
 const queryScoringRulesList = basePart + '/ScoringRules/queryScoringRulesList'; // 评分规则列表
+const querySceneScoringRulesList = basePart + '/ScoringRules/querySceneEvaluationRuleList'; // 场景评价列表
 const queryScoringRules = basePart + '/ScoringRules/queryScoringRules'; // 查询评分规则详情
 const saveScoringRules = basePart + '/ScoringRules/saveScoringRules'; // 保存评分规则详情
 const fxScoringRules = basePart + '/ScoringRules/fxScoringRules'; // 分享评分规则
 const deleteScoringRules = basePart + '/ScoringRules/deleteScoringRules'; // 删除评分规则
 const queryCsbById = basePart + '/ScoringRules/queryCsbById'; // 查询该规则是否有关联任务
+const queryScoringRulesInfo = basePart +'/ScoringRules/saveSceneEvaluationRuleByPath';  // 场景评价编辑
+const getScriptListByType = basePart +'/ScoringRules/queryEvaluationScript'; // 脚本列表 【复杂度,危险度等】
 
+const deleteSceneEvaluationRule = basePart +'/ScoringRules/deleteSceneEvaluationRule'; // 删除场景评价规则
+
+const querybenchmarkList = basePart + '/sceneReference/querySceneReferenceLibList'; // 基准场景库列表
+
+const saveSceneReferenceById = basePart + '/sceneReference/saveSceneReferenceById'; // 基准场景编辑
+
+const benchmarkSearchCreate = basePart + '/dict/createDictByType'; // 基准库筛选项创建
+
+const benchmarkSearchDelete = basePart + '/dict/deleteDictById'; // 基准库筛选项删除
 const queryStandardsRegulationsList = basePart + '/StandardsRegulations/queryStandardsRegulationsList'; // 标准法规场景列表
 const saveStandardsRegulations = basePart + '/StandardsRegulations/saveStandardsRegulations'; // 新增标准法规仿场景
 const deleteStandardsRegulations = basePart + '/StandardsRegulations/deleteStandardsRegulations'; // 删除标准法规仿场景
@@ -43,8 +55,17 @@ const saveSceneGeneralExample = basePart + '/SceneGeneralTemplate/saveSceneGener
 const queryGeneralTemplateByFh = basePart + '/SceneGeneralTemplate/queryGeneralTemplateByFh'; // 泛化过的详情
 
 
+const queryComplexityDetail = basePart + '/ScoringRules/querySceneEvaluationComplexityDetail'; // 获取复杂度详情
+
+const queryRiskDetail =  basePart + '/ScoringRules/querySceneEvaluationRiskDetail';
+
+const batchDeleteSceneReference = basePart + '/sceneReference/batchDeleteSceneReference'; // 批量删除基准库场景
+
+
+
 export default {
     queryScoringRulesList,
+    querySceneScoringRulesList,
     queryScoringRules,
     saveScoringRules,
     fxScoringRules,
@@ -83,5 +104,16 @@ export default {
     querySceneGeneralTemplateById,
     saveSceneGeneralTemplate,
     saveSceneGeneralExample,
-    queryGeneralTemplateByFh
+    queryGeneralTemplateByFh,
+
+    queryScoringRulesInfo,
+    getScriptListByType,
+    querybenchmarkList,
+    deleteSceneEvaluationRule,
+    saveSceneReferenceById,
+    queryComplexityDetail,
+    queryRiskDetail,
+    batchDeleteSceneReference,
+    benchmarkSearchCreate,
+    benchmarkSearchDelete
 }

+ 28 - 2
src/api/workManagement.js

@@ -6,7 +6,7 @@ const selectDropDownByType = basePart + '/simulationProject/selectDropDownByType
 const selectDropDownByTypeNew = basePart + '/simulationProject/selectDropDownByTypeNew'; // 标准化测试详情中的下拉列表-new
 const selectMaxParallelism = basePart + '/simulationProject/selectMaxParallelism'; // 标准化测试详情中获取人员可用并行数
 const updateProjectNowRunState = basePart + '/simulationProject/updateProjectNowRunState'; // 标准化测试详情中修改工作运行状态
-
+ 
 const selectProject = basePart + '/simulationProject/selectProject'; // 标准化测试列表
 const deleteProjectByids = basePart + '/simulationProject/deleteProjectByids'; // 删除标准化测试
 const exportProjectReportAndTaskFileById = basePart + '/simulationProject/exportProjectReportAndTaskFileById'; // 导出报告和任务包
@@ -29,7 +29,19 @@ const deleteAutomaticProjectByids = basePart + '/simulationProject/deleteAutomat
 const deleteAutomaticSubProjectByIds = basePart + '/simulationProject/deleteAutomaticSubProjectByIds'; // 删除自动化测试子任务
 const updateAutoProjectNowRunState = basePart + '/simulationProject/updateAutoProjectNowRunState'; // 修改自动化测试子任务状态
 
+const getEvaluationRuleDetail = basePart +'/simulationProject/getEvaluationRuleDetail'; // 标准化测试详情展示规则
 
+const querySceneEvaluationDetail = basePart + '/simulationProject/querySceneEvaluationDetail'; // 标准化场景评价列表
+const carList = basePart + '/simulationProject/selectDropDownByTypeNew'; //多模式仿真获取车辆列表
+const mapList = basePart + '/simulationMap/selectAllSimulationMapList'; //多模式仿真获取地图列表
+const algorithmList = basePart + '/simulationProject/selectDropDownByTypeNew';//多模式仿真获取算法列表
+const mapDetails = basePart + '/simulationMap/getSimulationMap';//多模式仿真获取地图详情
+const sceneCarList = basePart + '/simulationProject/getMultiSimulationSceneCarList';//获取记录
+const deleteRecord = basePart + '/simulationProject/deleteMultiSimulationSceneCar';//删除记录
+const settingsSimulation = basePart + '/simulationProject/setMultiSimulationSceneCarView';//设置仿真视角
+const saveOrUpdateSceneCarList = basePart + '/simulationProject/addOrUpdateMultiSimulationSceneCarList';//设置仿真视角
+const getMultiSimulationSceneDetail = basePart + '/simulationProject/getMultiSimulationSceneDetail';//获取多模式仿真场景详情
+const getStandardTestReport =  basePart + '/simulationProject/getProjectReportForAllReferenceScene'; // 标准化测试报告
 export default {
     addOrUpdateProject,
     selectProjectById,
@@ -42,6 +54,17 @@ export default {
     deleteProjectByids,
     exportProjectReportAndTaskFileById,
     exportProjectTaskFileById,
+	
+	
+	carList,
+	mapList,
+	algorithmList,
+	mapDetails,
+	sceneCarList,
+	deleteRecord,
+	settingsSimulation,
+	saveOrUpdateSceneCarList,
+	getMultiSimulationSceneDetail,
 
     selectProjectDetailsById,
     selectProjectTaskList,
@@ -58,5 +81,8 @@ export default {
     createAutomaticSubProject,
     deleteAutomaticProjectByids,
     deleteAutomaticSubProjectByIds,
-    updateAutoProjectNowRunState
+    updateAutoProjectNowRunState,
+    getEvaluationRuleDetail,
+    querySceneEvaluationDetail,
+    getStandardTestReport,
 }

BIN
src/assets/common/image/report_banner.png


+ 16 - 1
src/axios/filter.js

@@ -36,6 +36,9 @@ export function tryHideFullScreenLoading() {
     }
 }
 
+const urlMap = {
+
+}
 
 
 //axios配置和处理
@@ -43,7 +46,7 @@ Vue.use(VueAxios, axios);
 axios.defaults.baseURL = ''; //项目的的基础url
 axios.defaults.headers.common['Authorization'] = ""; //请求token信息配置
 axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; //请求type设置
-axios.defaults.timeout = 1000 * 60; //在超时前,所有请求都会等待相应秒数
+axios.defaults.timeout = 1000 * 1000; //在超时前,所有请求都会等待相应秒数
 axios.defaults.withCredentials = true;
 let isInvalid1 = false //用于控制登录信息过期后弹窗时间的截流,截流时间为5s
 let isInvalid2 = false
@@ -75,6 +78,18 @@ axios.interceptors.request.use(function (config) {
 });
 // 添加响应拦截器
 axios.interceptors.response.use(function (response) {
+	// if(response.config.url.includes("/simulation/resource/server/menu/getMyMenuTree")){
+	// 	response.data.info[3].children.push({
+	// 		"id": "d75a9d044eec4dc7b9133256c7e976af",
+	// 		"name": "多模式仿真",
+	// 		"router": "/multimodeSimulation",
+	// 		"icon": null,
+	// 		"sort": 3,
+	// 		"parentId": "268190b28633425da0744966976c4e22",
+	// 		"visible": "1",
+	// 		"children": null
+	// 	})
+	// }
     // 对响应数据处理
     tryHideFullScreenLoading();
     if (response && (response.status == 200)) {

+ 1 - 0
src/components/HelloWorld.vue

@@ -30,6 +30,7 @@ export default {
 </script>
 
 <style scoped lang="less">
+	
 h3 {
   margin: 40px 0 0;
 }

+ 3 - 1
src/components/grid/TableList.vue

@@ -111,6 +111,7 @@
                                                  :sort-change="{'sortChange':column.sortable}"
                                                  :show-overflow-tooltip="column.showOverflowTooltip"
                                                  :formatter='column.formatter'
+                                                 :fixed='column.fixed'
                                 >
                                 </el-table-column>
                                 <slot :name="column.prop" v-if="!!column.template"></slot>
@@ -339,7 +340,7 @@
                 dropCol: this.columns,
                 rowHeight: 48,
                 headerHeight: 48,
-                tableData: [],
+                tableData: [{}],
                 setPagination: {}, // 真实的分页对象
                 multipleSelection: [],
                 tempTotalData: {}, //临时模拟数据用
@@ -381,6 +382,7 @@
             if ((this.getDataWay.dataType).toLowerCase() == 'url') { // 根据url发送请求获取table数据
                 delete this.setPagination.total;
                 this.getDataWay.firstRequest===undefined  && this.loadData()//请求数据
+                console.log('当前模式')
             } else { // 通过list页面直接传table数据
                 if (this.getDataWay.data.length > 0 && this.pagination !== undefined) {
                     this.setPagination.total = this.getDataWay.data.length

+ 19 - 1
src/lib/util.js

@@ -231,4 +231,22 @@ function TimeFormatter(time){
         return false
     }
  }
- Vue.prototype.$validateInteger = ValidateInteger
+ Vue.prototype.$validateInteger = ValidateInteger
+
+// 流文件下载处理  压缩包
+function blobZipDown (blob, name){
+   const url = window.URL.createObjectURL(
+     new Blob([blob], {
+       // 设置该文件的类型,这里对应的类型对应为.zip格式
+       type: 'application/zip',
+     }),
+   );
+   const link = document.createElement('a');
+   link.href = url;
+   const fileName = decodeURI(name);
+   link.setAttribute('download', `${fileName}.zip`);
+   document.body.appendChild(link);
+   link.click();
+ };
+
+ Vue.prototype.$blobZipDown = blobZipDown

+ 1 - 1
src/main.js

@@ -14,7 +14,7 @@ import "./axios/filter"
 import '@/api/index.js'
 import '@/lib/autoTrim'
 import '@/lib/util.js'
-
+import './InfiniteGridHelper.js'
 Vue.config.productionTip = false;
 
 import echarts from 'echarts' // 引入echarts

+ 147 - 0
src/mixin/workManagement/getStdMapMixin.js

@@ -0,0 +1,147 @@
+import * as THREE from "three";
+import {
+	OrbitControls
+} from "three/examples/jsm/controls/OrbitControls";
+import {
+	RGBELoader
+} from "three/examples/jsm/loaders/RGBELoader";
+import {
+	Reflector
+} from "three/examples/jsm/objects/Reflector";
+import {
+	GLTFLoader
+} from "three/examples/jsm/loaders/GLTFLoader";
+import {
+	DRACOLoader
+} from "three/examples/jsm/loaders/DRACOLoader";
+import {
+	Line2
+} from "three/examples/jsm/lines/Line2";
+
+
+export let getStdMapMixin = {
+	methods: {
+		getStdMapKeys(std_map, delete_map = false) {
+			let map_keys = [];
+			const map_keys_vec = std_map.keys();
+			for (let idx = 0; idx < map_keys_vec.size(); idx++)
+				map_keys.push(map_keys_vec.get(idx));
+			map_keys_vec.delete();
+			if (delete_map) std_map.delete();
+			return map_keys;
+		},
+		getStdMapEntries(std_map) {
+			let map_entries = [];
+			//key路段索引 , std_map.get(key)车道编号
+			for (let key of this.getStdMapKeys(std_map)) {
+				map_entries.push([key, std_map.get(key)]);
+			}
+			return map_entries;
+		},
+		getStdVecEntries(std_vec, delete_vec = false, ArrayType = null) {
+			//获取道路网格三位坐标点数据
+			let entries = ArrayType ?
+				new ArrayType(std_vec.size()) :
+				new Array(std_vec.size());
+			for (let idx = 0; idx < std_vec.size(); idx++) {
+				entries[idx] = std_vec.get(idx);
+			}
+
+			if (delete_vec) std_vec.delete();
+			return entries;
+		},
+		isValid(rgba) {
+			return !(rgba[0] == 1 && rgba[1] == 1 && rgba[2] == 1 && rgba[3] == 1);
+		},
+		encodeUInt32(ui32) {
+			let rgba = new Float32Array(4);
+			rgba[0] = (Math.trunc(ui32) % 256) / 255;
+			rgba[1] = (Math.trunc(ui32 / 256) % 256) / 255;
+			rgba[2] = (Math.trunc(ui32 / 256 / 256) % 256) / 255;
+			rgba[3] = (Math.trunc(ui32 / 256 / 256 / 256) % 256) / 255;
+			return rgba;
+		},
+		decodeUInt32(rgba) {
+			return (
+				Math.round(rgba[0] * 255) +
+				Math.round(rgba[1] * 255) * 256 +
+				Math.round(rgba[2] * 255) * 256 * 256 +
+				Math.round(rgba[3] * 255) * 256 * 256 * 256
+			);
+		},
+		applyVertexColors(buffer_attribute, color, offset, count) {
+			//buffer_attribute.itemSize颜色宽度
+			const colors = new Float32Array(count * buffer_attribute.itemSize);
+			for (
+				let i = 0; i < count * buffer_attribute.itemSize; i += buffer_attribute.itemSize
+			) {
+				colors[i] = color.r;
+				colors[i + 1] = color.g;
+				colors[i + 2] = color.b;
+				// colors[i] =0;
+				// colors[i + 1] = 0;
+				// colors[i + 2] = 255;
+			}
+			//根据颜色偏移设置改变颜色值
+			buffer_attribute.array.set(colors, offset * buffer_attribute.itemSize);
+		},
+		getTextCanvas(content) {
+			var width = 500;
+			var height = 500;
+			var canvas = document.createElement('canvas');
+			canvas.setAttribute("width", width);
+			canvas.setAttribute("height", height);
+			var ctx = canvas.getContext('2d');
+			ctx.width = width;
+			ctx.height = height;
+			ctx.fillStyle = '#FFFFFF';
+			ctx.fillRect(0, 0, width, height);
+			ctx.font = '320px Microsoft YaHei';
+			ctx.fillStyle = '#000000';
+			ctx.textAlign = 'center';
+
+			ctx.fillText(content, ctx.width / 2, ctx.height / 2 + 50, ctx.width - 20);
+
+			return canvas;
+		},
+		get_geometry(odr_meshunion) {
+			const geom = new THREE.BufferGeometry();
+			geom.setAttribute(
+				"position",
+				new THREE.Float32BufferAttribute(
+					this.getStdVecEntries(odr_meshunion.vertices, true).flat(),
+					3
+				)
+			);
+			//获取uv坐标
+			geom.setAttribute(
+				"st",
+				new THREE.Float32BufferAttribute(
+					this.getStdVecEntries(odr_meshunion.st_coordinates, true).flat(),
+					2
+				)
+			);
+			//设置点颜色
+			geom.setAttribute(
+				"color",
+				new THREE.Float32BufferAttribute(
+					new Float32Array(geom.attributes.position.count * 3),
+					3
+				)
+			);
+			//设置几何体唯一编号
+			geom.setAttribute(
+				"id",
+				new THREE.Float32BufferAttribute(
+					new Float32Array(geom.attributes.position.count * 4),
+					4
+				)
+			);
+			// geom.setAttribute('ids', new THREE.Float32BufferAttribute(new Float32Array(geom.attributes.position.count * 4), 4));
+			//设置几何体索引数据
+			geom.setIndex(this.getStdVecEntries(odr_meshunion.indices, true));
+			geom.computeVertexNormals();
+			return geom;
+		}
+	},
+}

+ 868 - 0
src/mixin/workManagement/openDriveMixin.js

@@ -0,0 +1,868 @@
+import * as THREE from "three";
+import {
+	OrbitControls
+} from "three/examples/jsm/controls/OrbitControls";
+import {
+	RGBELoader
+} from "three/examples/jsm/loaders/RGBELoader";
+import {
+	Reflector
+} from "three/examples/jsm/objects/Reflector";
+import {
+	GLTFLoader
+} from "three/examples/jsm/loaders/GLTFLoader";
+import {
+	DRACOLoader
+} from "three/examples/jsm/loaders/DRACOLoader";
+import {
+	Line2
+} from "three/examples/jsm/lines/Line2";
+// import gsap from "gsap";
+// import * as CANNON from "cannon-es";
+
+import * as echarts from "echarts";
+
+export let openDriveMixin = {
+	data() {
+		return {
+			ModuleOpenDrive: null,
+			OpenDriveMap: null,
+			INTERSECTED_LANE_ID: 0xffffffff,
+			INTERSECTED_ROADMARK_ID: 0xffffffff,
+			refline_material: null,
+			lane_outlines_material: null,
+			roadmark_outlines_material: null,
+			disposable_objs: [],
+			id_material: null,
+			xyz_material: null,
+			st_material: null,
+			roadmarks_material: null,
+			road_objects_material: null,
+			road_network_material: null,
+			lane_picking_scene: null,
+			roadmark_picking_scene: null,
+			xyz_scene: null,
+			st_scene: null,
+			lane_picking_texture: null,
+			roadmark_picking_texture: null,
+			xyz_texture: null,
+			st_texture: null,
+			controls: null,
+			ground_grid: null,
+			road_network_mesh: null,
+			roadmarks_mesh: null,
+			road_objects_mesh: null,
+			refline_lines: null,
+			lane_outline_lines: null,
+			roadmark_outline_lines: null,
+			COLORS: {
+				road: 1.0,
+				roadmark: 1.0,
+				road_object: 0.9,
+				lane_outline: 0x444444,
+				roadmark_outline: 0xffffff,
+				ref_line: 0x444444,
+				background: 0x444444,
+				lane_highlight: 0xff3030,
+				roadmark_highlight: 0x2F4F4F,
+			},
+			renderer: null,
+			scene: null,
+			camera: null,
+			light: null,
+			lights: [
+				-295.65, 117.04, -408.97, -114.11, -272.34, -220.81, 250.93, 194.26,
+				338.92, 65.23, -3.58, -16.76,
+			],
+			startAndEndPoints: {},
+			mappingLineId: new Map()
+		}
+	},
+	created() {
+
+	},
+	mounted() {
+		this.init();
+		// this.loadMap("/map/mine4.xodr");
+	},
+	methods: {
+		drawPoint(point) {
+			if (this.startAndEndPoints[point.type]) {
+				this.scene.remove(this.startAndEndPoints[point.type].target);
+			}
+
+			const group = new THREE.Group();
+			let cricle = new THREE.CircleBufferGeometry(5, 200);
+			let metrial;
+			if (point.type == "start") {
+				metrial = new THREE.MeshBasicMaterial({
+					color: 0x00FF00
+				})
+			} else {
+				metrial = new THREE.MeshBasicMaterial({
+					color: 0xff0000
+				})
+			}
+			let mesh = new THREE.Mesh(cricle, metrial);
+			group.add(mesh);
+			let texture = new THREE.CanvasTexture(this.getTextCanvas(point.name));
+			let material = new THREE.SpriteMaterial({
+				map: texture
+			});
+			let sprite = new THREE.Sprite(material);
+			sprite.position.set(0, 0, 2);
+			group.add(sprite);
+			group.position.set(point.x - this.OpenDriveMap.x_offs, point.y - this.OpenDriveMap.y_offs, 0.015);
+			this.scene.add(group);
+			this.startAndEndPoints[point.type] = {
+				target: group,
+				point: point
+			};
+		},
+		clearPoint() {
+			Object.values(this.startAndEndPoints).forEach(value => {
+				this.scene.remove(value.target);
+			});
+			this.startAndEndPoints = {};
+		},
+		clearMappingId() {
+			this.mappingLineId = new Map();
+		},
+		loadMap(url) {
+			libOpenDrive().then((Module) => {
+				this.ModuleOpenDrive = Module;
+				fetch(url).then(
+					(file_data) => {
+						file_data.text().then((file_text) => {
+							//加载数据文件
+							this.loadFile(file_text, false);
+						});
+					}
+				);
+			});
+		},
+		reloadOdrMap() {
+			this.clearPoint();
+			if (this.OpenDriveMap) this.OpenDriveMap.delete();
+			this.OpenDriveMap = new this.ModuleOpenDrive.OpenDriveMap(
+				"./data.xodr",
+				PARAMS.lateralProfile,
+				PARAMS.laneHeight,
+				true
+			);
+			this.loadOdrMap(true, false);
+		},
+		reloadNewMap(url) {
+			this.clearPoint();
+			this.clearMappingId();
+			fetch(url, {}).then(response => response.blob()).then(blob => {
+				const file = new File([blob], "map.xodr", {
+					type: "text/plain",
+				});
+				this.onFileSelect(file);
+			})
+		},
+		onFileSelect(file) {
+			let file_reader = new FileReader();
+			file_reader.onload = () => {
+				this.loadFile(file_reader.result, true);
+			};
+			file_reader.readAsText(file);
+		},
+		loadFile(file_text, clear_map) {
+			//清除文件系统中保存的文件节点
+			if (clear_map) this.ModuleOpenDrive["FS_unlink"]("./data.xodr");
+			//将文件数据转为节点保存到文件系统本地指定的文件目录,支持读写
+			this.ModuleOpenDrive["FS_createDataFile"](
+				".",
+				"data.xodr",
+				file_text,
+				true,
+				true
+			);
+			//OpenDriveMap不为null,则已经打开过,需要删除地图重新尝试打开
+			if (this.OpenDriveMap) this.OpenDriveMap.delete();
+
+			//打开驱动地图
+			this.OpenDriveMap = new this.ModuleOpenDrive.OpenDriveMap(
+				"./data.xodr",
+				PARAMS.lateralProfile,
+				PARAMS.laneHeight,
+				true
+			);
+			//this.drawPoint();
+			this.loadOdrMap(clear_map);
+		},
+		loadOdrMap(clear_map = true, fit_view = true) {
+			if (clear_map) {
+				this.road_network_mesh.userData.odr_road_network_mesh.delete();
+				this.scene.remove(
+					this.road_network_mesh,
+					this.roadmarks_mesh,
+					this.road_objects_mesh,
+					this.refline_lines,
+					this.lane_outline_lines,
+					this.roadmark_outline_lines,
+					this.ground_grid
+				);
+				this.lane_picking_scene.remove(...this.lane_picking_scene.children);
+				this.roadmark_picking_scene.remove(...this.roadmark_picking_scene.children);
+				this.xyz_scene.remove(...this.xyz_scene.children);
+				this.st_scene.remove(...this.st_scene.children);
+				for (let obj of this.disposable_objs) obj.dispose();
+			}
+			//web浏览器内置api,精度微秒级,performance.now是浏览器(Web API)提供的方法,不同浏览器获取到的精度不同。Date.now是Javascript内置方法,差异主要在于浏览器遵循的ECMAScript规范。
+			const t0 = performance.now();
+			//是否清除地图
+			/**
+			 * 道路中间s方向的线
+			 */
+			//获取参考线矩形几何体
+			const reflines_geom = new THREE.BufferGeometry();
+			//获取驱动中参考线数据信息
+			const odr_refline_segments = this.OpenDriveMap.get_refline_segments(
+				parseFloat(PARAMS.resolution)
+			);
+			//设置参考线坐标点
+			reflines_geom.setAttribute(
+				"position",
+				new THREE.Float32BufferAttribute(
+					this.getStdVecEntries(odr_refline_segments.vertices).flat(),
+					3
+				)
+			);
+			//设置参考线坐标点索引
+			reflines_geom.setIndex(
+				this.getStdVecEntries(odr_refline_segments.indices, true)
+			);
+			//创建参考线物体
+			let refline_lines = new THREE.LineSegments(reflines_geom, this.refline_material);
+			this.refline_lines = refline_lines;
+			refline_lines.renderOrder = 10;
+			//设置是否可见
+			refline_lines.visible = PARAMS.ref_line;
+			refline_lines.matrixAutoUpdate = false;
+			this.disposable_objs.push(reflines_geom);
+			//将参考线加入场景中
+			this.scene.add(refline_lines);
+
+			/*
+			 *道路面
+			 */
+			//根据细节级别获取道路网格物体PARAMS.resolution 默认0.3中等级别
+			const odr_road_network_mesh = this.OpenDriveMap.get_mesh(
+				parseFloat(PARAMS.resolution)
+			);
+			//获取所有路段的车道(车道id为 -2, -1, 0, 1, 2)
+			const odr_lanes_mesh = odr_road_network_mesh.lanes_mesh;
+			//收集映射
+			for (const [vert_start_idx, lineId] of this.getStdMapEntries(odr_lanes_mesh.lane_start_indices)) {
+				const road_id = odr_lanes_mesh.get_road_id(vert_start_idx);
+				this.mappingLineId.set(road_id + ":" + lineId, vert_start_idx);
+			}
+
+			//获取所有路段车道点集构建道路物体
+			const road_network_geom = this.get_geometry(odr_lanes_mesh);
+			//设置道路颜色
+			road_network_geom.attributes.color.array.fill(this.COLORS.road);
+			//获取所有路段的车道的起始位置索引
+			//将索引作为车道开始和结束信息
+			for (const [vert_start_idx, _] of this.getStdMapEntries(odr_lanes_mesh.lane_start_indices)) {
+				const vert_idx_interval = odr_lanes_mesh.get_idx_interval_lane(vert_start_idx);
+				const vert_count = vert_idx_interval[1] - vert_idx_interval[0];
+				const vert_start_idx_encoded = this.encodeUInt32(vert_start_idx);
+				const attr_arr = new Float32Array(vert_count * 4);
+				for (let i = 0; i < vert_count; i++)
+					attr_arr.set(
+						vert_start_idx_encoded,
+						i * 4
+					);
+				road_network_geom.attributes.id.array.set(
+					attr_arr,
+					vert_idx_interval[0] * 4
+				);
+			}
+
+			this.disposable_objs.push(road_network_geom);
+			let road_network_mesh = new THREE.Mesh(
+				road_network_geom,
+				this.road_network_material
+			);
+			road_network_mesh.renderOrder = 0;
+			road_network_mesh.userData = {
+				odr_road_network_mesh
+			};
+			road_network_mesh.matrixAutoUpdate = false;
+			road_network_mesh.visible = !(PARAMS.view_mode == "Outlines");
+			this.scene.add(road_network_mesh);
+			this.road_network_mesh = road_network_mesh;
+
+			/**
+			 * 选中被选中的车道进行离屏渲染
+			 */
+			const lane_picking_mesh = new THREE.Mesh(road_network_geom, this.id_material);
+			lane_picking_mesh.matrixAutoUpdate = false;
+			this.lane_picking_scene.add(lane_picking_mesh);
+
+			/* xyz coords road network mesh */
+			let xyz_mesh = new THREE.Mesh(road_network_geom, this.xyz_material);
+			xyz_mesh.matrixAutoUpdate = false;
+			this.xyz_scene.add(xyz_mesh);
+
+			/* st coords road network mesh */
+			const st_mesh = new THREE.Mesh(road_network_geom, this.st_material);
+			st_mesh.matrixAutoUpdate = false;
+			this.st_scene.add(st_mesh);
+
+			/**
+			 * 车道线宽度区域填充,由于车道线有宽度,宽度区域颜色填充
+			 */
+			const odr_roadmarks_mesh = odr_road_network_mesh.roadmarks_mesh;
+			const roadmarks_geom = this.get_geometry(odr_roadmarks_mesh);
+			roadmarks_geom.attributes.color.array.fill(this.COLORS.roadmark);
+			for (const [vert_start_idx, _] of this.getStdMapEntries(odr_roadmarks_mesh
+					.roadmark_type_start_indices)) {
+				const vert_idx_interval =
+					odr_roadmarks_mesh.get_idx_interval_roadmark(vert_start_idx);
+				const vert_count = vert_idx_interval[1] - vert_idx_interval[0];
+				const vert_start_idx_encoded = this.encodeUInt32(vert_start_idx);
+				const attr_arr = new Float32Array(vert_count * 4);
+				for (let i = 0; i < vert_count; i++)
+					attr_arr.set(
+						vert_start_idx_encoded, //数组
+						i * 4 //偏移量,每次偏移step:数组大小
+					);
+				roadmarks_geom.attributes.id.array.set(
+					attr_arr,
+					vert_idx_interval[0] * 4
+				);
+			}
+			this.disposable_objs.push(roadmarks_geom);
+
+			/* roadmarks mesh */
+			let roadmarks_mesh = new THREE.Mesh(roadmarks_geom, this.roadmarks_material);
+			this.roadmarks_mesh = roadmarks_mesh;
+			roadmarks_mesh.matrixAutoUpdate = false;
+			roadmarks_mesh.visible = !(PARAMS.view_mode == "Outlines") && PARAMS.roadmarks;
+			this.scene.add(roadmarks_mesh);
+
+			//离屏渲染车道线宽度区域
+			const roadmark_picking_mesh = new THREE.Mesh(roadmarks_geom, this.id_material);
+			roadmark_picking_mesh.matrixAutoUpdate = false;
+			this.roadmark_picking_scene.add(roadmark_picking_mesh);
+
+			/* road objects geometry */
+			const odr_road_objects_mesh = odr_road_network_mesh.road_objects_mesh;
+			const road_objects_geom = this.get_geometry(odr_road_objects_mesh);
+			road_objects_geom.attributes.color.array.fill(this.COLORS.road_object);
+			for (const [vert_start_idx, _] of this.getStdMapEntries(
+					odr_road_objects_mesh.road_object_start_indices
+				)) {
+				const vert_idx_interval =
+					odr_roadmarks_mesh.get_idx_interval_roadmark(vert_start_idx);
+				const vert_count = vert_idx_interval[1] - vert_idx_interval[0];
+				const vert_start_idx_encoded = this.encodeUInt32(vert_start_idx);
+				const attr_arr = new Float32Array(vert_count * 4);
+				for (let i = 0; i < vert_count; i++)
+					attr_arr.set(vert_start_idx_encoded, i * 4);
+				roadmarks_geom.attributes.id.array.set(
+					attr_arr,
+					vert_idx_interval[0] * 4
+				);
+			}
+			this.disposable_objs.push(road_objects_geom);
+
+			/* road objects mesh */
+			let road_objects_mesh = new THREE.Mesh(
+				road_objects_geom,
+				this.road_objects_material
+			);
+			this.road_objects_mesh = road_objects_mesh;
+			road_objects_mesh.matrixAutoUpdate = false;
+			this.scene.add(road_objects_mesh);
+
+			/**
+			 * 车道轮廓线
+			 * 道路轮廓线包含车道线,由于每条车道线有宽度,车道轮廓线即为车道线的中心线
+			 * id为0的车道轮廓线和参考线s重合
+			 */
+			const lane_outlines_geom = new THREE.BufferGeometry();
+			lane_outlines_geom.setAttribute(
+				"position",
+				road_network_geom.attributes.position
+			);
+			lane_outlines_geom.setIndex(
+				this.getStdVecEntries(odr_lanes_mesh.get_lane_outline_indices(), true)
+			);
+			let lane_outline_lines = new THREE.LineSegments(
+				lane_outlines_geom,
+				this.lane_outlines_material
+			);
+			this.lane_outline_lines = lane_outline_lines;
+			lane_outline_lines.renderOrder = 9;
+			this.disposable_objs.push(lane_outlines_geom);
+			this.scene.add(lane_outline_lines);
+
+			/**
+			 * 道路轮廓线
+			 */
+			const roadmark_outlines_geom = new THREE.BufferGeometry();
+			roadmark_outlines_geom.setAttribute(
+				"position",
+				roadmarks_geom.attributes.position
+			);
+			roadmark_outlines_geom.setIndex(
+				this.getStdVecEntries(
+					odr_roadmarks_mesh.get_roadmark_outline_indices(),
+					true
+				)
+			);
+			let roadmark_outline_lines = new THREE.LineSegments(
+				roadmark_outlines_geom,
+				this.roadmark_outlines_material
+			);
+			this.roadmark_outline_lines = roadmark_outline_lines;
+			roadmark_outline_lines.renderOrder = 8;
+			roadmark_outline_lines.matrixAutoUpdate = false;
+			this.disposable_objs.push(roadmark_outlines_geom);
+			roadmark_outline_lines.visible = PARAMS.roadmarks;
+			this.scene.add(roadmark_outline_lines);
+
+			/* fit view and camera */
+			const bbox_reflines = new THREE.Box3().setFromObject(refline_lines);
+			const max_diag_dist = bbox_reflines.min.distanceTo(bbox_reflines.max);
+			this.camera.far = max_diag_dist * 1.5;
+			//controls.autoRotate = fit_view;
+
+			this.camera.position.set(0, 0, max_diag_dist / 3);
+			// if (fit_view) {
+			// 	this.camera.position.set(0, 0, 50);
+			// 	// fitViewToBbox(bbox_reflines);
+			// 	//fitViewToBbox(bbox_reflines);
+			// }
+
+			/**
+			 * 网格
+			 */
+			let bbox_center_pt = new THREE.Vector3();
+			bbox_reflines.getCenter(bbox_center_pt);
+			let ground_grid = new THREE.GridHelper(
+				max_diag_dist * 6,
+				max_diag_dist / 10,
+				0x2f4f4f,
+				0x2f4f4f
+			);
+			// console.log(THREE.InfiniteGridHelper)
+			// let ground_grid = THREE.InfiniteGridHelper(10, 10, new THREE.Color(0x2f4f4f), 500);
+			this.ground_grid = ground_grid;
+			ground_grid.geometry.rotateX(Math.PI / 2);
+			ground_grid.position.set(
+				bbox_center_pt.x,
+				bbox_center_pt.y,
+				bbox_reflines.min.z - 0.1
+			);
+			this.disposable_objs.push(ground_grid.geometry);
+			this.scene.add(ground_grid);
+
+			// const rgbeLoader = new RGBELoader();
+			// rgbeLoader.loadAsync("hdr/index8.hdr").then((loader) => {
+			// 	loader.needsUpdate = true;
+			// 	loader.mapping = THREE.EquirectangularRefractionMapping;
+			// 	loader.encoding = THREE.RGBEEncoding; //设置编码属性的值
+			// 	loader.mapping = THREE.EquirectangularRefractionMapping;
+			// 	loader.minFilter = THREE.NearestFilter; //当一个纹素覆盖小于一个像素时,贴图将如何采样
+			// 	loader.magFilter = THREE.NearestFilter; //当一个纹素覆盖大于一个像素时,贴图将如何采样
+			// 	loader.flipY = true; //翻转图像的Y轴以匹配WebGL纹理坐标空间
+			// 	// this.scene.background = new THREE.Color(0x2F4F4F);
+			// 	const sphereGeometry = new THREE.SphereBufferGeometry(max_diag_dist, 100, 100);
+			// 	const sphereMetrial = new THREE.MeshBasicMaterial({
+			// 		color: 0xffffff,
+			// 		map: loader,
+			// 	});
+			// 	const sphereMesh = new THREE.Mesh(sphereGeometry, sphereMetrial);
+			// 	sphereMesh.geometry.scale(1, 1, -1);
+			// 	sphereMesh.rotation.x = Math.PI / 2;
+			// 	this.scene.add(sphereMesh);
+			// });
+			// this.scene.environment = new THREE.Color(0x2F4F4F);
+
+			/**
+			 * 灯光
+			 */
+			this.light.position.set(
+				bbox_reflines.min.x,
+				bbox_reflines.min.y,
+				bbox_reflines.max.z + max_diag_dist
+			);
+			this.light.target.position.set(
+				bbox_center_pt.x,
+				bbox_center_pt.y,
+				bbox_center_pt.z
+			);
+			this.light.position.needsUpdate = true;
+			this.light.target.position.needsUpdate = true;
+			this.light.target.updateMatrixWorld();
+
+			// const t1 = performance.now();
+			// console.log(
+			// 	"Heap size: " + this.ModuleOpenDrive.HEAP8.length / 1024 / 1024 + " mb"
+			// );
+
+
+			//删除数据冗余,避免造成内存泄漏
+			odr_roadmarks_mesh.delete();
+			odr_lanes_mesh.delete();
+			this.animate();
+		},
+		initThreeJs() {
+			// THREE.vertexColors = true;
+			//创建渲染器
+			this.renderer = new THREE.WebGLRenderer({
+				antialias: true, //抗锯齿,防失真
+				sortObjects: false, //定义渲染器是否应对对象进行排序
+				//对数深度缓冲区,防止模型闪烁
+				logarithmicdepthbuffer: true,
+			});
+			//开启投影阴影
+			this.renderer.shadowMap.enabled = true;
+			//设置渲染器渲染区域
+			this.renderer.setSize(window.innerWidth, window.innerHeight);
+			//渲染
+			document.getElementById("ThreeJS").appendChild(this.renderer.domElement);
+			//创建场景
+			this.scene = new THREE.Scene();
+			//创建透视相机
+			this.camera = new THREE.PerspectiveCamera(
+				100,
+				window.innerWidth / window.innerHeight,
+				0.1,
+				100000
+			);
+			//让Z轴朝上+
+			this.camera.up.set(0, 0, 1);
+
+			//创建控制器
+			this.controls = new OrbitControls(this.camera, this.renderer.domElement);
+			//const controls = new THREE.OrbControls(camera, renderer.domElement);
+			// this.controls.addEventListener("start", () => {
+			// 	/**
+			// 	 * 拖动开始停止开启聚集光和停止旋转
+			// 	 */
+			// 	spotlight_paused = true; //聚集光暂停
+			// 	//controls.autoRotate = false; //是否旋转
+			// });
+			// this.controls.addEventListener("end", () => {
+			// 	//拖动结束聚集光关闭并且开启旋转
+			// 	spotlight_paused = false; //聚集光开始
+			// 	//将其设为true,以自动围绕目标旋转。请注意,如果它被启用,你必须在你的动画循环里调用
+			// 	// controls.autoRotate = true;//开启旋转
+			// });
+			// controls.autoRotate = true; //开启旋转
+			//创建平行光
+			this.light;
+			for (let index = 0; index < this.lights.length / 2; index++) {
+				this.light = new THREE.DirectionalLight(0xffffff, 0.6);
+				this.light.position.set(this.lights[2 * index], this.lights[2 * index + 1], 5);
+				this.scene.add(this.light);
+				//平行光方向指向原点(0,0,0)
+				this.scene.add(this.light.target);
+			}
+
+			window.addEventListener("resize", this.onWindowResize, false);
+		},
+		initOffscreen() {
+			//选择车道线场景
+			this.lane_picking_scene = new THREE.Scene();
+			//车道线场景背景颜色
+			this.lane_picking_scene.background = new THREE.Color(0xffffff);
+			//路标场景
+			this.roadmark_picking_scene = new THREE.Scene();
+			//路标场景背景颜色
+			this.roadmark_picking_scene.background = new THREE.Color(0xffffff);
+			//坐标场景
+			this.xyz_scene = new THREE.Scene();
+			//坐标场景背景颜色
+			this.xyz_scene.background = new THREE.Color(0xffffff);
+			this.st_scene = new THREE.Scene();
+			this.st_scene.background = new THREE.Color(0xffffff);
+
+			//创建渲染器
+			this.lane_picking_texture = new THREE.WebGLRenderTarget(1, 1, {
+				type: THREE.FloatType,
+			});
+			this.roadmark_picking_texture = new THREE.WebGLRenderTarget(1, 1, {
+				type: THREE.FloatType,
+			});
+			this.xyz_texture = new THREE.WebGLRenderTarget(1, 1, {
+				type: THREE.FloatType,
+			});
+			this.st_texture = new THREE.WebGLRenderTarget(1, 1, {
+				type: THREE.FloatType,
+			});
+
+		},
+		initMaterial() {
+			//获取顶点着色器
+			const idVertexShader =
+				document.getElementById("idVertexShader").textContent;
+			const idFragmentShader =
+				document.getElementById("idFragmentShader").textContent;
+			const xyzVertexShader =
+				document.getElementById("xyzVertexShader").textContent;
+			const xyzFragmentShader =
+				document.getElementById("xyzFragmentShader").textContent;
+			const stVertexShader =
+				document.getElementById("stVertexShader").textContent;
+			const stFragmentShader =
+				document.getElementById("stFragmentShader").textContent;
+
+			//设置车道中轴线颜色
+			this.refline_material = new THREE.LineBasicMaterial({
+				color: this.COLORS.ref_line,
+				//color: 0x0000ff,
+			});
+
+			//道路线
+			this.lane_outlines_material = new THREE.LineBasicMaterial({
+				color: this.COLORS.lane_outline,
+			});
+
+			//外侧线
+			this.roadmark_outlines_material = new THREE.LineBasicMaterial({
+				color: this.COLORS.roadmark_outline,
+			});
+			this.id_material = new THREE.ShaderMaterial({
+				vertexShader: idVertexShader,
+				fragmentShader: idFragmentShader,
+			});
+			this.xyz_material = new THREE.ShaderMaterial({
+				vertexShader: xyzVertexShader,
+				fragmentShader: xyzFragmentShader,
+			});
+			this.st_material = new THREE.ShaderMaterial({
+				vertexShader: stVertexShader,
+				fragmentShader: stFragmentShader,
+			});
+			this.roadmarks_material = new THREE.MeshBasicMaterial({
+				vertexColors: true,
+			});
+			this.road_objects_material = new THREE.MeshBasicMaterial({
+				vertexColors: true,
+				side: THREE.DoubleSide,
+				wireframe: true,
+			});
+
+			this.road_network_material = new THREE.MeshPhongMaterial({
+				vertexColors: THREE.VertexColors,
+				wireframe: PARAMS.wireframe, //显示现况
+				shininess: 20.0,
+				transparent: true,
+				opacity: 0.4,
+			});
+		},
+		animate() {
+			//控制电脑帧频,防止刷屏过快导致的页面刷3D数据刷新过快 控制每秒30次
+			setTimeout(() => {
+				window.requestAnimationFrame(this.animate);
+			}, 1000 / 30);
+			this.controls.update();
+			this.camera.setViewOffset(
+				this.renderer.domElement.width, //画布的宽度
+				this.renderer.domElement.height, //画布的高度
+				(this.renderer.domElement.width / 2) | 0, //画布坐标系中,相机的x坐标位置
+				(this.renderer.domElement.height / 2) | 0, //画布坐标系中,相机的y坐标位置
+				1, //副相机的宽度
+				1 //副相机的高度
+			);
+			//离屏渲染
+			this.renderer.setRenderTarget(this.lane_picking_texture);
+			this.renderer.render(this.lane_picking_scene, this.camera);
+
+			this.renderer.setRenderTarget(this.roadmark_picking_texture);
+			this.renderer.render(this.roadmark_picking_scene, this.camera);
+
+			this.renderer.setRenderTarget(this.xyz_texture);
+			this.renderer.render(this.xyz_scene, this.camera);
+
+			this.renderer.setRenderTarget(this.st_texture);
+			this.renderer.render(this.st_scene, this.camera);
+
+			const lane_id_pixel_buffer = new Float32Array(4);
+			this.renderer.readRenderTargetPixels(
+				this.lane_picking_texture,
+				0,
+				0,
+				1,
+				1,
+				this.lane_id_pixel_buffer
+			);
+			const roadmark_id_pixel_buffer = new Float32Array(4);
+			this.renderer.readRenderTargetPixels(
+				this.roadmark_picking_texture,
+				0,
+				0,
+				1,
+				1,
+				this.roadmark_id_pixel_buffer
+			);
+			const xyz_pixel_buffer = new Float32Array(4);
+			this.renderer.readRenderTargetPixels(
+				this.xyz_texture,
+				0,
+				0,
+				1,
+				1,
+				this.xyz_pixel_buffer
+			);
+			xyz_pixel_buffer[0] += this.OpenDriveMap.x_offs;
+			xyz_pixel_buffer[1] += this.OpenDriveMap.y_offs;
+			const st_pixel_buffer = new Float32Array(4);
+			this.renderer.readRenderTargetPixels(
+				this.st_texture,
+				0,
+				0,
+				1,
+				1,
+				this.st_pixel_buffer
+			);
+
+			this.camera.clearViewOffset();
+			this.renderer.setRenderTarget(null);
+
+			if (this.isValid(lane_id_pixel_buffer) && false) {
+				const decoded_lane_id = this.decodeUInt32(lane_id_pixel_buffer);
+				const odr_lanes_mesh =
+					this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
+				if (this.INTERSECTED_LANE_ID != decoded_lane_id) {
+					if (this.INTERSECTED_LANE_ID != 0xffffffff) {
+						this.road_network_mesh.geometry.attributes.color.array.fill(
+							this.COLORS.road
+						);
+					}
+
+					this.INTERSECTED_LANE_ID = decoded_lane_id;
+					const lane_vert_idx_interval =
+						odr_lanes_mesh.get_idx_interval_lane(this.INTERSECTED_LANE_ID);
+					const vert_count =
+						lane_vert_idx_interval[1] - lane_vert_idx_interval[0];
+					this.applyVertexColors(
+						this.road_network_mesh.geometry.attributes.color,
+						new THREE.Color(this.COLORS.lane_highlight),
+						lane_vert_idx_interval[0],
+						vert_count
+					);
+					this.road_network_mesh.geometry.attributes.color.needsUpdate = true;
+				}
+				odr_lanes_mesh.delete();
+			} else {
+				if (this.INTERSECTED_LANE_ID != 0xffffffff) {
+					const odr_lanes_mesh =
+						this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
+					const lane_vert_idx_interval =
+						odr_lanes_mesh.get_idx_interval_lane(this.INTERSECTED_LANE_ID);
+					this.road_network_mesh.geometry.attributes.color.array.fill(this.COLORS.road);
+					this.road_network_mesh.geometry.attributes.color.needsUpdate = true;
+					odr_lanes_mesh.delete();
+					this.INTERSECTED_LANE_ID = 0xffffffff;
+				}
+			}
+
+			if (this.isValid(roadmark_id_pixel_buffer)) {
+				//获取
+				const decoded_roadmark_id = this.decodeUInt32(roadmark_id_pixel_buffer);
+				const odr_roadmarks_mesh =
+					this.road_network_mesh.userData.odr_road_network_mesh.roadmarks_mesh;
+				if (this.INTERSECTED_ROADMARK_ID != decoded_roadmark_id) {
+					if (this.INTERSECTED_ROADMARK_ID != 0xffffffff) {
+						const prev_roadmark_vert_idx_interval =
+							odr_roadmarks_mesh.get_idx_interval_roadmark(
+								this.INTERSECTED_ROADMARK_ID
+							);
+						this.roadmarks_mesh.geometry.attributes.color.array.fill(
+							this.COLORS.roadmark,
+							prev_roadmark_vert_idx_interval[0] * 3,
+							prev_roadmark_vert_idx_interval[1] * 3
+						);
+					}
+					this.INTERSECTED_ROADMARK_ID = decoded_roadmark_id;
+					const roadmark_vert_idx_interval =
+						odr_roadmarks_mesh.get_idx_interval_roadmark(
+							this.INTERSECTED_ROADMARK_ID
+						);
+					const vert_count =
+						roadmark_vert_idx_interval[1] - roadmark_vert_idx_interval[0];
+					this.applyVertexColors(
+						this.roadmarks_mesh.geometry.attributes.color,
+						new THREE.Color(this.COLORS.roadmark_highlight),
+						roadmark_vert_idx_interval[0],
+						vert_count
+					);
+					this.roadmarks_mesh.geometry.attributes.color.needsUpdate = true;
+				}
+				odr_roadmarks_mesh.delete();
+			} else {
+				if (this.INTERSECTED_ROADMARK_ID != 0xffffffff) {
+					const odr_roadmarks_mesh =
+						this.road_network_mesh.userData.odr_road_network_mesh.roadmarks_mesh;
+					const roadmark_vert_idx_interval =
+						odr_roadmarks_mesh.get_idx_interval_lane(this.INTERSECTED_ROADMARK_ID);
+					this.roadmarks_mesh.geometry.attributes.color.array.fill(
+						this.COLORS.roadmark,
+						roadmark_vert_idx_interval[0] * 3,
+						roadmark_vert_idx_interval[1] * 3
+					);
+					this.roadmarks_mesh.geometry.attributes.color.needsUpdate = true;
+					this.INTERSECTED_ROADMARK_ID = 0xffffffff;
+					odr_roadmarks_mesh.delete();
+				}
+			}
+
+			if (this.INTERSECTED_LANE_ID != 0xffffffff) {
+				const odr_lanes_mesh =
+					this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
+				const road_id = odr_lanes_mesh.get_road_id(this.INTERSECTED_LANE_ID);
+				const lanesec_s0 = odr_lanes_mesh.get_lanesec_s0(this.INTERSECTED_LANE_ID);
+				const lane_id = odr_lanes_mesh.get_lane_id(this.INTERSECTED_LANE_ID);
+				const lane_type = this.OpenDriveMap.roads
+					.get(road_id)
+					.s_to_lanesection.get(lanesec_s0)
+					.id_to_lane.get(lane_id).type;
+				odr_lanes_mesh.delete();
+			}
+			this.renderer.render(this.scene, this.camera);
+		},
+		fillColorLine(roadId, lineId) {
+			lineId = this.mappingLineId.get(roadId + ":" + lineId);
+			const odr_lanes_mesh = this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
+			const lane_vert_idx_interval = odr_lanes_mesh.get_idx_interval_lane(lineId);
+			const vert_count = (lane_vert_idx_interval[1] - lane_vert_idx_interval[0]);
+			this.applyVertexColors(this.road_network_mesh.geometry.attributes.color, new THREE.Color(this.COLORS
+					.lane_highlight),
+				lane_vert_idx_interval[0], vert_count);
+			this.road_network_mesh.geometry.attributes.color.needsUpdate = true;
+			odr_lanes_mesh.delete();
+		},
+		clearColorLine(roadId, lineId) {
+			lineId = this.mappingLineId.get(roadId + ":" + lineId);
+			const odr_lanes_mesh = this.road_network_mesh.userData.odr_road_network_mesh.lanes_mesh;
+			const lane_vert_idx_interval = odr_lanes_mesh.get_idx_interval_lane(lineId);
+			const vert_count = (lane_vert_idx_interval[1] - lane_vert_idx_interval[0]);
+			this.road_network_mesh.geometry.attributes.color.array.fill(
+				this.COLORS.road
+			);
+			this.road_network_mesh.geometry.attributes.color.needsUpdate = true;
+			odr_lanes_mesh.delete();
+		},
+		onWindowResize() {
+			this.camera.aspect = window.innerWidth / window.innerHeight;
+			this.camera.updateProjectionMatrix();
+			this.renderer.setSize(window.innerWidth, window.innerHeight);
+			this.renderer.setPixelRatio(window.devicePixelRatio);
+		},
+		init() {
+			this.initThreeJs();
+			this.initOffscreen();
+			this.initMaterial();
+		}
+	}
+}

+ 0 - 1
src/router/filter.js

@@ -11,7 +11,6 @@ Router.prototype.push = function push(location) {
 
 // http://localhost:8082/?code=1&ticket=1
 router.beforeEach(async (to, from, next) => {
-
     let {
         code,
         ticket

+ 111 - 94
src/router/index.js

@@ -1,5 +1,6 @@
 import Vue from "vue";
 import VueRouter from "vue-router";
+import store from '../store'
 
 import modelLibrary from "./modelLibrary"; // 模型库
 import algorithmsLibrary from "./algorithmsLibrary"; // 算法库
@@ -11,113 +12,124 @@ import personalInformation from "./personalInformation"
 Vue.use(VueRouter);
 
 const routes = [{
-    path: "/login",
-    name: "login",
-    component: () => import("../views/login.vue")
+  path: "/login",
+  name: "login",
+  component: () => import("../views/login.vue")
+},
+{
+  path: "/",
+  name: "index",
+  meta: {
+    tabname: "首页"
   },
-  {
-    path: "/",
-    name: "index",
-    meta: {
-      tabname: "首页"
+  component: () => import('../views/index'),
+  redirect: '/mainPage',
+  children: [
+    {
+      path: "/mainPage",
+      name: "mainPage",
+      meta: {
+        // tabname: "首页"
+        login: true
+      },
+      component: () => import("@/views/mainPage.vue")
     },
-    component: () => import('../views/index'),
-    redirect: '/mainPage',
-    children: [
-      {
-        path: "/mainPage",
-        name: "mainPage",
-        meta: {
-          // tabname: "首页"
-          login: true
-        },
-        component: () => import("@/views/mainPage.vue")
+    {
+      path: "/modelLibrary",
+      name: "modelLibrary",
+      meta: {
+        tabname: "模型库",
+        login: true
       },
-      {
-        path: "/modelLibrary",
-        name: "modelLibrary",
-        meta: {
-          tabname: "模型库",
-          login: true
-        },
-        component: () => import("@/views/modelLibrary/index"),
-        redirect: '/index',
-        children: modelLibrary,
+      component: () => import("@/views/modelLibrary/index"),
+      redirect: '/index',
+      children: modelLibrary,
+    },
+    {
+      path: "/algorithmsLibrary",
+      name: "algorithmsLibrary",
+      meta: {
+        tabname: "算法库",
+        login: true
       },
-      {
-        path: "/algorithmsLibrary",
-        name: "algorithmsLibrary",
-        meta: {
-          tabname: "算法库",
-          login: true
-        },
-        component: () => import("@/views/algorithmsLibrary/index"),
-        redirect: '/index',
-        children: algorithmsLibrary,
+      component: () => import("@/views/algorithmsLibrary/index"),
+      redirect: '/index',
+      children: algorithmsLibrary,
+    },
+    {
+      path: "/sceneLibrary",
+      name: "sceneLibrary",
+      meta: {
+        tabname: "场景库",
+        login: true
       },
-      {
-        path: "/sceneLibrary",
-        name: "sceneLibrary",
-        meta: {
-          tabname: "场景库",
-          login: true
-        },
-        component: () => import("@/views/sceneLibrary/index"),
-        redirect: '/index',
-        children: sceneLibrary,
+      component: () => import("@/views/sceneLibrary/index"),
+      redirect: '/index',
+      children: sceneLibrary,
+    },
+    // {
+    //   path: "/multimodeSimulation",
+    //   name: "multimodeSimulation",
+    //   meta: {
+    //     tabname: "工作管理",
+    //     login: true
+    //   },
+    //   component: () => import("@/views/multimodeSimulation/index"),
+    //   redirect: '/index',
+    //   children: multimodeSimulation,
+    // },
+    {
+      path: "/workManagement",
+      name: "workManagement",
+      meta: {
+        tabname: "工作管理",
+        login: true
       },
-      {
-        path: "/workManagement",
-        name: "workManagement",
-        meta: {
-          tabname: "工作管理",
-          login: true
-        },
-        component: () => import("@/views/workManagement/index"),
-        redirect: '/index',
-        children: workManagement,
+      component: () => import("@/views/workManagement/index"),
+      redirect: '/index',
+      children: workManagement,
+    },
+    {
+      path: "/systemManagement",
+      name: "systemManagement",
+      meta: {
+        tabname: "系统管理",
+        login: true
       },
-      {
-        path: "/systemManagement",
-        name: "systemManagement",
-        meta: {
-          tabname: "系统管理",
-          login: true
-        },
-        component: () => import("@/views/systemManagement/index"),
-        redirect: '/index',
-        children: systemManagement,
-      }, 
-      {
-        path: "/personalInformation",
-        name: "personalInformation",
-        meta: {
-          tabname: "个人信息",
-          login: true
-        },
-        component: () => import("@/views/personalInformation/personalInformation"),
-        // redirect: '/index',
-        // children: personalInformation,
-      }, 
-    ]
-    // .concat([{
-    //   path: "*",
-    //   name: "*",
-    //   component: () => import("../views/mainPage.vue")
-    // }, ]),
-  },
-  {
-    path: "*",
-    name: "*",
-    component: () => import("@/views/mainPage.vue")
-  }
+      component: () => import("@/views/systemManagement/index"),
+      redirect: '/index',
+      children: systemManagement,
+    },
+    {
+      path: "/personalInformation",
+      name: "personalInformation",
+      meta: {
+        tabname: "个人信息",
+        login: true
+      },
+      component: () => import("@/views/personalInformation/personalInformation"),
+      // redirect: '/index',
+      // children: personalInformation,
+    },
+  ]
+  // .concat([{
+  //   path: "*",
+  //   name: "*",
+  //   component: () => import("../views/mainPage.vue")
+  // }, ]),
+},
+{
+  path: "*",
+  name: "*",
+  component: () => import("@/views/mainPage.vue")
+}
 ];
 
 const router = new VueRouter({
   mode: "history",
   base: process.env.BASE_URL,
   routes,
-  scrollBehavior(to, from, savedPosition) {
+  scrollBehavior (to, from, savedPosition) {
     return {
       x: 0,
       y: 0
@@ -125,4 +137,9 @@ const router = new VueRouter({
   }
 });
 
+router.beforeEach((to, from, next) => {
+  store.commit('setSceneLock', from.path === '/sceneEvaluation' ? true : false)
+  next()
+})
+
 export default router;

+ 45 - 0
src/router/multimodeSimulation.js

@@ -0,0 +1,45 @@
+// 多模式仿真模块路由
+export default [
+    {
+        path: "/multimodeSimulation",
+        name: "simulationHome",
+        meta: {
+            tabname: "多模式仿真",
+            menuKind: "multimodeSimulation",
+            login: true
+        },
+        component: () => import("@/views/multimodeSimulation/simulationHome.vue"),
+        children:[
+            {
+                path: "simulationEdit",
+                name: "simulationEdit",
+                meta: {
+                    tabname: "多模式仿真详情",
+                    menuKind: "multimodeSimulation",
+                    login: true
+                },
+                component: () => import("@/views/multimodeSimulation/simulationEdit.vue"),
+            },
+        ]
+    },
+    {
+        path: "/evaluationResults",
+        name: "evaluationResults",
+        meta: {
+            tabname: "评价结果",
+            menuKind: "evaluationResults",
+            login: true
+        },
+        component: () => import("@/views/multimodeSimulation/evaluationResults.vue"),
+    },
+    {
+        path: "/simulationMap",
+        name: "simulationMap",
+        meta: {
+            tabname: "地图上传",
+            menuKind: "simulationMap",
+            login: true
+        },
+        component: () => import("@/views/multimodeSimulation/simulationMap.vue"),
+    },
+]

+ 21 - 0
src/router/sceneLibrary.js

@@ -38,6 +38,27 @@ export default [{
         },
         component: () => import("@/views/sceneLibrary/generalizationScenarioList")
     },
+    {
+        path:"/benchmarkScenarioList",
+        name:"benchmarkScenarioList",
+        meta:{
+            tabname: "基准场景库",
+            menuKind: "benchmarkScenarioList",
+            login: true
+        },
+        component: () => import("@/views/sceneLibrary/benchmarkScenarioList"),
+    },
+    {
+        
+        path:"/sceneEvaluation",
+        name:"sceneEvaluation",
+        meta:{
+            tabname: "场景评价",
+            menuKind: "sceneEvaluation",
+            login: true
+        },
+        component: () => import("@/views/sceneLibrary/sceneEvaluation"),
+    },
     {
         path: "/scenarioTestPackageManagementList",
         name: "scenarioTestPackageManagementList",

+ 108 - 33
src/router/workManagement.js

@@ -1,4 +1,5 @@
-export default [{
+export default [
+    {
         path: "/manualRunProjectList",
         name: "manualRunProjectList",
         meta: {
@@ -7,16 +8,17 @@ export default [{
             login: true
         },
         component: () => import("@/views/workManagement/manualRunProjectList"),
-        children: [{
-            path: "projectInfo",
-            name: "projectInfo",
-            meta: {
-                tabname: "项目详情",
-                menuKind: "workManagement",
-                login: true
-            },
-            component: () => import("@/views/workManagement/projectInfo"),
-            children: [{
+        children: [
+            {
+                path: "projectInfo",
+                name: "projectInfo",
+                meta: {
+                    tabname: "项目详情",
+                    menuKind: "workManagement",
+                    login: true
+                },
+                component: () => import("@/views/workManagement/projectInfo"),
+                children: [{
                     path: "taskInfo",
                     name: "taskInfo",
                     meta: {
@@ -36,8 +38,17 @@ export default [{
                     },
                     component: () => import("@/views/workManagement/evaluationReport")
                 },
-            ]
-        }, ]
+                {
+                    path: "sceneReport",
+                    name: "sceneReport",
+                    meta: {
+                      tabname: "评价报告",
+                      login: true
+                    },
+                    component: () => import("@/views/workManagement/sceneReport")
+                  },
+                ]
+            },]
     },
     {
         path: "/manualRunProjectDetail",
@@ -49,7 +60,6 @@ export default [{
         },
         component: () => import("@/views/workManagement/manualRunProjectDetail")
     },
-
     {
         path: "/autoRunProjectList",
         name: "autoRunProjectList",
@@ -78,28 +88,28 @@ export default [{
                 },
                 component: () => import("@/views/workManagement/projectInfo"),
                 children: [{
-                        path: "taskInfo",
-                        name: "taskInfo",
-                        meta: {
-                            tabname: "任务详情",
-                            menuKind: "workManagement",
-                            login: true
-                        },
-                        component: () => import("@/views/workManagement/taskInfo")
+                    path: "taskInfo",
+                    name: "taskInfo",
+                    meta: {
+                        tabname: "任务详情",
+                        menuKind: "workManagement",
+                        login: true
                     },
-                    {
-                        path: "evaluationReport",
-                        name: "evaluationReport",
-                        meta: {
-                            tabname: "评价报告",
-                            menuKind: "workManagement",
-                            login: true
-                        },
-                        component: () => import("@/views/workManagement/evaluationReport")
+                    component: () => import("@/views/workManagement/taskInfo")
+                },
+                {
+                    path: "evaluationReport",
+                    name: "evaluationReport",
+                    meta: {
+                        tabname: "评价报告",
+                        menuKind: "workManagement",
+                        login: true
                     },
+                    component: () => import("@/views/workManagement/evaluationReport")
+                },
                 ]
-            }, ]
-        }, ]
+            },]
+        },]
     },
     {
         path: "/autoRunProjectDetail",
@@ -111,4 +121,69 @@ export default [{
         },
         component: () => import("@/views/workManagement/autoRunProjectDetail")
     },
+    // 仿真模式
+    {
+        path: "/multimodeSimulation",
+        name: "multimodeSimulation",
+        meta: {
+            tabname: "多模式仿真",
+            menuKind: "workManagement",
+            login: true
+        },
+        component: () => import("@/views/workManagement/simulationHome.vue"),
+        children: [{
+            path: "simulationMap",
+            name: "simulationMap",
+            meta: {
+                tabname: "地图管理",
+                menuKind: "workManagement",
+                login: true
+            },
+            component: () => import("@/views/workManagement/simulationMap")
+        },
+        {
+            path: "simulationEdit",
+            name: "simulationEdit",
+            meta: {
+                tabname: "多模式仿真详情",
+                menuKind: "workManagement",
+                login: true
+            },
+            component: () => import("@/views/workManagement/simulationEdit.vue"),
+            children:[
+                {
+                    path: "multimodeSimulationEdit",
+                    name: "multimodeSimulationEdit",
+                    meta: {
+                        tabname: "场景编辑",
+                        menuKind: "workManagement",
+                        login: true
+                    },
+                    component: () => import("@/views/workManagement/multimodeSimulationEdit")
+                },
+            ]
+        },
+        {
+            path: "simulationEvaluate",
+            name: "simulationEvaluate",
+            meta: {
+                tabname: "多模式仿真评价",
+                menuKind: "workManagement",
+                login: true
+            },
+            component: () => import("@/views/workManagement/simulationEvaluate.vue"),
+            children:[
+                {
+                    path: "evaluationResults",
+                    meta: {
+                        tabname: "评价结果",
+                        menuKind: "workManagement",
+                        login: true
+                    },
+                    component: () => import("@/views/workManagement/evaluationResults.vue"),
+                },
+            ]
+        }]
+    },
+
 ]

+ 27 - 7
src/store/index.js

@@ -20,6 +20,7 @@ export default new Vuex.Store({
     useType: '', //独占类型
     scale: 1.5, // 物体加载换算倍数
     scaleRate: 1.8, // 处理矿车等需要微调的
+    evaluateTabname:"",
     projectInfoTabname: "",
     taskInfoTabname: "",
     vehicleConfigurationDetailTabName: "", // 车辆配置详情
@@ -33,29 +34,48 @@ export default new Vuex.Store({
     scenePacketDistributionDetailTabName: "", // 场景包分配详情
     editAccountTabName: "", // 编辑账户详情
     vehicleModelDetailTabName: "", // 车辆设置详情
+    evaluationInfo: {}, // 场景评价编辑信息
+    sceneId: "", // 场景id
+    sceneCurPage: 1,// 分页
+    sceneLock:false, // 分页记忆锁
   },
   mutations: {
-    getUserId(state, data) {
+    getUserId (state, data) {
       state.id = data
     },
-    getUsername(state, data) {
+    getUsername (state, data) {
       state.username = data
     },
-    getRoleCode(state, data) {
+    getRoleCode (state, data) {
       state.roleCode = data
     },
-    getUseType(state, data) {
+    getUseType (state, data) {
       state.useType = data
     },
-    getProjectInfoTabname(state, data) {
+    getProjectInfoTabname (state, data) {
       state.projectInfoTabname = data
     },
-    getTaskInfoTabname(state, data) {
+    getEvaluateTabname(state,data){
+      state.evaluateTabname = data
+    },
+    getTaskInfoTabname (state, data) {
       state.taskInfoTabname = data
     },
-    getTabname(state, name, data) {
+    getTabname (state, name, data) {
       state[name] = data
     },
+    getEvaluationInfo (state, data) {
+      state.evaluationInfo = data
+    },
+    getSceneId (state, data) {
+      state.sceneId = data
+    },
+    getSceneCurPage(state, data){
+      state.sceneCurPage = data
+    },
+    setSceneLock(state,data){
+      state.sceneLock = data
+    }
   },
   actions: {},
   modules: {},

+ 262 - 231
src/views/page/breadCrumb.vue

@@ -1,265 +1,296 @@
 <template>
-    <div class="breadCrumbPanel">
-        <div class="contentClass">
-            <el-breadcrumb separator="/">
-                <transition-group name="breadcrumb">
-                    <el-breadcrumb-item v-for="(item, index) in list" :key="item.path + item.name">
-                        <router-link v-if="!disabledRoutes.includes(item.name)" @click="console.log(item)" :to="
-                            item.name !== $route.name
-                                ? item.fullPath
-                                    ? item.fullPath
-                                    : item.path
-                                        ? item.path
-                                        : '/'
-                                : $route.fullPath
-                        ">
-                            <i class="el-icon-folder-opened" v-if="index > 0 && index === list.length - 1"></i>
-                            {{ item.meta.tabname }}
-                        </router-link>
-                        <span v-else style="line-height: 20px">{{
-                            item.meta.tabname
-                        }}</span>
-                    </el-breadcrumb-item>
-                </transition-group>
-            </el-breadcrumb>
-        </div>
+  <div class="breadCrumbPanel">
+    <div class="contentClass">
+      <el-breadcrumb separator="/">
+        <transition-group name="breadcrumb">
+          <el-breadcrumb-item
+            v-for="(item, index) in list"
+            :key="item.path + item.name"
+          >
+            <router-link
+              v-if="!disabledRoutes.includes(item.name)"
+              @click="console.log(item)"
+              :to="
+                item.name !== $route.name
+                  ? item.fullPath
+                    ? item.fullPath
+                    : item.path
+                    ? item.path
+                    : '/'
+                  : $route.fullPath
+              "
+            >
+              <i
+                class="el-icon-folder-opened"
+                v-if="index > 0 && index === list.length - 1"
+              ></i>
+              {{ item.meta.tabname }}
+            </router-link>
+            <span v-else style="line-height: 20px">{{
+              item.meta.tabname
+            }}</span>
+          </el-breadcrumb-item>
+        </transition-group>
+      </el-breadcrumb>
+    </div>
 
-        <div class="nameBox">
-            <div>{{ $store.state.username }}</div>
-            <div class="el-icon-switch-button exit" @click="exit"></div>
-        </div>
+    <div class="nameBox">
+      <div>{{ $store.state.username }}</div>
+      <div class="el-icon-switch-button exit" @click="exit"></div>
     </div>
+  </div>
 </template>
 
 <script>
-import { mapState } from "vuex";
+import { mapState } from 'vuex'
 export default {
-    name: "breadCrumb",
-    data() {
-        return {
-            // 相关页面只为占位,页面是空白,无法展示
-            disabledRoutes: [
-                "modelLibrary",
-                "algorithmsLibrary",
-                "sceneLibrary",
-                "systemManagement",
-                "workManagement",
-            ],
-        };
-    },
-    methods: {
-        exit() {
-            this.$confirm("是否确定退出系统?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            })
-                .then(() => {
-                    localStorage.clear();
-                    // let loginUrl = window.location.origin + "/login";
-                    // window.location.href = loginUrl;
-                    this.$router.push({
-                        path: "/login",
-                    });
-                })
-                .catch(() => { });
-        },
+  name: 'breadCrumb',
+  data() {
+    return {
+      // 相关页面只为占位,页面是空白,无法展示
+      disabledRoutes: [
+        'modelLibrary',
+        'algorithmsLibrary',
+        'sceneLibrary',
+        'systemManagement',
+        'workManagement',
+      ],
+    }
+  },
+  methods: {
+    exit() {
+      this.$confirm('是否确定退出系统?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(() => {
+          localStorage.clear()
+          // let loginUrl = window.location.origin + "/login";
+          // window.location.href = loginUrl;
+          this.$router.push({
+            path: '/login',
+          })
+        })
+        .catch(() => {})
     },
-    computed: {
-        ...mapState([
-            "projectInfoTabname", "taskInfoTabname", "vehicleConfigurationDetailTabName",
-            "exportAlgorithmsTabName", "gitAlgorithmsTabName", "gradingRuleDetailTabName",
-            "scenePacketListTabName", "parameterDetailTabName", "clusteringDetailTabName",
-            "scenePacketDetailTabName", "scenePacketDistributionDetailTabName", "editAccountTabName",
-            "vehicleModelDetailTabName",
-        ]),
-        list() {
-            // console.log(this.$route);
-            let isMainPage = false;
-            this.$route.matched.filter((item) => {
-                // 项目详情和任务详情的tabname需要动态获取
-                if (item.name === "projectInfo") {
-                    item.meta.tabname =
-                        this.projectInfoTabname ||
-                        localStorage.getItem("projectInfoTabname") ||
-                        "项目详情";
-                }
+  },
+  computed: {
+    ...mapState([
+      'projectInfoTabname',
+      'taskInfoTabname',
+      'vehicleConfigurationDetailTabName',
+      'exportAlgorithmsTabName',
+      'gitAlgorithmsTabName',
+      'gradingRuleDetailTabName',
+      'scenePacketListTabName',
+      'parameterDetailTabName',
+      'clusteringDetailTabName',
+      'scenePacketDetailTabName',
+      'scenePacketDistributionDetailTabName',
+      'editAccountTabName',
+      'vehicleModelDetailTabName',
+      'evaluateTabname'
+    ]),
+    list() {
+      let isMainPage = false
+      this.$route.matched.filter((item) => {
+        if (item.name === 'simulationEdit') {
+          item.meta.tabname =
+            this.evaluateTabname ||
+            localStorage.getItem('evaluateTabname') ||
+            '多模式仿真详情'
+        }
 
-                if (item.name === "taskInfo") {
-                    item.meta.tabname =
-                        this.taskInfoTabname ||
-                        localStorage.getItem("taskInfoTabname") ||
-                        "任务详情";
-                }
+        if (item.name === 'simulationEvaluate') {
+          item.meta.tabname =
+            this.evaluateTabname ||
+            localStorage.getItem('evaluateTabname') ||
+            '多模式仿真评价'
+        }
 
-                if (item.name === "vehicleConfigurationDetail") {
-                    item.meta.tabname =
-                        this.vehicleConfigurationDetailTabName ||
-                        localStorage.getItem("vehicleConfigurationDetailTabName") ||
-                        "车辆配置详情";
-                } else if (item.name === "exportAlgorithms") {
-                    item.meta.tabname =
-                        this.exportAlgorithmsTabName ||
-                        localStorage.getItem("exportAlgorithmsTabName") ||
-                        "导入算法";
-                } else if (item.name === "gitAlgorithms") {
-                    item.meta.tabname =
-                        this.gitAlgorithmsTabName ||
-                        localStorage.getItem("gitAlgorithmsTabName") ||
-                        "仓库算法";
-                } else if (item.name === "gradingRuleDetail") {
-                    item.meta.tabname =
-                        this.gradingRuleDetailTabName ||
-                        localStorage.getItem("gradingRuleDetailTabName") ||
-                        "评分规则详情";
-                } else if (item.name === "scenePacketList") {
-                    item.meta.tabname =
-                        this.scenePacketListTabName ||
-                        localStorage.getItem("scenePacketListTabName") ||
-                        "场景测试包";
-                } else if (item.name === "parameterDetail") {
-                    item.meta.tabname =
-                        this.parameterDetailTabName ||
-                        localStorage.getItem("parameterDetailTabName") ||
-                        "编辑参数配置";
-                } else if (item.name === "clusteringDetail") {
-                    item.meta.tabname =
-                        this.clusteringDetailTabName ||
-                        localStorage.getItem("clusteringDetailTabName") ||
-                        "编辑集群配置";
-                } else if (item.name === "scenePacketDetail") {
-                    item.meta.tabname =
-                        this.scenePacketDetailTabName ||
-                        localStorage.getItem("scenePacketDetailTabName") ||
-                        "场景包详情";
-                } else if (item.name === "scenePacketDistributionDetail") {
-                    item.meta.tabname =
-                        this.scenePacketDistributionDetailTabName ||
-                        localStorage.getItem("scenePacketDistributionDetailTabName") ||
-                        "场景包分配详情";
-                } else if (item.name === "editAccount") {
-                    item.meta.tabname =
-                        this.editAccountTabName ||
-                        localStorage.getItem("editAccountTabName") ||
-                        "编辑账户";
-                } else if (item.name === "vehicleModelDetail") {
-                    item.meta.tabname =
-                        this.vehicleModelDetailTabName ||
-                        localStorage.getItem("vehicleModelDetailTabName") ||
-                        "车辆设置详情";
-                }
+        // 项目详情和任务详情的tabname需要动态获取
+        if (item.name === 'projectInfo') {
+          item.meta.tabname =
+            this.projectInfoTabname ||
+            localStorage.getItem('projectInfoTabname') ||
+            '项目详情'
+        }
+
+        if (item.name === 'taskInfo') {
+          item.meta.tabname =
+            this.taskInfoTabname ||
+            localStorage.getItem('taskInfoTabname') ||
+            '任务详情'
+        }
 
-                if (item.name === this.$route.name) {
-                    item.fullPath = this.$route.fullPath;
-                }
+        if (item.name === 'vehicleConfigurationDetail') {
+          item.meta.tabname =
+            this.vehicleConfigurationDetailTabName ||
+            localStorage.getItem('vehicleConfigurationDetailTabName') ||
+            '车辆配置详情'
+        } else if (item.name === 'exportAlgorithms') {
+          item.meta.tabname =
+            this.exportAlgorithmsTabName ||
+            localStorage.getItem('exportAlgorithmsTabName') ||
+            '导入算法'
+        } else if (item.name === 'gitAlgorithms') {
+          item.meta.tabname =
+            this.gitAlgorithmsTabName ||
+            localStorage.getItem('gitAlgorithmsTabName') ||
+            '仓库算法'
+        } else if (item.name === 'gradingRuleDetail') {
+          item.meta.tabname =
+            this.gradingRuleDetailTabName ||
+            localStorage.getItem('gradingRuleDetailTabName') ||
+            '评分规则详情'
+        } else if (item.name === 'scenePacketList') {
+          item.meta.tabname =
+            this.scenePacketListTabName ||
+            localStorage.getItem('scenePacketListTabName') ||
+            '场景测试包'
+        } else if (item.name === 'parameterDetail') {
+          item.meta.tabname =
+            this.parameterDetailTabName ||
+            localStorage.getItem('parameterDetailTabName') ||
+            '编辑参数配置'
+        } else if (item.name === 'clusteringDetail') {
+          item.meta.tabname =
+            this.clusteringDetailTabName ||
+            localStorage.getItem('clusteringDetailTabName') ||
+            '编辑集群配置'
+        } else if (item.name === 'scenePacketDetail') {
+          item.meta.tabname =
+            this.scenePacketDetailTabName ||
+            localStorage.getItem('scenePacketDetailTabName') ||
+            '场景包详情'
+        } else if (item.name === 'scenePacketDistributionDetail') {
+          item.meta.tabname =
+            this.scenePacketDistributionDetailTabName ||
+            localStorage.getItem('scenePacketDistributionDetailTabName') ||
+            '场景包分配详情'
+        } else if (item.name === 'editAccount') {
+          item.meta.tabname =
+            this.editAccountTabName ||
+            localStorage.getItem('editAccountTabName') ||
+            '编辑账户'
+        } else if (item.name === 'vehicleModelDetail') {
+          item.meta.tabname =
+            this.vehicleModelDetailTabName ||
+            localStorage.getItem('vehicleModelDetailTabName') ||
+            '车辆设置详情'
+        }
 
-                if (item.name === "mainPage") {
-                    isMainPage = true;
-                }
-            });
-            if (isMainPage) {
-                // 如果跳转首页,会有 / 需要去掉
-                return this.$route.matched.slice(0, 1);
-            } else {
-                // 不要第一个显示首页的
-                return this.$route.matched.slice(1);
-            }
-        },
+        if (item.name === this.$route.name) {
+          item.fullPath = this.$route.fullPath
+        }
+
+        if (item.name === 'mainPage') {
+          isMainPage = true
+        }
+      })
+      if (isMainPage) {
+        // 如果跳转首页,会有 / 需要去掉
+        return this.$route.matched.slice(0, 1)
+      } else {
+        // 不要第一个显示首页的
+        return this.$route.matched.slice(1)
+      }
     },
-};
+  },
+}
 </script>
 
 <style lang="less" scoped>
 .breadCrumbPanel {
-    position: fixed;
-    top: 0;
-    left: 150px;
-    right: 0;
-    bottom: 0;
-    z-index: 666;
-    height: 50px;
-    line-height: 48px;
-    border-bottom: 2px solid #f5f7fa;
-    background-color: #ffffff;
-    overflow: hidden;
+  position: fixed;
+  top: 0;
+  left: 150px;
+  right: 0;
+  bottom: 0;
+  z-index: 666;
+  height: 50px;
+  line-height: 48px;
+  border-bottom: 2px solid #f5f7fa;
+  background-color: #ffffff;
+  overflow: hidden;
 
-    .contentClass {
-        // width: 1100px;
-        // margin: 0 auto;
-        // flex: 1;
-        padding-top: 15px;
-        padding-left: 12px;
+  .contentClass {
+    // width: 1100px;
+    // margin: 0 auto;
+    // flex: 1;
+    padding-top: 15px;
+    padding-left: 12px;
 
-        // .breadcrumb {
-        //     height: 30px;
-        //     border-radius: 4px;
-        //     margin-bottom: 0px;
-        //     position: relative;
-        // }
+    // .breadcrumb {
+    //     height: 30px;
+    //     border-radius: 4px;
+    //     margin-bottom: 0px;
+    //     position: relative;
+    // }
 
-        /deep/ .el-breadcrumb {
-            
-            >span {
-                display: block;
-                width: 3000px;
-            }
-        }
+    /deep/ .el-breadcrumb {
+      > span {
+        display: block;
+        width: 3000px;
+      }
+    }
 
-        /deep/ .el-breadcrumb__inner a {
-            color: #333;
-            font-weight: normal;
-            user-select: none;
-            line-height: 20px;
+    /deep/ .el-breadcrumb__inner a {
+      color: #333;
+      font-weight: normal;
+      user-select: none;
+      line-height: 20px;
 
-            &:hover {
-                color: @themeColor;
-            }
-        }
+      &:hover {
+        color: @themeColor;
+      }
+    }
 
-        /deep/ .el-breadcrumb__item:last-child .el-breadcrumb__inner,
-        .el-breadcrumb__item:last-child .el-breadcrumb__inner a,
-        .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,
-        .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover {
-            /*font-weight: 700;*/
-            color: @themeColor;
-            user-select: none;
-            line-height: 20px;
-            cursor: pointer;
-        }
+    /deep/ .el-breadcrumb__item:last-child .el-breadcrumb__inner,
+    .el-breadcrumb__item:last-child .el-breadcrumb__inner a,
+    .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,
+    .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover {
+      /*font-weight: 700;*/
+      color: @themeColor;
+      user-select: none;
+      line-height: 20px;
+      cursor: pointer;
+    }
 
-        /deep/ .el-breadcrumb__separator[class*="el-icon-arrow-right"] {
-            margin: 0px 3px 0px 1px;
-        }
+    /deep/ .el-breadcrumb__separator[class*='el-icon-arrow-right'] {
+      margin: 0px 3px 0px 1px;
     }
+  }
 
-    .nameBox {
-        position: absolute;
-        top: 4px;
-        // right: 20px;
-        right: 0;
-        z-index: 669;
-        display: flex;
-        height: 40px;
-        padding: 0 20px;
-        background-color: #ffffff;
+  .nameBox {
+    position: absolute;
+    top: 4px;
+    // right: 20px;
+    right: 0;
+    z-index: 669;
+    display: flex;
+    height: 40px;
+    padding: 0 20px;
+    background-color: #ffffff;
 
-        div {
-            height: 40px;
-            line-height: 40px;
-        }
+    div {
+      height: 40px;
+      line-height: 40px;
+    }
 
-        .exit {
-            margin-left: 10px;
-            font-size: 20px;
-            cursor: pointer;
-        }
+    .exit {
+      margin-left: 10px;
+      font-size: 20px;
+      cursor: pointer;
+    }
 
-        .exit:hover {
-            color: @themeColor;
-        }
+    .exit:hover {
+      color: @themeColor;
     }
+  }
 
-    /* .avatarBox {
+  /* .avatarBox {
         position: absolute;
         top: 4px;
         right: 20px;

+ 714 - 0
src/views/sceneLibrary/benchmarkScenarioList.vue

@@ -0,0 +1,714 @@
+<template>
+  <div class="generalizationScenarioListPanel">
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">场景名称</span>
+        <el-input
+          v-model="searchParams.sceneName"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem1">
+        <span class="label">主车动作</span>
+        <el-select
+          v-model="searchParams.mainBehavior[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in dictionaryList['egoAction']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">他车动作</span>
+        <el-select
+          v-model="searchParams.otherBehavior[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in dictionaryList['targetAction']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">天气</span>
+        <el-select v-model="searchParams.weather[0]" size="small" clearable>
+          <el-option
+            v-for="item in dictionaryList['sceneLibWeather']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">道路类型</span>
+        <el-select v-model="searchParams.roadType[0]" size="small" clearable>
+          <el-option
+            v-for="item in dictionaryList['sceneLibrodeType']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">道路几何-平面</span>
+        <el-select
+          v-model="searchParams.roadGeometryPlane[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in dictionaryList['roadPlaneGeometry']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem4">
+        <span class="label">道路几何-纵断面</span>
+        <el-select
+          v-model="searchParams.roadGeometryVertical[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in dictionaryList['roadProfileGeometry']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem4">
+        <span class="label">智能驾驶</span>
+        <el-select
+          v-model="searchParams.autoDriveFunction[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in dictionaryList['supportedAdas']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem5">
+        <span class="label">运行区域</span>
+        <el-select
+          v-model="searchParams.operationArea[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in dictionaryList['rodeSection']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <!-- 复杂度 -->
+      <template slot="searchItem5">
+        <span class="label">复杂度</span>
+        <el-input
+          v-model="searchParams.minComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <!-- 危险度 -->
+      <template slot="searchItem6">
+        <span class="label">危险度</span>
+        <el-input
+          v-model="searchParams.minRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem6">
+        <span class="label">复杂度等级</span>
+        <el-select
+          v-model="searchParams.complexityLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in dictionaryList['complexityLevel']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem7">
+        <span class="label">危险度等级</span>
+        <el-select v-model="searchParams.riskLevel" size="small" clearable>
+          <el-option
+            v-for="item in dictionaryList['riskLevel']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem7">
+        <span class="label">标签</span>
+        <el-input
+          v-model="searchParams.label"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">场景描述</span>
+        <el-input
+          v-model="searchParams.sceneDescription"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+        >
+        </el-input>
+      </template>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="benchmarkEditShow=true">筛选编辑</el-button>
+      </template>
+    </search-layout>
+    <tableList
+      ref="table"
+      style="margin: 40px 30px 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      index
+      indexFixed
+    >
+      <el-table-column
+        label="操作"
+        slot="cgInfos"
+        align="center"
+        width="180"
+        fixed="right"
+      >
+        <template v-slot="scope">
+          <i @click="viewRow(scope.row)" class="el-icon-view elIcon"></i>
+          <i @click="editHandle(scope.row)" class="el-icon-edit-outline elIcon"></i>
+          <i @click="jumpScene(scope.row)" class="el-icon-document elIcon" ></i>
+        </template>
+      </el-table-column>
+    </tableList>
+    <el-dialog
+      v-if="generalizationVisible"
+      :visible.sync="generalizationVisible"
+      :title="generalizationDiaTitle"
+      width="90%"
+      class="generalizationDia"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="generalizationCancel"
+    >
+      <div>
+        <generalization-detail
+          ref="generalizationDetail"
+          :disabled="true"
+          :id="generalizationId"
+          :genUrlType="1"
+        ></generalization-detail>
+      </div>
+    </el-dialog>
+    <!-- 查看视频弹窗 -->
+    <el-dialog
+      :title="videoDiaTitle"
+      :visible.sync="dialogVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :destroy-on-close="true"
+    >
+      <div class="videoBox">
+        <video :src="videoSrc" controls></video>
+      </div>
+    </el-dialog>
+    <!-- 编辑表格 -->
+    <el-dialog
+      title="编辑"
+      :visible.sync="editVisible"
+      width="820px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <el-form
+        ref="editInfo"
+        :model="editInfo"
+        label-width="130px"
+        style="display: flex; flex-wrap: wrap; justify-content: space-between"
+      >
+        <el-form-item label="场景名称">
+          <el-input v-model="editInfo.sceneName" :disabled="true"></el-input>
+        </el-form-item>
+        <el-form-item label="场景描述">
+          <el-input v-model="editInfo.sceneDescription"></el-input>
+        </el-form-item>
+        <el-form-item label="主车动作">
+          <el-select v-model="editInfo.mainBehavior">
+            <el-option
+            v-for="item in dictionaryList['egoAction']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="他车动作">
+          <el-select v-model="editInfo.otherBehavior">
+            <el-option
+            v-for="item in dictionaryList['targetAction']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="天气">
+          <el-select v-model="editInfo.weather">
+            <el-option
+            v-for="item in dictionaryList['sceneLibWeather']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+            ></el-option
+          ></el-select>
+        </el-form-item>
+        <el-form-item label="道路类型">
+          <el-select v-model="editInfo.roadType">
+            <el-option
+            v-for="item in dictionaryList['sceneLibrodeType']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="道路几何-平面">
+          <el-select v-model="editInfo.roadGeometryPlane">
+            <el-option
+            v-for="item in dictionaryList['roadPlaneGeometry']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="道路几何-纵断面">
+          <el-select v-model="editInfo.roadGeometryVertical">
+            <el-option
+            v-for="item in dictionaryList['roadProfileGeometry']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="自动驾驶功能">
+          <el-select v-model="editInfo.autoDriveFunction">
+            <el-option
+            v-for="item in dictionaryList['supportedAdas']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="运行区域">
+          <el-select v-model="editInfo.operationArea">
+            <el-option
+            v-for="item in dictionaryList['rodeSection']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="标签">
+          <el-input v-model="editInfo.label"></el-input>
+        </el-form-item>
+      </el-form>
+      <div style="width: 100%; display: flex; justify-content: center">
+        <el-button @click="editVisible = false">取消</el-button>
+        <el-button type="primary" @click="editUpdate">更新</el-button>
+      </div>
+    </el-dialog>
+    <benchmark-edit v-if="benchmarkEditShow" @closeHandle="editCloseHandle"></benchmark-edit>
+  </div>
+</template>
+
+<script>
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import benchmarkEdit from './components/benchmarkEdit'
+import { mapState } from 'vuex'
+export default {
+  name: 'benchmarkScenarioList', // 基准场景库
+  components: { searchLayout, tableList,benchmarkEdit },
+  data() {
+    return {
+      benchmarkEditShow:false,
+      //搜索参数
+      searchParams: {
+        sceneName: '', // 场景名称
+        share: '0',
+        mainBehavior: [''], // 主车动作
+        otherBehavior: [''],
+        weather: [''],
+        roadType: [''],
+        roadGeometryPlane: [''],
+        roadGeometryVertical: [''],
+        autoDriveFunction: [''],
+        operationArea: [''],
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+        sceneDescription: '',
+        label: '',
+      },
+      //  编辑信息
+      editVisible: false,
+      //  编辑内容数据回填
+      editInfo: {
+        sceneName: '', //场景名称
+        sceneDescription: '', // 场景描述
+        mainBehavior: '', //主车动作
+        weather: '', // 天气
+        roadGeometryPlane: '', // 道路几何-平面
+        autoDriveFunction: '', // 自动驾驶功能
+        label: '', // 标签
+        otherBehavior: '', // 他车动作
+        roadType: '', // 道路类型
+        roadGeometryVertical: '', // 道路几何-纵断面
+        operationArea: '', // 运行区域
+      },
+      fileNameList: [
+        {
+          label: '汇入',
+          value: '',
+        },
+      ],
+      scenarioRoadTypeList: [],
+      // scenarioWeatherList: [],
+      props: {
+        multiple: true,
+        label: 'dictName',
+        value: 'dictCode',
+      },
+      columns: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'sceneName',
+          // fixed: 'left',
+        },
+        {
+          label: '主车动作',
+          prop: 'mainBehavior',
+        },
+        {
+          label: '他车动作',
+          prop: 'otherBehavior',
+        },
+        {
+          label: '天气',
+          prop: 'weather',
+        },
+        {
+          label: '道路类型',
+          prop: 'roadType',
+        },
+        {
+          label: '道路几何-平面',
+          prop: 'roadGeometryPlane',
+          width:'200'
+        },
+        {
+          label: '道路几何-纵断面',
+          prop: 'roadGeometryVertical',
+          width:'150'
+        },
+        {
+          label: '支持智驾功能',
+          prop: 'autoDriveFunction',
+          width:'150'
+        },
+        {
+          label: '运行区域',
+          prop: 'operationArea',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+        {
+          label: '便签',
+          prop: 'label',
+        },
+        {
+          label: '场景描述',
+          prop: 'sceneDescription',
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        data: this.$api.sceneLibrary.querybenchmarkList,
+        param: {
+          share: '0',
+        },
+      },
+      generalizationVisible: false, // 泛化dialog
+      generalizationId: '', // 泛化详情id
+      generalizationDiaTitle: '',
+      //  视频弹窗信息
+      dialogVisible: false,
+      autoplay: false,
+      videoSrc: '',
+      objectPath: '',
+      videoDiaTitle: '',
+      dictionaryList:{},
+    }
+  },
+
+  computed: {
+    ...mapState(['fileHost', 'fileUrl']),
+  },
+
+  methods: {
+    // 编辑弹窗更新
+     editUpdate() {
+      this.$axios({
+        method: 'post',
+        url: this.$api.sceneLibrary.saveSceneReferenceById,
+        data: {...this.editInfo},
+      }).then(res=>{
+        if(res.code ==200){
+          this.editVisible = false
+          this.$message.success("更新成功");
+          this.doSearch()
+        }else{
+          this.$message.error(res.message || "更新失败");
+        }
+      })
+    },
+    // 搜索查询
+    doSearch() {
+      this.searchParams.share = '0'
+      const specialParams = [
+        'mainBehavior',
+        'otherBehavior',
+        'weather',
+        'roadType',
+        'roadGeometryPlane',
+        'roadGeometryVertical',
+        'autoDriveFunction',
+        'operationArea',
+      ]
+      const obj = JSON.parse(JSON.stringify(this.searchParams))
+      Object.keys(obj).forEach((item) => {
+        if(specialParams.includes(item)){
+          if(!obj[item][0]){
+            obj[item] = []
+          }
+        }
+      })
+      this.refreshList(obj)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doReset() {
+      this.searchParams = {
+        sceneName: '', // 场景名称
+        share: '0',
+        mainBehavior: [''], // 主车动作
+        otherBehavior: [''],
+        weather: [''],
+        roadType: [''],
+        roadGeometryPlane: [''],
+        roadGeometryVertical: [''],
+        autoDriveFunction: [''],
+        operationArea: [''],
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+        sceneDescription: '',
+        label: '',
+      }
+      this.doSearch()
+    },
+    pageControl(data) {
+      this.activeName = data.name
+      this.doSearch()
+    },
+    viewRow(row) {
+      this.dialogVisible = true
+      this.videoSrc = row.videoPreview || ''
+    },
+    // 编辑
+    editHandle(e) {
+      this.editInfo = JSON.parse(JSON.stringify(e))
+      this.editVisible = true
+    },
+    // 跳转场景评价
+    jumpScene(row) {
+      this.$store.commit("getSceneId",row.sceneId);
+      this.$store.commit("getSceneCurPage",this.pagination.currentPage);
+      this.$router.push({
+        path: '/sceneEvaluation',
+        query:{id:row.sceneId}
+      })
+    },
+    // 筛选项编辑关闭 -- 刷新筛选列表
+    editCloseHandle(){
+      this.benchmarkEditShow = false
+      this.searchInit()
+    },
+    searchInit() {
+            this.$axios({
+                method: 'post',
+                url: this.$api.common.getDictListsByTypes,
+                data: { dictTypes: "egoAction,targetAction,sceneLibWeather,sceneLibrodeType,roadPlaneGeometry,roadProfileGeometry,supportedAdas,rodeSection,complexityLevel,riskLevel" },
+            }).then((res) => {
+                if (res.code == 200) {
+                    this.dictionaryList = res.info
+                } else {
+                    this.$message.error(res.message || '查询失败')
+                }
+            })
+        },
+  },
+
+  async mounted() {
+    if(this.$store.state.sceneLock){
+      this.pagination.currentPage = this.$store.state.sceneCurPage
+    }
+    this.searchInit()
+  },
+}
+</script>
+
+<style lang='less' scoped>
+@import './common/util.less';
+
+.generalizationScenarioListPanel {
+  .inputBox {
+    .label {
+      min-width: 90px;
+    }
+  }
+
+  .btnsPanel {
+    text-align: right;
+  }
+
+  .generalizationDia {
+    /deep/ .el-dialog__body {
+      position: relative;
+      padding: 20px 60px;
+
+      .changeBtn {
+        position: absolute;
+        top: 20px;
+        right: 60px;
+      }
+    }
+  }
+}
+</style>

+ 18 - 0
src/views/sceneLibrary/common.js

@@ -0,0 +1,18 @@
+export  const ruleTypeOpts = [
+  {
+    value: '2',
+    label: '危险度',
+  },
+  {
+    value: '4',
+    label: '覆盖率',
+  },
+  {
+    value: '3',
+    label: '暴露率',
+  },
+  {
+    value: '1',
+    label: '复杂度',
+  },
+]

+ 182 - 0
src/views/sceneLibrary/components/benchmarkEdit.vue

@@ -0,0 +1,182 @@
+<template>
+    <el-dialog title="基准场景筛选编辑" :visible.sync="dialogVisible" width="700" @close="dialogClose">
+        <h3>标签类型</h3>
+        <el-radio-group v-model="radio" style="display: flex; flex-wrap: wrap; justify-content: flex-start;"
+            @input="radioChange">
+            <el-radio style="margin: 5px 5px" label="sceneLibrodeType" border>道路类型</el-radio>
+            <el-radio style="margin: 5px 5px;" label="egoAction" border>主车行动</el-radio>
+            <el-radio style="margin: 5px 5px;" label="targetAction" border>它车行动</el-radio>
+            <el-radio style="margin: 5px 5px;" label="sceneLibWeather" border>天气</el-radio>
+            <el-radio style="margin: 5px 5px;" label="roadPlaneGeometry" border>道路平面几何</el-radio>
+            <el-radio style="margin: 5px 5px;" label="roadProfileGeometry" border>道路几何-纵断面</el-radio>
+            <el-radio style="margin: 5px 5px;" label="rodeSection" border>运行区域</el-radio>
+            <el-radio style="margin: 5px 5px;" label="supportedAdas" border>智能驾驶</el-radio>
+            <el-radio style="margin: 5px 5px;" label="complexityLevel" border>复杂度等级</el-radio>
+            <el-radio style="margin: 5px 5px;" label="riskLevel" border>危险度等级</el-radio>
+        </el-radio-group>
+        <h3>下拉内容编辑</h3>
+        <div style="display: flex; margin-bottom: 30px;">
+            <el-tag :key="tag.id" v-for="tag in dynamicTags" closable :disable-transitions="false"
+                @close="handleClose(tag.id)">
+                {{ tag.dictName }}
+            </el-tag>
+            <el-input placeholder="请输入新增内容" style="width: 150px; margin-left: 20px;" v-if="inputVisible"
+                v-model="inputValue" ref="saveTagInput" size="small" @keyup.enter.native="handleInputConfirm"
+                @blur="handleInputConfirm">
+            </el-input>
+            <el-button v-else class="button-new-tag" size="small" @click="showInput">新增数据+</el-button>
+        </div>
+        <!-- <span slot="footer" class="dialog-footer">
+            <el-button @click="dialogVisible = false">取 消</el-button>
+            <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
+        </span> -->
+    </el-dialog>
+</template>
+
+<script>
+const dictionaryMap = {
+    sceneLibrodeType: '道路类型',
+    egoAction: '主车动作',
+    targetAction: '它车动作',
+    sceneLibWeather: '天气',
+    roadPlaneGeometry: '道路平面几何',
+    roadProfileGeometry: '道路几何-纵断面',
+    rodeSection: '运行区域',
+    supportedAdas: '智能驾驶',
+    complexityLevel: '复杂度等级',
+    riskLevel: '危险度等级',
+}
+
+export default {
+    name: "benchmarkEdit", // 基准场景筛选项编辑
+    components: {},
+    data() {
+        return {
+            radio: 'sceneLibrodeType',
+            dialogVisible: true,
+            dictionaryList: {}, // 字典对象
+            dynamicTags: [{ label: 'xxx', value: '123' }],
+            inputVisible: false,
+            inputValue: '',
+        }
+
+    },
+    props: {
+        // content: {
+        //     type: String,
+        //     default: "",
+        // },
+        // isEdit: {
+        //     type: Boolean,
+        //     default: true,
+        // },
+    },
+
+    methods: {
+        init(defaultType = 'sceneLibrodeType') {
+            this.$axios({
+                method: 'post',
+                url: this.$api.common.getDictListsByTypes,
+                data: { dictTypes: "egoAction,targetAction,sceneLibWeather,sceneLibrodeType,roadPlaneGeometry,roadProfileGeometry,supportedAdas,rodeSection,complexityLevel,riskLevel" },
+            }).then((res) => {
+                if (res.code == 200) {
+                    this.dictionaryList = res.info
+                    // 默认加载道路类型数据 
+                    this.dynamicTags = res.info[defaultType] || []
+                } else {
+                    this.$message.error(res.message || '查询失败')
+                }
+            })
+        },
+        radioChange(type) {
+            this.dynamicTags = this.dictionaryList[type] || []
+        },
+        handleClose(tag) {
+            console.log(tag)
+            // this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+            this.$axios({
+                    method: 'post',
+                    url: this.$api.sceneLibrary.benchmarkSearchDelete,
+                    data: {
+                        id: tag,
+                        dictType: this.radio
+                    },
+                }).then((res) => {
+                    if (res.code == 200) {
+                        this.$message.success('数据删除成功')
+                        this.init(this.radio)
+                    } else {
+                        this.$message.error(res.message || '删除失败')
+                    }
+                })
+        },
+        showInput() {
+            this.inputVisible = true;
+            this.$nextTick(() => {
+                this.$refs.saveTagInput.$refs.input.focus();
+            });
+        },
+        handleInputConfirm() {
+            console.log(this.radio, dictionaryMap[this.radio])
+            let inputValue = this.inputValue;
+            if (inputValue) {
+                this.$axios({
+                    method: 'post',
+                    url: this.$api.sceneLibrary.benchmarkSearchCreate,
+                    data: {
+                        dictType: this.radio,
+                        dictName: this.inputValue,
+                        dictCode: this.inputValue,
+                        dictComment: dictionaryMap[this.radio]
+                    },
+                }).then((res) => {
+                    if (res.code == 200) {
+                        this.$message.success('数据新增成功')
+                        this.init(this.radio)
+                    } else {
+                        this.$message.error(res.message || '新增失败')
+                    }
+                    this.inputVisible = false;
+                    this.inputValue = '';
+                })
+            }
+        },
+        dialogClose(){
+            console.log('关闭')
+            this.$emit('closeHandle');
+        }
+    },
+    mounted() {
+        this.init()
+    },
+    beforeDestroy() {
+
+    },
+};
+</script>
+
+<style lang='less' scoped>
+.el-tag+.el-tag {
+    margin-left: 10px;
+}
+
+.button-new-tag {
+    margin-left: 10px;
+    height: 32px;
+    line-height: 30px;
+    padding-top: 0;
+    padding-bottom: 0;
+}
+
+.input-new-tag {
+    border: 2px solid red;
+    width: 50px;
+    margin-left: 10px;
+    vertical-align: bottom;
+}
+
+h3 {
+    font-size: 18px;
+    margin: 20px 0 10px;
+}
+</style>

+ 1638 - 857
src/views/sceneLibrary/components/realSceneList.vue

@@ -1,893 +1,1674 @@
 <template>
-    <div>
-        <div class="tabsBox">
-            <div class="myTabsBox myTabsBoxThreeTabs">
-                <el-tabs
-                    v-model="activeName"
-                    type="card"
-                    @tab-click="pageControl"
-                >
-                    <el-tab-pane label="自然驾驶场景" name="1"></el-tab-pane>
-                    <el-tab-pane label="标准法规场景" name="2"></el-tab-pane>
-                    <el-tab-pane label="交通事故场景" name="3"></el-tab-pane>
-                </el-tabs>
-            </div>
-
-            <div v-show="activeName === '3'">
-                <search-layout>
-                    <template slot="searchItem1">
-                        <span class="label">场景名称</span>
-                        <el-input
-                            v-model="searchParamsA.sceneName"
-                            size="small"
-                            clearable
-                            placeholder="请输入"
-                            maxlength="60"
-                        >
-                        </el-input>
-                    </template>
-                    <template slot="searchItem2">
-                        <span class="label">自车驾驶行为</span>
-                        <el-select
-                            v-model="searchParamsA.selfDriving"
-                            multiple
-                            size="small"
-                        >
-                            <el-option
-                                v-for="item in selfDrivingList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </template>
-                    <template slot="searchItem3">
-                        <span class="label">目标驾驶行为</span>
-                        <el-select
-                            v-model="searchParamsA.targetDriving"
-                            multiple
-                            size="small"
-                        >
-                            <el-option
-                                v-for="item in targetDrivingList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </template>
-                    <template slot="searchItem4">
-                        <span class="label">自车反应行为</span>
-                        <el-select
-                            v-model="searchParamsA.selfReaction"
-                            multiple
-                            size="small"
-                        >
-                            <el-option
-                                v-for="item in selfReactionList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </template>
-                    <template slot="searchItem5">
-                        <span class="label">冲突行为</span>
-                        <el-select
-                            v-model="searchParamsA.conflictBehavior"
-                            multiple
-                            size="small"
-                        >
-                            <el-option
-                                v-for="item in conflictBehaviorList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </template>
-                    <template slot="searchItem6">
-                        <span class="label">冲突类型</span>
-                        <el-select
-                            v-model="searchParamsA.conflictType"
-                            multiple
-                            size="small"
-                        >
-                            <el-option
-                                v-for="item in conflictTypeList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </template>
-                    <template slot="searchBtn1">
-                        <el-button type="primary" @click="doSearchA"
-                            >查询</el-button
-                        >
-                    </template>
-                    <template slot="searchBtn2">
-                        <el-button type="primary" @click="doResetA"
-                            >重置</el-button
-                        >
-                    </template>
-                </search-layout>
-                <div class="isSelected">
-                    <el-checkbox v-model="selectedA" @change="selectedShowA"
-                        >已选择</el-checkbox
-                    >
-                </div>
-                <div class="myTabsBox myTabsBoxInline">
-                    <el-tabs
-                        v-model="activeNameA"
-                        type="card"
-                        @tab-click="pageControlA"
-                    >
-                        <el-tab-pane label="公有" name="1"></el-tab-pane>
-                        <el-tab-pane label="私有" name="2"></el-tab-pane>
-                    </el-tabs>
-                </div>
-                <tableList
-                    ref="tableA"
-                    :columns="columnsA"
-                    :getDataWay="getDataWayA"
-                    :pagination="paginationA"
-                    :checkedData="checkedArrA"
-                    :needLoadedCallBack="true"
-                    :loadedCallBack="loadedCallBackA"
-                    :needSelectedCallBack="true"
-                    :selectedCallBack="selectedCallBackA"
-                    :selectedAllCallBack="selectedAllCallBackA"
-                    index
-                    selection
-                >
-                </tableList>
-            </div>
-
-            <div v-show="activeName === '1'">
-                <search-layout>
-                    <template slot="searchItem1">
-                        <span class="label">场景名称</span>
-                        <el-input
-                            v-model="searchParamsB.naturalName"
-                            size="small"
-                            clearable
-                            placeholder="请输入"
-                            maxlength="60"
-                        >
-                        </el-input>
-                    </template>
-                    <template slot="searchItem2">
-                        <span class="label">自车行为</span>
-                        <el-cascader
-                            v-model="searchParamsB.selfBehavior"
-                            :options="selfBehaviorList"
-                            :props="props"
-                            clearable=""
-                            size="small"
-                        ></el-cascader>
-                    </template>
-                    <template slot="searchItem3">
-                        <span class="label">目标行为</span>
-                        <el-cascader
-                            v-model="searchParamsB.targetBehavior"
-                            :options="targetBehaviorList"
-                            :props="props"
-                            clearable=""
-                            size="small"
-                        ></el-cascader>
-                    </template>
-                    <template slot="searchItem4">
-                        <span class="label">交通情况</span>
-                        <el-cascader
-                            v-model="searchParamsB.trafficCondition"
-                            :options="trafficConditionList"
-                            :props="props"
-                            clearable=""
-                            size="small"
-                        ></el-cascader>
-                    </template>
-                    <template slot="searchItem5">
-                        <span class="label">道路</span>
-                        <el-cascader
-                            v-model="searchParamsB.road"
-                            :options="roadList"
-                            :props="props"
-                            clearable=""
-                            size="small"
-                        ></el-cascader>
-                    </template>
-                    <template slot="searchItem6">
-                        <span class="label">基础设施</span>
-                        <el-cascader
-                            v-model="searchParamsB.infrastructure"
-                            :options="infrastructureList"
-                            :props="props"
-                            clearable=""
-                            size="small"
-                        ></el-cascader>
-                    </template>
-                    <template slot="searchItem7">
-                        <span class="label">自然环境</span>
-                        <el-cascader
-                            v-model="searchParamsB.naturalEnvironment"
-                            :options="naturalEnvironmentList"
-                            :props="props"
-                            clearable=""
-                            size="small"
-                        ></el-cascader>
-                    </template>
-                    <template slot="searchItem8">
-                        <span class="label">临时性操纵</span>
-                        <el-cascader
-                            v-model="searchParamsB.temporaryOperation"
-                            :options="temporaryOperationList"
-                            :props="props"
-                            clearable=""
-                            size="small"
-                        ></el-cascader>
-                    </template>
-                    <template slot="searchBtn1">
-                        <el-button type="primary" @click="doSearchB"
-                            >查询</el-button
-                        >
-                    </template>
-                    <template slot="searchBtn2">
-                        <el-button type="primary" @click="doResetB"
-                            >重置</el-button
-                        >
-                    </template>
-                </search-layout>
-                <div class="isSelected">
-                    <el-checkbox v-model="selectedB" @change="selectedShowB"
-                        >已选择</el-checkbox
-                    >
-                </div>
-                <div class="myTabsBox myTabsBoxInline">
-                    <el-tabs
-                        v-model="activeNameB"
-                        type="card"
-                        @tab-click="pageControlB"
-                    >
-                        <el-tab-pane label="公有" name="1"></el-tab-pane>
-                        <el-tab-pane label="私有" name="2"></el-tab-pane>
-                    </el-tabs>
-                </div>
-                <tableList
-                    ref="tableB"
-                    :columns="columnsB"
-                    :getDataWay="getDataWayB"
-                    :pagination="paginationB"
-                    :checkedData="checkedArrB"
-                    :needLoadedCallBack="true"
-                    :loadedCallBack="loadedCallBackB"
-                    :needSelectedCallBack="true"
-                    :selectedCallBack="selectedCallBackB"
-                    :selectedAllCallBack="selectedAllCallBackB"
-                    index
-                    selection
-                >
-                </tableList>
-            </div>
-
-            <div v-show="activeName === '2'">
-                <search-layout>
-                    <template slot="searchItem1">
-                        <span class="label">场景名称</span>
-                        <el-input
-                            v-model="searchParamsC.sceneName"
-                            size="small"
-                            maxlength="60"
-                            clearable
-                            placeholder="请输入"
-                        >
-                        </el-input>
-                    </template>
-                    <template slot="searchItem2">
-                        <span class="label">法规类型</span>
-                        <el-select
-                            v-model="searchParamsC.regulationType"
-                            multiple
-                            size="small"
-                        >
-                            <el-option
-                                v-for="item in regulationTypeList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </template>
-                    <template slot="searchItem3">
-                        <span class="label">标准类型</span>
-                        <el-input
-                            v-model="searchParamsC.standardType"
-                            size="small"
-                            maxlength="60"
-                            clearable
-                            placeholder="请输入"
-                        >
-                        </el-input>
-                    </template>
-                    <template slot="searchBtn1">
-                        <el-button type="primary" @click="doSearchC"
-                            >查询</el-button
-                        >
-                    </template>
-                    <template slot="searchBtn2">
-                        <el-button type="primary" @click="doResetC"
-                            >重置</el-button
-                        >
-                    </template>
-                </search-layout>
-                <div class="isSelected">
-                    <el-checkbox v-model="selectedC" @change="selectedShowC"
-                        >已选择</el-checkbox
-                    >
-                </div>
-                <div class="myTabsBox myTabsBoxInline">
-                    <el-tabs
-                        v-model="activeNameC"
-                        type="card"
-                        @tab-click="pageControlC"
-                    >
-                        <el-tab-pane label="公有" name="1"></el-tab-pane>
-                        <el-tab-pane label="私有" name="2"></el-tab-pane>
-                    </el-tabs>
-                </div>
-                <tableList
-                    ref="tableC"
-                    :columns="columnsC"
-                    :getDataWay="getDataWayC"
-                    :pagination="paginationC"
-                    :checkedData="checkedArrC"
-                    :needLoadedCallBack="true"
-                    :loadedCallBack="loadedCallBackC"
-                    :needSelectedCallBack="true"
-                    :selectedCallBack="selectedCallBackC"
-                    :selectedAllCallBack="selectedAllCallBackC"
-                    index
-                    selection
-                >
-                </tableList>
-            </div>
+  <div>
+    <div class="tabsBox">
+      <div class="myTabsBox myTabsBoxThreeTabs">
+        <el-tabs v-model="activeName" type="card" @tab-click="pageControl">
+          <el-tab-pane label="自然驾驶场景" name="1"></el-tab-pane>
+          <el-tab-pane label="标准法规场景" name="2"></el-tab-pane>
+          <el-tab-pane label="交通事故场景" name="3"></el-tab-pane>
+          <el-tab-pane label="基准场景库" name="4"></el-tab-pane>
+        </el-tabs>
+      </div>
+
+      <div v-show="activeName === '3'">
+        <search-layout>
+          <template slot="searchItem1">
+            <span class="label">场景名称</span>
+            <el-input
+              v-model="searchParamsA.sceneName"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+            >
+            </el-input>
+          </template>
+          <template slot="searchItem2">
+            <span class="label">自车驾驶行为</span>
+            <el-select
+              v-model="searchParamsA.selfDriving"
+              multiple
+              size="small"
+            >
+              <el-option
+                v-for="item in selfDrivingList"
+                :label="item.caption"
+                :value="item.code"
+                :key="item.code"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem3">
+            <span class="label">目标驾驶行为</span>
+            <el-select
+              v-model="searchParamsA.targetDriving"
+              multiple
+              size="small"
+            >
+              <el-option
+                v-for="item in targetDrivingList"
+                :label="item.caption"
+                :value="item.code"
+                :key="item.code"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem4">
+            <span class="label">自车反应行为</span>
+            <el-select
+              v-model="searchParamsA.selfReaction"
+              multiple
+              size="small"
+            >
+              <el-option
+                v-for="item in selfReactionList"
+                :label="item.caption"
+                :value="item.code"
+                :key="item.code"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem5">
+            <span class="label">冲突行为</span>
+            <el-select
+              v-model="searchParamsA.conflictBehavior"
+              multiple
+              size="small"
+            >
+              <el-option
+                v-for="item in conflictBehaviorList"
+                :label="item.caption"
+                :value="item.code"
+                :key="item.code"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem6">
+            <span class="label">冲突类型</span>
+            <el-select
+              v-model="searchParamsA.conflictType"
+              multiple
+              size="small"
+            >
+              <el-option
+                v-for="item in conflictTypeList"
+                :label="item.caption"
+                :value="item.code"
+                :key="item.code"
+              ></el-option>
+            </el-select>
+          </template>
+          <!-- 复杂度 -->
+          <template slot="searchItem5">
+            <span class="label">复杂度</span>
+            <el-input
+              v-model="searchParamsA.minComplexity"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+            <span class="dateSeparator">至</span>
+            <el-input
+              v-model="searchParamsA.maxComplexity"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+          </template>
+          <!-- 危险度 -->
+          <template slot="searchItem6">
+            <span class="label">危险度</span>
+            <el-input
+              v-model="searchParamsA.minRisk"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+            <span class="dateSeparator">至</span>
+            <el-input
+              v-model="searchParamsA.maxRisk"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+          </template>
+          <template slot="searchItem7">
+            <span class="label">复杂度等级</span>
+            <el-select
+              v-model="searchParamsA.complexityLevel"
+              size="small"
+              clearable
+            >
+              <el-option
+                v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+                :label="item"
+                :value="item"
+                :key="item"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem7">
+            <span class="label">危险度等级</span>
+            <el-select v-model="searchParamsA.riskLevel" size="small" clearable>
+              <el-option
+                v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+                :label="item"
+                :value="item"
+                :key="item"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchBtn1">
+            <el-button type="primary" @click="doSearchA">查询</el-button>
+          </template>
+          <template slot="searchBtn2">
+            <el-button type="primary" @click="doResetA">重置</el-button>
+          </template>
+        </search-layout>
+        <div class="isSelected">
+          <el-checkbox v-model="selectedA" @change="selectedShowA"
+            >已选择</el-checkbox
+          >
+        </div>
+        <div class="myTabsBox myTabsBoxInline">
+          <el-tabs v-model="activeNameA" type="card" @tab-click="pageControlA">
+            <el-tab-pane label="公有" name="1"></el-tab-pane>
+            <el-tab-pane label="私有" name="2"></el-tab-pane>
+          </el-tabs>
+        </div>
+        <tableList
+          ref="tableA"
+          :columns="columnsA"
+          :getDataWay="getDataWayA"
+          :pagination="paginationA"
+          :checkedData="checkedArrA"
+          :needLoadedCallBack="true"
+          :loadedCallBack="loadedCallBackA"
+          :needSelectedCallBack="true"
+          :selectedCallBack="selectedCallBackA"
+          :selectedAllCallBack="selectedAllCallBackA"
+          index
+          selection
+        >
+        </tableList>
+      </div>
+
+      <div v-show="activeName === '1'">
+        <search-layout>
+          <template slot="searchItem1">
+            <span class="label">场景名称</span>
+            <el-input
+              v-model="searchParamsB.naturalName"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+            >
+            </el-input>
+          </template>
+          <template slot="searchItem2">
+            <span class="label">自车行为</span>
+            <el-cascader
+              v-model="searchParamsB.selfBehavior"
+              :options="selfBehaviorList"
+              :props="props"
+              clearable=""
+              size="small"
+            ></el-cascader>
+          </template>
+          <template slot="searchItem3">
+            <span class="label">目标行为</span>
+            <el-cascader
+              v-model="searchParamsB.targetBehavior"
+              :options="targetBehaviorList"
+              :props="props"
+              clearable=""
+              size="small"
+            ></el-cascader>
+          </template>
+          <template slot="searchItem4">
+            <span class="label">交通情况</span>
+            <el-cascader
+              v-model="searchParamsB.trafficCondition"
+              :options="trafficConditionList"
+              :props="props"
+              clearable=""
+              size="small"
+            ></el-cascader>
+          </template>
+          <template slot="searchItem5">
+            <span class="label">道路</span>
+            <el-cascader
+              v-model="searchParamsB.road"
+              :options="roadList"
+              :props="props"
+              clearable=""
+              size="small"
+            ></el-cascader>
+          </template>
+          <template slot="searchItem6">
+            <span class="label">基础设施</span>
+            <el-cascader
+              v-model="searchParamsB.infrastructure"
+              :options="infrastructureList"
+              :props="props"
+              clearable=""
+              size="small"
+            ></el-cascader>
+          </template>
+          <template slot="searchItem7">
+            <span class="label">自然环境</span>
+            <el-cascader
+              v-model="searchParamsB.naturalEnvironment"
+              :options="naturalEnvironmentList"
+              :props="props"
+              clearable=""
+              size="small"
+            ></el-cascader>
+          </template>
+          <template slot="searchItem8">
+            <span class="label">临时性操纵</span>
+            <el-cascader
+              v-model="searchParamsB.temporaryOperation"
+              :options="temporaryOperationList"
+              :props="props"
+              clearable=""
+              size="small"
+            ></el-cascader>
+          </template>
+          <!-- 复杂度 -->
+          <template slot="searchItem7">
+            <span class="label">复杂度</span>
+            <el-input
+              v-model="searchParamsB.minComplexity"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+            <span class="dateSeparator">至</span>
+            <el-input
+              v-model="searchParamsB.maxComplexity"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+          </template>
+          <!-- 危险度 -->
+          <template slot="searchItem5">
+            <span class="label">危险度</span>
+            <el-input
+              v-model="searchParamsB.minRisk"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+            <span class="dateSeparator">至</span>
+            <el-input
+              v-model="searchParamsB.maxRisk"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+          </template>
+          <template slot="searchItem6">
+            <span class="label">复杂度等级</span>
+            <el-select
+              v-model="searchParamsB.complexityLevel"
+              size="small"
+              clearable
+            >
+              <el-option
+                v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+                :label="item"
+                :value="item"
+                :key="item"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem8">
+            <span class="label">危险度等级</span>
+            <el-select v-model="searchParamsB.riskLevel" size="small" clearable>
+              <el-option
+                v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+                :label="item"
+                :value="item"
+                :key="item"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchBtn1">
+            <el-button type="primary" @click="doSearchB">查询</el-button>
+          </template>
+          <template slot="searchBtn2">
+            <el-button type="primary" @click="doResetB">重置</el-button>
+          </template>
+        </search-layout>
+        <div class="isSelected">
+          <el-checkbox v-model="selectedB" @change="selectedShowB"
+            >已选择</el-checkbox
+          >
+        </div>
+        <div class="myTabsBox myTabsBoxInline">
+          <el-tabs v-model="activeNameB" type="card" @tab-click="pageControlB">
+            <el-tab-pane label="公有" name="1"></el-tab-pane>
+            <el-tab-pane label="私有" name="2"></el-tab-pane>
+          </el-tabs>
         </div>
+        <tableList
+          ref="tableB"
+          :columns="columnsB"
+          :getDataWay="getDataWayB"
+          :pagination="paginationB"
+          :checkedData="checkedArrB"
+          :needLoadedCallBack="true"
+          :loadedCallBack="loadedCallBackB"
+          :needSelectedCallBack="true"
+          :selectedCallBack="selectedCallBackB"
+          :selectedAllCallBack="selectedAllCallBackB"
+          index
+          selection
+        >
+        </tableList>
+      </div>
 
-        <div class="flexBox summaryBox">
-            <div>
-                场景总数:
-                {{
-                    checkedIdsA.length + checkedIdsB.length + checkedIdsC.length
-                }}
-            </div>
-            <div>自然驾驶场景: {{ checkedIdsB.length }}</div>
-            <div>标准法规场景: {{ checkedIdsC.length }}</div>
-            <div>交通事故场景: {{ checkedIdsA.length }}</div>
+      <div v-show="activeName === '2'">
+        <search-layout>
+          <template slot="searchItem1">
+            <span class="label">场景名称</span>
+            <el-input
+              v-model="searchParamsC.sceneName"
+              size="small"
+              maxlength="60"
+              clearable
+              placeholder="请输入"
+            >
+            </el-input>
+          </template>
+          <template slot="searchItem2">
+            <span class="label">法规类型</span>
+            <el-select
+              v-model="searchParamsC.regulationType"
+              multiple
+              size="small"
+            >
+              <el-option
+                v-for="item in regulationTypeList"
+                :label="item.caption"
+                :value="item.code"
+                :key="item.code"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem3">
+            <span class="label">标准类型</span>
+            <el-input
+              v-model="searchParamsC.standardType"
+              size="small"
+              maxlength="60"
+              clearable
+              placeholder="请输入"
+            >
+            </el-input>
+          </template>
+          <!-- 复杂度 -->
+          <template slot="searchItem4">
+            <span class="label">复杂度</span>
+            <el-input
+              v-model="searchParamsC.minComplexity"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+            <span class="dateSeparator">至</span>
+            <el-input
+              v-model="searchParamsC.maxComplexity"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+          </template>
+          <!-- 危险度 -->
+          <template slot="searchItem5">
+            <span class="label">危险度</span>
+            <el-input
+              v-model="searchParamsC.minRisk"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+            <span class="dateSeparator">至</span>
+            <el-input
+              v-model="searchParamsC.maxRisk"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              @keyup.enter.native="doSearch"
+              style="width: 100px"
+            >
+            </el-input>
+          </template>
+          <template slot="searchItem5">
+            <span class="label">复杂度等级</span>
+            <el-select
+              v-model="searchParamsC.complexityLevel"
+              size="small"
+              clearable
+            >
+              <el-option
+                v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+                :label="item"
+                :value="item"
+                :key="item"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem6">
+            <span class="label">危险度等级</span>
+            <el-select v-model="searchParamsC.riskLevel" size="small" clearable>
+              <el-option
+                v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+                :label="item"
+                :value="item"
+                :key="item"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchBtn1">
+            <el-button type="primary" @click="doSearchC">查询</el-button>
+          </template>
+          <template slot="searchBtn2">
+            <el-button type="primary" @click="doResetC">重置</el-button>
+          </template>
+        </search-layout>
+        <div class="isSelected">
+          <el-checkbox v-model="selectedC" @change="selectedShowC"
+            >已选择</el-checkbox
+          >
+        </div>
+        <div class="myTabsBox myTabsBoxInline">
+          <el-tabs v-model="activeNameC" type="card" @tab-click="pageControlC">
+            <el-tab-pane label="公有" name="1"></el-tab-pane>
+            <el-tab-pane label="私有" name="2"></el-tab-pane>
+          </el-tabs>
+        </div>
+        <tableList
+          ref="tableC"
+          :columns="columnsC"
+          :getDataWay="getDataWayC"
+          :pagination="paginationC"
+          :checkedData="checkedArrC"
+          :needLoadedCallBack="true"
+          :loadedCallBack="loadedCallBackC"
+          :needSelectedCallBack="true"
+          :selectedCallBack="selectedCallBackC"
+          :selectedAllCallBack="selectedAllCallBackC"
+          index
+          selection
+        >
+        </tableList>
+      </div>
+      <!-- 基准场景 -->
+      <div v-show="activeName === '4'">
+        <search-layout>
+          <template slot="searchItem1">
+            <span class="label">场景名称</span>
+            <el-input
+              v-model="searchParamsD.sceneName"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+            >
+            </el-input>
+          </template>
+          <template slot="searchItem2">
+            <span class="label">主车动作</span>
+            <el-select
+              v-model="searchParamsD.mainBehavior[0]"
+              size="small"
+              placeholder="请输入"
+              clearable
+            >
+              <el-option
+              v-for="item in dictionaryList['egoAction']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem2">
+            <span class="label">他车动作</span>
+            <el-select
+              v-model="searchParamsD.otherBehavior[0]"
+              size="small"
+              clearable
+            >
+              <el-option
+              v-for="item in dictionaryList['targetAction']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem1">
+            <span class="label">天气</span>
+            <el-select
+              v-model="searchParamsD.weather[0]"
+              size="small"
+              clearable
+            >
+              <el-option
+              v-for="item in dictionaryList['sceneLibWeather']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem3">
+            <span class="label">道路类型</span>
+            <el-select
+              v-model="searchParamsD.roadType[0]"
+              size="small"
+              clearable
+            >
+              <el-option
+              v-for="item in dictionaryList['sceneLibrodeType']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem3">
+            <span class="label">道路几何-平面</span>
+            <el-select
+              v-model="searchParamsD.roadGeometryPlane[0]"
+              size="small"
+              clearable
+            >
+              <el-option
+              v-for="item in dictionaryList['roadPlaneGeometry']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem4">
+            <span class="label">道路几何-纵断面</span>
+            <el-select
+              v-model="searchParamsD.roadGeometryVertical[0]"
+              size="small"
+              clearable
+            >
+              <el-option
+              v-for="item in dictionaryList['roadProfileGeometry']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem4">
+            <span class="label">智能驾驶</span>
+            <el-select
+              v-model="searchParamsD.autoDriveFunction[0]"
+              size="small"
+              clearable
+            >
+              <el-option
+              v-for="item in dictionaryList['supportedAdas']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem5">
+            <span class="label">运行区域</span>
+            <el-select
+              v-model="searchParamsD.operationArea[0]"
+              size="small"
+              clearable
+            >
+              <el-option
+              v-for="item in dictionaryList['rodeSection']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+
+          <!-- 复杂度 -->
+          <template slot="searchItem5">
+            <span class="label">复杂度</span>
+            <el-input
+              v-model="searchParamsD.minComplexity"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              style="width: 100px"
+            >
+            </el-input>
+            <span class="dateSeparator">至</span>
+            <el-input
+              v-model="searchParamsD.maxComplexity"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              style="width: 100px"
+            >
+            </el-input>
+          </template>
+          <!-- 危险度 -->
+          <template slot="searchItem6">
+            <span class="label">危险度</span>
+            <el-input
+              v-model="searchParamsD.minRisk"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              style="width: 100px"
+            >
+            </el-input>
+            <span class="dateSeparator">至</span>
+            <el-input
+              v-model="searchParamsD.maxRisk"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+              style="width: 100px"
+            >
+            </el-input>
+          </template>
+          <template slot="searchItem6">
+            <span class="label">复杂度等级</span>
+            <el-select
+              v-model="searchParamsD.complexityLevel"
+              size="small"
+              clearable
+            >
+              <el-option
+              v-for="item in dictionaryList['complexityLevel']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem7">
+            <span class="label">危险度等级</span>
+            <el-select v-model="searchParamsD.riskLevel" size="small" clearable>
+              <el-option
+              v-for="item in dictionaryList['riskLevel']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+              ></el-option>
+            </el-select>
+          </template>
+          <template slot="searchItem7">
+            <span class="label">标签</span>
+            <el-input
+              v-model="searchParamsD.label"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+            >
+            </el-input>
+          </template>
+          <template slot="searchItem8">
+            <span class="label">场景描述</span>
+            <el-input
+              v-model="searchParamsD.sceneDescription"
+              size="small"
+              clearable
+              placeholder="请输入"
+              maxlength="60"
+            >
+            </el-input>
+          </template>
+          <template slot="searchBtn1">
+            <el-button type="primary" @click="doSearchD">查询</el-button>
+          </template>
+          <template slot="searchBtn2">
+            <el-button type="primary" @click="doResetD">重置</el-button>
+          </template>
+        </search-layout>
+        <div class="isSelected">
+          <el-checkbox v-model="selectedD" @change="selectedShowD"
+            >已选择</el-checkbox
+          >
+        </div>
+        <div class="myTabsBox myTabsBoxInline">
+          <el-tabs v-model="activeNameD" type="card" @tab-click="pageControlD">
+            <el-tab-pane label="公有" name="1"></el-tab-pane>
+            <el-tab-pane label="私有" name="2"></el-tab-pane>
+          </el-tabs>
         </div>
+        <tableList
+          ref="tableD"
+          :columns="columnsD"
+          :getDataWay="getDataWayD"
+          :pagination="paginationD"
+          :checkedData="checkedArrD"
+          :needLoadedCallBack="true"
+          :loadedCallBack="loadedCallBackD"
+          :needSelectedCallBack="true"
+          :selectedCallBack="selectedCallBackD"
+          :selectedAllCallBack="selectedAllCallBackD"
+          index
+          selection
+        >
+        </tableList>
+      </div>
     </div>
+
+    <div class="flexBox summaryBox">
+      <div>
+        场景总数:
+        {{
+          checkedIdsA.length +
+          checkedIdsB.length +
+          checkedIdsC.length +
+          checkedIdsD.length
+        }}
+      </div>
+      <div>自然驾驶场景: {{ checkedIdsB.length }}</div>
+      <div>标准法规场景: {{ checkedIdsC.length }}</div>
+      <div>交通事故场景: {{ checkedIdsA.length }}</div>
+      <div>基准场景: {{ checkedIdsD.length }}</div>
+    </div>
+  </div>
 </template>
 
 <script>
-import searchLayout from "@/components/grid/searchLayout";
-import toolbarTab from "@/components/toolbar/toolbarTab";
-import tableList from "@/components/grid/TableList";
+import searchLayout from '@/components/grid/searchLayout'
+import toolbarTab from '@/components/toolbar/toolbarTab'
+import tableList from '@/components/grid/TableList'
 
 export default {
-    name: "realSceneList", // 真实场景列表-三大列表集合
-    components: { searchLayout, toolbarTab, tableList },
-    data() {
-        return {
-            list: [],
-            activeName: "1",
-            searchParamsA: {
-                //搜索参数
-                sceneName: "", //场景名称
-                selfDriving: [], //自车驾驶行为
-                targetDriving: [], //目标驾驶行为
-                selfReaction: [], //自车反应行为
-                conflictBehavior: [], //冲突行为
-                conflictType: [], //冲突类型
-                share: "0",
-            },
-            selfDrivingList: [],
-            targetDrivingList: [],
-            selfReactionList: [],
-            conflictBehaviorList: [],
-            conflictTypeList: [],
-            columnsA: [
-                //表格列
-                {
-                    label: "场景名称",
-                    prop: "sceneName",
-                },
-                {
-                    label: "自车驾驶行为",
-                    prop: "selfDriving",
-                },
-                {
-                    label: "目标驾驶行为",
-                    prop: "targetDriving",
-                },
-                {
-                    label: "自车反应行为",
-                    prop: "selfReaction",
-                },
-                {
-                    label: "冲突行为",
-                    prop: "conflictBehavior",
-                },
-                {
-                    label: "冲突类型",
-                    prop: "conflictType",
-                },
-            ],
-            paginationA: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWayA: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.querySceneAccidentList,
-                param: {
-                    share: "0",
-                },
-            },
-            selectedA: false, // 是否选中展示已选择项
-            searchParamsB: {
-                //搜索参数
-                naturalName: "", // 场景名称
-                road: [], // 道路
-                infrastructure: [], // 基础设施
-                trafficCondition: [], // 交通情况
-                selfBehavior: [], // 自车行为
-                targetBehavior: [], // 目标行为
-                naturalEnvironment: [], // 自然环境
-                share: "0",
-            },
-            roadList: [],
-            infrastructureList: [],
-            trafficConditionList: [],
-            selfBehaviorList: [],
-            targetBehaviorList: [],
-            naturalEnvironmentList: [],
-            temporaryOperationList: [],
-            props: {
-                multiple: true,
-                label: "dictName",
-                value: "dictCode",
-            },
-            columnsB: [
-                //表格列
-                {
-                    label: "场景名称",
-                    prop: "naturalName",
-                },
-                {
-                    label: "自车行为",
-                    prop: "selfBehavior",
-                },
-                {
-                    label: "目标行为",
-                    prop: "targetBehavior",
-                },
-                {
-                    label: "天气",
-                    prop: "weather",
-                },
-                {
-                    label: "道路类型",
-                    prop: "roadType",
-                },
-            ],
-            paginationB: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWayB: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.querySceneNaturalList,
-                param: {
-                    share: "0",
-                },
-            },
-            selectedB: false,
-            searchParamsC: {
-                //搜索参数
-                sceneName: "", //场景名称
-                regulationType: [], //法规类型
-                standardType: "", //标准类型
-                share: "0",
-            },
-            regulationTypeList: [],
-            columnsC: [
-                //表格列
-                {
-                    label: "场景名称",
-                    prop: "sceneName",
-                },
-                {
-                    label: "法规类型",
-                    prop: "regulationType",
-                },
-                {
-                    label: "标准类型",
-                    prop: "standardType",
-                },
-            ],
-            paginationC: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWayC: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.queryStandardsRegulationsList,
-                param: {
-                    share: "0",
-                },
-            },
-            selectedC: false,
-            checkedArrA: [], // 交通事故列表已选
-            checkedArrB: [], // 自然驾驶列表已选
-            checkedArrC: [], // 标准法规列表已选
-
-            checkedIdsA: [], // 当前交通事故列表已选
-            checkedIdsB: [], // 当前自然驾驶列表已选
-            checkedIdsC: [], // 当前标准法规列表已选
-
-            activeNameA: "2",
-            activeNameB: "2",
-            activeNameC: "2",
-        };
-    },
-
-    computed: {},
-
-    methods: {
-        pageControl(data) {
-            this.activeName = data.name;
-            if (this.activeName === "1") {
-                this.doSearchB();
-            } else if (this.activeName === "2") {
-                this.doSearchC();
-            } else {
-                this.doSearchA();
-            }
-        },
-        doSearchA() {
-            this.searchParamsA.share = this.activeNameA === "1" ? "1" : "0";
-            let data = { ...this.searchParamsA };
-            if (this.selectedA) {
-                data.ids = this.checkedIdsA;
-            } else {
-                data.ids = null;
-            }
-
-            this.refreshListA(data);
-        },
-        //刷新table
-        refreshListA(param) {
-            param
-                ? this.$refs["tableA"].loadData(param)
-                : this.$refs["tableA"].loadData();
-        },
-        doResetA() {
-            this.searchParamsA = {
-                sceneName: "",
-                selfDriving: [],
-                targetDriving: [],
-                selfReaction: [],
-                conflictBehavior: [],
-                conflictType: [],
-                share: this.activeNameA === "1" ? "1" : "0",
-            };
-            this.doSearchA();
-        },
-        // 数据加载后的回调
-        loadedCallBackA() {
-            this.checkedArrA = [];
-            this.$refs.tableA.tableData.forEach((i) => {
-                if (this.checkedIdsA.includes(i.accidentId)) {
-                    // 显示已选中的项
-                    this.$refs.tableA.$refs.ListTable.toggleRowSelection(
-                        i,
-                        true
-                    );
-                    this.checkedArrA.push(i);
-                }
-            });
+  name: 'realSceneList', // 真实场景列表-三大列表集合
+  components: { searchLayout, toolbarTab, tableList },
+  data() {
+    return {
+      list: [],
+      activeName: '1',
+      searchParamsA: {
+        //搜索参数
+        sceneName: '', //场景名称
+        selfDriving: [], //自车驾驶行为
+        targetDriving: [], //目标驾驶行为
+        selfReaction: [], //自车反应行为
+        conflictBehavior: [], //冲突行为
+        conflictType: [], //冲突类型
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      },
+      selfDrivingList: [],
+      targetDrivingList: [],
+      selfReactionList: [],
+      conflictBehaviorList: [],
+      conflictTypeList: [],
+      columnsA: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'sceneName',
         },
-        // 用户勾选完执行函数后的回调
-        selectedCallBackA(row, type) {
-            if (type === 1) {
-                if (!this.checkedIdsA.includes(row.accidentId)) {
-                    this.checkedIdsA.push(row.accidentId);
-                }
-            } else {
-                let index = this.checkedIdsA.indexOf(row.accidentId);
-                if (index > -1) {
-                    this.checkedIdsA.splice(index, 1);
-                }
-            }
-        },
-        // 用户勾选全选执行函数后的回调
-        selectedAllCallBackA(selection, type) {
-            if (type === 1) {
-                selection.forEach((i) => {
-                    if (!this.checkedIdsA.includes(i.accidentId)) {
-                        this.checkedIdsA.push(i.accidentId);
-                    }
-                });
-            } else {
-                this.$refs.tableA.tableData.forEach((i) => {
-                    let index = this.checkedIdsA.indexOf(i.accidentId);
-                    if (index > -1) {
-                        this.checkedIdsA.splice(index, 1);
-                    }
-                });
-            }
-        },
-        doSearchB() {
-            this.searchParamsB.share = this.activeNameB === "1" ? "1" : "0";
-            let data = { ...this.searchParamsB };
-            if (this.selectedB) {
-                data.ids = this.checkedIdsB;
-            } else {
-                data.ids = null;
-            }
-
-            this.refreshListB(data);
-        },
-        //刷新table
-        refreshListB(param) {
-            param
-                ? this.$refs["tableB"].loadData(param)
-                : this.$refs["tableB"].loadData();
-        },
-        doResetB() {
-            this.searchParamsB = {
-                naturalName: "",
-                road: [],
-                infrastructure: [],
-                trafficCondition: [],
-                selfBehavior: [],
-                targetBehavior: [],
-                naturalEnvironment: [],
-                temporaryOperation: [],
-                share: this.activeNameB === "1" ? "1" : "0",
-            };
-            this.doSearchB();
-        },
-        loadedCallBackB() {
-            this.checkedArrB = [];
-            this.$refs.tableB.tableData.forEach((i) => {
-                if (this.checkedIdsB.includes(i.naturalId)) {
-                    this.$refs.tableB.$refs.ListTable.toggleRowSelection(
-                        i,
-                        true
-                    );
-                    this.checkedArrB.push(i);
-                }
-            });
-        },
-        selectedCallBackB(row, type) {
-            if (type === 1) {
-                this.checkedIdsB.push(row.naturalId);
-            } else {
-                let index = this.checkedIdsB.indexOf(row.naturalId);
-                if (index > -1) {
-                    this.checkedIdsB.splice(index, 1);
-                }
-            }
-        },
-        selectedAllCallBackB(selection, type) {
-            if (type === 1) {
-                selection.forEach((i) => {
-                    if (!this.checkedIdsB.includes(i.naturalId)) {
-                        this.checkedIdsB.push(i.naturalId);
-                    }
-                });
-            } else {
-                this.$refs.tableB.tableData.forEach((i) => {
-                    let index = this.checkedIdsB.indexOf(i.naturalId);
-                    if (index > -1) {
-                        this.checkedIdsB.splice(index, 1);
-                    }
-                });
-            }
-        },
-        doSearchC() {
-            this.searchParamsC.share = this.activeNameC === "1" ? "1" : "0";
-            let data = { ...this.searchParamsC };
-            if (this.selectedC) {
-                data.ids = this.checkedIdsC;
-            } else {
-                data.ids = null;
-            }
-
-            this.refreshListC(data);
-        },
-        //刷新table
-        refreshListC(param) {
-            param
-                ? this.$refs["tableC"].loadData(param)
-                : this.$refs["tableC"].loadData();
-        },
-        doResetC() {
-            this.searchParamsC = {
-                sceneName: "",
-                regulationType: [],
-                standardType: "",
-                share: this.activeNameC === "1" ? "1" : "0",
-            };
-            this.doSearchC();
-        },
-        loadedCallBackC() {
-            this.checkedArrC = [];
-            this.$refs.tableC.tableData.forEach((i) => {
-                if (this.checkedIdsC.includes(i.regulationsId)) {
-                    this.$refs.tableC.$refs.ListTable.toggleRowSelection(
-                        i,
-                        true
-                    );
-                    this.checkedArrC.push(i);
-                }
-            });
-        },
-        selectedCallBackC(row, type) {
-            if (type === 1) {
-                this.checkedIdsC.push(row.regulationsId);
-            } else {
-                let index = this.checkedIdsC.indexOf(row.regulationsId);
-                if (index > -1) {
-                    this.checkedIdsC.splice(index, 1);
+        {
+          label: '自车驾驶行为',
+          prop: 'selfDriving',
+        },
+        {
+          label: '目标驾驶行为',
+          prop: 'targetDriving',
+        },
+        {
+          label: '自车反应行为',
+          prop: 'selfReaction',
+        },
+        {
+          label: '冲突行为',
+          prop: 'conflictBehavior',
+        },
+        {
+          label: '冲突类型',
+          prop: 'conflictType',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+      ],
+      paginationA: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWayA: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.querySceneAccidentList,
+        param: {
+          share: '0',
+        },
+      },
+      selectedA: false, // 是否选中展示已选择项
+      searchParamsB: {
+        //搜索参数
+        naturalName: '', // 场景名称
+        road: [], // 道路
+        infrastructure: [], // 基础设施
+        trafficCondition: [], // 交通情况
+        selfBehavior: [], // 自车行为
+        targetBehavior: [], // 目标行为
+        naturalEnvironment: [], // 自然环境
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      },
+      roadList: [],
+      infrastructureList: [],
+      trafficConditionList: [],
+      selfBehaviorList: [],
+      targetBehaviorList: [],
+      naturalEnvironmentList: [],
+      temporaryOperationList: [],
+      props: {
+        multiple: true,
+        label: 'dictName',
+        value: 'dictCode',
+      },
+      columnsB: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'naturalName',
+        },
+        {
+          label: '自车行为',
+          prop: 'selfBehavior',
+        },
+        {
+          label: '目标行为',
+          prop: 'targetBehavior',
+        },
+        {
+          label: '天气',
+          prop: 'weather',
+        },
+        {
+          label: '道路类型',
+          prop: 'roadType',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+      ],
+      paginationB: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWayB: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.querySceneNaturalList,
+        param: {
+          share: '0',
+        },
+      },
+      selectedB: false,
+      searchParamsC: {
+        //搜索参数
+        sceneName: '', //场景名称
+        regulationType: [], //法规类型
+        standardType: '', //标准类型
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      },
+      regulationTypeList: [],
+      columnsC: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'sceneName',
+        },
+        {
+          label: '法规类型',
+          prop: 'regulationType',
+        },
+        {
+          label: '标准类型',
+          prop: 'standardType',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+      ],
+      paginationC: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWayC: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.queryStandardsRegulationsList,
+        param: {
+          share: '0',
+        },
+      },
+      selectedC: false,
+      selectedD: false,
+      searchParamsD: {
+        sceneName: '', // 场景名称
+        share: '0',
+        mainBehavior: [''], // 主车动作
+        otherBehavior: [''],
+        weather: [''],
+        roadType: [''],
+        roadGeometryPlane: [''],
+        roadGeometryVertical: [''],
+        autoDriveFunction: [''],
+        operationArea: [''],
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+        sceneDescription: '',
+        label: '',
+      },
+
+      paginationD: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWayD: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.querybenchmarkList,
+        param: {
+          share: '0',
+        },
+      },
+
+      columnsD: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'sceneName',
+          fixed: 'left',
+        },
+        {
+          label: '主车动作',
+          prop: 'mainBehavior',
+        },
+        {
+          label: '他车动作',
+          prop: 'otherBehavior',
+        },
+        {
+          label: '天气',
+          prop: 'weather',
+        },
+        {
+          label: '道路类型',
+          prop: 'roadType',
+        },
+        {
+          label: '道路几何-平面',
+          prop: 'roadGeometryPlane',
+        },
+        {
+          label: '道路几何-纵断面',
+          prop: 'roadGeometryVertical',
+        },
+        {
+          label: '支持智驾功能',
+          prop: 'autoDriveFunction',
+        },
+        {
+          label: '运行区域',
+          prop: 'operationArea',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+        {
+          label: '便签',
+          prop: 'label',
+        },
+        {
+          label: '场景描述',
+          prop: 'sceneDescription',
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+
+      checkedArrA: [], // 交通事故列表已选
+      checkedArrB: [], // 自然驾驶列表已选
+      checkedArrC: [], // 标准法规列表已选
+      checkedArrD: [], // 基准场景列表已选
+
+      checkedIdsA: [], // 当前交通事故列表已选
+      checkedIdsB: [], // 当前自然驾驶列表已选
+      checkedIdsC: [], // 当前标准法规列表已选
+      checkedIdsD: [], // 当前基准场景列表已选
+
+      activeNameA: '2',
+      activeNameB: '2',
+      activeNameC: '2',
+      activeNameD: '2',
+
+      dictionaryList:{},
+    }
+  },
+
+  computed: {},
+
+  methods: {
+    pageControl(data) {
+      this.activeName = data.name
+      if (this.activeName === '1') {
+        this.doSearchB()
+      } else if (this.activeName === '2') {
+        this.doSearchC()
+      } else if (this.activeName === '4') {
+        this.doSearchD()
+      } else {
+        this.doSearchA()
+      }
+    },
+    doSearchA() {
+      this.searchParamsA.share = this.activeNameA === '1' ? '1' : '0'
+      let data = { ...this.searchParamsA }
+      if (this.selectedA) {
+        data.ids = this.checkedIdsA
+      } else {
+        data.ids = null
+      }
+
+      this.refreshListA(data)
+    },
+    //刷新table
+    refreshListA(param) {
+      param
+        ? this.$refs['tableA'].loadData(param)
+        : this.$refs['tableA'].loadData()
+    },
+    doResetA() {
+      this.searchParamsA = {
+        share: this.activeNameA === '1' ? '1' : '0',
+        sceneName: '', //场景名称
+        selfDriving: [], //自车驾驶行为
+        targetDriving: [], //目标驾驶行为
+        selfReaction: [], //自车反应行为
+        conflictBehavior: [], //冲突行为
+        conflictType: [], //冲突类型
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      }
+      this.doSearchA()
+    },
+    // 数据加载后的回调
+    loadedCallBackA() {
+      this.checkedArrA = []
+      this.$refs.tableA.tableData.forEach((i) => {
+        if (this.checkedIdsA.includes(i.accidentId)) {
+          // 显示已选中的项
+          this.$refs.tableA.$refs.ListTable.toggleRowSelection(i, true)
+          this.checkedArrA.push(i)
+        }
+      })
+    },
+    // 用户勾选完执行函数后的回调
+    selectedCallBackA(row, type) {
+      if (type === 1) {
+        if (!this.checkedIdsA.includes(row.accidentId)) {
+          this.checkedIdsA.push(row.accidentId)
+        }
+      } else {
+        let index = this.checkedIdsA.indexOf(row.accidentId)
+        if (index > -1) {
+          this.checkedIdsA.splice(index, 1)
+        }
+      }
+    },
+    // 用户勾选全选执行函数后的回调
+    selectedAllCallBackA(selection, type) {
+      if (type === 1) {
+        selection.forEach((i) => {
+          if (!this.checkedIdsA.includes(i.accidentId)) {
+            this.checkedIdsA.push(i.accidentId)
+          }
+        })
+      } else {
+        this.$refs.tableA.tableData.forEach((i) => {
+          let index = this.checkedIdsA.indexOf(i.accidentId)
+          if (index > -1) {
+            this.checkedIdsA.splice(index, 1)
+          }
+        })
+      }
+    },
+    doSearchB() {
+      this.searchParamsB.share = this.activeNameB === '1' ? '1' : '0'
+      let data = { ...this.searchParamsB }
+      if (this.selectedB) {
+        data.ids = this.checkedIdsB
+      } else {
+        data.ids = null
+      }
+
+      this.refreshListB(data)
+    },
+    //刷新table
+    refreshListB(param) {
+      param
+        ? this.$refs['tableB'].loadData(param)
+        : this.$refs['tableB'].loadData()
+    },
+    doResetB() {
+      this.searchParamsB = {
+        share: this.activeNameB === '1' ? '1' : '0',
+        naturalName: '', // 场景名称
+        road: [], // 道路
+        infrastructure: [], // 基础设施
+        trafficCondition: [], // 交通情况
+        selfBehavior: [], // 自车行为
+        targetBehavior: [], // 目标行为
+        naturalEnvironment: [], // 自然环境
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      }
+      this.doSearchB()
+    },
+    loadedCallBackB() {
+      this.checkedArrB = []
+      this.$refs.tableB.tableData.forEach((i) => {
+        if (this.checkedIdsB.includes(i.naturalId)) {
+          this.$refs.tableB.$refs.ListTable.toggleRowSelection(i, true)
+          this.checkedArrB.push(i)
+        }
+      })
+    },
+    selectedCallBackB(row, type) {
+      if (type === 1) {
+        this.checkedIdsB.push(row.naturalId)
+      } else {
+        let index = this.checkedIdsB.indexOf(row.naturalId)
+        if (index > -1) {
+          this.checkedIdsB.splice(index, 1)
+        }
+      }
+    },
+    selectedAllCallBackB(selection, type) {
+      if (type === 1) {
+        selection.forEach((i) => {
+          if (!this.checkedIdsB.includes(i.naturalId)) {
+            this.checkedIdsB.push(i.naturalId)
+          }
+        })
+      } else {
+        this.$refs.tableB.tableData.forEach((i) => {
+          let index = this.checkedIdsB.indexOf(i.naturalId)
+          if (index > -1) {
+            this.checkedIdsB.splice(index, 1)
+          }
+        })
+      }
+    },
+    doSearchC() {
+      this.searchParamsC.share = this.activeNameC === '1' ? '1' : '0'
+      let data = { ...this.searchParamsC }
+      if (this.selectedC) {
+        data.ids = this.checkedIdsC
+      } else {
+        data.ids = null
+      }
+
+      this.refreshListC(data)
+    },
+    //刷新table
+    refreshListC(param) {
+      param
+        ? this.$refs['tableC'].loadData(param)
+        : this.$refs['tableC'].loadData()
+    },
+    doResetC() {
+      this.searchParamsC = {
+        sceneName: '', //场景名称
+        regulationType: [], //法规类型
+        standardType: '', //标准类型
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+        share: this.activeNameC === '1' ? '1' : '0',
+      }
+      this.doSearchC()
+    },
+    loadedCallBackC() {
+      this.checkedArrC = []
+      this.$refs.tableC.tableData.forEach((i) => {
+        if (this.checkedIdsC.includes(i.regulationsId)) {
+          this.$refs.tableC.$refs.ListTable.toggleRowSelection(i, true)
+          this.checkedArrC.push(i)
+        }
+      })
+    },
+    selectedCallBackC(row, type) {
+      if (type === 1) {
+        this.checkedIdsC.push(row.regulationsId)
+      } else {
+        let index = this.checkedIdsC.indexOf(row.regulationsId)
+        if (index > -1) {
+          this.checkedIdsC.splice(index, 1)
+        }
+      }
+    },
+    selectedAllCallBackC(selection, type) {
+      if (type === 1) {
+        selection.forEach((i) => {
+          if (!this.checkedIdsC.includes(i.regulationsId)) {
+            this.checkedIdsC.push(i.regulationsId)
+          }
+        })
+      } else {
+        this.$refs.tableC.tableData.forEach((i) => {
+          let index = this.checkedIdsC.indexOf(i.regulationsId)
+          if (index > -1) {
+            this.checkedIdsC.splice(index, 1)
+          }
+        })
+      }
+    },
+
+    doSearchD() {
+      const specialParams = [
+        'mainBehavior',
+        'otherBehavior',
+        'weather',
+        'roadType',
+        'roadGeometryPlane',
+        'roadGeometryVertical',
+        'autoDriveFunction',
+        'operationArea',
+      ]
+      this.searchParamsD.share = this.activeNameD === '1' ? '1' : '0'
+      const obj = JSON.parse(JSON.stringify(this.searchParamsD))
+      Object.keys(obj).forEach((item) => {
+        if (specialParams.includes(item)) {
+          if (!obj[item][0]) {
+            obj[item] = []
+          }
+        }
+      })
+      let data = { ...obj }
+      if (this.selectedD) {
+        data.ids = this.checkedIdsD
+      } else {
+        data.ids = null
+      }
+      this.refreshListD(data)
+    },
+
+    refreshListD(param) {
+      param
+        ? this.$refs['tableD'].loadData(param)
+        : this.$refs['tableD'].loadData()
+    },
+
+    doResetD() {
+      this.searchParamsD = {
+        sceneName: '', // 场景名称
+        mainBehavior: [''], // 主车动作
+        otherBehavior: [''],
+        weather: [''],
+        roadType: [''],
+        roadGeometryPlane: [''],
+        roadGeometryVertical: [''],
+        autoDriveFunction: [''],
+        operationArea: [''],
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+        sceneDescription: '',
+        label: '',
+        share: this.activeNameC === '1' ? '1' : '0',
+      }
+      this.doSearchD()
+    },
+
+    loadedCallBackD() {
+      this.checkedArrD = []
+      this.$refs.tableD.tableData.forEach((i) => {
+        if (this.checkedIdsD.includes(i.sceneId)) {
+          this.$refs.tableD.$refs.ListTable.toggleRowSelection(i, true)
+          this.checkedArrD.push(i)
+        }
+      })
+    },
+
+    selectedCallBackD(row, type) {
+      if (type === 1) {
+        this.checkedIdsD.push(row.sceneId)
+      } else {
+        let index = this.checkedIdsD.indexOf(row.sceneId)
+        if (index > -1) {
+          this.checkedIdsD.splice(index, 1)
+        }
+      }
+    },
+
+    selectedAllCallBackD(selection, type) {
+      if (type === 1) {
+        selection.forEach((i) => {
+          if (!this.checkedIdsD.includes(i.sceneId)) {
+            this.checkedIdsD.push(i.sceneId)
+          }
+        })
+      } else {
+        this.$refs.tableD.tableData.forEach((i) => {
+          let index = this.checkedIdsD.indexOf(i.sceneId)
+          if (index > -1) {
+            this.checkedIdsD.splice(index, 1)
+          }
+        })
+      }
+    },
+
+    selectedShowA() {
+      this.doSearchA()
+    },
+    selectedShowB() {
+      this.doSearchB()
+    },
+    selectedShowC() {
+      this.doSearchC()
+    },
+    selectedShowD() {
+      this.doSearchD()
+    },
+    pageControlA(data) {
+      this.activeNameA = data.name
+      this.doSearchA()
+    },
+    pageControlB(data) {
+      this.activeNameB = data.name
+      this.doSearchB()
+    },
+    pageControlC(data) {
+      this.activeNameC = data.name
+      this.doSearchC()
+    },
+    pageControlD(data) {
+      this.activeNameD = data.name
+      this.doSearchD()
+    },
+    searchInit() {
+            this.$axios({
+                method: 'post',
+                url: this.$api.common.getDictListsByTypes,
+                data: { dictTypes: "egoAction,targetAction,sceneLibWeather,sceneLibrodeType,roadPlaneGeometry,roadProfileGeometry,supportedAdas,rodeSection,complexityLevel,riskLevel" },
+            }).then((res) => {
+                if (res.code == 200) {
+                    this.dictionaryList = res.info
+                } else {
+                    this.$message.error(res.message || '查询失败')
                 }
-            }
-        },
-        selectedAllCallBackC(selection, type) {
-            if (type === 1) {
-                selection.forEach((i) => {
-                    if (!this.checkedIdsC.includes(i.regulationsId)) {
-                        this.checkedIdsC.push(i.regulationsId);
-                    }
-                });
-            } else {
-                this.$refs.tableC.tableData.forEach((i) => {
-                    let index = this.checkedIdsC.indexOf(i.regulationsId);
-                    if (index > -1) {
-                        this.checkedIdsC.splice(index, 1);
-                    }
-                });
-            }
-        },
-        selectedShowA() {
-            this.doSearchA();
-        },
-        selectedShowB() {
-            this.doSearchB();
-        },
-        selectedShowC() {
-            this.doSearchC();
-        },
-        pageControlA(data) {
-            this.activeNameA = data.name;
-            this.doSearchA();
-        },
-        pageControlB(data) {
-            this.activeNameB = data.name;
-            this.doSearchB();
-        },
-        pageControlC(data) {
-            this.activeNameC = data.name;
-            this.doSearchC();
-        },
-    },
-
-    async mounted() {
-        await this.$dicsListsInit({
-            selfDrivingList: "selfDriving",
-            targetDrivingList: "targetDriving",
-            selfReactionList: "selfReaction",
-            conflictBehaviorList: "conflictBehavior",
-            conflictTypeList: "conflictType",
-            regulationTypeList: "regulationType",
-        });
-
-        await this.$dicsTreesInit({
-            roadList: "road",
-            infrastructureList: "infrastructure",
-            trafficConditionList: "trafficCondition",
-            selfBehaviorList: "selfBehavior",
-            targetBehaviorList: "targetBehavior",
-            naturalEnvironmentList: "naturalEnvironment",
-            temporaryOperationList: "temporaryOperation",
-        });
-    },
-};
+            })
+        },
+  },
+
+  async mounted() {
+    await this.$dicsListsInit({
+      selfDrivingList: 'selfDriving',
+      targetDrivingList: 'targetDriving',
+      selfReactionList: 'selfReaction',
+      conflictBehaviorList: 'conflictBehavior',
+      conflictTypeList: 'conflictType',
+      regulationTypeList: 'regulationType',
+    })
+
+    await this.$dicsTreesInit({
+      roadList: 'road',
+      infrastructureList: 'infrastructure',
+      trafficConditionList: 'trafficCondition',
+      selfBehaviorList: 'selfBehavior',
+      targetBehaviorList: 'targetBehavior',
+      naturalEnvironmentList: 'naturalEnvironment',
+      temporaryOperationList: 'temporaryOperation',
+    })
+    this.searchInit()
+
+  },
+}
 </script>
 
 <style lang='less' scoped>
 .tabsBox {
-    .el-input,
-    .el-select {
-        width: 230px;
-    }
+  .el-input,
+  .el-select {
+    width: 230px;
+  }
 
-    .label {
-        min-width: 90px;
-    }
+  .label {
+    min-width: 90px;
+  }
 
-    .isSelected {
-        padding: 10px 0 10px 10px;
-    }
+  .isSelected {
+    padding: 10px 0 10px 10px;
+  }
 }
 
 .summaryBox {
-    padding: 20px 20px 0;
-    margin-top: 20px;
-    border-top: 1px dotted @themeColor;
-    color: @themeColor;
-    font-size: 18px;
-    font-weight: bold;
-
-    > div {
-        margin-right: 30px;
-    }
+  padding: 20px 20px 0;
+  margin-top: 20px;
+  border-top: 1px dotted @themeColor;
+  color: @themeColor;
+  font-size: 18px;
+  font-weight: bold;
+
+  > div {
+    margin-right: 30px;
+  }
 }
 
 .myTabsBox {
-    /deep/ .el-tabs__nav-scroll {
-        &:after {
-            width: 100%;
-        }
+  /deep/ .el-tabs__nav-scroll {
+    &:after {
+      width: 100%;
     }
+  }
 
-    &.myTabsBoxThreeTabs {
-        /deep/ .el-tabs {
-            width: auto;
-            margin: 0;
-        }
+  &.myTabsBoxThreeTabs {
+    /deep/ .el-tabs {
+      width: auto;
+      margin: 0;
+    }
 
-        /deep/ .el-tabs__item {
-            width: 120px;
-        }
+    /deep/ .el-tabs__item {
+      width: 120px;
     }
+  }
 
-    /deep/
-        .el-tabs--top.el-tabs--card
-        > .el-tabs__header
-        .el-tabs__item:nth-child(2) {
-        border-left-color: @gray;
+  /deep/
+    .el-tabs--top.el-tabs--card
+    > .el-tabs__header
+    .el-tabs__item:nth-child(2) {
+    border-left-color: @gray;
 
-        &.is-active {
-            border-left-color: @themeColor;
-        }
+    &.is-active {
+      border-left-color: @themeColor;
     }
+  }
 }
 
 .myTabsBoxInline {
-    .el-tabs {
-        margin-top: 10px;
-    }
+  .el-tabs {
+    margin-top: 10px;
+  }
 }
 </style>

+ 16 - 25
src/views/sceneLibrary/generalizationScenarioList.vue

@@ -27,31 +27,6 @@
                     @keyup.enter.native="doSearch">
                 </el-input>
             </template>
-            <!-- <template slot="searchItem3">
-                <span class="label">天气</span>
-                <el-select
-                    v-model="searchParams.scenarioWeather"
-                    multiple
-                    size="small"
-                    clearable
-                >
-                    <el-option
-                        v-for="item in scenarioWeatherList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template> -->
-            <!-- <template slot="searchItem4">
-                <span class="label">场景发生时刻</span>
-                <el-time-picker
-                    v-model="searchParams.scenarioTime"
-                    value-format="HH:mm:ss"
-                    placeholder="请选择"
-                >
-                </el-time-picker>
-            </template> -->
             <template slot="searchBtn1">
                 <el-button type="primary" @click="doSearch">查询</el-button>
             </template>
@@ -141,6 +116,22 @@ export default {
                     label: "场景简述",
                     prop: "scenarioResume",
                 },
+                {
+                label: '复杂度',
+                prop: 'complexity',
+                },
+                {
+                label: '复杂度等级',
+                prop: 'complexityLevel',
+                },
+                {
+                label: '危险度',
+                prop: 'risk',
+                },
+                {
+                label: '危险度等级',
+                prop: 'riskLevel',
+                },
                 // {
                 //     label: "场景发生时刻",
                 //     prop: "scenarioTime",

+ 281 - 195
src/views/sceneLibrary/gradingRuleDetail.vue

@@ -1,223 +1,309 @@
 <template>
-    <div>
-        <el-form ref="form" :model="form" :rules="rules" label-width="108px">
-            <el-form-item label="规则名称:" prop="ruleName">
-                <el-input
-                    placeholder="请输入"
-                    maxlength="50"
-                    v-autoTrim="{ obj: form, key: 'ruleName' }"
-                    v-model="form.ruleName"
-                >
-                </el-input>
-            </el-form-item>
-
-            <el-form-item label="规则描述:" prop="ruleDescription">
-                <el-input
-                    placeholder="请输入"
-                    maxlength="300"
-                    v-autoTrim="{ obj: form, key: 'ruleDescription' }"
-                    v-model="form.ruleDescription"
-                >
-                </el-input>
-            </el-form-item>
-
-            <el-form-item label="规则详情:" prop="ruleDetails">
-                <!-- <el-input
-                    v-autoTrim="{
-                        obj: form,
-                        key: 'ruleDetails',
-                    }"
-                    v-model="form.ruleDetails"
-                    type="textarea"
-                    placeholder="请输入"
-                    :autosize="{ minRows: 8, maxRows: 8 }"
-                    maxlength="10000"
-                    show-word-limit
-                ></el-input> -->
-                <editor
-                    :content="content"
-                    ref="editor"
-                    :isEdit="!!$route.query.rulesId"
-                ></editor>
-            </el-form-item>
-
-            <div class="btns">
-                <!-- 公有列表进,另存为+取消 另存为为新增一条数据 新增数据均为私有 1 -->
-                <!-- 私有列表进,保存+另存为+取消 0 -->
-                <!-- 新增进,保存+取消 -1 -->
-                <el-button
-                    type="primary"
-                    v-if="share === '0' || share === '-1'"
-                    @click="save(false)"
-                    >保存</el-button
-                >
-                <el-button
-                    type="primary"
-                    v-if="share === '0' || share === '1'"
-                    @click="save(true)"
-                    >另存为</el-button
-                >
-                <el-button type="primary" plain @click="cancel">取消</el-button>
-            </div>
-        </el-form>
-    </div>
+  <div>
+    <el-form ref="form" :model="form" :rules="rules" label-width="108px">
+      <el-form-item label="规则名称:" prop="ruleName">
+        <el-input
+          :disabled="ruleTypeDisabled"
+          placeholder="请输入"
+          maxlength="50"
+          v-autoTrim="{ obj: form, key: 'ruleName' }"
+          v-model="form.ruleName"
+        >
+        </el-input>
+      </el-form-item>
+
+      <el-form-item label="规则描述:" prop="ruleDescription">
+        <el-input
+          placeholder="请输入"
+          maxlength="300"
+          v-autoTrim="{ obj: form, key: 'ruleDescription' }"
+          v-model="form.ruleDescription"
+        >
+        </el-input>
+      </el-form-item>
+
+      <el-form-item label="规则详情:" prop="ruleDetails" v-if="!isScore">
+        <editor
+          :content="content"
+          ref="editor"
+          :isEdit="!!$route.query.rulesId"
+        ></editor>
+      </el-form-item>
+      <el-form-item v-else label="规则类型:" prop="ruleType">
+        <el-select
+          :disabled="ruleTypeDisabled"
+          v-model="form.ruleType"
+          size="small"
+          clearable
+          placeholder="请选择规则类型"
+        >
+          <el-option
+            v-for="item in ruleTypeOpts"
+            :label="item.label"
+            :value="item.value"
+            :key="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <!-- <el-form-item
+        v-if="isScore && form.rulesId"
+        label="脚本名称:"
+        prop="scriptName"
+      >
+        <el-input
+          style="width: 400px"
+          disabled
+          placeholder=""
+          v-model="form.scriptName"
+        >
+        </el-input>
+      </el-form-item> -->
+
+      <!-- 文件上传 -->
+      <el-form-item label="脚本上传地址" v-if="isScore">
+        <!-- <el-upload
+          :multiple="false"
+          action=""
+          class="upload-demo"
+          list-type="card"
+          :file-list="fileList"
+          :http-request="uploadHandle"
+          :on-remove="fileRemove"
+        >
+          <el-button size="small" type="primary">点击上传</el-button>
+        </el-upload> -->
+        <el-input
+          style="width: 400px"
+          placeholder="请填写脚本地址"
+          v-model="form.localPath"
+        >
+        </el-input>
+      </el-form-item>
+
+      <div class="btns">
+        <!-- 公有列表进,另存为+取消 另存为为新增一条数据 新增数据均为私有 1 -->
+        <!-- 私有列表进,保存+另存为+取消 0 -->
+        <!-- 新增进,保存+取消 -1 -->
+        <el-button
+          type="primary"
+          v-if="share === '0' || share === '-1'"
+          @click="save(false)"
+          >保存</el-button
+        >
+        <el-button
+          type="primary"
+          v-if="share === '0' || share === '1'"
+          @click="save(true)"
+          >另存为</el-button
+        >
+        <el-button type="primary" plain @click="cancel">取消</el-button>
+      </div>
+    </el-form>
+  </div>
 </template>
 
 <script>
-import editor from "./components/editor";
+import editor from './components/editor'
+import { ruleTypeOpts } from './common'
 
 export default {
-    name: "gradingRuleDetail", // 评分规则
-    components: { editor },
-    data() {
-        return {
-            share: "-1", //控制显示按钮
-            form: {
-                rulesId: "",
-                ruleName: "",
-                share: "-1",
-                ruleDescription: "",
-                ruleDetails: "",
-            },
-            content: "",
-            rules: {
-                ruleName: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                ],
-                ruleDescription: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                ],
-                ruleDetails: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                ],
-            },
-        };
-    },
-
-    computed: {},
+  name: 'gradingRuleDetail', // 评分规则
+  components: { editor },
+  data() {
+    return {
+      share: '-1', //控制显示按钮
+      scriptUpdate: false, // 脚本是否更新
+      form: {
+        rulesId: '',
+        ruleName: '',
+        share: '-1',
+        ruleDescription: '',
+        ruleDetails: '',
+        ruleType: '',
+        // scriptName: '',
+        localPath: '',
+      },
+      ruleTypeDisabled: false,
+      fileList: [], // 文件上传列表
+      content: '',
+      rules: {
+        ruleName: [{ required: true, message: '请输入', trigger: 'blur' }],
+        ruleDescription: [
+          { required: true, message: '请输入', trigger: 'blur' },
+        ],
+        ruleDetails: [{ required: true, message: '请输入', trigger: 'blur' }],
+      },
+      isScore: false, // 评分规则新增类型
+      ruleTypeOpts, // 规则类型
+    }
+  },
 
-    methods: {
-        save(isAdd) {
-            let ruleDetails = this.$refs.editor.editor.getText().trim();
-            this.form.ruleDetails = ruleDetails;
+  computed: {},
 
-            // 调用save时,应写成save(),给不给参数均可,不写小括号的话,isAdd会是事件源,则为true
-            this.$refs.form.validate((valid) => {
-                if (valid) {
-                    if (ruleDetails && ruleDetails.length > 1000000) {
-                        this.$message.error("规则详情长度不得超过100万!");
-                        return;
-                    }
+  methods: {
+    fileRemove() {
+      this.fileList = []
+    },
+    uploadHandle(f) {
+      this.fileList = [f.file]
+      this.scriptUpdate = true
+    },
+    save(isAdd) {
+      if (this.isScore) {
+        this.saveFn()
+      } else {
+        let ruleDetails = null
 
-                    if (isAdd || !this.$route.query.rulesId) {
-                        // 另存为或新增页面
-                        this.form.rulesId = "";
-                        this.form.share = "0";
-                    }
+        if (!this.isScore) {
+          ruleDetails = this.$refs.editor.editor.getText().trim()
+          this.form.ruleDetails = ruleDetails
+        }
+        // 调用save时,应写成save(),给不给参数均可,不写小括号的话,isAdd会是事件源,则为true
+        this.$refs.form.validate((valid) => {
+          if (valid) {
+            if (!this.isScore && ruleDetails && ruleDetails.length > 1000000) {
+              this.$message.error('规则详情长度不得超过100万!')
+              return
+            }
 
-                    if (this.form.rulesId) {
-                        this.$axios({
-                            method: "post",
-                            url: this.$api.sceneLibrary.queryCsbById,
-                            data: {
-                                rulesId: this.form.rulesId,
-                            },
-                        }).then((res) => {
-                            if (res.code === 200) {
-                                if (res.info === 0) {
-                                    this.saveFn();
-                                    return;
-                                }
-
-                                this.$confirm(
-                                    "该评分规则已经被场景测试包引用,保存后同步更新场景测试包中的评分规则,是否确认保存?",
-                                    "提示",
-                                    {
-                                        confirmButtonText: "确定",
-                                        cancelButtonText: "取消",
-                                        type: "warning",
-                                    }
-                                ).then(() => {
-                                    this.saveFn();
-                                });
-                            } else {
-                                this.$message.error(
-                                    res.message ||
-                                        "获取该评分规则是否被场景测试包引用失败"
-                                );
-                            }
-                        });
-                        return;
-                    }
+            if (isAdd || !this.$route.query.rulesId) {
+              // 另存为或新增页面
+              this.form.rulesId = ''
+              this.form.share = '0'
+            }
 
-                    this.saveFn();
-                }
-            });
-        },
-        saveFn() {
-            this.$axios({
-                method: "post",
-                url: this.$api.sceneLibrary.saveScoringRules,
+            if (this.form.rulesId) {
+              this.$axios({
+                method: 'post',
+                url: this.$api.sceneLibrary.queryCsbById,
                 data: {
-                    ...this.form,
+                  rulesId: this.form.rulesId,
                 },
-            }).then((res) => {
+              }).then((res) => {
                 if (res.code === 200) {
-                    this.$message.success("保存成功");
-                    this.cancel();
-                } else {
-                    this.$message.error(res.message || "保存失败");
-                }
-            });
-            // .catch((error) => {
-            //     this.$message.error(error || "保存失败!");
-            // });
-        },
-        cancel() {
-            this.$router.replace({ path: "/gradingRulesList" });
-        },
-    },
+                  if (res.info === 0) {
+                    this.saveFn()
+                    return
+                  }
 
-    mounted() {
-        if (this.$route.query.rulesId) {
-            let rulesId = "";
-            this.form.rulesId = rulesId = this.$route.query.rulesId;
-            this.form.share = this.share = this.$route.query.share;
-
-            if (rulesId) {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.queryScoringRules,
-                    data: {
-                        rulesId,
-                    },
-                }).then((res) => {
-                    if (res.code == 200 && res.info) {
-                        this.form = res.info;
-                        this.content = res.info.ruleDetails;
-                    } else {
-                        this.$message.error(res.message || "获取信息失败");
+                  this.$confirm(
+                    '该评分规则已经被场景测试包引用,保存后同步更新场景测试包中的评分规则,是否确认保存?',
+                    '提示',
+                    {
+                      confirmButtonText: '确定',
+                      cancelButtonText: '取消',
+                      type: 'warning',
                     }
-                });
+                  ).then(() => {
+                    this.saveFn()
+                  })
+                } else {
+                  this.$message.error(
+                    res.message || '获取该评分规则是否被场景测试包引用失败'
+                  )
+                }
+              })
+              return
             }
-        }
+
+            this.saveFn()
+          }
+        })
+      }
+    },
+    saveFn() {
+      if (this.isScore) {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.queryScoringRulesInfo,
+          data: { ...this.form,ruleId:this.form.rulesId, uploadNewFile: true },
+          withCredentials: true,
+          headers: {
+            'Content-type': 'application/json',
+          },
+        }).then((res) => {
+          if (res.code === 200) {
+            this.$message.success('保存成功')
+            this.cancel()
+          } else {
+            this.$message.error(res.message || '保存失败')
+          }
+        })
+      } else {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.saveScoringRules,
+          data: {
+            ...this.form,
+          },
+        }).then((res) => {
+          if (res.code === 200) {
+            this.$message.success('保存成功')
+            this.cancel()
+          } else {
+            this.$message.error(res.message || '保存失败')
+          }
+        })
+      }
     },
-};
+    cancel() {
+      this.$router.replace({ path: '/gradingRulesList' })
+    },
+  },
+
+  mounted() {
+    this.isScore = this.$route.query.isScore ? true : false // 判断是否评分规则新增
+    if (this.$route.query.rulesId) {
+      let rulesId = ''
+      this.form.rulesId = rulesId = this.$route.query.rulesId
+      this.form.share = this.share = this.$route.query.share
+      // 场景评价
+      if (this.isScore) {
+        const { ruleName, ruleDescription, ruleType, scriptName } =
+          this.$store.state.evaluationInfo
+        this.form = Object.assign(this.form, {
+          ruleName,
+          ruleDescription,
+          ruleType,
+          scriptName,
+        })
+        this.ruleTypeDisabled = true
+      } else {
+        this.$axios({
+          method: 'post',
+          url: this.isScore
+            ? this.$api.sceneLibrary.queryScoringRulesInfo
+            : this.$api.sceneLibrary.queryScoringRules,
+          data: {
+            rulesId,
+          },
+        }).then((res) => {
+          if (res.code == 200 && res.info) {
+            this.form = res.info
+            this.content = res.info.ruleDetails
+          } else {
+            this.$message.error(res.message || '获取信息失败')
+          }
+        })
+      }
+    }
+  },
+}
 </script>
 
 <style lang='less' scoped>
 .el-form {
-    width: 60%;
-    padding-top: 60px;
-    margin: 0 auto;
+  width: 60%;
+  padding-top: 60px;
+  margin: 0 auto;
 
-    .el-input {
-        width: 100%;
-    }
+  .el-input {
+    width: 100%;
+  }
 }
 
 .btns {
-    padding-top: 30px;
-    text-align: center;
+  padding-top: 30px;
+  text-align: center;
 }
 </style>

+ 433 - 286
src/views/sceneLibrary/gradingRulesList.vue

@@ -1,308 +1,455 @@
 <template>
-    <div>
-        <div v-show="!$route.path.includes('gradingRuleDetail')">
-            <search-layout :needBox="true">
-                <!-- <template slot="searchItem1">
-                            <span class="label">规则ID</span>
-                            <el-input
-                                v-model="searchParams.rulesCode"
-                                size="small"
-                                clearable
-                                placeholder="请输入"
-                                maxlength="60"
-                                @keyup.enter.native="doSearch"
-                            >
-                            </el-input>
-                        </template> -->
-                <template slot="searchItem1">
-                    <span class="label">规则名称</span>
-                    <el-input v-model="searchParams.ruleName" size="small" clearable placeholder="请输入" maxlength="50"
-                        @keyup.enter.native="doSearch(false)">
-                    </el-input>
-                </template>
-                <template slot="searchItem2">
-                    <span class="label">规则描述</span>
-                    <el-input v-model="searchParams.ruleDescription" size="small" clearable placeholder="请输入"
-                        maxlength="300" @keyup.enter.native="doSearch(false)">
-                    </el-input>
-                </template>
-                <template slot="searchItem3">
-                    <span class="label">创建时间</span>
-                    <!-- <el-date-picker
-                        v-model="searchDate"
-                        type="daterange"
-                        format="yyyy-MM-dd"
-                        value-format="yyyy-MM-dd"
-                        range-separator="至"
-                        start-placeholder="开始日期"
-                        end-placeholder="结束日期"
-                    >
-                    </el-date-picker> -->
-                    <el-date-picker v-model="searchParams.yearMin" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
-                        placeholder="开始日期" class="dateRangeInput">
-                    </el-date-picker>
-                    <span class="dateSeparator">至</span>
-                    <el-date-picker v-model="searchParams.yearMax" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
-                        placeholder="结束日期" class="dateRangeInput">
-                    </el-date-picker>
-                </template>
-                <template slot="searchBtn1">
-                    <el-button type="primary" @click="doSearch(false)">查询</el-button>
-                </template>
-                <template slot="searchBtn2">
-                    <el-button type="primary" @click="doReset">重置</el-button>
-                </template>
-            </search-layout>
+  <div>
+    <div v-show="!$route.path.includes('gradingRuleDetail')">
+      <search-layout :needBox="true">
+        <template slot="searchItem1">
+          <span class="label">规则名称</span>
+          <el-input
+            v-model="searchParams.ruleName"
+            size="small"
+            clearable
+            placeholder="请输入"
+            maxlength="50"
+            @keyup.enter.native="doSearch(false)"
+          >
+          </el-input>
+        </template>
+        <template slot="searchItem2">
+          <span class="label">规则描述</span>
+          <el-input
+            v-model="searchParams.ruleDescription"
+            size="small"
+            clearable
+            placeholder="请输入"
+            maxlength="300"
+            @keyup.enter.native="doSearch(false)"
+          >
+          </el-input>
+        </template>
+        <template slot="searchItem3" v-if="activeName !== '3'">
+          <span class="label">创建时间</span>
+          <el-date-picker
+            v-model="searchParams.yearMin"
+            type="date"
+            format="yyyy-MM-dd"
+            value-format="yyyy-MM-dd"
+            placeholder="开始日期"
+            class="dateRangeInput"
+          >
+          </el-date-picker>
+          <span class="dateSeparator">至</span>
+          <el-date-picker
+            v-model="searchParams.yearMax"
+            type="date"
+            format="yyyy-MM-dd"
+            value-format="yyyy-MM-dd"
+            placeholder="结束日期"
+            class="dateRangeInput"
+          >
+          </el-date-picker>
+        </template>
+        <template slot="searchItem4" v-else>
+          <span class="label">规则类型</span>
+          <el-select
+            v-model="searchParams.ruleType"
+            size="small"
+            clearable
+            placeholder="请选择规则类型"
+          >
+            <el-option
+              v-for="item in ruleTypeOpts"
+              :label="item.label"
+              :value="item.value"
+              :key="item.value"
+            ></el-option>
+          </el-select>
+        </template>
+        <template slot="searchBtn1">
+          <el-button type="primary" @click="doSearch(false)">查询</el-button>
+        </template>
+        <template slot="searchBtn2">
+          <el-button type="primary" @click="doReset">重置</el-button>
+        </template>
+      </search-layout>
 
-            <div class="myTabsBox">
-                <el-tabs v-model="activeName" type="card" @tab-click="pageControl">
-                    <el-tab-pane label="公有" name="1"></el-tab-pane>
-                    <el-tab-pane label="私有" name="2"></el-tab-pane>
-                </el-tabs>
-                <el-button v-show="activeName === '2'" class="addBtn" icon="el-icon-circle-plus-outline" @click="addOne"
-                    type="primary">新增</el-button>
-            </div>
+      <div class="myTabsBox">
+        <el-tabs
+          style="width: 350px"
+          v-model="activeName"
+          type="card"
+          @tab-click="pageControl"
+        >
+          <el-tab-pane label="公有" name="1"></el-tab-pane>
+          <el-tab-pane label="私有" name="2"></el-tab-pane>
+          <el-tab-pane label="场景评价" name="3"></el-tab-pane>
+        </el-tabs>
+        <el-button
+          v-show="['2', '3'].includes(activeName)"
+          class="addBtn"
+          icon="el-icon-circle-plus-outline"
+          @click="addOne"
+          type="primary"
+          >新增</el-button
+        >
+      </div>
 
-            <tableList ref="table" style="margin: 0 30px" :columns="columns" :getDataWay="getDataWay"
-                :pagination="pagination" index>
-                <el-table-column label="规则描述" slot="ruleDescription" align="center">
-                    <template v-slot="scope">
-                        <span>{{ scope.row.ruleDescription }}</span>
-                    </template>
-                </el-table-column>
-                <el-table-column label="操作" slot="cgInfos" align="center" width="180">
-                    <template v-slot="scope">
-                        <i v-if="
-                            (roleCode === '0' || roleCode === '1') &&
-                            activeName === '2'
-                        " @click="shareRow(scope.row)" class="el-icon-share elIcon" title="分享"></i>
-                        <i @click="editRow(scope.row)" class="el-icon-edit-outline elIcon" title="编辑"></i>
-                        <i v-if="((roleCode === '0' || roleCode === '1') && activeName === '1') || activeName === '2'"
-                            @click="delRow(scope.row)" class="el-icon-delete elIcon" title="删除"></i>
-                    </template>
-                </el-table-column>
-            </tableList>
-        </div>
-
-        <router-view v-show="$route.path.includes('gradingRuleDetail')"></router-view>
+      <tableList
+        ref="table"
+        style="margin: 0 30px"
+        :columns="activeName === '3' ? columnsScene : columns"
+        :getDataWay="getDataWay"
+        :pagination="pagination"
+        index
+      >
+        <el-table-column label="规则描述" slot="ruleDescription" align="center">
+          <template v-slot="scope">
+            <span>{{ scope.row.ruleDescription }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="规则类型" slot="ruleType" align="center">
+          <template v-slot="scope">
+            <span>{{ ruleMap[scope.row.ruleType] }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+          <template v-slot="scope">
+            <i
+              v-if="
+                (roleCode === '0' || roleCode === '1') && activeName === '2'
+              "
+              @click="shareRow(scope.row)"
+              class="el-icon-share elIcon"
+              title="分享"
+            ></i>
+            <i
+              @click="editRow(scope.row)"
+              class="el-icon-edit-outline elIcon"
+              title="编辑"
+            ></i>
+            <i
+              v-if="
+                ((roleCode === '0' || roleCode === '1') &&
+                  activeName === '1') ||
+                activeName === '2' ||
+                activeName === '3'
+              "
+              @click="delRow(scope.row)"
+              class="el-icon-delete elIcon"
+              title="删除"
+            ></i>
+          </template>
+        </el-table-column>
+      </tableList>
     </div>
-</template>
 
-<script>
-import searchLayout from "@/components/grid/searchLayout";
-import tableList from "@/components/grid/TableList";
-import toolbarTab from "@/components/toolbar/toolbarTab";
-import { mapState } from "vuex";
+    <router-view
+      v-show="$route.path.includes('gradingRuleDetail')"
+    ></router-view>
+  </div>
+</template>
+  
+  <script>
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import toolbarTab from '@/components/toolbar/toolbarTab'
+import { ruleTypeOpts } from './common'
+import { mapState } from 'vuex'
 
 export default {
-    name: "gradingRulesList", // 评分规则列表
-    components: { searchLayout, tableList, toolbarTab },
-    data() {
-        return {
-            activeName: "2",
-            searchParams: {
-                //搜索参数
-                // rulesCode: "", //规则Id
-                ruleName: "", //规则名称
-                ruleDescription: "", //规则描述
-                yearMin: "", // 开始时间
-                yearMax: "", // 结束时间
-            },
-            searchDate: "", // 创建时间
-            columns: [
-                //表格列
-                {
-                    label: "规则名称",
-                    prop: "ruleName",
-                },
-                {
-                    label: "规则描述",
-                    prop: "ruleDescription",
-                    showOverflowTooltip: true,
-                    template: true,
-                },
-                {
-                    label: "创建时间",
-                    prop: "createTime",
-                    formatter(row) {
-                        return row.createTime.slice(0, 10);
-                    },
-                },
-                {
-                    label: "操作",
-                    prop: "cgInfos",
-                    template: true,
-                },
-            ],
-            pagination: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWay: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.queryScoringRulesList,
-                param: {
-                    packageId: "11111111",
-                    share: "0",
-                },
-            },
-            dialogVisible: false,
-        };
-    },
-
-    computed: { ...mapState(["roleCode"]) },
-
-    watch: {
-        $route(to, from) {
-            if (to.name === "gradingRulesList") {
-                this.$nextTick(() => {
-                    this.doSearch(true);
-                });
+  name: 'gradingRulesList', // 评分规则列表
+  components: { searchLayout, tableList, toolbarTab },
+  data() {
+    return {
+      activeName: '2',
+      searchParams: {
+        //搜索参数
+        // rulesCode: "", //规则Id
+        ruleName: '', //规则名称
+        ruleDescription: '', //规则描述
+        yearMin: '', // 开始时间
+        yearMax: '', // 结束时间
+        ruleType: '',
+      },
+      ruleTypeOpts, // 规则类型
+      searchDate: '', // 创建时间
+      ruleMap: ['', '复杂度', '危险度', '暴露率','覆盖率'],
+      columns: [
+        //表格列
+        {
+          label: '规则名称',
+          prop: 'ruleName',
+        },
+        {
+          label: '规则描述',
+          prop: 'ruleDescription',
+          showOverflowTooltip: true,
+          template: true,
+        },
+        {
+          label: '创建时间',
+          prop: 'createTime',
+          formatter(row) {
+            return row.createTime.slice(0, 10)
+          },
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      columnsScene: [
+        //表格列
+        {
+          label: '规则名称',
+          prop: 'ruleName',
+        },
+        {
+          label: '规则描述',
+          prop: 'ruleDescription',
+          showOverflowTooltip: true,
+          template: true,
+        },
+        {
+          label: '规则类型',
+          prop: 'ruleType',
+          template: true,
+        },
+        {
+          label: '上传状态',
+          prop: 'status',
+          formatter(row) {
+            switch(row.status){
+              case '0':
+                return '未上传'
+                case '1':
+                return '上传中'
+                case '2':
+                return '上传完成'
+                case '5':
+                return '上传失败'
+                default: return '-'
             }
+          },
+        },
+        {
+          label: '创建时间',
+          prop: 'createTime',
+          formatter(row) {
+            return row.createTime.slice(0, 10)
+          },
         },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.queryScoringRulesList,
+        param: {
+          packageId: '11111111',
+          share: '0',
+        },
+      },
+      dialogVisible: false,
+    }
+  },
+
+  computed: { ...mapState(['roleCode']) },
+
+  watch: {
+    $route(to, from) {
+      if (to.name === 'gradingRulesList') {
+        this.$nextTick(() => {
+          this.doSearch(true)
+        })
+      }
     },
+  },
 
-    methods: {
-        pageControl(data) {
-            this.activeName = data.name;
-            this.doSearch(false);
-        },
-        // isBack为解决从详情回退时列表在当前页刷新
-        doSearch(isBack = false) {
-            // if (this.searchDate) {
-            //     this.searchParams.yearMin = `${this.searchDate[0]} 00:00:00`;
-            //     this.searchParams.yearMax = `${this.searchDate[1]} 23:59:59`;
-            // } else {
-            //     this.searchParams.yearMin = "";
-            //     this.searchParams.yearMax = "";
-            // }
+  methods: {
+    pageControl(data) {
+      // 场景评价 切换接口地址
+      if (data.name == '3') {
+        this.getDataWay.data = this.$api.sceneLibrary.querySceneScoringRulesList
+      } else {
+        // 公有 私有
+        this.getDataWay.data = this.$api.sceneLibrary.queryScoringRulesList
+      }
+      this.activeName = data.name
+      this.doSearch(false)
+    },
+    // isBack为解决从详情回退时列表在当前页刷新
+    doSearch(isBack = false) {
+      // if (this.searchDate) {
+      //     this.searchParams.yearMin = `${this.searchDate[0]} 00:00:00`;
+      //     this.searchParams.yearMax = `${this.searchDate[1]} 23:59:59`;
+      // } else {
+      //     this.searchParams.yearMin = "";
+      //     this.searchParams.yearMax = "";
+      // }
 
-            let yearMin = "";
-            if (this.searchParams.yearMin) {
-                yearMin = `${this.searchParams.yearMin} 00:00:00`;
-            }
+      let yearMin = ''
+      if (this.searchParams.yearMin) {
+        yearMin = `${this.searchParams.yearMin} 00:00:00`
+      }
 
-            let yearMax = "";
-            if (this.searchParams.yearMax) {
-                yearMax = `${this.searchParams.yearMax} 23:59:59`;
-            }
+      let yearMax = ''
+      if (this.searchParams.yearMax) {
+        yearMax = `${this.searchParams.yearMax} 23:59:59`
+      }
 
-            if (yearMin && yearMax && yearMin > yearMax) {
-                this.$message.error("结束时间不能早于开始时间");
-                return;
-            }
+      if (yearMin && yearMax && yearMin > yearMax) {
+        this.$message.error('结束时间不能早于开始时间')
+        return
+      }
 
-            let pageMap = {
-                // rulesCode: this.searchParams.rulesCode,
-                ruleName: this.searchParams.ruleName,
-                ruleDescription: this.searchParams.ruleDescription,
-                yearMin,
-                yearMax,
-                share: this.activeName === "1" ? "1" : "0",
-                resetPageNum: !isBack ? false : (this.pagination.currentPage || 1),
-            };
+      let pageMap = {
+        // rulesCode: this.searchParams.rulesCode,
+        ruleName: this.searchParams.ruleName,
+        ruleDescription: this.searchParams.ruleDescription,
+        ruleType: this.searchParams.ruleType, // 规则类型
+        yearMin,
+        yearMax,
+        share: this.activeName === '1' ? '1' : '0',
+        resetPageNum: !isBack ? false : this.pagination.currentPage || 1,
+      }
 
-            if (!isBack) this.pagination.currentPage = 1;
+      if (!isBack) this.pagination.currentPage = 1
 
-            this.refreshList(pageMap);
-        },
-        //刷新table
-        refreshList(param) {
-            param
-                ? this.$refs["table"].loadData(param)
-                : this.$refs["table"].loadData();
-        },
-        doReset() {
-            this.searchParams = {
-                // rulesCode: "",
-                ruleName: "",
-                ruleDescription: "",
-                yearMin: "",
-                yearMax: "",
-            };
-            // this.searchDate = "";
-            this.doSearch();
-        },
-        viewRow(row) {
-            this.dialogVisible = true;
-        },
-        addOne() {
-            this.$store.commit("getTabname", "gradingRuleDetailTabName", "");
-            localStorage.setItem("gradingRuleDetailTabName", "");
+      this.refreshList(pageMap)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doReset() {
+      this.searchParams = {
+        // rulesCode: "",
+        ruleName: '',
+        ruleDescription: '',
+        yearMin: '',
+        yearMax: '',
+      }
+      // this.searchDate = "";
+      this.doSearch()
+    },
+    viewRow(row) {
+      this.dialogVisible = true
+    },
+    addOne() {
+      this.$store.commit('getTabname', 'gradingRuleDetailTabName', '')
+      localStorage.setItem('gradingRuleDetailTabName', '')
 
-            this.$router.push({ path: "/gradingRuleDetail" });
-        },
-        shareRow(row) {
-            this.$confirm("确认是否分享?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.fxScoringRules,
-                    data: {
-                        rulesId: row.rulesId,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("分享成功");
-                    } else {
-                        this.$message.error(res.message || "分享失败");
-                    }
-                    this.doSearch();
-                });
-            });
-        },
-        delRow(row) {
-            this.$confirm("确认是否删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.deleteScoringRules,
-                    data: {
-                        rulesId: row.rulesId,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
-        },
-        editRow(row) {
-            this.$store.commit("getTabname", "gradingRuleDetailTabName", row.ruleName);
-            localStorage.setItem("gradingRuleDetailTabName", row.ruleName);
+      this.$router.push({
+        path: '/gradingRuleDetail',
+        query: this.activeName == '3' ? { isScore: true } : {}, // 评分规则新增路由跳转标识
+      })
+    },
+    shareRow(row) {
+      this.$confirm('确认是否分享?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.fxScoringRules,
+          data: {
+            rulesId: row.rulesId,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('分享成功')
+          } else {
+            this.$message.error(res.message || '分享失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    delRow(row) {
+      const obj =
+        this.activeName == '3'
+          ? {
+              ruleId: row.ruleId,
+            }
+          : {
+              rulesId: row.rulesId,
+            }
+      this.$confirm('确认是否删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url:
+            this.activeName == '3'
+              ? this.$api.sceneLibrary.deleteSceneEvaluationRule
+              : this.$api.sceneLibrary.deleteScoringRules,
+          data: obj,
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    editRow(row) {
+      this.$store.commit('getTabname', 'gradingRuleDetailTabName', row.ruleName)
+      localStorage.setItem('gradingRuleDetailTabName', row.ruleName)
+      if (this.activeName == '3') {
+        this.$store.commit('getEvaluationInfo', {
+          ruleName: row.ruleName,
+          ruleDescription: row.ruleDescription,
+          ruleType: row.ruleType,
+          scriptName: row.scriptName,
+        })
+      }
+      const objs =
+        this.activeName == '3'
+          ? {
+              rulesId: row.rulesId || row.ruleId,
+              share: -1,
+              isScore: true,
+            }
+          : {
+              rulesId: row.rulesId || row.ruleId,
+              share: row.share,
+            }
+      this.$router.push({
+        path: '/gradingRuleDetail',
+        // params: {
+        //     rulesId: row.rulesId,
+        //     share: row.share,
+        // },
 
-            this.$router.push({
-                path: "/gradingRuleDetail",
-                // params: {
-                //     rulesId: row.rulesId,
-                //     share: row.share,
-                // },
-                query: {
-                    rulesId: row.rulesId,
-                    share: row.share,
-                },
-            });
-        },
+        query: objs,
+      })
     },
+  },
 
-    // mounted() {}
-};
+  // mounted() {}
+}
 </script>
-
-<style lang='less' scoped></style>
+  
+  <style lang='less' scoped></style>

+ 539 - 559
src/views/sceneLibrary/naturalDrivingScenarioList.vue

@@ -1,90 +1,166 @@
 <template>
-    <div class="naturalDrivingScenarioListPanel">
-        <search-layout :needBox="true">
-            <template slot="searchItem1">
-                <span class="label">场景名称</span>
-                <el-input
-                    v-model="searchParams.naturalName"
-                    size="small"
-                    clearable
-                    placeholder="请输入"
-                    maxlength="60"
-                    @keyup.enter.native="doSearch"
-                >
-                </el-input>
-            </template>
-            <template slot="searchItem2">
-                <span class="label">自车行为</span>
-                <el-cascader
-                    v-model="searchParams.selfBehavior"
-                    :options="selfBehaviorList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem3">
-                <span class="label">目标行为</span>
-                <el-cascader
-                    v-model="searchParams.targetBehavior"
-                    :options="targetBehaviorList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem4">
-                <span class="label">交通情况</span>
-                <el-cascader
-                    v-model="searchParams.trafficCondition"
-                    :options="trafficConditionList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem5">
-                <span class="label">道路</span>
-                <el-cascader
-                    v-model="searchParams.road"
-                    :options="roadList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem6">
-                <span class="label">基础设施</span>
-                <el-cascader
-                    v-model="searchParams.infrastructure"
-                    :options="infrastructureList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem7">
-                <span class="label">自然环境</span>
-                <el-cascader
-                    v-model="searchParams.naturalEnvironment"
-                    :options="naturalEnvironmentList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem8">
-                <span class="label">临时性操纵</span>
-                <el-cascader
-                    v-model="searchParams.temporaryOperation"
-                    :options="temporaryOperationList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem27">
-                <!-- <el-checkbox-group v-model="labels">
+  <div class="naturalDrivingScenarioListPanel">
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">场景名称</span>
+        <el-input
+          v-model="searchParams.naturalName"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">自车行为</span>
+        <el-cascader
+          v-model="searchParams.selfBehavior"
+          :options="selfBehaviorList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">目标行为</span>
+        <el-cascader
+          v-model="searchParams.targetBehavior"
+          :options="targetBehaviorList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem4">
+        <span class="label">交通情况</span>
+        <el-cascader
+          v-model="searchParams.trafficCondition"
+          :options="trafficConditionList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem5">
+        <span class="label">道路</span>
+        <el-cascader
+          v-model="searchParams.road"
+          :options="roadList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem6">
+        <span class="label">基础设施</span>
+        <el-cascader
+          v-model="searchParams.infrastructure"
+          :options="infrastructureList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem7">
+        <span class="label">自然环境</span>
+        <el-cascader
+          v-model="searchParams.naturalEnvironment"
+          :options="naturalEnvironmentList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem7">
+        <span class="label">临时性操纵</span>
+        <el-cascader
+          v-model="searchParams.temporaryOperation"
+          :options="temporaryOperationList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <!-- 复杂度 -->
+      <template slot="searchItem5">
+        <span class="label">复杂度</span>
+        <el-input
+          v-model="searchParams.minComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <!-- 危险度 -->
+      <template slot="searchItem6">
+        <span class="label">危险度</span>
+        <el-input
+          v-model="searchParams.minRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem7">
+        <span class="label">复杂度等级</span>
+        <el-select
+          v-model="searchParams.complexityLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem6">
+        <span class="label">危险度等级</span>
+        <el-select
+          v-model="searchParams.riskLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem27">
+        <!-- <el-checkbox-group v-model="labels">
                     <el-checkbox-button
                         label="1"
                         :key="1"
@@ -111,508 +187,412 @@
                         >掉头</el-checkbox-button
                     >
                 </el-checkbox-group> -->
-                <div class="labelsBox">
-                    <b class="labelA" @click="conditions(1)">高速</b>
-                    <b class="labelB" @click="conditions(2)">切入</b>
-                    <b class="labelC" @click="conditions(3)">切出</b>
-                    <b class="labelD" @click="conditions(4)">变道</b>
-                    <b class="labelA" @click="conditions(5)">匝道</b>
-                    <b class="labelB" @click="conditions(6)">隧道</b>
-                    <b class="labelC" @click="conditions(7)">掉头</b>
-                </div>
-            </template>
-
-            <template slot="searchBtn1">
-                <el-button type="primary" @click="doSearch">查询</el-button>
-            </template>
-            <template slot="searchBtn2">
-                <el-button type="primary" @click="doReset">重置</el-button>
-            </template>
-        </search-layout>
-
-        <div class="myTabsBox">
-            <el-tabs v-model="activeName" type="card" @tab-click="pageControl">
-                <el-tab-pane label="公有" name="1"></el-tab-pane>
-                <el-tab-pane label="私有" name="2"></el-tab-pane>
-            </el-tabs>
+        <div class="labelsBox">
+          <b class="labelA" @click="conditions(1)">高速</b>
+          <b class="labelB" @click="conditions(2)">切入</b>
+          <b class="labelC" @click="conditions(3)">切出</b>
+          <b class="labelD" @click="conditions(4)">变道</b>
+          <b class="labelA" @click="conditions(5)">匝道</b>
+          <b class="labelB" @click="conditions(6)">隧道</b>
+          <b class="labelC" @click="conditions(7)">掉头</b>
         </div>
+      </template>
 
-        <tableList
-            ref="table"
-            style="margin: 0 30px 30px"
-            :columns="columns"
-            :getDataWay="getDataWay"
-            :pagination="pagination"
-            index
-        >
-            <el-table-column
-                label="操作"
-                slot="cgInfos"
-                align="center"
-                width="180"
-            >
-                <template v-slot="scope">
-                    <i
-                        @click="viewRow(scope.row)"
-                        class="el-icon-view elIcon cursor"
-                        title="查看"
-                    >
-                    </i>
-                </template>
-            </el-table-column>
-        </tableList>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+    </search-layout>
 
-        <el-dialog
-            :title="videoDiaTitle"
-            :visible.sync="dialogVisible"
-            width="690px"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-            :before-close="diaClose"
-        >
-            <div class="videoBox">
-                <video autoplay :src="videoSrc" controls></video>
-            </div>
-        </el-dialog>
+    <div class="myTabsBox">
+      <el-tabs v-model="activeName" type="card" @tab-click="pageControl">
+        <el-tab-pane label="公有" name="1"></el-tab-pane>
+        <el-tab-pane label="私有" name="2"></el-tab-pane>
+      </el-tabs>
     </div>
+
+    <tableList
+      ref="table"
+      style="margin: 0 30px 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      index
+    >
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <i
+            @click="viewRow(scope.row)"
+            class="el-icon-view elIcon cursor"
+            title="查看"
+          >
+          </i>
+          <i @click="jumpScene(scope.row)" class="el-icon-document elIcon">  </i>
+        </template>
+      </el-table-column>
+    </tableList>
+
+    <el-dialog
+      :title="videoDiaTitle"
+      :visible.sync="dialogVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="diaClose"
+    >
+      <div class="videoBox">
+        <video autoplay :src="videoSrc" controls></video>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
-import searchLayout from "@/components/grid/searchLayout";
-import tableList from "@/components/grid/TableList";
-import { mapState } from "vuex";
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import { mapState } from 'vuex'
 
 export default {
-    name: "naturalDrivingScenarioList", // 自然驾驶场景
-    components: { searchLayout, tableList },
-    data() {
-        return {
-            activeName: "2",
-            searchParams: {
-                //搜索参数
-                naturalName: "", // 场景名称
-                road: [], // 道路
-                infrastructure: [], // 基础设施
-                trafficCondition: [], // 交通情况
-                selfBehavior: [], // 自车行为
-                targetBehavior: [], // 目标行为
-                naturalEnvironment: [], // 自然环境
-
-                highSpeed: [], // 高速
-                ramp: [], // 匝道
-                tunnel: [], // 隧道
-                cutIn: [], // 切入
-                cutOut: [], // 切出
-                laneChange: [], // 变道
-                turnAround: [], // 掉头
-
-                share: "0", // 0 私有 1 公有
-            },
-            labels: [],
-            list: [],
-            roadList: [],
-            infrastructureList: [],
-            trafficConditionList: [],
-            selfBehaviorList: [],
-            targetBehaviorList: [],
-            naturalEnvironmentList: [],
-            temporaryOperationList: [],
-            props: {
-                multiple: true,
-                label: "dictName",
-                value: "dictCode",
-            },
-            columns: [
-                //表格列
-                {
-                    label: "场景名称",
-                    prop: "naturalName",
-                },
-                {
-                    label: "自车行为",
-                    prop: "selfBehavior",
-                },
-                {
-                    label: "目标行为",
-                    prop: "targetBehavior",
-                },
-                {
-                    label: "天气",
-                    prop: "weather",
-                },
-                {
-                    label: "道路类型",
-                    prop: "roadType",
-                },
-                {
-                    label: "标签",
-                    prop: "label",
-                },
-                {
-                    label: "操作",
-                    prop: "cgInfos",
-                    template: true,
-                },
-            ],
-            pagination: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWay: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.querySceneNaturalList,
-                param: {
-                    share: "0",
-                },
-            },
-            dialogVisible: false,
-            autoplay: false,
-            videoSrc: "",
-            objectPath: "",
-            videoDiaTitle: "",
-        };
-    },
+  name: 'naturalDrivingScenarioList', // 自然驾驶场景
+  components: { searchLayout, tableList },
+  data() {
+    return {
+      activeName: '2',
+      searchParams: {
+        //搜索参数
+        naturalName: '', // 场景名称
+        road: [], // 道路
+        infrastructure: [], // 基础设施
+        trafficCondition: [], // 交通情况
+        selfBehavior: [], // 自车行为
+        targetBehavior: [], // 目标行为
+        naturalEnvironment: [], // 自然环境
 
-    computed: {
-        ...mapState(["fileHost", "fileUrl"]),
-    },
-
-    methods: {
-        doSearch() {
-            /* this.searchParams.highSpeed = this.labels.includes("1")
-                ? [["roadType", "高速"]]
-                : [];
-            this.searchParams.cutIn = this.labels.includes("2")
-                ? [
-                      [
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "机动车从左侧切入成功",
-                      ],
-                      [
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "机动车从右侧切入成功",
-                      ],
-                  ]
-                : [];
-            this.searchParams.cutOut = this.labels.includes("3")
-                ? [
-                      [
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "机动车向左侧切出成功",
-                      ],
-                      [
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "targetBehavior",
-                          "机动车向右侧切出成功",
-                      ],
-                  ]
-                : [];
-            this.searchParams.laneChange = this.labels.includes("4")
-                ? [
-                      [
-                          "selfBehavior",
-                          "selfBehavior",
-                          "selfBehavior",
-                          "向左变道成功",
-                      ],
-                      [
-                          "selfBehavior",
-                          "selfBehavior",
-                          "selfBehavior",
-                          "向右变道成功",
-                      ],
-                      [
-                          "selfBehavior",
-                          "selfBehavior",
-                          "selfBehavior",
-                          "向左连续变道",
-                      ],
-                      [
-                          "selfBehavior",
-                          "selfBehavior",
-                          "selfBehavior",
-                          "向右连续变道",
-                      ],
-                      [
-                          "selfBehavior",
-                          "selfBehavior",
-                          "selfBehavior",
-                          "向左变道超车",
-                      ],
-                      [
-                          "selfBehavior",
-                          "selfBehavior",
-                          "selfBehavior",
-                          "向右变道超车",
-                      ],
-                  ]
-                : [];
-            this.searchParams.ramp = this.labels.includes("5")
-                ? [["ramp", "是"]]
-                : [];
-            this.searchParams.tunnel = this.labels.includes("6")
-                ? [["tunnel", "是"]]
-                : [];
-            this.searchParams.turnAround = this.labels.includes("7")
-                ? [
-                      ["selfBehavior", "直路掉头"],
-                      ["selfBehavior", "selfBehavior", "路口掉头"],
-                  ]
-                : []; */
+        highSpeed: [], // 高速
+        ramp: [], // 匝道
+        tunnel: [], // 隧道
+        cutIn: [], // 切入
+        cutOut: [], // 切出
+        laneChange: [], // 变道
+        turnAround: [], // 掉头
 
-            this.searchParams.share = this.activeName === "1" ? "1" : "0";
-            this.refreshList(this.searchParams);
+        share: '0', // 0 私有 1 公有
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      },
+      labels: [],
+      list: [],
+      roadList: [],
+      infrastructureList: [],
+      trafficConditionList: [],
+      selfBehaviorList: [],
+      targetBehaviorList: [],
+      naturalEnvironmentList: [],
+      temporaryOperationList: [],
+      props: {
+        multiple: true,
+        label: 'dictName',
+        value: 'dictCode',
+      },
+      columns: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'naturalName',
         },
-        //刷新table
-        refreshList(param) {
-            param
-                ? this.$refs["table"].loadData(param)
-                : this.$refs["table"].loadData();
+        {
+          label: '自车行为',
+          prop: 'selfBehavior',
         },
-        doReset() {
-            this.searchParams = {
-                naturalName: "",
-                road: [],
-                infrastructure: [],
-                trafficCondition: [],
-                selfBehavior: [],
-                targetBehavior: [],
-                naturalEnvironment: [],
-                temporaryOperation: [],
-                highSpeed: [],
-                ramp: [],
-                tunnel: [],
-                cutIn: [],
-                cutOut: [],
-                laneChange: [],
-                turnAround: [],
-                share: this.activeName === "1" ? "1" : "0",
-            };
-            // this.labels = [];
-            this.doSearch();
+        {
+          label: '目标行为',
+          prop: 'targetBehavior',
         },
-        pageControl(data) {
-            this.activeName = data.name;
-            this.doSearch();
+        {
+          label: '天气',
+          prop: 'weather',
         },
-        conditions(v) {
-            switch (v) {
-                case 1:
-                    this.searchParams.road = [
-                        ...this.searchParams.road,
-                        ["roadType", "高速"],
-                    ];
-                    break;
-                case 2:
-                    this.searchParams.targetBehavior = [
-                        ...this.searchParams.targetBehavior,
-                        [
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "机动车从左侧切入成功",
-                        ],
-                        [
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "机动车从右侧切入成功",
-                        ],
-                    ];
-                    break;
-                case 3:
-                    this.searchParams.targetBehavior = [
-                        ...this.searchParams.targetBehavior,
-                        [
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "机动车向左侧切出成功",
-                        ],
-                        [
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "机动车向右侧切出成功",
-                        ],
-                    ];
-                    break;
-                case 4:
-                    this.searchParams.selfBehavior = [
-                        ...this.searchParams.selfBehavior,
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向左变道成功",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向右变道成功",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向左连续变道",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向右连续变道",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向左变道超车",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向右变道超车",
-                        ],
-                    ];
-                    break;
-                case 5:
-                    this.searchParams.road = [
-                        ...this.searchParams.road,
-                        ["ramp", "是"],
-                    ];
-                    break;
-                case 6:
-                    this.searchParams.road = [
-                        ...this.searchParams.road,
-                        ["tunnel", "是"],
-                    ];
-                    break;
-                case 7:
-                    this.searchParams.selfBehavior = [
-                        ...this.searchParams.selfBehavior,
-                        ["selfBehavior", "直路掉头"],
-                        ["selfBehavior", "selfBehavior", "路口掉头"],
-                    ];
-                    break;
-                default:
-                    break;
-            }
+        {
+          label: '道路类型',
+          prop: 'roadType',
         },
-        viewRow(row) {
-            if (!row.videoAddress) {
-                this.$message.warning("本场景无仿真视频");
-                return;
-            }
-            
-            this.dialogVisible = true;
-            this.videoDiaTitle = row.naturalName;
-
-            let url = "";
-            if (process.env.VUE_APP_IS_DEV == "true") {
-                url = this.fileHost + this.fileUrl;
-            } else {
-                url = this.fileUrl;
-            }
-
-            let token = localStorage.getItem("Authorization").split(" ")[1];
-            this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`;
-            this.autoplay = true;
+        {
+          label: '标签',
+          prop: 'label',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
         },
-        delRow(row) {
-            this.$confirm("确认是否删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.deleteSceneNatural,
-                    data: {
-                        naturalId: row.naturalId,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
         },
-        diaClose(done) {
-            this.autoplay = false;
-            this.videoSrc = "";
-            done();
+        {
+          label: '危险度',
+          prop: 'risk',
         },
-        openFileDia() {
-            this.objectPath = Math.random().toString();
-            this.$refs.fileDialog.fileVisible = true;
+
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
         },
-        fileClose() {
-            this.objectPath = "";
-            this.doSearch();
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
         },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.querySceneNaturalList,
+        param: {
+          share: '0',
+        },
+      },
+      dialogVisible: false,
+      autoplay: false,
+      videoSrc: '',
+      objectPath: '',
+      videoDiaTitle: '',
+    }
+  },
+
+  computed: {
+    ...mapState(['fileHost', 'fileUrl']),
+  },
+
+  methods: {
+    doSearch() {
+      this.searchParams.share = this.activeName === '1' ? '1' : '0'
+      this.refreshList(this.searchParams)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doReset() {
+      this.searchParams = {
+        naturalName: '',
+        road: [],
+        infrastructure: [],
+        trafficCondition: [],
+        selfBehavior: [],
+        targetBehavior: [],
+        naturalEnvironment: [],
+        temporaryOperation: [],
+        highSpeed: [],
+        ramp: [],
+        tunnel: [],
+        cutIn: [],
+        cutOut: [],
+        laneChange: [],
+        turnAround: [],
+        share: this.activeName === '1' ? '1' : '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      }
+      // this.labels = [];
+      this.doSearch()
+    },
+    pageControl(data) {
+      this.activeName = data.name
+      this.doSearch()
+    },
+    conditions(v) {
+      switch (v) {
+        case 1:
+          this.searchParams.road = [
+            ...this.searchParams.road,
+            ['roadType', '高速'],
+          ]
+          break
+        case 2:
+          this.searchParams.targetBehavior = [
+            ...this.searchParams.targetBehavior,
+            [
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              '机动车从左侧切入成功',
+            ],
+            [
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              '机动车从右侧切入成功',
+            ],
+          ]
+          break
+        case 3:
+          this.searchParams.targetBehavior = [
+            ...this.searchParams.targetBehavior,
+            [
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              '机动车向左侧切出成功',
+            ],
+            [
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              '机动车向右侧切出成功',
+            ],
+          ]
+          break
+        case 4:
+          this.searchParams.selfBehavior = [
+            ...this.searchParams.selfBehavior,
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向左变道成功'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向右变道成功'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向左连续变道'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向右连续变道'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向左变道超车'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向右变道超车'],
+          ]
+          break
+        case 5:
+          this.searchParams.road = [...this.searchParams.road, ['ramp', '是']]
+          break
+        case 6:
+          this.searchParams.road = [...this.searchParams.road, ['tunnel', '是']]
+          break
+        case 7:
+          this.searchParams.selfBehavior = [
+            ...this.searchParams.selfBehavior,
+            ['selfBehavior', '直路掉头'],
+            ['selfBehavior', 'selfBehavior', '路口掉头'],
+          ]
+          break
+        default:
+          break
+      }
     },
+    jumpScene(row) {
+      this.$store.commit("getSceneCurPage",this.pagination.currentPage);
+      this.$store.commit('getSceneId', row.naturalId)
+      this.$router.push({
+        path: '/sceneEvaluation',
+        query:{id:row.naturalId}
+      })
+    },
+    viewRow(row) {
+      if (!row.videoAddress) {
+        this.$message.warning('本场景无仿真视频')
+        return
+      }
+
+      this.dialogVisible = true
+      this.videoDiaTitle = row.naturalName
+
+      let url = ''
+      if (process.env.VUE_APP_IS_DEV == 'true') {
+        url = this.fileHost + this.fileUrl
+      } else {
+        url = this.fileUrl
+      }
 
-    async mounted() {
-        await this.$dicsTreesInit({
-            roadList: "road",
-            infrastructureList: "infrastructure",
-            trafficConditionList: "trafficCondition",
-            selfBehaviorList: "selfBehavior",
-            targetBehaviorList: "targetBehavior",
-            naturalEnvironmentList: "naturalEnvironment",
-            temporaryOperationList: "temporaryOperation",
-        });
+      let token = localStorage.getItem('Authorization').split(' ')[1]
+      this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`
+      this.autoplay = true
+    },
+    delRow(row) {
+      this.$confirm('确认是否删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.deleteSceneNatural,
+          data: {
+            naturalId: row.naturalId,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    diaClose(done) {
+      this.autoplay = false
+      this.videoSrc = ''
+      done()
+    },
+    openFileDia() {
+      this.objectPath = Math.random().toString()
+      this.$refs.fileDialog.fileVisible = true
     },
-};
+    fileClose() {
+      this.objectPath = ''
+      this.doSearch()
+    },
+  },
+
+  async mounted() {
+    if(this.$store.state.sceneLock){
+      this.pagination.currentPage = this.$store.state.sceneCurPage
+    }
+    await this.$dicsTreesInit({
+      roadList: 'road',
+      infrastructureList: 'infrastructure',
+      trafficConditionList: 'trafficCondition',
+      selfBehaviorList: 'selfBehavior',
+      targetBehaviorList: 'targetBehavior',
+      naturalEnvironmentList: 'naturalEnvironment',
+      temporaryOperationList: 'temporaryOperation',
+    })
+  },
+}
 </script>
 
 <style lang='less' scoped>
-@import "./common/util.less";
+@import './common/util.less';
 .naturalDrivingScenarioListPanel {
-    .inputBox {
-        .label {
-            min-width: 75px;
-        }
+  .inputBox {
+    .label {
+      min-width: 75px;
     }
+  }
 
-    .btnsPanel {
-        text-align: right;
-    }
+  .btnsPanel {
+    text-align: right;
+  }
 }
 </style>

+ 215 - 0
src/views/sceneLibrary/sceneEvaluation.vue

@@ -0,0 +1,215 @@
+<template>
+  <div
+    style="
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+      padding: 20px 50px;
+    "
+  >
+    <!-- 复杂度详情 -->
+    <p
+      style="
+        font-size: 18px;
+        font-weight: bold;
+        border-bottom: 1px solid #ccc;
+        padding-bottom: 15px;
+      "
+    >
+      复杂度详情
+    </p>
+    <tableList
+      ref="table"
+      style="margin: 40px 30px 30px"
+      :columns="columns1"
+      :getDataWay="getDataWay1"
+      :pagination="pagination1"
+      index
+      indexFixed
+    >
+    </tableList>
+    <!-- 危险度详情 -->
+    <p
+      style="
+        font-size: 18px;
+        font-weight: bold;
+        border-bottom: 1px solid #ccc;
+        padding-bottom: 15px;
+      "
+    >
+      危险度详情
+    </p>
+    <tableList
+      ref="table"
+      style="margin: 40px 30px 30px"
+      :columns="columns2"
+      :getDataWay="getDataWay2"
+      :pagination="pagination2"
+      index
+      indexFixed
+    >
+    </tableList>
+    <!-- 分页 -->
+    <div
+      style="width: 100%; display: flex; justify-content: end; margin: 30px 0"
+    >
+      <el-pagination
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+        :current-page="dangerCurPage"
+        :page-sizes="[5, 10, 20, 50]"
+        :page-size="dangerPageSize"
+        :total="dangerData.length"
+        layout="total, sizes, prev, pager, next, jumper"
+      >
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import tableList from '@/components/grid/TableList'
+export default {
+  components: { tableList },
+  data() {
+    return {
+      sceneId: '',
+      columns1: [
+        {
+          label: '评价时间',
+          prop: 'createTime',
+        },
+        {
+          label: '评分规则',
+          prop: 'ruleName',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+      ],
+      columns2: [
+        {
+          label: '评价时间',
+          prop: 'createTime',
+        },
+        {
+          label: '评分规则',
+          prop: 'ruleName',
+        },
+        {
+          label: '评价算法',
+          prop: 'algorithmName',
+        },
+        {
+          label: '评价车型',
+          prop: 'vehicleName',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+      ],
+      getDataWay1: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        data: this.$api.sceneLibrary.queryComplexityDetail,
+        param: {
+          // sceneId: this.$store.state.sceneId,
+          sceneId: '',
+
+        },
+      },
+      getDataWay2: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        data: this.$api.sceneLibrary.queryRiskDetail,
+        param: {
+          // sceneId: this.$store.state.sceneId,
+          sceneId: '',
+
+        },
+      },
+      pagination1: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      pagination2: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      complexData: [
+        {
+          sceneId: '',
+          sceneType: '',
+          ruleId: '',
+          ruleName: '评分规则1',
+          taskId: '',
+          complexity: 1,
+          complexityLevel: 11,
+        },
+        {
+          sceneId: '',
+          sceneType: '',
+          ruleId: '',
+          ruleName: '评分规则2',
+          taskId: '',
+          complexity: 2,
+          complexityLevel: 21,
+        },
+      ],
+      dangerData: [
+        {
+          sceneId: '',
+          sceneType: '',
+          ruleId: '',
+          ruleName: '评分规则3',
+          taskId: '',
+          risk: 1,
+          riskLevel: 61,
+          algorithmId: 11,
+          algorithmName: 11,
+          vehicleId: 11,
+          vehicleName: 51,
+        },
+      ],
+      complexCurPage: 1, // 复杂度页码
+      complexPageSize: 5, // 复杂度页条数
+      dangerCurPage: 1, // 复杂度页码
+      dangerPageSize: 5, // 复杂度页条数
+    }
+  },
+  methods: {
+    handleSizeChange(val) {
+      this.pageSize = val
+    },
+    handleCurrentChange(val) {
+      this.currentPage = val
+    },
+  },
+  mounted() {
+    if(this.$route.query.id){
+      this.getDataWay1.param.sceneId = this.$route.query.id
+      this.getDataWay2.param.sceneId = this.$route.query.id
+    }
+  },
+}
+</script>

+ 14 - 1
src/views/sceneLibrary/scenePacketList.vue

@@ -406,6 +406,7 @@ export default {
                         ruleNameArrayS: [],
                         sceneGeneralizationIds: null,
                         sceneNaturalIds: "",
+                        sceneReferenceLibIds:null,
                         sceneNum: 0,
                         sceneStatueIds: null,
                         sceneTrafficIds: null,
@@ -476,6 +477,7 @@ export default {
             checkedIdsA: [], // 交通事故列表已选
             checkedIdsB: [], // 自然驾驶列表已选
             checkedIdsC: [], // 标准法规列表已选
+            checkedIdsD: [], // 基准化场景列表已选
             isRoot: false, // 是否是根节点
             templateViewVisible: false, // 模板预览dialog
             treeData: [],
@@ -648,6 +650,7 @@ export default {
                             ruleNameArrayS: [],
                             sceneGeneralizationIds: null,
                             sceneNaturalIds: "",
+                            sceneReferenceLibIds:null,
                             sceneNum: 0,
                             sceneStatueIds: null,
                             sceneTrafficIds: null,
@@ -673,7 +676,6 @@ export default {
                         this.nodeList
                     );
 
-                    // console.log(this.getDataWay.data);
 
                     this.checkWeightValidate();
 
@@ -708,6 +710,8 @@ export default {
                             this.$refs.realScene.doResetA();
                             this.$refs.realScene.doResetB();
                             this.$refs.realScene.doResetC();
+                            this.$refs.realScene.doResetD();
+
 
                             // 把选中数据对应的ids组分别传入tabs中,用于后续操作数据进行存储
                             if (this.curNode.sceneTrafficIds) {
@@ -722,6 +726,9 @@ export default {
                                 this.$refs.realScene.checkedIdsC =
                                     this.curNode.sceneStatueIds.split(",");
                             }
+                            if(this.curNode.sceneReferenceLibIds){
+                                this.$refs.realScene.checkedIdsD = this.curNode.sceneReferenceLibIds.split(",")
+                            }
                         });
                     } else {
                         // 泛化场景
@@ -756,6 +763,8 @@ export default {
             this.checkedIdsA = this.$refs.realScene.checkedIdsA;
             this.checkedIdsB = this.$refs.realScene.checkedIdsB;
             this.checkedIdsC = this.$refs.realScene.checkedIdsC;
+            this.checkedIdsD = this.$refs.realScene.checkedIdsD;
+
 
             this.curNode.packageAndRules = this.formA.rulesId;
             this.curNode.ruleName = this.formA.ruleName;
@@ -764,6 +773,7 @@ export default {
             this.curNode.sceneNum =
                 this.checkedIdsA.length +
                 this.checkedIdsB.length +
+                this.checkedIdsD.length +
                 this.checkedIdsC.length;
 
             // 选择场景总数为0 则去掉对应的规则名称和id
@@ -781,6 +791,8 @@ export default {
             this.curNode.sceneTrafficIds = this.checkedIdsA.join(",");
             this.curNode.sceneNaturalIds = this.checkedIdsB.join(",");
             this.curNode.sceneStatueIds = this.checkedIdsC.join(",");
+            this.curNode.sceneReferenceLibIds = this.checkedIdsD.join(",");
+
 
             // 清空泛化场景的数据
             this.curNode.exampleId = "";
@@ -903,6 +915,7 @@ export default {
                 node.sceneTrafficIds = "";
                 node.sceneNaturalIds = "";
                 node.sceneStatueIds = "";
+                node.sceneReferenceLibIds = "";
 
                 this.sceneNumUpdate(node);
             }

+ 404 - 291
src/views/sceneLibrary/standardRegulationSimulationScenarioList.vue

@@ -1,48 +1,126 @@
 <template>
-    <div>
-        <search-layout :needBox="true">
-            <template slot="searchItem1">
-                <span class="label">场景名称</span>
-                <el-input
-                    v-model="searchParams.sceneName"
-                    size="small"
-                    maxlength="60"
-                    clearable
-                    placeholder="请输入"
-                    @keyup.enter.native="doSearch"
-                >
-                </el-input>
-            </template>
-            <template slot="searchItem2">
-                <span class="label">法规类型</span>
-                <el-select
-                    v-model="searchParams.regulationType"
-                    multiple
-                    clearable
-                    size="small"
-                >
-                    <el-option
-                        v-for="item in regulationTypeList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem3">
-                <span class="label">标准类型</span>
-                <el-input
-                    v-model="searchParams.standardType"
-                    size="small"
-                    maxlength="60"
-                    clearable
-                    placeholder="请输入"
-                    @keyup.enter.native="doSearch"
-                >
-                </el-input>
-            </template>
-            <template slot="searchItem27">
-                <!-- <el-checkbox-group v-model="labels">
+  <div>
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">场景名称</span>
+        <el-input
+          v-model="searchParams.sceneName"
+          size="small"
+          maxlength="60"
+          clearable
+          placeholder="请输入"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">法规类型</span>
+        <el-select
+          v-model="searchParams.regulationType"
+          multiple
+          clearable
+          size="small"
+        >
+          <el-option
+            v-for="item in regulationTypeList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">标准类型</span>
+        <el-input
+          v-model="searchParams.standardType"
+          size="small"
+          maxlength="60"
+          clearable
+          placeholder="请输入"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <!-- 复杂度 -->
+      <template slot="searchItem6">
+        <span class="label">复杂度</span>
+        <el-input
+          v-model="searchParams.minComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <!-- 危险度 -->
+      <template slot="searchItem6">
+        <span class="label">危险度</span>
+        <el-input
+          v-model="searchParams.minRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">复杂度等级</span>
+        <el-select
+          v-model="searchParams.complexityLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">危险度等级</span>
+        <el-select
+          v-model="searchParams.riskLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem27">
+        <!-- <el-checkbox-group v-model="labels">
                     <el-checkbox-button label="ISO" :key="1" class="labelA"
                         >ISO</el-checkbox-button
                     >
@@ -56,277 +134,312 @@
                         >E-NCAP</el-checkbox-button
                     >
                 </el-checkbox-group> -->
-                <div class="labelsBox">
-                    <b class="labelA" @click="conditions(1)">ISO</b>
-                    <b class="labelB" @click="conditions(2)">GB</b>
-                    <b class="labelC" @click="conditions(3)">C-NCAP</b>
-                    <b class="labelD" @click="conditions(4)">E-NCAP</b>
-                </div>
-            </template>
-            <template slot="searchBtn1">
-                <el-button type="primary" @click="doSearch">查询</el-button>
-            </template>
-            <template slot="searchBtn2">
-                <el-button type="primary" @click="doReset">重置</el-button>
-            </template>
-        </search-layout>
-
-        <div class="myTabsBox">
-            <el-tabs v-model="activeName" type="card" @tab-click="pageControl">
-                <el-tab-pane label="公有" name="1"></el-tab-pane>
-                <el-tab-pane label="私有" name="2"></el-tab-pane>
-            </el-tabs>
+        <div class="labelsBox">
+          <b class="labelA" @click="conditions(1)">ISO</b>
+          <b class="labelB" @click="conditions(2)">GB</b>
+          <b class="labelC" @click="conditions(3)">C-NCAP</b>
+          <b class="labelD" @click="conditions(4)">E-NCAP</b>
         </div>
+      </template>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+    </search-layout>
 
-        <tableList
-            ref="table"
-            style="margin: 0 30px 30px"
-            :columns="columns"
-            :getDataWay="getDataWay"
-            :pagination="pagination"
-            index
-        >
-            <el-table-column
-                label="操作"
-                slot="cgInfos"
-                align="center"
-                width="180"
-            >
-                <template v-slot="scope">
-                    <i
-                        @click="viewRow(scope.row)"
-                        class="el-icon-view elIcon cursor"
-                        title="查看"
-                    >
-                    </i>
-                </template>
-            </el-table-column>
-        </tableList>
-
-        <el-dialog
-            :title="videoDiaTitle"
-            :visible.sync="dialogVisible"
-            width="690px"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-            :before-close="diaClose"
-        >
-            <div class="videoBox">
-                <video autoplay :src="videoSrc" controls></video>
-            </div>
-        </el-dialog>
+    <div class="myTabsBox">
+      <el-tabs v-model="activeName" type="card" @tab-click="pageControl">
+        <el-tab-pane label="公有" name="1"></el-tab-pane>
+        <el-tab-pane label="私有" name="2"></el-tab-pane>
+      </el-tabs>
     </div>
+
+    <tableList
+      ref="table"
+      style="margin: 0 30px 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      index
+    >
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <i
+            @click="viewRow(scope.row)"
+            class="el-icon-view elIcon cursor"
+            title="查看"
+          >
+          </i>
+          <i @click="jumpScene(scope.row)" class="el-icon-document  elIcon"> </i>
+        </template>
+      </el-table-column>
+    </tableList>
+
+    <el-dialog
+      :title="videoDiaTitle"
+      :visible.sync="dialogVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="diaClose"
+    >
+      <div class="videoBox">
+        <video autoplay :src="videoSrc" controls></video>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
-import searchLayout from "@/components/grid/searchLayout";
-import tableList from "@/components/grid/TableList";
-import { mapState } from "vuex";
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import { mapState } from 'vuex'
 
 export default {
-    name: "standardRegulationSimulationScenarioList", // 标准法规场景
-    components: { searchLayout, tableList },
-    data() {
-        return {
-            activeName: "2",
-            searchParams: {
-                //搜索参数
-                sceneName: "", //场景名称
-                regulationType: [], //法规类型
-                standardType: "", //标准类型
-                label: [],
-                share: "0",
-            },
-            labels: [], // 标签
-            regulationTypeList: [],
-            columns: [
-                //表格列
-                {
-                    label: "场景名称",
-                    prop: "sceneName",
-                },
-                {
-                    label: "法规类型",
-                    prop: "regulationType",
-                },
-                {
-                    label: "标准类型",
-                    prop: "standardType",
-                },
-                {
-                    label: "标签",
-                    prop: "regulationType",
-                },
-                {
-                    label: "操作",
-                    prop: "cgInfos",
-                    template: true,
-                    // videoAddress
-                },
-            ],
-            pagination: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWay: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.queryStandardsRegulationsList,
-                param: {
-                    share: "0",
-                },
-            },
-            dialogVisible: false,
-            autoplay: false,
-            videoSrc: "",
-            objectPath: "",
-            videoDiaTitle: "",
-        };
-    },
-
-    computed: {
-        ...mapState(["fileHost", "fileUrl"]),
-    },
-
-    methods: {
-        doSearch() {
-            // this.searchParams.label = [...this.labels];
-            this.searchParams.share = this.activeName === "1" ? "1" : "0";
-            this.refreshList(this.searchParams);
+  name: 'standardRegulationSimulationScenarioList', // 标准法规场景
+  components: { searchLayout, tableList },
+  data() {
+    return {
+      activeName: '2',
+      searchParams: {
+        //搜索参数
+        sceneName: '', //场景名称
+        regulationType: [], //法规类型
+        standardType: '', //标准类型
+        label: [],
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      },
+      labels: [], // 标签
+      regulationTypeList: [],
+      columns: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'sceneName',
         },
-        //刷新table
-        refreshList(param) {
-            param
-                ? this.$refs["table"].loadData(param)
-                : this.$refs["table"].loadData();
+        {
+          label: '法规类型',
+          prop: 'regulationType',
         },
-        doReset() {
-            this.searchParams = {
-                sceneName: "",
-                regulationType: [],
-                standardType: "",
-                label: [],
-                share: this.activeName === "1" ? "1" : "0",
-            };
-            // this.labels = [];
-            this.doSearch();
+        {
+          label: '标准类型',
+          prop: 'standardType',
         },
-        pageControl(data) {
-            this.activeName = data.name;
-            this.doSearch();
+        {
+          label: '标签',
+          prop: 'regulationType',
         },
-        conditions(v) {
-            switch (v) {
-                case 1:
-                    if (!this.searchParams.regulationType.includes("ISO")) {
-                        this.searchParams.regulationType = [
-                            ...this.searchParams.regulationType,
-                            "ISO",
-                        ];
-                    }
-                    break;
-                case 2:
-                    if (!this.searchParams.regulationType.includes("GB")) {
-                        this.searchParams.regulationType = [
-                            ...this.searchParams.regulationType,
-                            "GB",
-                        ];
-                    }
-                    break;
-                case 3:
-                    if (!this.searchParams.regulationType.includes("C-NCAP")) {
-                        this.searchParams.regulationType = [
-                            ...this.searchParams.regulationType,
-                            "C-NCAP",
-                        ];
-                    }
-                    break;
-                case 4:
-                    if (!this.searchParams.regulationType.includes("E-NCAP")) {
-                        this.searchParams.regulationType = [
-                            ...this.searchParams.regulationType,
-                            "E-NCAP",
-                        ];
-                    }
-                    break;
-                default:
-                    break;
-            }
+        {
+          label: '复杂度',
+          prop: 'complexity',
         },
-        viewRow(row) {
-            if (!row.videoAddress) {
-                this.$message.warning("本场景无仿真视频");
-                return;
-            }
-            
-            this.dialogVisible = true;
-            this.videoDiaTitle = row.sceneName;
-
-            let url = "";
-            if (process.env.VUE_APP_IS_DEV == "true") {
-                url = this.fileHost + this.fileUrl;
-            } else {
-                url = this.fileUrl;
-            }
-
-            let token = localStorage.getItem("Authorization").split(" ")[1];
-            this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`;
-            this.autoplay = true;
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
         },
-        delRow(row) {
-            this.$confirm("确认是否删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.deleteStandardsRegulations,
-                    data: {
-                        regulationsId: row.regulationsId,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
+        {
+          label: '危险度',
+          prop: 'risk',
         },
-        diaClose(done) {
-            this.autoplay = false;
-            this.videoSrc = "";
-            done();
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
         },
-        openFileDia() {
-            this.objectPath = Math.random().toString();
-            this.$refs.fileDialog.fileVisible = true;
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+          // videoAddress
         },
-        fileClose() {
-            this.objectPath = "";
-            this.doSearch();
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.queryStandardsRegulationsList,
+        param: {
+          share: '0',
         },
+      },
+      dialogVisible: false,
+      autoplay: false,
+      videoSrc: '',
+      objectPath: '',
+      videoDiaTitle: '',
+    }
+  },
+
+  computed: {
+    ...mapState(['fileHost', 'fileUrl']),
+  },
+
+  methods: {
+    doSearch() {
+      // this.searchParams.label = [...this.labels];
+      this.searchParams.share = this.activeName === '1' ? '1' : '0'
+      this.refreshList(this.searchParams)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doReset() {
+      this.searchParams = {
+        sceneName: '',
+        regulationType: [],
+        standardType: '',
+        label: [],
+        share: this.activeName === '1' ? '1' : '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      }
+      // this.labels = [];
+      this.doSearch()
+    },
+    pageControl(data) {
+      this.activeName = data.name
+      this.doSearch()
+    },
+    conditions(v) {
+      switch (v) {
+        case 1:
+          if (!this.searchParams.regulationType.includes('ISO')) {
+            this.searchParams.regulationType = [
+              ...this.searchParams.regulationType,
+              'ISO',
+            ]
+          }
+          break
+        case 2:
+          if (!this.searchParams.regulationType.includes('GB')) {
+            this.searchParams.regulationType = [
+              ...this.searchParams.regulationType,
+              'GB',
+            ]
+          }
+          break
+        case 3:
+          if (!this.searchParams.regulationType.includes('C-NCAP')) {
+            this.searchParams.regulationType = [
+              ...this.searchParams.regulationType,
+              'C-NCAP',
+            ]
+          }
+          break
+        case 4:
+          if (!this.searchParams.regulationType.includes('E-NCAP')) {
+            this.searchParams.regulationType = [
+              ...this.searchParams.regulationType,
+              'E-NCAP',
+            ]
+          }
+          break
+        default:
+          break
+      }
     },
+    jumpScene(row) {
+      this.$store.commit("getSceneCurPage",this.pagination.currentPage);
+      this.$store.commit('getSceneId', row.regulationsId)
+      this.$router.push({
+        path: '/sceneEvaluation',
+        query:{id:row.regulationsId}
+      })
+    },
+    viewRow(row) {
+      if (!row.videoAddress) {
+        this.$message.warning('本场景无仿真视频')
+        return
+      }
+
+      this.dialogVisible = true
+      this.videoDiaTitle = row.sceneName
+
+      let url = ''
+      if (process.env.VUE_APP_IS_DEV == 'true') {
+        url = this.fileHost + this.fileUrl
+      } else {
+        url = this.fileUrl
+      }
 
-    async mounted() {
-        await this.$dicsListsInit({
-            regulationTypeList: "regulationType",
-        });
+      let token = localStorage.getItem('Authorization').split(' ')[1]
+      this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`
+      this.autoplay = true
+    },
+    delRow(row) {
+      this.$confirm('确认是否删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.deleteStandardsRegulations,
+          data: {
+            regulationsId: row.regulationsId,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    diaClose(done) {
+      this.autoplay = false
+      this.videoSrc = ''
+      done()
     },
-};
+    openFileDia() {
+      this.objectPath = Math.random().toString()
+      this.$refs.fileDialog.fileVisible = true
+    },
+    fileClose() {
+      this.objectPath = ''
+      this.doSearch()
+    },
+  },
+
+  async mounted() {
+    if(this.$store.state.sceneLock){
+      this.pagination.currentPage = this.$store.state.sceneCurPage
+    }
+    await this.$dicsListsInit({
+      regulationTypeList: 'regulationType',
+    })
+  },
+}
 </script>
 
 <style lang='less' scoped>
-@import "./common/util.less";
+@import './common/util.less';
 .btnsPanel {
-    text-align: right;
+  text-align: right;
 }
 </style>

+ 505 - 400
src/views/sceneLibrary/trafficAccidentSimulationScenarioList.vue

@@ -1,100 +1,180 @@
 <template>
-    <div class="trafficAccidentSimulationScenarioListPanel">
-        <search-layout :needBox="true">
-            <template slot="searchItem1">
-                <span class="label">场景名称</span>
-                <el-input
-                    v-model="searchParams.sceneName"
-                    size="small"
-                    clearable
-                    placeholder="请输入"
-                    maxlength="60"
-                    @keyup.enter.native="doSearch"
-                >
-                </el-input>
-            </template>
-            <template slot="searchItem2">
-                <span class="label">自车驾驶行为</span>
-                <el-select
-                    v-model="searchParams.selfDriving"
-                    multiple
-                    size="small"
-                    clearable
-                >
-                    <el-option
-                        v-for="item in selfDrivingList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem3">
-                <span class="label">目标驾驶行为</span>
-                <el-select
-                    v-model="searchParams.targetDriving"
-                    multiple
-                    size="small"
-                    clearable
-                >
-                    <el-option
-                        v-for="item in targetDrivingList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem4">
-                <span class="label">自车反应行为</span>
-                <el-select
-                    v-model="searchParams.selfReaction"
-                    multiple
-                    size="small"
-                    clearable
-                >
-                    <el-option
-                        v-for="item in selfReactionList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem5">
-                <span class="label">冲突行为</span>
-                <el-select
-                    v-model="searchParams.conflictBehavior"
-                    multiple
-                    size="small"
-                    clearable
-                >
-                    <el-option
-                        v-for="item in conflictBehaviorList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem6">
-                <span class="label">冲突类型</span>
-                <el-select
-                    v-model="searchParams.conflictType"
-                    multiple
-                    size="small"
-                    clearable
-                >
-                    <el-option
-                        v-for="item in conflictTypeList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem27">
-                <!-- <el-checkbox-group v-model="labels">
+  <div class="trafficAccidentSimulationScenarioListPanel">
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">场景名称</span>
+        <el-input
+          v-model="searchParams.sceneName"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">自车驾驶行为</span>
+        <el-select
+          v-model="searchParams.selfDriving"
+          multiple
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in selfDrivingList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">目标驾驶行为</span>
+        <el-select
+          v-model="searchParams.targetDriving"
+          multiple
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in targetDrivingList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem4">
+        <span class="label">自车反应行为</span>
+        <el-select
+          v-model="searchParams.selfReaction"
+          multiple
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in selfReactionList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem5">
+        <span class="label">冲突行为</span>
+        <el-select
+          v-model="searchParams.conflictBehavior"
+          multiple
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in conflictBehaviorList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem6">
+        <span class="label">冲突类型</span>
+        <el-select
+          v-model="searchParams.conflictType"
+          multiple
+          size="small"
+          clearable
+        >
+          <el-option
+            v-for="item in conflictTypeList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <!-- 复杂度 -->
+      <template slot="searchItem6">
+        <span class="label">复杂度</span>
+        <el-input
+        v-model="searchParams.minComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <!-- 危险度 -->
+      <template slot="searchItem7">
+        <span class="label">危险度</span>
+        <el-input
+          v-model="searchParams.minRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem7">
+        <span class="label">复杂度等级</span>
+        <el-select
+          v-model="searchParams.complexityLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">危险度等级</span>
+        <el-select
+          v-model="searchParams.riskLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem27">
+        <!-- <el-checkbox-group v-model="labels">
                     <el-checkbox-button label="追尾" :key="1" class="labelA"
                         >追尾</el-checkbox-button
                     >
@@ -114,172 +194,186 @@
                         >机动车-机动车冲突</el-checkbox-button
                     >
                 </el-checkbox-group> -->
-                <div class="labelsBox">
-                    <b class="labelA" @click="conditions(1)">追尾</b>
-                    <b class="labelB" @click="conditions(2)">目标车切入</b>
-                    <b class="labelC" @click="conditions(3)"
-                        >目标车沿弯道行驶</b
-                    >
-                    <b class="labelD" @click="conditions(4)"
-                        >机动车-机动车冲突</b
-                    >
-                </div>
-            </template>
-            <template slot="searchBtn1">
-                <el-button type="primary" @click="doSearch">查询</el-button>
-            </template>
-            <template slot="searchBtn2">
-                <el-button type="primary" @click="doReset">重置</el-button>
-            </template>
-        </search-layout>
-
-        <div class="myTabsBox">
-            <el-tabs v-model="activeName" type="card" @tab-click="pageControl">
-                <el-tab-pane label="公有" name="1"></el-tab-pane>
-                <el-tab-pane label="私有" name="2"></el-tab-pane>
-            </el-tabs>
+        <div class="labelsBox">
+          <b class="labelA" @click="conditions(1)">追尾</b>
+          <b class="labelB" @click="conditions(2)">目标车切入</b>
+          <b class="labelC" @click="conditions(3)">目标车沿弯道行驶</b>
+          <b class="labelD" @click="conditions(4)">机动车-机动车冲突</b>
         </div>
+      </template>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+    </search-layout>
 
-        <tableList
-            ref="table"
-            style="margin: 0 30px 30px"
-            :columns="columns"
-            :getDataWay="getDataWay"
-            :pagination="pagination"
-            index
-        >
-            <el-table-column
-                label="操作"
-                slot="cgInfos"
-                align="center"
-                width="180"
-            >
-                <template v-slot="scope">
-                    <i
-                        @click="viewRow(scope.row)"
-                        class="el-icon-view elIcon cursor"
-                        title="查看"
-                    >
-                    </i>
-                </template>
-            </el-table-column>
-        </tableList>
-
-        <el-dialog
-            :title="videoDiaTitle"
-            :visible.sync="dialogVisible"
-            width="690px"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-            :before-close="diaClose"
-        >
-            <div class="videoBox">
-                <video autoplay :src="videoSrc" controls></video>
-            </div>
-        </el-dialog>
+    <div class="myTabsBox">
+      <el-tabs v-model="activeName" type="card" @tab-click="pageControl">
+        <el-tab-pane label="公有" name="1"></el-tab-pane>
+        <el-tab-pane label="私有" name="2"></el-tab-pane>
+      </el-tabs>
     </div>
+
+    <tableList
+      ref="table"
+      style="margin: 0 30px 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      index
+    >
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <i
+            @click="viewRow(scope.row)"
+            class="el-icon-view elIcon cursor"
+            title="查看"
+          >
+          </i>
+          <i @click="jumpScene(scope.row)" class="el-icon-document elIcon"></i>
+        </template>
+      </el-table-column>
+    </tableList>
+
+    <el-dialog
+      :title="videoDiaTitle"
+      :visible.sync="dialogVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="diaClose"
+    >
+      <div class="videoBox">
+        <video autoplay :src="videoSrc" controls></video>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
-import searchLayout from "@/components/grid/searchLayout";
-import tableList from "@/components/grid/TableList";
-import { mapState } from "vuex";
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import { mapState } from 'vuex'
 
 export default {
-    name: "trafficAccidentSimulationScenarioList", // 交通事故场景
-    components: { searchLayout, tableList },
-    data() {
-        return {
-            activeName: "2",
-            searchParams: {
-                //搜索参数
-                sceneName: "", //场景名称
-                selfDriving: [], //自车驾驶行为
-                targetDriving: [], //目标驾驶行为
-                selfReaction: [], //自车反应行为
-                conflictBehavior: [], //冲突行为
-                conflictType: [], //冲突类型
-                rearEndCollision: "", // 追尾
-                cutIn: "", // 切入
-                driveCurve: "", // 沿弯道行驶
-                carConflict: "", // 机动车-机动车冲突
-                share: "0",
-            },
-            labels: [],
-            selfDrivingList: [],
-            targetDrivingList: [],
-            selfReactionList: [],
-            conflictBehaviorList: [],
-            conflictTypeList: [],
-            columns: [
-                //表格列
-                {
-                    label: "场景名称",
-                    prop: "sceneName",
-                },
-                {
-                    label: "自车驾驶行为",
-                    prop: "selfDriving",
-                },
-                {
-                    label: "目标驾驶行为",
-                    prop: "targetDriving",
-                },
-                {
-                    label: "自车反应行为",
-                    prop: "selfReaction",
-                },
-                {
-                    label: "冲突行为",
-                    prop: "conflictBehavior",
-                },
-                {
-                    label: "冲突类型",
-                    prop: "conflictType",
-                },
-                {
-                    label: "标签",
-                    prop: "label",
-                },
-                {
-                    label: "操作",
-                    prop: "cgInfos",
-                    template: true,
-                },
-            ],
-            pagination: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWay: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.querySceneAccidentList,
-                param: {
-                    share: "0",
-                },
-            },
-            dialogVisible: false,
-            autoplay: false,
-            videoSrc: "",
-            objectPath: "",
-            videoDiaTitle: "",
-        };
-    },
+  name: 'trafficAccidentSimulationScenarioList', // 交通事故场景
+  components: { searchLayout, tableList },
+  data() {
+    return {
+      activeName: '2',
+      searchParams: {
+        //搜索参数
+        sceneName: '', //场景名称
+        selfDriving: [], //自车驾驶行为
+        targetDriving: [], //目标驾驶行为
+        selfReaction: [], //自车反应行为
+        conflictBehavior: [], //冲突行为
+        conflictType: [], //冲突类型
+        rearEndCollision: '', // 追尾
+        cutIn: '', // 切入
+        driveCurve: '', // 沿弯道行驶
+        carConflict: '', // 机动车-机动车冲突
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      },
+      labels: [],
+      selfDrivingList: [],
+      targetDrivingList: [],
+      selfReactionList: [],
+      conflictBehaviorList: [],
+      conflictTypeList: [],
+      columns: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'sceneName',
+        },
+        {
+          label: '自车驾驶行为',
+          prop: 'selfDriving',
+        },
+        {
+          label: '目标驾驶行为',
+          prop: 'targetDriving',
+        },
+        {
+          label: '自车反应行为',
+          prop: 'selfReaction',
+        },
+        {
+          label: '冲突行为',
+          prop: 'conflictBehavior',
+        },
+        {
+          label: '冲突类型',
+          prop: 'conflictType',
+        },
+        {
+          label: '标签',
+          prop: 'label',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.querySceneAccidentList,
+        param: {
+          share: '0',
+        },
+      },
+      dialogVisible: false,
+      autoplay: false,
+      videoSrc: '',
+      objectPath: '',
+      videoDiaTitle: '',
+    }
+  },
 
-    computed: {
-        ...mapState(["fileHost", "fileUrl"]),
-    },
+  computed: {
+    ...mapState(['fileHost', 'fileUrl']),
+  },
 
-    methods: {
-        doSearch() {
-            /* this.searchParams.rearEndCollision = this.labels.includes("追尾")
+  methods: {
+    doSearch() {
+      /* this.searchParams.rearEndCollision = this.labels.includes("追尾")
                 ? "追尾"
                 : "";
             this.searchParams.cutIn = this.labels.includes("切入")
@@ -294,164 +388,175 @@ export default {
                 ? "机动车-机动车"
                 : ""; */
 
-            this.searchParams.share = this.activeName === "1" ? "1" : "0";
-            this.refreshList(this.searchParams);
-        },
-        //刷新table
-        refreshList(param) {
-            param
-                ? this.$refs["table"].loadData(param)
-                : this.$refs["table"].loadData();
-        },
-        doReset() {
-            this.searchParams = {
-                sceneName: "",
-                selfDriving: [],
-                targetDriving: [],
-                selfReaction: [],
-                conflictBehavior: [],
-                conflictType: [],
-                rearEndCollision: "",
-                cutIn: "",
-                driveCurve: "",
-                carConflict: "",
-                share: this.activeName === "1" ? "1" : "0",
-            };
-            // this.labels = [];
-            this.doSearch();
-        },
-        pageControl(data) {
-            this.activeName = data.name;
-            this.doSearch();
-        },
-        conditions(v) {
-            switch (v) {
-                case 1:
-                    if (!this.searchParams.conflictBehavior.includes("追尾")) {
-                        this.searchParams.conflictBehavior = [
-                            ...this.searchParams.conflictBehavior,
-                            "追尾",
-                        ];
-                    }
-                    break;
-                case 2:
-                    if (!this.searchParams.targetDriving.includes("切入")) {
-                        this.searchParams.targetDriving = [
-                            ...this.searchParams.targetDriving,
-                            "切入",
-                        ];
-                    }
-                    break;
-                case 3:
-                    if (
-                        !this.searchParams.targetDriving.includes("沿弯道行驶")
-                    ) {
-                        this.searchParams.targetDriving = [
-                            ...this.searchParams.targetDriving,
-                            "沿弯道行驶",
-                        ];
-                    }
-                    break;
-                case 4:
-                    if (
-                        !this.searchParams.conflictType.includes(
-                            "机动车-机动车"
-                        )
-                    ) {
-                        this.searchParams.conflictType = [
-                            ...this.searchParams.conflictType,
-                            "机动车-机动车",
-                        ];
-                    }
-                    break;
-                default:
-                    break;
-            }
-        },
-        viewRow(row) {
-            if (!row.videoAddress) {
-                this.$message.warning("本场景无仿真视频");
-                return;
-            }
-            
-            this.dialogVisible = true;
-            this.videoDiaTitle = row.sceneName;
+      this.searchParams.share = this.activeName === '1' ? '1' : '0'
+      this.refreshList(this.searchParams)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    jumpScene(row) {
+      this.$store.commit("getSceneCurPage",this.pagination.currentPage);
+      this.$store.commit('getSceneId', row.accidentId)
+      this.$router.push({
+        path: '/sceneEvaluation',
+        query:{id:row.accidentId}
+      })
+    },
+    doReset() {
+      this.searchParams = {
+        sceneName: '',
+        selfDriving: [],
+        targetDriving: [],
+        selfReaction: [],
+        conflictBehavior: [],
+        conflictType: [],
+        rearEndCollision: '',
+        cutIn: '',
+        driveCurve: '',
+        carConflict: '',
+        share: this.activeName === '1' ? '1' : '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      }
+      // this.labels = [];
+      this.doSearch()
+    },
+    pageControl(data) {
+      this.activeName = data.name
+      this.doSearch()
+    },
+    conditions(v) {
+      switch (v) {
+        case 1:
+          if (!this.searchParams.conflictBehavior.includes('追尾')) {
+            this.searchParams.conflictBehavior = [
+              ...this.searchParams.conflictBehavior,
+              '追尾',
+            ]
+          }
+          break
+        case 2:
+          if (!this.searchParams.targetDriving.includes('切入')) {
+            this.searchParams.targetDriving = [
+              ...this.searchParams.targetDriving,
+              '切入',
+            ]
+          }
+          break
+        case 3:
+          if (!this.searchParams.targetDriving.includes('沿弯道行驶')) {
+            this.searchParams.targetDriving = [
+              ...this.searchParams.targetDriving,
+              '沿弯道行驶',
+            ]
+          }
+          break
+        case 4:
+          if (!this.searchParams.conflictType.includes('机动车-机动车')) {
+            this.searchParams.conflictType = [
+              ...this.searchParams.conflictType,
+              '机动车-机动车',
+            ]
+          }
+          break
+        default:
+          break
+      }
+    },
+    viewRow(row) {
+      if (!row.videoAddress) {
+        this.$message.warning('本场景无仿真视频')
+        return
+      }
 
-            let url = "";
-            if (process.env.VUE_APP_IS_DEV == "true") {
-                url = this.fileHost + this.fileUrl;
-            } else {
-                url = this.fileUrl;
-            }
+      this.dialogVisible = true
+      this.videoDiaTitle = row.sceneName
 
-            let token = localStorage.getItem("Authorization").split(" ")[1];
-            this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`;
-            this.autoplay = true;
-        },
-        delRow(row) {
-            this.$confirm("确认是否删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.deleteSceneAccident,
-                    data: {
-                        accidentId: row.accidentId,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
-        },
-        diaClose(done) {
-            this.autoplay = false;
-            this.videoSrc = "";
-            done();
-        },
-        openFileDia() {
-            this.objectPath = Math.random().toString();
-            this.$refs.fileDialog.fileVisible = true;
-        },
-        fileClose() {
-            this.objectPath = "";
-            this.doSearch();
-        },
-    },
+      let url = ''
+      if (process.env.VUE_APP_IS_DEV == 'true') {
+        url = this.fileHost + this.fileUrl
+      } else {
+        url = this.fileUrl
+      }
 
-    async mounted() {
-        await this.$dicsListsInit({
-            selfDrivingList: "selfDriving",
-            targetDrivingList: "targetDriving",
-            selfReactionList: "selfReaction",
-            conflictBehaviorList: "conflictBehavior",
-            conflictTypeList: "conflictType",
-        });
+      let token = localStorage.getItem('Authorization').split(' ')[1]
+      this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`
+      this.autoplay = true
+    },
+    delRow(row) {
+      this.$confirm('确认是否删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.deleteSceneAccident,
+          data: {
+            accidentId: row.accidentId,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    diaClose(done) {
+      this.autoplay = false
+      this.videoSrc = ''
+      done()
     },
-};
+    openFileDia() {
+      this.objectPath = Math.random().toString()
+      this.$refs.fileDialog.fileVisible = true
+    },
+    fileClose() {
+      this.objectPath = ''
+      this.doSearch()
+    },
+  },
+
+  async mounted() {
+    if(this.$store.state.sceneLock){
+      this.pagination.currentPage = this.$store.state.sceneCurPage
+    }
+    await this.$dicsListsInit({
+      selfDrivingList: 'selfDriving',
+      targetDrivingList: 'targetDriving',
+      selfReactionList: 'selfReaction',
+      conflictBehaviorList: 'conflictBehavior',
+      conflictTypeList: 'conflictType',
+    })
+  },
+}
 </script>
 
 <style lang='less' scoped>
-@import "./common/util.less";
+@import './common/util.less';
 .trafficAccidentSimulationScenarioListPanel {
-    .inputBox {
-        .radioBox {
-            width: 340px;
-        }
-
-        .label {
-            min-width: 90px;
-        }
+  .inputBox {
+    .radioBox {
+      width: 340px;
     }
 
-    .btnsPanel {
-        text-align: right;
+    .label {
+      min-width: 90px;
     }
+  }
+
+  .btnsPanel {
+    text-align: right;
+  }
 }
 </style>

+ 668 - 0
src/views/systemManagement/sceneLibraryManagement/benchmarkScenario.vue

@@ -0,0 +1,668 @@
+<template>
+  <div class="generalizationScenarioListPanel">
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">场景名称</span>
+        <el-input
+          v-model="searchParams.sceneName"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem1">
+        <span class="label">主车动作</span>
+        <el-select
+          v-model="searchParams.mainBehavior[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in dictionaryList['egoAction']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">他车动作</span>
+        <el-select
+          v-model="searchParams.otherBehavior[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in dictionaryList['targetAction']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">天气</span>
+        <el-select v-model="searchParams.weather[0]" size="small" clearable>
+          <el-option
+          v-for="item in dictionaryList['sceneLibWeather']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">道路类型</span>
+        <el-select v-model="searchParams.roadType[0]" size="small" clearable>
+          <el-option
+          v-for="item in dictionaryList['sceneLibrodeType']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">道路几何-平面</span>
+        <el-select
+          v-model="searchParams.roadGeometryPlane[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in dictionaryList['roadPlaneGeometry']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem4">
+        <span class="label">道路几何-纵断面</span>
+        <el-select
+          v-model="searchParams.roadGeometryVertical[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in dictionaryList['roadProfileGeometry']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem4">
+        <span class="label">智能驾驶</span>
+        <el-select
+          v-model="searchParams.autoDriveFunction[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in dictionaryList['supportedAdas']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem5">
+        <span class="label">运行区域</span>
+        <el-select
+          v-model="searchParams.operationArea[0]"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in dictionaryList['rodeSection']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <!-- 复杂度 -->
+      <template slot="searchItem5">
+        <span class="label">复杂度</span>
+        <el-input
+          v-model="searchParams.minComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <!-- 危险度 -->
+      <template slot="searchItem6">
+        <span class="label">危险度</span>
+        <el-input
+          v-model="searchParams.minRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem6">
+        <span class="label">复杂度等级</span>
+        <el-select
+          v-model="searchParams.complexityLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in dictionaryList['complexityLevel']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem7">
+        <span class="label">危险度等级</span>
+        <el-select v-model="searchParams.riskLevel" size="small" clearable>
+          <el-option
+          v-for="item in dictionaryList['riskLevel']"
+            :label="item.dictName"
+            :value="item.dictName"
+            :key="item.id"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem7">
+        <span class="label">标签</span>
+        <el-input
+          v-model="searchParams.label"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">场景描述</span>
+        <el-input
+          v-model="searchParams.sceneDescription"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+        >
+        </el-input>
+      </template>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+    </search-layout>
+    <div class="btnsPanel">
+      <el-button type="primary" plain icon="el-icon-delete" @click="delRows"
+        >批量删除</el-button
+      >
+    </div>
+    <tableList
+      ref="table"
+      style="margin: 0 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      :checkedData="checkedArr"
+      index
+      indexFixed
+      selection
+    >
+      <el-table-column
+        label="操作"
+        slot="cgInfos"
+        align="center"
+        width="180"
+        fixed="right"
+      >
+        <template v-slot="scope">
+          <i
+            class="el-icon-view elIcon cursor"
+            @click="viewRow(scope.row)"
+            title="查看"
+          >
+          </i>
+          <el-popconfirm title="确定删除吗?" @confirm="delRow(scope.row)">
+            <i slot="reference" class="el-icon-delete elIcon" title="删除"> </i>
+          </el-popconfirm>
+        </template>
+      </el-table-column>
+    </tableList>
+    <el-dialog
+      v-if="generalizationVisible"
+      :visible.sync="generalizationVisible"
+      :title="generalizationDiaTitle"
+      width="90%"
+      class="generalizationDia"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="generalizationCancel"
+    >
+      <div>
+        <generalization-detail
+          ref="generalizationDetail"
+          :disabled="true"
+          :id="generalizationId"
+          :genUrlType="1"
+        ></generalization-detail>
+      </div>
+    </el-dialog>
+    <!-- 查看视频弹窗 -->
+    <el-dialog
+      :title="videoDiaTitle"
+      :visible.sync="dialogVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <div class="videoBox">
+        <video autoplay :src="videoSrc" controls></video>
+      </div>
+    </el-dialog>
+    <!-- 编辑表格 -->
+    <el-dialog
+      title="编辑"
+      :visible.sync="editVisible"
+      width="780px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <el-form
+        ref="editInfo"
+        :model="editInfo"
+        label-width="150px"
+        style="display: flex; flex-wrap: wrap; justify-content: space-between"
+      >
+        <el-form-item label="场景名称">
+          <el-input v-model="editInfo.sceneName" :disabled="true"></el-input>
+        </el-form-item>
+        <el-form-item label="场景描述">
+          <el-input v-model="editInfo.sceneDescription"></el-input>
+        </el-form-item>
+        <el-form-item label="主车动作">
+          <el-select v-model="editInfo.mainBehavior"></el-select>
+        </el-form-item>
+        <el-form-item label="他车动作">
+          <el-select v-model="editInfo.otherBehavior"></el-select>
+        </el-form-item>
+        <el-form-item label="天气">
+          <el-select v-model="editInfo.weather"></el-select>
+        </el-form-item>
+        <el-form-item label="道路类型">
+          <el-select v-model="editInfo.roadType"></el-select>
+        </el-form-item>
+        <el-form-item label="道路几何-平面">
+          <el-select v-model="editInfo.roadGeometryPlane"></el-select>
+        </el-form-item>
+        <el-form-item label="道路几何-纵断面">
+          <el-select v-model="editInfo.roadGeometryVertical"></el-select>
+        </el-form-item>
+        <el-form-item label="自动驾驶功能">
+          <el-select v-model="editInfo.autoDriveFunction"></el-select>
+        </el-form-item>
+        <el-form-item label="运行区域">
+          <el-select v-model="editInfo.operationArea"></el-select>
+        </el-form-item>
+        <el-form-item label="标签">
+          <el-select v-model="editInfo.label"></el-select>
+        </el-form-item>
+      </el-form>
+      <div style="width: 100%; display: flex; justify-content: center">
+        <el-button @click="editVisible = false">取消</el-button>
+        <el-button type="primary" @click="">立即创建</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import { mapState } from 'vuex'
+export default {
+  name: 'benchmarkScenarioList', // 基准场景库
+  components: { searchLayout, tableList },
+  data() {
+    return {
+      activeName: '2',
+      searchParams: {
+        sceneName: '', // 场景名称
+        share: '0',
+        mainBehavior: [''], // 主车动作
+        otherBehavior: [''],
+        weather: [''],
+        roadType: [''],
+        roadGeometryPlane: [''],
+        roadGeometryVertical: [''],
+        autoDriveFunction: [''],
+        operationArea: [''],
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+        sceneDescription: '',
+        label: '',
+      },
+      //  编辑信息
+      editVisible: false,
+      //  编辑内容数据回填
+      editInfo: {
+        sceneName: '', //场景名称
+        sceneDescription: '', // 场景描述
+        mainBehavior: '', //主车动作
+        weather: '', // 天气
+        roadGeometryPlane: '', // 道路几何-平面
+        autoDriveFunction: '', // 自动驾驶功能
+        label: '', // 标签
+        otherBehavior: '', // 他车动作
+        roadType: '', // 道路类型
+        roadGeometryVertical: '', // 道路几何-纵断面
+        operationArea: '', // 运行区域
+      },
+      fileNameList: [],
+      scenarioRoadTypeList: [],
+      // scenarioWeatherList: [],
+      props: {
+        multiple: true,
+        label: 'dictName',
+        value: 'dictCode',
+      },
+      columns: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'sceneName',
+          fixed: 'left',
+        },
+        {
+          label: '主车动作',
+          prop: 'mainBehavior',
+        },
+        {
+          label: '他车动作',
+          prop: 'otherBehavior',
+        },
+        {
+          label: '天气',
+          prop: 'weather',
+        },
+        {
+          label: '道路类型',
+          prop: 'roadType',
+        },
+        {
+          label: '道路几何-平面',
+          prop: 'roadGeometryPlane',
+        },
+        {
+          label: '道路几何-纵断面',
+          prop: 'roadGeometryVertical',
+        },
+        {
+          label: '支持智驾功能',
+          prop: 'autoDriveFunction',
+        },
+        {
+          label: '运行区域',
+          prop: 'operationArea',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+        {
+          label: '便签',
+          prop: 'label',
+        },
+        {
+          label: '场景描述',
+          prop: 'sceneDescription',
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        dataType: 'url',
+        type: 'post',
+        data: this.$api.sceneLibrary.querybenchmarkList,
+        param: {
+          share: '0',
+        },
+      },
+      generalizationVisible: false, // 泛化dialog
+      generalizationId: '', // 泛化详情id
+      generalizationDiaTitle: '',
+      //  视频弹窗信息
+      dialogVisible: false,
+      autoplay: false,
+      videoSrc: '',
+      objectPath: '',
+      videoDiaTitle: '',
+      checkedArr: [], //  表格多选
+      dictionaryList:{},
+    }
+  },
+
+  computed: {
+    ...mapState(['fileHost', 'fileUrl']),
+  },
+
+  methods: {
+    doSearch() {
+      this.searchParams.share = '0'
+      const specialParams = [
+        'mainBehavior',
+        'otherBehavior',
+        'weather',
+        'roadType',
+        'roadGeometryPlane',
+        'roadGeometryVertical',
+        'autoDriveFunction',
+        'operationArea',
+      ]
+      const obj = JSON.parse(JSON.stringify(this.searchParams))
+      Object.keys(obj).forEach((item) => {
+        if (specialParams.includes(item)) {
+          if (!obj[item][0]) {
+            obj[item] = []
+          }
+        }
+      })
+      this.refreshList(obj)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doReset() {
+      this.searchParams = {
+        sceneName: '', // 场景名称
+        share: '0',
+        mainBehavior: [''], // 主车动作
+        otherBehavior: [''],
+        weather: [''],
+        roadType: [''],
+        roadGeometryPlane: [''],
+        roadGeometryVertical: [''],
+        autoDriveFunction: [''],
+        operationArea: [''],
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+        sceneDescription: '',
+        label: '',
+      }
+      this.doSearch()
+    },
+    pageControl(data) {
+      this.activeName = data.name
+      this.doSearch()
+    },
+    // 观看视频
+    viewRow(row) {
+      this.dialogVisible = true
+      this.videoSrc = 'https://media.w3.org/2010/05/sintel/trailer.mp4'
+    },
+    // 删除列表
+    delRow(e) {
+      this.$axios({
+        method: 'post',
+        url: this.$api.sceneLibrary.batchDeleteSceneReference,
+        data: { sceneNames: [e.sceneName] },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.doSearch()
+          this.$message.success('删除成功')
+        } else {
+          this.$message.error(res.message || '删除失败')
+        }
+      })
+    },
+    // 编辑
+    editHandle() {
+      this.editVisible = true
+    },
+    // 跳转场景评价
+    jumpScene() {
+      this.$router.push({
+        path: '/sceneEvaluation',
+        // query: this.activeName == '3' ? { isScore: true } : {}, // 评分规则新增路由跳转标识
+      })
+    },
+    delRows() {
+      let checkedArr = this.checkedArr
+      if (checkedArr.length <= 0) {
+        this.$message.info('请先选择数据')
+        return
+      } else {
+        const obj = []
+        checkedArr.forEach(item=>{
+          obj.push(item.sceneName)
+        })
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.batchDeleteSceneReference,
+          data: { sceneNames: obj },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.doSearch()
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+        })
+      }
+    },
+    searchInit() {
+            this.$axios({
+                method: 'post',
+                url: this.$api.common.getDictListsByTypes,
+                data: { dictTypes: "egoAction,targetAction,sceneLibWeather,sceneLibrodeType,roadPlaneGeometry,roadProfileGeometry,supportedAdas,rodeSection,complexityLevel,riskLevel" },
+            }).then((res) => {
+                if (res.code == 200) {
+                    this.dictionaryList = res.info
+                } else {
+                    this.$message.error(res.message || '查询失败')
+                }
+            })
+        },
+  },
+
+  async mounted() {
+    this.searchInit()
+  },
+}
+</script>
+
+<style lang='less' scoped>
+@import './common/util.less';
+
+.generalizationScenarioListPanel {
+  .inputBox {
+    .label {
+      min-width: 90px;
+    }
+  }
+
+  .btnsPanel {
+    text-align: right;
+  }
+
+  .generalizationDia {
+    /deep/ .el-dialog__body {
+      position: relative;
+      padding: 20px 60px;
+
+      .changeBtn {
+        position: absolute;
+        top: 20px;
+        right: 60px;
+      }
+    }
+  }
+}
+</style>

+ 16 - 0
src/views/systemManagement/sceneLibraryManagement/generalizationScene.vue

@@ -111,6 +111,22 @@ export default {
                     label: "场景简述",
                     prop: "scenarioResume",
                 },
+                {
+                label: '复杂度',
+                prop: 'complexity',
+                },
+                {
+                label: '复杂度等级',
+                prop: 'complexityLevel',
+                },
+                {
+                label: '危险度',
+                prop: 'risk',
+                },
+                {
+                label: '危险度等级',
+                prop: 'riskLevel',
+                },
                 {
                     label: "操作",
                     prop: "cgInfos",

+ 579 - 520
src/views/systemManagement/sceneLibraryManagement/naturalDrivingScene.vue

@@ -1,90 +1,166 @@
 <template>
-    <div class="naturalDrivingScenarioListPanel">
-        <search-layout :needBox="true">
-            <template slot="searchItem1">
-                <span class="label">场景名称</span>
-                <el-input
-                    v-model="searchParams.naturalName"
-                    size="small"
-                    clearable
-                    placeholder="请输入"
-                    maxlength="60"
-                    @keyup.enter.native="doSearch"
-                >
-                </el-input>
-            </template>
-            <template slot="searchItem2">
-                <span class="label">自车行为</span>
-                <el-cascader
-                    v-model="searchParams.selfBehavior"
-                    :options="selfBehaviorList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem3">
-                <span class="label">目标行为</span>
-                <el-cascader
-                    v-model="searchParams.targetBehavior"
-                    :options="targetBehaviorList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem4">
-                <span class="label">交通情况</span>
-                <el-cascader
-                    v-model="searchParams.trafficCondition"
-                    :options="trafficConditionList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem5">
-                <span class="label">道路</span>
-                <el-cascader
-                    v-model="searchParams.road"
-                    :options="roadList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem6">
-                <span class="label">基础设施</span>
-                <el-cascader
-                    v-model="searchParams.infrastructure"
-                    :options="infrastructureList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem7">
-                <span class="label">自然环境</span>
-                <el-cascader
-                    v-model="searchParams.naturalEnvironment"
-                    :options="naturalEnvironmentList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem8">
-                <span class="label">临时性操纵</span>
-                <el-cascader
-                    v-model="searchParams.temporaryOperation"
-                    :options="temporaryOperationList"
-                    :props="props"
-                    clearable
-                    size="small"
-                ></el-cascader>
-            </template>
-            <template slot="searchItem27">
-                <!-- <el-checkbox-group v-model="labels">
+  <div class="naturalDrivingScenarioListPanel">
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">场景名称</span>
+        <el-input
+          v-model="searchParams.naturalName"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">自车行为</span>
+        <el-cascader
+          v-model="searchParams.selfBehavior"
+          :options="selfBehaviorList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">目标行为</span>
+        <el-cascader
+          v-model="searchParams.targetBehavior"
+          :options="targetBehaviorList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem4">
+        <span class="label">交通情况</span>
+        <el-cascader
+          v-model="searchParams.trafficCondition"
+          :options="trafficConditionList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem5">
+        <span class="label">道路</span>
+        <el-cascader
+          v-model="searchParams.road"
+          :options="roadList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem6">
+        <span class="label">基础设施</span>
+        <el-cascader
+          v-model="searchParams.infrastructure"
+          :options="infrastructureList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem7">
+        <span class="label">自然环境</span>
+        <el-cascader
+          v-model="searchParams.naturalEnvironment"
+          :options="naturalEnvironmentList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">临时性操纵</span>
+        <el-cascader
+          v-model="searchParams.temporaryOperation"
+          :options="temporaryOperationList"
+          :props="props"
+          clearable
+          size="small"
+        ></el-cascader>
+      </template>
+      <!-- 复杂度 -->
+      <template slot="searchItem6">
+        <span class="label">复杂度</span>
+        <el-input
+          v-model="searchParams.minComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <!-- 危险度 -->
+      <template slot="searchItem6">
+        <span class="label">危险度</span>
+        <el-input
+          v-model="searchParams.minRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">复杂度等级</span>
+        <el-select
+          v-model="searchParams.complexityLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">危险度等级</span>
+        <el-select
+          v-model="searchParams.riskLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem27">
+        <!-- <el-checkbox-group v-model="labels">
                     <el-checkbox-button label="1" :key="1" class="labelA"
                         >高速</el-checkbox-button
                     >
@@ -107,25 +183,25 @@
                         >掉头</el-checkbox-button
                     >
                 </el-checkbox-group> -->
-                <div class="labelsBox">
-                    <b class="labelA" @click="conditions(1)">高速</b>
-                    <b class="labelB" @click="conditions(2)">切入</b>
-                    <b class="labelC" @click="conditions(3)">切出</b>
-                    <b class="labelD" @click="conditions(4)">变道</b>
-                    <b class="labelA" @click="conditions(5)">匝道</b>
-                    <b class="labelB" @click="conditions(6)">隧道</b>
-                    <b class="labelC" @click="conditions(7)">掉头</b>
-                </div>
-            </template>
-            <template slot="searchBtn1">
-                <el-button type="primary" @click="doSearch">查询</el-button>
-            </template>
-            <template slot="searchBtn2">
-                <el-button type="primary" @click="doReset">重置</el-button>
-            </template>
-        </search-layout>
+        <div class="labelsBox">
+          <b class="labelA" @click="conditions(1)">高速</b>
+          <b class="labelB" @click="conditions(2)">切入</b>
+          <b class="labelC" @click="conditions(3)">切出</b>
+          <b class="labelD" @click="conditions(4)">变道</b>
+          <b class="labelA" @click="conditions(5)">匝道</b>
+          <b class="labelB" @click="conditions(6)">隧道</b>
+          <b class="labelC" @click="conditions(7)">掉头</b>
+        </div>
+      </template>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+    </search-layout>
 
-        <!-- <div class="btnsPanel">
+    <!-- <div class="btnsPanel">
             <el-button
                 type="primary"
                 plain
@@ -135,7 +211,7 @@
             >
         </div> -->
 
-        <!-- <file-dialog
+    <!-- <file-dialog
             ref="fileDialog"
             type="1"
             :objectPath="objectPath"
@@ -143,27 +219,23 @@
             @fileClose="fileClose"
         ></file-dialog> -->
 
-        <div class="btnsPanel">
-            <el-button
-                type="primary"
-                plain
-                icon="el-icon-delete"
-                @click="delRows"
-                >批量删除</el-button
-            >
-        </div>
+    <div class="btnsPanel">
+      <el-button type="primary" plain icon="el-icon-delete" @click="delRows"
+        >批量删除</el-button
+      >
+    </div>
 
-        <tableList
-            ref="table"
-            style="margin: 0 30px"
-            :columns="columns"
-            :getDataWay="getDataWay"
-            :pagination="pagination"
-            :checkedData="checkedArr"
-            selection
-            index
-        >
-            <!-- <tableList
+    <tableList
+      ref="table"
+      style="margin: 0 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      :checkedData="checkedArr"
+      selection
+      index
+    >
+      <!-- <tableList
             ref="table"
             style="margin: 30px"
             :columns="columns"
@@ -171,186 +243,203 @@
             :pagination="pagination"
             index
         > -->
-            <el-table-column
-                label="操作"
-                slot="cgInfos"
-                align="center"
-                width="180"
-            >
-                <template v-slot="scope">
-                    <i
-                        @click="viewRow(scope.row)"
-                        class="el-icon-view elIcon cursor"
-                        title="查看"
-                    >
-                    </i>
-                    <i
-                        @click="delRow(scope.row)"
-                        class="el-icon-delete elIcon"
-                        title="删除"
-                    >
-                    </i>
-                </template>
-            </el-table-column>
-        </tableList>
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <i
+            @click="viewRow(scope.row)"
+            class="el-icon-view elIcon cursor"
+            title="查看"
+          >
+          </i>
+          <i
+            @click="delRow(scope.row)"
+            class="el-icon-delete elIcon"
+            title="删除"
+          >
+          </i>
+        </template>
+      </el-table-column>
+    </tableList>
 
-        <el-dialog
-            :title="videoDiaTitle"
-            :visible.sync="dialogVisible"
-            width="690px"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-            :before-close="diaClose"
-        >
-            <div class="videoBox">
-                <video autoplay :src="videoSrc" controls></video>
-            </div>
-        </el-dialog>
-    </div>
+    <el-dialog
+      :title="videoDiaTitle"
+      :visible.sync="dialogVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="diaClose"
+    >
+      <div class="videoBox">
+        <video autoplay :src="videoSrc" controls></video>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
-import searchLayout from "@/components/grid/searchLayout";
-import tableList from "@/components/grid/TableList";
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
 // import fileDialog from "./components/fileDialog";
-import { mapState } from "vuex";
+import { mapState } from 'vuex'
 
 export default {
-    name: "naturalDrivingScenarioList", // 自然驾驶场景
-    components: { searchLayout, tableList },
-    data() {
-        return {
-            searchParams: {
-                //搜索参数
-                naturalName: "", // 场景名称
-                road: [], // 道路
-                infrastructure: [], // 基础设施
-                trafficCondition: [], // 交通情况
-                selfBehavior: [], // 自车行为
-                targetBehavior: [], // 目标行为
-                naturalEnvironment: [], // 自然环境
+  name: 'naturalDrivingScenarioList', // 自然驾驶场景
+  components: { searchLayout, tableList },
+  data() {
+    return {
+      searchParams: {
+        //搜索参数
+        naturalName: '', // 场景名称
+        road: [], // 道路
+        infrastructure: [], // 基础设施
+        trafficCondition: [], // 交通情况
+        selfBehavior: [], // 自车行为
+        targetBehavior: [], // 目标行为
+        naturalEnvironment: [], // 自然环境
 
-                highSpeed: [], // 高速
-                ramp: [], // 匝道
-                tunnel: [], // 隧道
-                cutIn: [], // 切入
-                cutOut: [], // 切出
-                laneChange: [], // 变道
-                turnAround: [], // 掉头
+        highSpeed: [], // 高速
+        ramp: [], // 匝道
+        tunnel: [], // 隧道
+        cutIn: [], // 切入
+        cutOut: [], // 切出
+        laneChange: [], // 变道
+        turnAround: [], // 掉头
 
-                share: "0",
-            },
-            labels: [],
-            list: [],
-            // roadList: [],
-            // infrastructureList: [],
-            // trafficConditionList: [],
-            // selfBehaviorList: [],
-            // targetBehaviorList: [],
-            // naturalEnvironmentList: [],
-            // temporaryOperationList: [],
-            props: {
-                multiple: true,
-                label: "dictName",
-                value: "dictCode",
-            },
-            columns: [
-                //表格列
-                {
-                    label: "场景名称",
-                    prop: "naturalName",
-                },
-                {
-                    label: "自车行为",
-                    prop: "selfBehavior",
-                },
-                {
-                    label: "目标行为",
-                    prop: "targetBehavior",
-                },
-                {
-                    label: "天气",
-                    prop: "weather",
-                },
-                {
-                    label: "道路类型",
-                    prop: "roadType",
-                },
-                {
-                    label: "标签",
-                    prop: "label",
-                },
-                {
-                    label: "操作",
-                    prop: "cgInfos",
-                    template: true,
-                },
-            ],
-            pagination: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWay: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.querySceneNaturalList,
-                param: {
-                    share: "0",
-                },
-            },
-            dialogVisible: false,
-            autoplay: false,
-            videoSrc: "",
-            objectPath: "",
-            videoDiaTitle: "",
-            checkedArr: [],
-        };
-    },
-
-    props: {
-        roadList: {
-            type: Array,
-            default: [],
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      },
+      labels: [],
+      list: [],
+      // roadList: [],
+      // infrastructureList: [],
+      // trafficConditionList: [],
+      // selfBehaviorList: [],
+      // targetBehaviorList: [],
+      // naturalEnvironmentList: [],
+      // temporaryOperationList: [],
+      props: {
+        multiple: true,
+        label: 'dictName',
+        value: 'dictCode',
+      },
+      columns: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'naturalName',
         },
-        infrastructureList: {
-            type: Array,
-            default: [],
+        {
+          label: '自车行为',
+          prop: 'selfBehavior',
         },
-        trafficConditionList: {
-            type: Array,
-            default: [],
+        {
+          label: '目标行为',
+          prop: 'targetBehavior',
         },
-        selfBehaviorList: {
-            type: Array,
-            default: [],
+        {
+          label: '天气',
+          prop: 'weather',
         },
-        targetBehaviorList: {
-            type: Array,
-            default: [],
+        {
+          label: '道路类型',
+          prop: 'roadType',
         },
-        naturalEnvironmentList: {
-            type: Array,
-            default: [],
+        {
+          label: '标签',
+          prop: 'label',
         },
-        temporaryOperationList: {
-            type: Array,
-            default: [],
+        {
+          label: '复杂度',
+          prop: 'complexity',
         },
-    },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.querySceneNaturalList,
+        param: {
+          share: '0',
+        },
+      },
+      dialogVisible: false,
+      autoplay: false,
+      videoSrc: '',
+      objectPath: '',
+      videoDiaTitle: '',
+      checkedArr: [],
+    }
+  },
 
-    computed: {
-        ...mapState(["fileHost", "fileUrl"]),
+  props: {
+    roadList: {
+      type: Array,
+      default: [],
+    },
+    infrastructureList: {
+      type: Array,
+      default: [],
+    },
+    trafficConditionList: {
+      type: Array,
+      default: [],
+    },
+    selfBehaviorList: {
+      type: Array,
+      default: [],
+    },
+    targetBehaviorList: {
+      type: Array,
+      default: [],
     },
+    naturalEnvironmentList: {
+      type: Array,
+      default: [],
+    },
+    temporaryOperationList: {
+      type: Array,
+      default: [],
+    },
+  },
 
-    methods: {
-        doSearch() {
-            /* this.searchParams.highSpeed = this.labels.includes("1")
+  computed: {
+    ...mapState(['fileHost', 'fileUrl']),
+  },
+
+  methods: {
+    doSearch() {
+      /* this.searchParams.highSpeed = this.labels.includes("1")
                 ? [["roadType", "高速"]]
                 : [];
             this.searchParams.cutIn = this.labels.includes("2")
@@ -446,252 +535,222 @@ export default {
                   ]
                 : []; */
 
-            this.refreshList(this.searchParams);
-        },
-        //刷新table
-        refreshList(param) {
-            param
-                ? this.$refs["table"].loadData(param)
-                : this.$refs["table"].loadData();
-        },
-        doReset() {
-            this.searchParams = {
-                naturalName: "",
-                road: [],
-                infrastructure: [],
-                trafficCondition: [],
-                selfBehavior: [],
-                targetBehavior: [],
-                naturalEnvironment: [],
-                temporaryOperation: [],
-                highSpeed: [],
-                ramp: [],
-                tunnel: [],
-                cutIn: [],
-                cutOut: [],
-                laneChange: [],
-                turnAround: [],
-                share: "0",
-            };
-            this.labels = [];
-            this.doSearch();
-        },
-        conditions(v) {
-            switch (v) {
-                case 1:
-                    this.searchParams.road = [
-                        ...this.searchParams.road,
-                        ["roadType", "高速"],
-                    ];
-                    break;
-                case 2:
-                    this.searchParams.targetBehavior = [
-                        ...this.searchParams.targetBehavior,
-                        [
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "机动车从左侧切入成功",
-                        ],
-                        [
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "机动车从右侧切入成功",
-                        ],
-                    ];
-                    break;
-                case 3:
-                    this.searchParams.targetBehavior = [
-                        ...this.searchParams.targetBehavior,
-                        [
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "机动车向左侧切出成功",
-                        ],
-                        [
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "targetBehavior",
-                            "机动车向右侧切出成功",
-                        ],
-                    ];
-                    break;
-                case 4:
-                    this.searchParams.selfBehavior = [
-                        ...this.searchParams.selfBehavior,
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向左变道成功",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向右变道成功",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向左连续变道",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向右连续变道",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向左变道超车",
-                        ],
-                        [
-                            "selfBehavior",
-                            "selfBehavior",
-                            "selfBehavior",
-                            "向右变道超车",
-                        ],
-                    ];
-                    break;
-                case 5:
-                    this.searchParams.road = [
-                        ...this.searchParams.road,
-                        ["ramp", "是"],
-                    ];
-                    break;
-                case 6:
-                    this.searchParams.road = [
-                        ...this.searchParams.road,
-                        ["tunnel", "是"],
-                    ];
-                    break;
-                case 7:
-                    this.searchParams.selfBehavior = [
-                        ...this.searchParams.selfBehavior,
-                        ["selfBehavior", "直路掉头"],
-                        ["selfBehavior", "selfBehavior", "路口掉头"],
-                    ];
-                    break;
-                default:
-                    break;
-            }
-        },
-        viewRow(row) {
-            if (!row.videoAddress) {
-                this.$message.warning("本场景无仿真视频");
-                return;
-            }
+      this.refreshList(this.searchParams)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doReset() {
+      this.searchParams = {
+        naturalName: '',
+        road: [],
+        infrastructure: [],
+        trafficCondition: [],
+        selfBehavior: [],
+        targetBehavior: [],
+        naturalEnvironment: [],
+        temporaryOperation: [],
+        highSpeed: [],
+        ramp: [],
+        tunnel: [],
+        cutIn: [],
+        cutOut: [],
+        laneChange: [],
+        turnAround: [],
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      }
+      this.labels = []
+      this.doSearch()
+    },
+    conditions(v) {
+      switch (v) {
+        case 1:
+          this.searchParams.road = [
+            ...this.searchParams.road,
+            ['roadType', '高速'],
+          ]
+          break
+        case 2:
+          this.searchParams.targetBehavior = [
+            ...this.searchParams.targetBehavior,
+            [
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              '机动车从左侧切入成功',
+            ],
+            [
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              '机动车从右侧切入成功',
+            ],
+          ]
+          break
+        case 3:
+          this.searchParams.targetBehavior = [
+            ...this.searchParams.targetBehavior,
+            [
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              '机动车向左侧切出成功',
+            ],
+            [
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              'targetBehavior',
+              '机动车向右侧切出成功',
+            ],
+          ]
+          break
+        case 4:
+          this.searchParams.selfBehavior = [
+            ...this.searchParams.selfBehavior,
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向左变道成功'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向右变道成功'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向左连续变道'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向右连续变道'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向左变道超车'],
+            ['selfBehavior', 'selfBehavior', 'selfBehavior', '向右变道超车'],
+          ]
+          break
+        case 5:
+          this.searchParams.road = [...this.searchParams.road, ['ramp', '是']]
+          break
+        case 6:
+          this.searchParams.road = [...this.searchParams.road, ['tunnel', '是']]
+          break
+        case 7:
+          this.searchParams.selfBehavior = [
+            ...this.searchParams.selfBehavior,
+            ['selfBehavior', '直路掉头'],
+            ['selfBehavior', 'selfBehavior', '路口掉头'],
+          ]
+          break
+        default:
+          break
+      }
+    },
+    viewRow(row) {
+      if (!row.videoAddress) {
+        this.$message.warning('本场景无仿真视频')
+        return
+      }
 
-            this.dialogVisible = true;
-            this.videoDiaTitle = row.naturalName;
+      this.dialogVisible = true
+      this.videoDiaTitle = row.naturalName
 
-            let url = "";
-            if (process.env.VUE_APP_IS_DEV == "true") {
-                url = this.fileHost + this.fileUrl;
-            } else {
-                url = this.fileUrl;
-            }
+      let url = ''
+      if (process.env.VUE_APP_IS_DEV == 'true') {
+        url = this.fileHost + this.fileUrl
+      } else {
+        url = this.fileUrl
+      }
 
-            let token = localStorage.getItem("Authorization").split(" ")[1];
-            this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`;
-            this.autoplay = true;
-        },
-        delRow(row) {
-            this.$confirm("确认是否删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.deleteSceneNatural,
-                    data: {
-                        naturalId: row.naturalId,
-                        naturalName: row.naturalName,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
-        },
-        delRows() {
-            let checkedArr = this.checkedArr;
+      let token = localStorage.getItem('Authorization').split(' ')[1]
+      this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`
+      this.autoplay = true
+    },
+    delRow(row) {
+      this.$confirm('确认是否删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.deleteSceneNatural,
+          data: {
+            naturalId: row.naturalId,
+            naturalName: row.naturalName,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    delRows() {
+      let checkedArr = this.checkedArr
 
-            if (checkedArr.length <= 0) {
-                this.$message.info("请先选择数据");
-                return;
-            }
+      if (checkedArr.length <= 0) {
+        this.$message.info('请先选择数据')
+        return
+      }
 
-            let arr = checkedArr.map((i) => i.naturalName);
+      let arr = checkedArr.map((i) => i.naturalName)
 
-            this.$confirm("确认是否批量删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.batchDeleteSceneNatural,
-                    data: {
-                        naturalNameList: arr,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
-        },
-        diaClose(done) {
-            this.autoplay = false;
-            this.videoSrc = "";
-            done();
-        },
-        openFileDia() {
-            this.objectPath = Math.random().toString();
-            this.$refs.fileDialog.fileVisible = true;
-        },
-        fileClose() {
-            this.objectPath = "";
-            this.doSearch();
-        },
+      this.$confirm('确认是否批量删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.batchDeleteSceneNatural,
+          data: {
+            naturalNameList: arr,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    diaClose(done) {
+      this.autoplay = false
+      this.videoSrc = ''
+      done()
     },
-};
+    openFileDia() {
+      this.objectPath = Math.random().toString()
+      this.$refs.fileDialog.fileVisible = true
+    },
+    fileClose() {
+      this.objectPath = ''
+      this.doSearch()
+    },
+  },
+}
 </script>
 
 <style lang='less' scoped>
-@import "./common/util.less";
+@import './common/util.less';
 .naturalDrivingScenarioListPanel {
-    .inputBox {
-        .label {
-            min-width: 75px;
-        }
+  .inputBox {
+    .label {
+      min-width: 75px;
     }
+  }
 
-    .btnsPanel {
-        text-align: right;
-    }
+  .btnsPanel {
+    text-align: right;
+  }
 }
 </style>

+ 157 - 145
src/views/systemManagement/sceneLibraryManagement/sceneLibraryManagement.vue

@@ -1,167 +1,179 @@
 <!--场景库管理,包括自然驾驶、标准法规、交通事故、泛化四个场景库-->
 <template>
-    <div>
-        <toolbarTab
-            :isConnect="true"
-            position="top"
-            :subPageActiveName="subPageActiveName"
-            :toolbarItem="subPageList"
-            @toolbarClick="toolsControl"
-        >
-        </toolbarTab>
-        <natural-driving-scene
-            v-show="subPageActiveName === 1"
-            :roadList="roadList"
-            :infrastructureList="infrastructureList"
-            :trafficConditionList="trafficConditionList"
-            :selfBehaviorList="selfBehaviorList"
-            :targetBehaviorList="targetBehaviorList"
-            :naturalEnvironmentList="naturalEnvironmentList"
-            :temporaryOperationList="temporaryOperationList"
-        >
-        </natural-driving-scene>
-        <standard-regulation-simulation-scene
-            v-show="subPageActiveName === 2"
-            :regulationTypeList="regulationTypeList"
-        >
-        </standard-regulation-simulation-scene>
-        <traffic-accident-simulation-scene
-            v-show="subPageActiveName === 3"
-            :selfDrivingList="selfDrivingList"
-            :targetDrivingList="targetDrivingList"
-            :selfReactionList="selfReactionList"
-            :conflictBehaviorList="conflictBehaviorList"
-            :conflictTypeList="conflictTypeList"
-        >
-        </traffic-accident-simulation-scene>
-        <generalization-scene
-            v-show="subPageActiveName === 4"
-            :scenarioRoadTypeList="scenarioRoadTypeList"
-        ></generalization-scene>
-    </div>
+  <div>
+    <toolbarTab
+      :isConnect="true"
+      position="top"
+      :subPageActiveName="subPageActiveName"
+      :toolbarItem="subPageList"
+      @toolbarClick="toolsControl"
+    >
+    </toolbarTab>
+    <natural-driving-scene
+      v-show="subPageActiveName === 1"
+      :roadList="roadList"
+      :infrastructureList="infrastructureList"
+      :trafficConditionList="trafficConditionList"
+      :selfBehaviorList="selfBehaviorList"
+      :targetBehaviorList="targetBehaviorList"
+      :naturalEnvironmentList="naturalEnvironmentList"
+      :temporaryOperationList="temporaryOperationList"
+    >
+    </natural-driving-scene>
+    <standard-regulation-simulation-scene
+      v-show="subPageActiveName === 2"
+      :regulationTypeList="regulationTypeList"
+    >
+    </standard-regulation-simulation-scene>
+    <traffic-accident-simulation-scene
+      v-show="subPageActiveName === 3"
+      :selfDrivingList="selfDrivingList"
+      :targetDrivingList="targetDrivingList"
+      :selfReactionList="selfReactionList"
+      :conflictBehaviorList="conflictBehaviorList"
+      :conflictTypeList="conflictTypeList"
+    >
+    </traffic-accident-simulation-scene>
+    <generalization-scene
+      v-show="subPageActiveName === 4"
+      :scenarioRoadTypeList="scenarioRoadTypeList"
+    ></generalization-scene>
+    <benchmark-scenario v-show="subPageActiveName === 5">
+    </benchmark-scenario>
+  </div>
 </template>
 
 <script>
-import toolbarTab from "@/components/toolbar/toolbarTab";
-import trafficAccidentSimulationScene from "./trafficAccidentSimulationScene";
-import naturalDrivingScene from "./naturalDrivingScene";
-import standardRegulationSimulationScene from "./standardRegulationSimulationScene";
-import generalizationScene from "./generalizationScene";
+import toolbarTab from '@/components/toolbar/toolbarTab'
+import trafficAccidentSimulationScene from './trafficAccidentSimulationScene'
+import naturalDrivingScene from './naturalDrivingScene'
+import standardRegulationSimulationScene from './standardRegulationSimulationScene'
+import generalizationScene from './generalizationScene'
+import benchmarkScenario from './benchmarkScenario.vue'
 
 export default {
-    name: "sceneLibraryManagement", // 场景库管理
-    components: {
-        toolbarTab,
-        naturalDrivingScene,
-        standardRegulationSimulationScene,
-        trafficAccidentSimulationScene,
-        generalizationScene,
-    },
-    data() {
-        return {
-            subPageActiveName: 1,
-            selfDrivingList: [],
-            targetDrivingList: [],
-            selfReactionList: [],
-            conflictBehaviorList: [],
-            conflictTypeList: [],
-            roadList: [],
-            infrastructureList: [],
-            trafficConditionList: [],
-            selfBehaviorList: [],
-            targetBehaviorList: [],
-            naturalEnvironmentList: [],
-            temporaryOperationList: [],
-            regulationTypeList: [],
-            fileNameList: [],
-            // scenarioWeatherList: [],
-            scenarioRoadTypeList: [],
-        };
-    },
-    computed: {
-        subPageList() {
-            return [
-                {
-                    type: "primary",
-                    plain: true,
-                    title: "自然驾驶场景",
-                    disabled: false,
-                    api: "",
-                    fromId: 1,
-                },
-                {
-                    type: "primary",
-                    plain: true,
-                    title: "标准法规场景",
-                    disabled: false,
-                    api: "",
-                    fromId: 2,
-                },
-                {
-                    type: "primary",
-                    plain: true,
-                    title: "交通事故场景",
-                    disabled: false,
-                    api: "",
-                    fromId: 3,
-                },
-                {
-                    type: "primary",
-                    plain: true,
-                    title: "泛化场景模板",
-                    disabled: false,
-                    api: "",
-                    fromId: 4,
-                },
-            ];
+  name: 'sceneLibraryManagement', // 场景库管理
+  components: {
+    toolbarTab,
+    naturalDrivingScene,
+    standardRegulationSimulationScene,
+    trafficAccidentSimulationScene,
+    generalizationScene,
+    benchmarkScenario,
+  },
+  data() {
+    return {
+      subPageActiveName: 1,
+      selfDrivingList: [],
+      targetDrivingList: [],
+      selfReactionList: [],
+      conflictBehaviorList: [],
+      conflictTypeList: [],
+      roadList: [],
+      infrastructureList: [],
+      trafficConditionList: [],
+      selfBehaviorList: [],
+      targetBehaviorList: [],
+      naturalEnvironmentList: [],
+      temporaryOperationList: [],
+      regulationTypeList: [],
+      fileNameList: [],
+      // scenarioWeatherList: [],
+      scenarioRoadTypeList: [],
+    }
+  },
+  computed: {
+    subPageList() {
+      return [
+        {
+          type: 'primary',
+          plain: true,
+          title: '自然驾驶场景',
+          disabled: false,
+          api: '',
+          fromId: 1,
         },
-    },
-    methods: {
-        toolsControl(item) {
-            this.subPageActiveName = item.fromId;
+        {
+          type: 'primary',
+          plain: true,
+          title: '标准法规场景',
+          disabled: false,
+          api: '',
+          fromId: 2,
+        },
+        {
+          type: 'primary',
+          plain: true,
+          title: '交通事故场景',
+          disabled: false,
+          api: '',
+          fromId: 3,
+        },
+        {
+          type: 'primary',
+          plain: true,
+          title: '泛化场景模板',
+          disabled: false,
+          api: '',
+          fromId: 4,
         },
+        {
+          type: 'primary',
+          plain: true,
+          title: '基准场景库',
+          disabled: false,
+          api: '',
+          fromId: 5,
+        },
+      ]
     },
-    async mounted() {
-        await this.$dicsListsInit({
-            selfDrivingList: "selfDriving",
-            targetDrivingList: "targetDriving",
-            selfReactionList: "selfReaction",
-            conflictBehaviorList: "conflictBehavior",
-            conflictTypeList: "conflictType",
-            regulationTypeList: "regulationType",
-            // scenarioWeatherList: "scenarioWeather",
-            scenarioRoadTypeList: "scenarioRoadType",
-        });
-
-        await this.$dicsTreesInit({
-            roadList: "road",
-            infrastructureList: "infrastructure",
-            trafficConditionList: "trafficCondition",
-            selfBehaviorList: "selfBehavior",
-            targetBehaviorList: "targetBehavior",
-            naturalEnvironmentList: "naturalEnvironment",
-            temporaryOperationList: "temporaryOperation",
-        });
+  },
+  methods: {
+    toolsControl(item) {
+      this.subPageActiveName = item.fromId
     },
-};
+  },
+  async mounted() {
+    await this.$dicsListsInit({
+      selfDrivingList: 'selfDriving',
+      targetDrivingList: 'targetDriving',
+      selfReactionList: 'selfReaction',
+      conflictBehaviorList: 'conflictBehavior',
+      conflictTypeList: 'conflictType',
+      regulationTypeList: 'regulationType',
+      // scenarioWeatherList: "scenarioWeather",
+      scenarioRoadTypeList: 'scenarioRoadType',
+    })
+
+    await this.$dicsTreesInit({
+      roadList: 'road',
+      infrastructureList: 'infrastructure',
+      trafficConditionList: 'trafficCondition',
+      selfBehaviorList: 'selfBehavior',
+      targetBehaviorList: 'targetBehavior',
+      naturalEnvironmentList: 'naturalEnvironment',
+      temporaryOperationList: 'temporaryOperation',
+    })
+  },
+}
 </script>
 
 <style scoped lang="less">
 .tabsBox {
-    position: relative;
-    overflow: hidden;
+  position: relative;
+  overflow: hidden;
 
-    .el-button {
-        position: absolute;
-        right: 40px;
-        top: 45px;
-    }
+  .el-button {
+    position: absolute;
+    right: 40px;
+    top: 45px;
+  }
 }
 .myTabsBox {
-    min-height: 99px;
+  min-height: 99px;
 }
 /deep/ .el-tabs__nav .el-tabs__item {
-    width: auto;
-    padding: 0 10px;
+  width: auto;
+  padding: 0 10px;
 }
 </style>

+ 428 - 332
src/views/systemManagement/sceneLibraryManagement/standardRegulationSimulationScene.vue

@@ -1,48 +1,125 @@
 <template>
-    <div>
-        <search-layout :needBox="true">
-            <template slot="searchItem1">
-                <span class="label">场景名称</span>
-                <el-input
-                    v-model="searchParams.sceneName"
-                    size="small"
-                    maxlength="60"
-                    clearable
-                    placeholder="请输入"
-                    @keyup.enter.native="doSearch"
-                >
-                </el-input>
-            </template>
-            <template slot="searchItem2">
-                <span class="label">法规类型</span>
-                <el-select
-                    v-model="searchParams.regulationType"
-                    multiple
-                    clearable
-                    size="small"
-                >
-                    <el-option
-                        v-for="item in regulationTypeList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem3">
-                <span class="label">标准类型</span>
-                <el-input
-                    v-model="searchParams.standardType"
-                    size="small"
-                    maxlength="60"
-                    clearable
-                    placeholder="请输入"
-                    @keyup.enter.native="doSearch"
-                >
-                </el-input>
-            </template>
-            <template slot="searchItem27">
-                <!-- <el-checkbox-group v-model="labels">
+  <div>
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">场景名称</span>
+        <el-input
+          v-model="searchParams.sceneName"
+          size="small"
+          maxlength="60"
+          clearable
+          placeholder="请输入"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">法规类型</span>
+        <el-select
+          v-model="searchParams.regulationType"
+          multiple
+          clearable
+          size="small"
+        >
+          <el-option
+            v-for="item in regulationTypeList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">标准类型</span>
+        <el-input
+          v-model="searchParams.standardType"
+          size="small"
+          maxlength="60"
+          clearable
+          placeholder="请输入"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <!-- 复杂度 -->
+      <template slot="searchItem6">
+        <span class="label">复杂度</span>
+        <el-input
+          v-model="searchParams.minComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <!-- 危险度 -->
+      <template slot="searchItem6">
+        <span class="label">危险度</span>
+        <span class="label">危险度</span>
+        <el-input
+          v-model="searchParams.minRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">复杂度等级</span>
+        <el-select
+          v-model="searchParams.complexityLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">危险度等级</span>
+        <el-select
+          v-model="searchParams.riskLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem27">
+        <!-- <el-checkbox-group v-model="labels">
                     <el-checkbox-button label="ISO" :key="1" class="labelA"
                         >ISO</el-checkbox-button
                     >
@@ -56,42 +133,38 @@
                         >E-NCAP</el-checkbox-button
                     >
                 </el-checkbox-group> -->
-                <div class="labelsBox">
-                    <b class="labelA" @click="conditions(1)">ISO</b>
-                    <b class="labelB" @click="conditions(2)">GB</b>
-                    <b class="labelC" @click="conditions(3)">C-NCAP</b>
-                    <b class="labelD" @click="conditions(4)">E-NCAP</b>
-                </div>
-            </template>
-            <template slot="searchBtn1">
-                <el-button type="primary" @click="doSearch">查询</el-button>
-            </template>
-            <template slot="searchBtn2">
-                <el-button type="primary" @click="doReset">重置</el-button>
-            </template>
-        </search-layout>
-
-        <div class="btnsPanel">
-            <el-button
-                type="primary"
-                plain
-                icon="el-icon-delete"
-                @click="delRows"
-                >批量删除</el-button
-            >
+        <div class="labelsBox">
+          <b class="labelA" @click="conditions(1)">ISO</b>
+          <b class="labelB" @click="conditions(2)">GB</b>
+          <b class="labelC" @click="conditions(3)">C-NCAP</b>
+          <b class="labelD" @click="conditions(4)">E-NCAP</b>
         </div>
+      </template>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+    </search-layout>
 
-        <tableList
-            ref="table"
-            style="margin: 0 30px"
-            :columns="columns"
-            :getDataWay="getDataWay"
-            :pagination="pagination"
-            :checkedData="checkedArr"
-            selection
-            index
-        >
-            <!-- <tableList
+    <div class="btnsPanel">
+      <el-button type="primary" plain icon="el-icon-delete" @click="delRows"
+        >批量删除</el-button
+      >
+    </div>
+
+    <tableList
+      ref="table"
+      style="margin: 0 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      :checkedData="checkedArr"
+      selection
+      index
+    >
+      <!-- <tableList
             ref="table"
             style="margin: 30px"
             :columns="columns"
@@ -99,281 +172,304 @@
             :pagination="pagination"
             index
         > -->
-            <el-table-column
-                label="操作"
-                slot="cgInfos"
-                align="center"
-                width="180"
-            >
-                <template v-slot="scope">
-                    <i
-                        @click="viewRow(scope.row)"
-                        class="el-icon-view elIcon cursor"
-                        title="查看"
-                    >
-                    </i>
-                    <i
-                        @click="delRow(scope.row)"
-                        class="el-icon-delete elIcon"
-                        title="删除"
-                    >
-                    </i>
-                </template>
-            </el-table-column>
-        </tableList>
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <i
+            @click="viewRow(scope.row)"
+            class="el-icon-view elIcon cursor"
+            title="查看"
+          >
+          </i>
+          <i
+            @click="delRow(scope.row)"
+            class="el-icon-delete elIcon"
+            title="删除"
+          >
+          </i>
+        </template>
+      </el-table-column>
+    </tableList>
 
-        <el-dialog
-            :title="videoDiaTitle"
-            :visible.sync="dialogVisible"
-            width="690px"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-            :before-close="diaClose"
-        >
-            <div class="videoBox">
-                <video autoplay :src="videoSrc" controls></video>
-            </div>
-        </el-dialog>
-    </div>
+    <el-dialog
+      :title="videoDiaTitle"
+      :visible.sync="dialogVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="diaClose"
+    >
+      <div class="videoBox">
+        <video autoplay :src="videoSrc" controls></video>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
-import searchLayout from "@/components/grid/searchLayout";
-import tableList from "@/components/grid/TableList";
-import { mapState } from "vuex";
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import { mapState } from 'vuex'
 
 export default {
-    name: "standardRegulationSimulationScenarioList", // 标准法规场景
-    components: { searchLayout, tableList },
-    data() {
-        return {
-            searchParams: {
-                //搜索参数
-                sceneName: "", //场景名称
-                regulationType: [], //法规类型
-                standardType: "", //标准类型
-                label: [],
-                share: "0",
-            },
-            labels: [], // 标签
-            // regulationTypeList: [],
-            columns: [
-                //表格列
-                {
-                    label: "场景名称",
-                    prop: "sceneName",
-                },
-                {
-                    label: "法规类型",
-                    prop: "regulationType",
-                },
-                {
-                    label: "标准类型",
-                    prop: "standardType",
-                },
-                {
-                    label: "标签",
-                    prop: "regulationType",
-                },
-                {
-                    label: "操作",
-                    prop: "cgInfos",
-                    template: true,
-                    // videoAddress
-                },
-            ],
-            pagination: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWay: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.queryStandardsRegulationsList,
-                param: {
-                    share: "0",
-                },
-            },
-            dialogVisible: false,
-            autoplay: false,
-            videoSrc: "",
-            objectPath: "",
-            videoDiaTitle: "",
-            checkedArr: [],
-        };
-    },
-
-    props: {
-        regulationTypeList: {
-            type: Array,
-            default: [],
+  name: 'standardRegulationSimulationScenarioList', // 标准法规场景
+  components: { searchLayout, tableList },
+  data() {
+    return {
+      searchParams: {
+        //搜索参数
+        sceneName: '', //场景名称
+        regulationType: [], //法规类型
+        standardType: '', //标准类型
+        label: [],
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      },
+      labels: [], // 标签
+      // regulationTypeList: [],
+      columns: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'sceneName',
         },
-    },
-
-    computed: {
-        ...mapState(["fileHost", "fileUrl"]),
-    },
-
-    methods: {
-        doSearch() {
-            // this.searchParams.label = [...this.labels];
-            this.refreshList(this.searchParams);
+        {
+          label: '法规类型',
+          prop: 'regulationType',
+        },
+        {
+          label: '标准类型',
+          prop: 'standardType',
+        },
+        {
+          label: '标签',
+          prop: 'regulationType',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
         },
-        //刷新table
-        refreshList(param) {
-            param
-                ? this.$refs["table"].loadData(param)
-                : this.$refs["table"].loadData();
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
         },
-        doReset() {
-            this.searchParams = {
-                sceneName: "",
-                regulationType: [],
-                standardType: "",
-                label: [],
-                share: "0",
-            };
-            // this.labels = [];
-            this.doSearch();
+        {
+          label: '危险度',
+          prop: 'risk',
         },
-        conditions(v) {
-            switch (v) {
-                case 1:
-                    if (!this.searchParams.regulationType.includes("ISO")) {
-                        this.searchParams.regulationType = [
-                            ...this.searchParams.regulationType,
-                            "ISO",
-                        ];
-                    }
-                    break;
-                case 2:
-                    if (!this.searchParams.regulationType.includes("GB")) {
-                        this.searchParams.regulationType = [
-                            ...this.searchParams.regulationType,
-                            "GB",
-                        ];
-                    }
-                    break;
-                case 3:
-                    if (!this.searchParams.regulationType.includes("C-NCAP")) {
-                        this.searchParams.regulationType = [
-                            ...this.searchParams.regulationType,
-                            "C-NCAP",
-                        ];
-                    }
-                    break;
-                case 4:
-                    if (!this.searchParams.regulationType.includes("E-NCAP")) {
-                        this.searchParams.regulationType = [
-                            ...this.searchParams.regulationType,
-                            "E-NCAP",
-                        ];
-                    }
-                    break;
-                default:
-                    break;
-            }
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
         },
-        viewRow(row) {
-            if (!row.videoAddress) {
-                this.$message.warning("本场景无仿真视频");
-                return;
-            }
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+          // videoAddress
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.queryStandardsRegulationsList,
+        param: {
+          share: '0',
+        },
+      },
+      dialogVisible: false,
+      autoplay: false,
+      videoSrc: '',
+      objectPath: '',
+      videoDiaTitle: '',
+      checkedArr: [],
+    }
+  },
 
-            this.dialogVisible = true;
-            this.videoDiaTitle = row.sceneName;
+  props: {
+    regulationTypeList: {
+      type: Array,
+      default: [],
+    },
+  },
 
-            let url = "";
-            if (process.env.VUE_APP_IS_DEV == "true") {
-                url = this.fileHost + this.fileUrl;
-            } else {
-                url = this.fileUrl;
-            }
+  computed: {
+    ...mapState(['fileHost', 'fileUrl']),
+  },
 
-            let token = localStorage.getItem("Authorization").split(" ")[1];
-            this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`;
-            this.autoplay = true;
-        },
-        delRow(row) {
-            this.$confirm("确认是否删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.deleteStandardsRegulations,
-                    data: {
-                        regulationsId: row.regulationsId,
-                        sceneName: row.sceneName,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
-        },
-        delRows() {
-            let checkedArr = this.checkedArr;
+  methods: {
+    doSearch() {
+      // this.searchParams.label = [...this.labels];
+      this.refreshList(this.searchParams)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doReset() {
+      this.searchParams = {
+        sceneName: '',
+        regulationType: [],
+        standardType: '',
+        label: [],
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      }
+      // this.labels = [];
+      this.doSearch()
+    },
+    conditions(v) {
+      switch (v) {
+        case 1:
+          if (!this.searchParams.regulationType.includes('ISO')) {
+            this.searchParams.regulationType = [
+              ...this.searchParams.regulationType,
+              'ISO',
+            ]
+          }
+          break
+        case 2:
+          if (!this.searchParams.regulationType.includes('GB')) {
+            this.searchParams.regulationType = [
+              ...this.searchParams.regulationType,
+              'GB',
+            ]
+          }
+          break
+        case 3:
+          if (!this.searchParams.regulationType.includes('C-NCAP')) {
+            this.searchParams.regulationType = [
+              ...this.searchParams.regulationType,
+              'C-NCAP',
+            ]
+          }
+          break
+        case 4:
+          if (!this.searchParams.regulationType.includes('E-NCAP')) {
+            this.searchParams.regulationType = [
+              ...this.searchParams.regulationType,
+              'E-NCAP',
+            ]
+          }
+          break
+        default:
+          break
+      }
+    },
+    viewRow(row) {
+      if (!row.videoAddress) {
+        this.$message.warning('本场景无仿真视频')
+        return
+      }
 
-            if (checkedArr.length <= 0) {
-                this.$message.info("请先选择数据");
-                return;
-            }
+      this.dialogVisible = true
+      this.videoDiaTitle = row.sceneName
 
-            let arr = checkedArr.map((i) => i.sceneName);
+      let url = ''
+      if (process.env.VUE_APP_IS_DEV == 'true') {
+        url = this.fileHost + this.fileUrl
+      } else {
+        url = this.fileUrl
+      }
 
-            this.$confirm("确认是否批量删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.batchDeleteSceneStandards,
-                    data: {
-                        sceneNameList: arr,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
-        },
-        diaClose(done) {
-            this.autoplay = false;
-            this.videoSrc = "";
-            done();
-        },
-        openFileDia() {
-            this.objectPath = Math.random().toString();
-            this.$refs.fileDialog.fileVisible = true;
-        },
-        fileClose() {
-            this.objectPath = "";
-            this.doSearch();
-        },
+      let token = localStorage.getItem('Authorization').split(' ')[1]
+      this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`
+      this.autoplay = true
     },
-};
+    delRow(row) {
+      this.$confirm('确认是否删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.deleteStandardsRegulations,
+          data: {
+            regulationsId: row.regulationsId,
+            sceneName: row.sceneName,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    delRows() {
+      let checkedArr = this.checkedArr
+
+      if (checkedArr.length <= 0) {
+        this.$message.info('请先选择数据')
+        return
+      }
+
+      let arr = checkedArr.map((i) => i.sceneName)
+
+      this.$confirm('确认是否批量删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.batchDeleteSceneStandards,
+          data: {
+            sceneNameList: arr,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    diaClose(done) {
+      this.autoplay = false
+      this.videoSrc = ''
+      done()
+    },
+    openFileDia() {
+      this.objectPath = Math.random().toString()
+      this.$refs.fileDialog.fileVisible = true
+    },
+    fileClose() {
+      this.objectPath = ''
+      this.doSearch()
+    },
+  },
+}
 </script>
 
 <style lang='less' scoped>
-@import "./common/util.less";
+@import './common/util.less';
 .btnsPanel {
-    text-align: right;
+  text-align: right;
 }
 </style>

+ 532 - 443
src/views/systemManagement/sceneLibraryManagement/trafficAccidentSimulationScene.vue

@@ -1,100 +1,180 @@
 <template>
-    <div class="trafficAccidentSimulationScenarioListPanel">
-        <search-layout :needBox="true">
-            <template slot="searchItem1">
-                <span class="label">场景名称</span>
-                <el-input
-                    v-model="searchParams.sceneName"
-                    size="small"
-                    clearable
-                    placeholder="请输入"
-                    maxlength="60"
-                    @keyup.enter.native="doSearch"
-                >
-                </el-input>
-            </template>
-            <template slot="searchItem2">
-                <span class="label">自车驾驶行为</span>
-                <el-select
-                    v-model="searchParams.selfDriving"
-                    multiple
-                    clearable
-                    size="small"
-                >
-                    <el-option
-                        v-for="item in selfDrivingList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem3">
-                <span class="label">目标驾驶行为</span>
-                <el-select
-                    v-model="searchParams.targetDriving"
-                    multiple
-                    clearable
-                    size="small"
-                >
-                    <el-option
-                        v-for="item in targetDrivingList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem4">
-                <span class="label">自车反应行为</span>
-                <el-select
-                    v-model="searchParams.selfReaction"
-                    multiple
-                    clearable
-                    size="small"
-                >
-                    <el-option
-                        v-for="item in selfReactionList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem5">
-                <span class="label">冲突行为</span>
-                <el-select
-                    v-model="searchParams.conflictBehavior"
-                    multiple
-                    clearable
-                    size="small"
-                >
-                    <el-option
-                        v-for="item in conflictBehaviorList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem6">
-                <span class="label">冲突类型</span>
-                <el-select
-                    v-model="searchParams.conflictType"
-                    multiple
-                    clearable
-                    size="small"
-                >
-                    <el-option
-                        v-for="item in conflictTypeList"
-                        :label="item.caption"
-                        :value="item.code"
-                        :key="item.code"
-                    ></el-option>
-                </el-select>
-            </template>
-            <template slot="searchItem27">
-                <!-- <el-checkbox-group v-model="labels">
+  <div class="trafficAccidentSimulationScenarioListPanel">
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">场景名称</span>
+        <el-input
+          v-model="searchParams.sceneName"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">自车驾驶行为</span>
+        <el-select
+          v-model="searchParams.selfDriving"
+          multiple
+          clearable
+          size="small"
+        >
+          <el-option
+            v-for="item in selfDrivingList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">目标驾驶行为</span>
+        <el-select
+          v-model="searchParams.targetDriving"
+          multiple
+          clearable
+          size="small"
+        >
+          <el-option
+            v-for="item in targetDrivingList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem4">
+        <span class="label">自车反应行为</span>
+        <el-select
+          v-model="searchParams.selfReaction"
+          multiple
+          clearable
+          size="small"
+        >
+          <el-option
+            v-for="item in selfReactionList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem5">
+        <span class="label">冲突行为</span>
+        <el-select
+          v-model="searchParams.conflictBehavior"
+          multiple
+          clearable
+          size="small"
+        >
+          <el-option
+            v-for="item in conflictBehaviorList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem6">
+        <span class="label">冲突类型</span>
+        <el-select
+          v-model="searchParams.conflictType"
+          multiple
+          clearable
+          size="small"
+        >
+          <el-option
+            v-for="item in conflictTypeList"
+            :label="item.caption"
+            :value="item.code"
+            :key="item.code"
+          ></el-option>
+        </el-select>
+      </template>
+      <!-- 复杂度 -->
+      <template slot="searchItem6">
+        <span class="label">复杂度</span>
+        <el-input
+        v-model="searchParams.minComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxComplexity"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <!-- 危险度 -->
+      <template slot="searchItem6">
+        <span class="label">危险度</span>
+        <el-input
+          v-model="searchParams.minRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+        <span class="dateSeparator">至</span>
+        <el-input
+          v-model="searchParams.maxRisk"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch"
+          style="width: 100px"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">复杂度等级</span>
+        <el-select
+          v-model="searchParams.complexityLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">危险度等级</span>
+        <el-select
+          v-model="searchParams.riskLevel"
+          size="small"
+          clearable
+        >
+          <el-option
+          v-for="item in ['S', 'AA', 'A', 'B', 'C']"
+            :label="item"
+            :value="item"
+            :key="item"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchItem27">
+        <!-- <el-checkbox-group v-model="labels">
                     <el-checkbox-button label="追尾" :key="1" class="labelA"
                         >追尾</el-checkbox-button
                     >
@@ -114,46 +194,38 @@
                         >机动车-机动车冲突</el-checkbox-button
                     >
                 </el-checkbox-group> -->
-                <div class="labelsBox">
-                    <b class="labelA" @click="conditions(1)">追尾</b>
-                    <b class="labelB" @click="conditions(2)">目标车切入</b>
-                    <b class="labelC" @click="conditions(3)"
-                        >目标车沿弯道行驶</b
-                    >
-                    <b class="labelD" @click="conditions(4)"
-                        >机动车-机动车冲突</b
-                    >
-                </div>
-            </template>
-            <template slot="searchBtn1">
-                <el-button type="primary" @click="doSearch">查询</el-button>
-            </template>
-            <template slot="searchBtn2">
-                <el-button type="primary" @click="doReset">重置</el-button>
-            </template>
-        </search-layout>
-
-        <div class="btnsPanel">
-            <el-button
-                type="primary"
-                plain
-                icon="el-icon-delete"
-                @click="delRows"
-                >批量删除</el-button
-            >
+        <div class="labelsBox">
+          <b class="labelA" @click="conditions(1)">追尾</b>
+          <b class="labelB" @click="conditions(2)">目标车切入</b>
+          <b class="labelC" @click="conditions(3)">目标车沿弯道行驶</b>
+          <b class="labelD" @click="conditions(4)">机动车-机动车冲突</b>
         </div>
+      </template>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+    </search-layout>
 
-        <tableList
-            ref="table"
-            style="margin: 0 30px"
-            :columns="columns"
-            :getDataWay="getDataWay"
-            :pagination="pagination"
-            :checkedData="checkedArr"
-            selection
-            index
-        >
-            <!-- <tableList
+    <div class="btnsPanel">
+      <el-button type="primary" plain icon="el-icon-delete" @click="delRows"
+        >批量删除</el-button
+      >
+    </div>
+
+    <tableList
+      ref="table"
+      style="margin: 0 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      :checkedData="checkedArr"
+      selection
+      index
+    >
+      <!-- <tableList
             ref="table"
             style="margin: 30px"
             :columns="columns"
@@ -161,167 +233,184 @@
             :pagination="pagination"
             index
         > -->
-            <el-table-column
-                label="操作"
-                slot="cgInfos"
-                align="center"
-                width="180"
-            >
-                <template v-slot="scope">
-                    <i
-                        @click="viewRow(scope.row)"
-                        class="el-icon-view elIcon cursor"
-                        title="查看"
-                    >
-                    </i>
-                    <i
-                        @click="delRow(scope.row)"
-                        class="el-icon-delete elIcon"
-                        title="删除"
-                    >
-                    </i>
-                </template>
-            </el-table-column>
-        </tableList>
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <i
+            @click="viewRow(scope.row)"
+            class="el-icon-view elIcon cursor"
+            title="查看"
+          >
+          </i>
+          <i
+            @click="delRow(scope.row)"
+            class="el-icon-delete elIcon"
+            title="删除"
+          >
+          </i>
+        </template>
+      </el-table-column>
+    </tableList>
 
-        <el-dialog
-            :title="videoDiaTitle"
-            :visible.sync="dialogVisible"
-            width="690px"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-            :before-close="diaClose"
-        >
-            <div class="videoBox">
-                <video autoplay :src="videoSrc" controls></video>
-            </div>
-        </el-dialog>
-    </div>
+    <el-dialog
+      :title="videoDiaTitle"
+      :visible.sync="dialogVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="diaClose"
+    >
+      <div class="videoBox">
+        <video autoplay :src="videoSrc" controls></video>
+      </div>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
-import searchLayout from "@/components/grid/searchLayout";
-import tableList from "@/components/grid/TableList";
-import { mapState } from "vuex";
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import { mapState } from 'vuex'
 
 export default {
-    name: "trafficAccidentSimulationScenarioList", // 交通事故场景
-    components: { searchLayout, tableList },
-    data() {
-        return {
-            searchParams: {
-                //搜索参数
-                sceneName: "", //场景名称
-                selfDriving: [], //自车驾驶行为
-                targetDriving: [], //目标驾驶行为
-                selfReaction: [], //自车反应行为
-                conflictBehavior: [], //冲突行为
-                conflictType: [], //冲突类型
-                rearEndCollision: "", // 追尾
-                cutIn: "", // 切入
-                driveCurve: "", // 沿弯道行驶
-                carConflict: "", // 机动车-机动车冲突
-                share: "0",
-            },
-            labels: [],
-            // selfDrivingList: [],
-            // targetDrivingList: [],
-            // selfReactionList: [],
-            // conflictBehaviorList: [],
-            // conflictTypeList: [],
-            columns: [
-                //表格列
-                {
-                    label: "场景名称",
-                    prop: "sceneName",
-                },
-                {
-                    label: "自车驾驶行为",
-                    prop: "selfDriving",
-                },
-                {
-                    label: "目标驾驶行为",
-                    prop: "targetDriving",
-                },
-                {
-                    label: "自车反应行为",
-                    prop: "selfReaction",
-                },
-                {
-                    label: "冲突行为",
-                    prop: "conflictBehavior",
-                },
-                {
-                    label: "冲突类型",
-                    prop: "conflictType",
-                },
-                {
-                    label: "标签",
-                    prop: "label",
-                },
-                {
-                    label: "操作",
-                    prop: "cgInfos",
-                    template: true,
-                },
-            ],
-            pagination: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWay: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.sceneLibrary.querySceneAccidentList,
-                param: {
-                    share: "0",
-                },
-            },
-            dialogVisible: false,
-            autoplay: false,
-            videoSrc: "",
-            objectPath: "",
-            videoDiaTitle: "",
-            checkedArr: [],
-        };
-    },
-
-    props: {
-        selfDrivingList: {
-            type: Array,
-            default: [],
+  name: 'trafficAccidentSimulationScenarioList', // 交通事故场景
+  components: { searchLayout, tableList },
+  data() {
+    return {
+      searchParams: {
+        //搜索参数
+        sceneName: '', //场景名称
+        selfDriving: [], //自车驾驶行为
+        targetDriving: [], //目标驾驶行为
+        selfReaction: [], //自车反应行为
+        conflictBehavior: [], //冲突行为
+        conflictType: [], //冲突类型
+        rearEndCollision: '', // 追尾
+        cutIn: '', // 切入
+        driveCurve: '', // 沿弯道行驶
+        carConflict: '', // 机动车-机动车冲突
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      },
+      labels: [],
+      // selfDrivingList: [],
+      // targetDrivingList: [],
+      // selfReactionList: [],
+      // conflictBehaviorList: [],
+      // conflictTypeList: [],
+      columns: [
+        //表格列
+        {
+          label: '场景名称',
+          prop: 'sceneName',
         },
-        targetDrivingList: {
-            type: Array,
-            default: [],
+        {
+          label: '自车驾驶行为',
+          prop: 'selfDriving',
         },
-        selfReactionList: {
-            type: Array,
-            default: [],
+        {
+          label: '目标驾驶行为',
+          prop: 'targetDriving',
         },
-        conflictBehaviorList: {
-            type: Array,
-            default: [],
+        {
+          label: '自车反应行为',
+          prop: 'selfReaction',
         },
-        conflictTypeList: {
-            type: Array,
-            default: [],
+        {
+          label: '冲突行为',
+          prop: 'conflictBehavior',
         },
-    },
+        {
+          label: '冲突类型',
+          prop: 'conflictType',
+        },
+        {
+          label: '标签',
+          prop: 'label',
+        },
+        {
+          label: '复杂度',
+          prop: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          prop: 'complexityLevel',
+        },
+        {
+          label: '危险度',
+          prop: 'risk',
+        },
+        {
+          label: '危险度等级',
+          prop: 'riskLevel',
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.sceneLibrary.querySceneAccidentList,
+        param: {
+          share: '0',
+        },
+      },
+      dialogVisible: false,
+      autoplay: false,
+      videoSrc: '',
+      objectPath: '',
+      videoDiaTitle: '',
+      checkedArr: [],
+    }
+  },
 
-    computed: {
-        ...mapState(["fileHost", "fileUrl"]),
+  props: {
+    selfDrivingList: {
+      type: Array,
+      default: [],
+    },
+    targetDrivingList: {
+      type: Array,
+      default: [],
+    },
+    selfReactionList: {
+      type: Array,
+      default: [],
+    },
+    conflictBehaviorList: {
+      type: Array,
+      default: [],
     },
+    conflictTypeList: {
+      type: Array,
+      default: [],
+    },
+  },
+
+  computed: {
+    ...mapState(['fileHost', 'fileUrl']),
+  },
 
-    methods: {
-        doSearch() {
-            /* this.searchParams.rearEndCollision = this.labels.includes("追尾")
+  methods: {
+    doSearch() {
+      /* this.searchParams.rearEndCollision = this.labels.includes("追尾")
                 ? "追尾"
                 : "";
             this.searchParams.cutIn = this.labels.includes("切入")
@@ -336,181 +425,181 @@ export default {
                 ? "机动车-机动车"
                 : ""; */
 
-            this.refreshList(this.searchParams);
-        },
-        //刷新table
-        refreshList(param) {
-            param
-                ? this.$refs["table"].loadData(param)
-                : this.$refs["table"].loadData();
-        },
-        doReset() {
-            this.searchParams = {
-                sceneName: "",
-                selfDriving: [],
-                targetDriving: [],
-                selfReaction: [],
-                conflictBehavior: [],
-                conflictType: [],
-                rearEndCollision: "",
-                cutIn: "",
-                driveCurve: "",
-                carConflict: "",
-                share: "0",
-            };
-            // this.labels = [];
-            this.doSearch();
-        },
-        conditions(v) {
-            switch (v) {
-                case 1:
-                    if (!this.searchParams.conflictBehavior.includes("追尾")) {
-                        this.searchParams.conflictBehavior = [
-                            ...this.searchParams.conflictBehavior,
-                            "追尾",
-                        ];
-                    }
-                    break;
-                case 2:
-                    if (!this.searchParams.targetDriving.includes("切入")) {
-                        this.searchParams.targetDriving = [
-                            ...this.searchParams.targetDriving,
-                            "切入",
-                        ];
-                    }
-                    break;
-                case 3:
-                    if (
-                        !this.searchParams.targetDriving.includes("沿弯道行驶")
-                    ) {
-                        this.searchParams.targetDriving = [
-                            ...this.searchParams.targetDriving,
-                            "沿弯道行驶",
-                        ];
-                    }
-                    break;
-                case 4:
-                    if (
-                        !this.searchParams.conflictType.includes(
-                            "机动车-机动车"
-                        )
-                    ) {
-                        this.searchParams.conflictType = [
-                            ...this.searchParams.conflictType,
-                            "机动车-机动车",
-                        ];
-                    }
-                    break;
-                default:
-                    break;
-            }
-        },
-        viewRow(row) {
-            if (!row.videoAddress) {
-                this.$message.warning("本场景无仿真视频");
-                return;
-            }
+      this.refreshList(this.searchParams)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doReset() {
+      this.searchParams = {
+        sceneName: '',
+        selfDriving: [],
+        targetDriving: [],
+        selfReaction: [],
+        conflictBehavior: [],
+        conflictType: [],
+        rearEndCollision: '',
+        cutIn: '',
+        driveCurve: '',
+        carConflict: '',
+        share: '0',
+        minComplexity: '',
+        maxComplexity: '',
+        minRisk: '',
+        maxRisk: '',
+        complexityLevel: '',
+        riskLevel: '',
+      }
+      // this.labels = [];
+      this.doSearch()
+    },
+    conditions(v) {
+      switch (v) {
+        case 1:
+          if (!this.searchParams.conflictBehavior.includes('追尾')) {
+            this.searchParams.conflictBehavior = [
+              ...this.searchParams.conflictBehavior,
+              '追尾',
+            ]
+          }
+          break
+        case 2:
+          if (!this.searchParams.targetDriving.includes('切入')) {
+            this.searchParams.targetDriving = [
+              ...this.searchParams.targetDriving,
+              '切入',
+            ]
+          }
+          break
+        case 3:
+          if (!this.searchParams.targetDriving.includes('沿弯道行驶')) {
+            this.searchParams.targetDriving = [
+              ...this.searchParams.targetDriving,
+              '沿弯道行驶',
+            ]
+          }
+          break
+        case 4:
+          if (!this.searchParams.conflictType.includes('机动车-机动车')) {
+            this.searchParams.conflictType = [
+              ...this.searchParams.conflictType,
+              '机动车-机动车',
+            ]
+          }
+          break
+        default:
+          break
+      }
+    },
+    viewRow(row) {
+      if (!row.videoAddress) {
+        this.$message.warning('本场景无仿真视频')
+        return
+      }
 
-            this.dialogVisible = true;
-            this.videoDiaTitle = row.sceneName;
+      this.dialogVisible = true
+      this.videoDiaTitle = row.sceneName
 
-            let url = "";
-            if (process.env.VUE_APP_IS_DEV == "true") {
-                url = this.fileHost + this.fileUrl;
-            } else {
-                url = this.fileUrl;
-            }
+      let url = ''
+      if (process.env.VUE_APP_IS_DEV == 'true') {
+        url = this.fileHost + this.fileUrl
+      } else {
+        url = this.fileUrl
+      }
 
-            let token = localStorage.getItem("Authorization").split(" ")[1];
-            this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`;
-            this.autoplay = true;
-        },
-        delRow(row) {
-            this.$confirm("确认是否删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.deleteSceneAccident,
-                    data: {
-                        accidentId: row.accidentId,
-                        sceneName: row.sceneName,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
-        },
-        delRows() {
-            let checkedArr = this.checkedArr;
+      let token = localStorage.getItem('Authorization').split(' ')[1]
+      this.videoSrc = `${url}?objectName=${row.videoAddress}&access_token=${token}`
+      this.autoplay = true
+    },
+    delRow(row) {
+      this.$confirm('确认是否删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.deleteSceneAccident,
+          data: {
+            accidentId: row.accidentId,
+            sceneName: row.sceneName,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    delRows() {
+      let checkedArr = this.checkedArr
 
-            if (checkedArr.length <= 0) {
-                this.$message.info("请先选择数据");
-                return;
-            }
+      if (checkedArr.length <= 0) {
+        this.$message.info('请先选择数据')
+        return
+      }
 
-            let arr = checkedArr.map((i) => i.sceneName);
+      let arr = checkedArr.map((i) => i.sceneName)
 
-            this.$confirm("确认是否批量删除?", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.sceneLibrary.batchDeleteSceneAccident,
-                    data: {
-                        sceneNameList: arr,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
-        },
-        diaClose(done) {
-            this.autoplay = false;
-            this.videoSrc = "";
-            done();
-        },
-        openFileDia() {
-            this.objectPath = Math.random().toString();
-            this.$refs.fileDialog.fileVisible = true;
-        },
-        fileClose() {
-            this.objectPath = "";
-            this.doSearch();
-        },
+      this.$confirm('确认是否批量删除?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.sceneLibrary.batchDeleteSceneAccident,
+          data: {
+            sceneNameList: arr,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    diaClose(done) {
+      this.autoplay = false
+      this.videoSrc = ''
+      done()
+    },
+    openFileDia() {
+      this.objectPath = Math.random().toString()
+      this.$refs.fileDialog.fileVisible = true
     },
-};
+    fileClose() {
+      this.objectPath = ''
+      this.doSearch()
+    },
+  },
+}
 </script>
 
 <style lang='less' scoped>
-@import "./common/util.less";
+@import './common/util.less';
 .trafficAccidentSimulationScenarioListPanel {
-    .inputBox {
-        .radioBox {
-            width: 340px;
-        }
-
-        .label {
-            min-width: 90px;
-        }
+  .inputBox {
+    .radioBox {
+      width: 340px;
     }
 
-    .btnsPanel {
-        text-align: right;
+    .label {
+      min-width: 90px;
     }
+  }
+
+  .btnsPanel {
+    text-align: right;
+  }
 }
 </style>

+ 508 - 465
src/views/systemManagement/sceneUploadList.vue

@@ -1,21 +1,21 @@
 <template>
-    <div>
-        <search-layout :needBox="true">
-            <template slot="searchItem1">
-                <span class="label">任务名称</span>
-                <el-input
-                    v-model="searchParams.name"
-                    size="small"
-                    clearable
-                    placeholder="请输入"
-                    maxlength="60"
-                    @keyup.enter.native="doSearch(false)"
-                >
-                </el-input>
-            </template>
-            <template slot="searchItem2">
-                <span class="label">上传时间</span>
-                <!-- <el-date-picker
+  <div>
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">任务名称</span>
+        <el-input
+          v-model="searchParams.name"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          @keyup.enter.native="doSearch(false)"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem2">
+        <span class="label">上传时间</span>
+        <!-- <el-date-picker
                     v-model="uploadDate"
                     type="daterange"
                     format="yyyy-MM-dd"
@@ -25,496 +25,539 @@
                     end-placeholder="结束日期"
                 >
                 </el-date-picker> -->
-                <el-date-picker
-                    v-model="searchParams.timeBegin"
-                    type="date"
-                    format="yyyy-MM-dd"
-                    value-format="yyyy-MM-dd"
-                    placeholder="开始日期"
-                    class="dateRangeInput"
-                >
-                </el-date-picker>
-                <span class="dateSeparator">至</span>
-                <el-date-picker
-                    v-model="searchParams.timeEnd"
-                    type="date"
-                    format="yyyy-MM-dd"
-                    value-format="yyyy-MM-dd"
-                    placeholder="结束日期"
-                    class="dateRangeInput"
-                >
-                </el-date-picker>
-            </template>
-
-            <template slot="searchBtn1">
-                <el-button type="primary" @click="doSearch(false)">查询</el-button>
-            </template>
-            <template slot="searchBtn2">
-                <el-button type="primary" @click="doReset">重置</el-button>
-            </template>
-        </search-layout>
-
-        <div class="btnsPanel">
-            <el-button
-                type="primary"
-                icon="el-icon-circle-plus-outline"
-                @click="addOne"
-                >新增</el-button
-            >
-        </div>
-
-        <tableList
-            ref="table"
-            style="margin: 0 30px"
-            :columns="columns"
-            :getDataWay="getDataWay"
-            :pagination="pagination"
-            index
+        <el-date-picker
+          v-model="searchParams.timeBegin"
+          type="date"
+          format="yyyy-MM-dd"
+          value-format="yyyy-MM-dd"
+          placeholder="开始日期"
+          class="dateRangeInput"
         >
-            <el-table-column label="操作" slot="cgInfos" align="center">
-                <template v-slot="scope">
-                    <!-- <span
+        </el-date-picker>
+        <span class="dateSeparator">至</span>
+        <el-date-picker
+          v-model="searchParams.timeEnd"
+          type="date"
+          format="yyyy-MM-dd"
+          value-format="yyyy-MM-dd"
+          placeholder="结束日期"
+          class="dateRangeInput"
+        >
+        </el-date-picker>
+      </template>
+
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch(false)">查询</el-button>
+      </template>
+      <template slot="searchBtn2">
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+    </search-layout>
+
+    <div class="btnsPanel">
+      <el-button
+        type="primary"
+        icon="el-icon-circle-plus-outline"
+        @click="addOne"
+        >新增</el-button
+      >
+    </div>
+
+    <tableList
+      ref="table"
+      style="margin: 0 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      index
+    >
+    <el-table-column label="评价结果" align="center" slot="evaluate_result">
+      <template  v-slot="scope">
+        <span>{{ evaluateStatusMap[scope.row.evaluationStatus] || '-' }}</span>
+      </template>
+      </el-table-column>
+      <el-table-column label="操作" slot="cgInfos" align="center">
+        <template v-slot="scope">
+          <!-- <span
                         v-if="scope.row.errorMessage"
                         @click="viewRow(scope.row.errorMessage)"
                         class="errRecord tdBtn"
                         >错误记录</span
                     > -->
-                    <i
-                        v-if="scope.row.errorMessage"
-                        @click="viewRow(scope.row.errorMessage)"
-                        class="el-icon-document elIcon tdBtn"
-                        title="错误记录"
-                    ></i>
-                    <i
-                        @click="delRow(scope.row.id)"
-                        class="el-icon-delete elIcon tdBtn"
-                        title="删除"
-                    ></i>
-                </template>
-            </el-table-column>
-        </tableList>
-
-        <el-dialog
-            title="场景上传"
-            :visible.sync="dialogVisible"
-            width="690px"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-            :before-close="uploadCancel"
+          <i
+            v-if="scope.row.errorMessage"
+            @click="viewRow(scope.row.errorMessage)"
+            class="el-icon-document elIcon tdBtn"
+            title="错误记录"
+          ></i>
+          <i
+            @click="delRow(scope.row.id)"
+            class="el-icon-delete elIcon tdBtn"
+            title="删除"
+          ></i>
+        </template>
+      </el-table-column>
+    </tableList>
+
+    <el-dialog
+      title="场景上传"
+      :visible.sync="dialogVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="uploadCancel"
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="128px">
+        <el-form-item label="任务名称:" prop="name">
+          <el-input
+            placeholder="请输入"
+            maxlength="60"
+            v-autoTrim="{ obj: form, key: 'name' }"
+            v-model="form.name"
+          >
+          </el-input>
+        </el-form-item>
+
+        <el-form-item label="场景分类:" prop="sceneType">
+          <el-select v-model="form.sceneType" @change="sceneTypeChange">
+            <el-option
+              v-for="item in sceneTypeList"
+              :label="item.caption"
+              :value="item.code"
+              :key="item.code"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+
+        <!-- 三个真实场景时展示 -->
+        <el-form-item
+          v-if="form.sceneType != '4'"
+          label="场景路径:"
+          prop="dataDirectory"
         >
-            <el-form
-                ref="form"
-                :model="form"
-                :rules="rules"
-                label-width="108px"
+          <el-input
+            placeholder="请输入"
+            maxlength="300"
+            v-autoTrim="{ obj: form, key: 'dataDirectory' }"
+            v-model="form.dataDirectory"
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item
+          v-if="form.sceneType != '4'"
+          label="复杂度评价脚本:"
+          prop="sceneEvaluationRuleId"
+        >
+          <el-select placeholder="暂不评价" v-model="form.sceneEvaluationRuleId" >
+            <el-option
+              v-for="item in scriptOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
             >
-                <el-form-item label="任务名称:" prop="name">
-                    <el-input
-                        placeholder="请输入"
-                        maxlength="60"
-                        v-autoTrim="{ obj: form, key: 'name' }"
-                        v-model="form.name"
-                    >
-                    </el-input>
-                </el-form-item>
-
-                <el-form-item label="场景分类:" prop="sceneType">
-                    <el-select
-                        v-model="form.sceneType"
-                        @change="sceneTypeChange"
-                    >
-                        <el-option
-                            v-for="item in sceneTypeList"
-                            :label="item.caption"
-                            :value="item.code"
-                            :key="item.code"
-                        ></el-option>
-                    </el-select>
-                </el-form-item>
-
-                <!-- 三个真实场景时展示 -->
-                <el-form-item
-                    v-if="form.sceneType != '4'"
-                    label="场景路径:"
-                    prop="dataDirectory"
-                >
-                    <el-input
-                        placeholder="请输入"
-                        maxlength="300"
-                        v-autoTrim="{ obj: form, key: 'dataDirectory' }"
-                        v-model="form.dataDirectory"
-                    >
-                    </el-input>
-                </el-form-item>
-
-                <!-- 泛化时展示 -->
-                <el-form-item
-                    v-if="form.sceneType === '4'"
-                    label="文件上传:"
-                    prop="fileName"
-                >
-                    <el-input
-                        placeholder="请输入"
-                        maxlength="600"
-                        v-autoTrim="{ obj: form, key: 'fileName' }"
-                        v-model="form.fileName"
-                        disabled
-                    >
-                    </el-input>
-                    <upload
-                        ref="upload"
-                        class="upload"
-                        @handleChange="handleChange"
-                    ></upload>
-                </el-form-item>
-            </el-form>
-            <span slot="footer">
-                <el-button type="primary" @click="uploadConfirm"
-                    >确 定</el-button
-                >
-                <el-button @click="uploadCancel">取 消</el-button>
-            </span>
-        </el-dialog>
-
-        <el-dialog
-            title="错误记录"
-            :visible.sync="errRocordVisible"
-            width="690px"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-            :before-close="errClose"
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <!-- 泛化时展示 -->
+        <el-form-item
+          v-if="form.sceneType === '4'"
+          label="文件上传:"
+          prop="fileName"
         >
-            <div>{{ errorMessage }}</div>
-            <span slot="footer">
-                <el-button type="primary" @click="errClose">关 闭</el-button>
-            </span>
-        </el-dialog>
-    </div>
+          <el-input
+            placeholder="请输入"
+            maxlength="600"
+            v-autoTrim="{ obj: form, key: 'fileName' }"
+            v-model="form.fileName"
+            disabled
+          >
+          </el-input>
+          <upload
+            ref="upload"
+            class="upload"
+            @handleChange="handleChange"
+          ></upload>
+        </el-form-item>
+      </el-form>
+      <span slot="footer">
+        <el-button type="primary" @click="uploadConfirm">确 定</el-button>
+        <el-button @click="uploadCancel">取 消</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog
+      title="错误记录"
+      :visible.sync="errRocordVisible"
+      width="690px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      :before-close="errClose"
+    >
+      <div>{{ errorMessage }}</div>
+      <span slot="footer">
+        <el-button type="primary" @click="errClose">关 闭</el-button>
+      </span>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
-import searchLayout from "@/components/grid/searchLayout";
-import tableList from "@/components/grid/TableList";
-import upload from "./components/upload";
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import upload from './components/upload'
 
 export default {
-    name: "sceneUploadList", // 场景上传
-    components: { searchLayout, tableList, upload },
-
-    data() {
-        let formatSeconds = function formatSeconds(value) {
-            var theTime = parseInt(value); // 秒
-            var theTime1 = 0; // 分
-            var theTime2 = 0; // 小时
-            if (theTime > 60) {
-                theTime1 = parseInt(theTime / 60);
-                theTime = parseInt(theTime % 60);
-                if (theTime1 > 60) {
-                    theTime2 = parseInt(theTime1 / 60);
-                    theTime1 = parseInt(theTime1 % 60);
-                }
-            }
-            var result = "" + parseInt(theTime) + "秒";
-            if (theTime1 > 0) {
-                result = "" + parseInt(theTime1) + "分" + result;
-            }
-            if (theTime2 > 0) {
-                result = "" + parseInt(theTime2) + "小时" + result;
-            }
-            return result;
-        };
-
-        return {
-            searchParams: {
-                //搜索参数
-                name: "", // 任务名称
-                timeBegin: "", // 上传时间起
-                timeEnd: "", // 上传时间止
-            },
-            uploadDate: "",
-            columns: [
-                {
-                    label: "任务名称",
-                    prop: "name",
-                },
-                {
-                    label: "场景分类",
-                    prop: "sceneType",
-                },
-                {
-                    label: "上传时间",
-                    prop: "createTime",
-                },
-                {
-                    label: "上传状态",
-                    prop: "status",
-                },
-                {
-                    label: "总用时长",
-                    prop: "totalTime",
-                    formatter: (row) => {
-                        if (row.totalTime)
-                            if (row.totalTime && !isNaN(row.totalTime)) {
-                                return formatSeconds(row.totalTime);
-                            }
-                    },
-                },
-                {
-                    label: "操作",
-                    prop: "cgInfos",
-                    template: true,
-                },
-            ],
-            pagination: {
-                //分页使用
-                currentPage: 1,
-                pageSize: 10,
-                position: "right",
-                pageSizes: [10, 30, 50, 100, 200],
-                layout: "sizes, total, prev, pager, next, jumper",
-            },
-            getDataWay: {
-                //加载表格数据
-                dataType: "url",
-                type: "post",
-                // firstRequest: false,
-                data: this.$api.systemManagement.getSceneImporPagetList,
-                param: {},
-            },
-            form: {
-                name: "", // 任务名称
-                sceneType: "", // 场景分类
-                dataDirectory: "", // 场景路径
-                fileName: "", // 文件名称
-            },
-            rules: {
-                name: [{ required: true, message: "请输入", trigger: "blur" }],
-                sceneType: [
-                    { required: true, message: "请选择", trigger: "change" },
-                ],
-                dataDirectory: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                ],
-                fileName: [
-                    { required: true, message: "请上传", trigger: "change" },
-                ],
-            },
-            sceneTypeList: [],
-            dialogVisible: false,
-            file: null,
-            errRocordVisible: false,
-            errorMessage: "",
-            timer: null,
-        };
-    },
+  name: 'sceneUploadList', // 场景上传
+  components: { searchLayout, tableList, upload },
+
+  data() {
+    let formatSeconds = function formatSeconds(value) {
+      var theTime = parseInt(value) // 秒
+      var theTime1 = 0 // 分
+      var theTime2 = 0 // 小时
+      if (theTime > 60) {
+        theTime1 = parseInt(theTime / 60)
+        theTime = parseInt(theTime % 60)
+        if (theTime1 > 60) {
+          theTime2 = parseInt(theTime1 / 60)
+          theTime1 = parseInt(theTime1 % 60)
+        }
+      }
+      var result = '' + parseInt(theTime) + '秒'
+      if (theTime1 > 0) {
+        result = '' + parseInt(theTime1) + '分' + result
+      }
+      if (theTime2 > 0) {
+        result = '' + parseInt(theTime2) + '小时' + result
+      }
+      return result
+    }
 
-    methods: {
-        doSearch(isTimer = false) {
-            // if (this.uploadDate) {
-            //     this.searchParams.timeBegin = `${this.uploadDate[0]}`;
-            //     this.searchParams.timeEnd = `${this.uploadDate[1]}`;
-            // } else {
-            //     this.searchParams.timeBegin = "";
-            //     this.searchParams.timeEnd = "";
-            // }
-
-            let timeBegin = "";
-            if (this.searchParams.timeBegin) {
-                timeBegin = `${this.searchParams.timeBegin} 00:00:00`;
-            }
-
-            let timeEnd = "";
-            if (this.searchParams.timeEnd) {
-                timeEnd = `${this.searchParams.timeEnd} 23:59:59`;
-            }
-
-            if (timeBegin && timeEnd && timeBegin > timeEnd) {
-                this.$message.error("结束时间不能早于开始时间");
-                return;
-            }
-
-            let pageMap = {
-                name: this.searchParams.name,
-                timeBegin,
-                timeEnd,
-                resetPageNum: !isTimer ? false : (this.pagination.currentPage || 1),
-            };
-
-            if(!isTimer) this.pagination.currentPage = 1;
-
-            this.refreshList(pageMap);
-
-            if (this.timer) clearInterval(this.timer);
-
-            this.timer = setInterval(() => {
-                if (this.$refs["table"]) this.doSearch(true);
-            }, 1000 * 60);
-        },
-        //刷新table
-        refreshList(param) {
-            param
-                ? this.$refs["table"].loadData(param)
-                : this.$refs["table"].loadData();
-        },
-        doReset() {
-            this.searchParams = {
-                name: "",
-                timeBegin: "",
-                timeEnd: "",
-            };
-            // this.uploadDate = "";
-            this.doSearch(false);
+    return {
+      searchParams: {
+        //搜索参数
+        name: '', // 任务名称
+        timeBegin: '', // 上传时间起
+        timeEnd: '', // 上传时间止
+      },
+      uploadDate: '',
+      evaluateStatusMap:['未评价','评价中','评价完成','评价失败'],
+      columns: [
+        {
+          label: '任务名称',
+          prop: 'name',
         },
-        addOne() {
-            this.form = {
-                name: "",
-                sceneType: "",
-                dataDirectory: "",
-                fileName: "",
-            };
-            this.file = null;
-
-            this.dialogVisible = true;
-
-            this.$nextTick(() => {
-                this.$refs.form.clearValidate();
-            });
+        {
+          label: '场景分类',
+          prop: 'sceneType',
         },
-        viewRow(errorMessage) {
-            this.errorMessage = errorMessage;
-            this.errRocordVisible = true;
+        {
+          label: '上传时间',
+          prop: 'createTime',
         },
-        delRow(id) {
-            this.$confirm("确认是否删除?(温馨提示:文件较大,删除时间较长请您耐心等待)", "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-            }).then(() => {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.systemManagement.deleteTask,
-                    timeout: 1000 * 60 * 30,
-                    data: {
-                        id,
-                    },
-                }).then((res) => {
-                    if (res.code == 200) {
-                        this.$message.success("删除成功");
-                    } else {
-                        this.$message.error(res.message || "删除失败");
-                    }
-                    this.doSearch();
-                });
-            });
+        {
+          label: '上传状态',
+          prop: 'status',
         },
-        errClose() {
-            this.errRocordVisible = false;
-            this.errorMessage = "";
+        {
+          label: '总用时长',
+          prop: 'totalTime',
+          formatter: (row) => {
+            if (row.totalTime)
+              if (row.totalTime && !isNaN(row.totalTime)) {
+                return formatSeconds(row.totalTime)
+              }
+          },
         },
-        uploadConfirm() {
-            this.$refs.form.validate(async (valid) => {
-                if (valid) {
-                    if (this.form.sceneType === "4") {
-                        let formData = new FormData();
-                        await formData.append("taskName", this.form.name);
-                        await formData.append("name", this.file.name);
-                        await formData.append("file", this.file.raw);
-
-                        await this.$axios({
-                            method: "post",
-                            url: this.$api.systemManagement
-                                .saveSceneGeneralTemplateAll,
-                            data: formData,
-                            withCredentials: true,
-                            headers: {
-                                "Content-type": "multipart/form-data",
-                            },
-                        }).then((res) => {
-                            if (res.code == 200) {
-                                this.$message.success("保存成功");
-                                this.uploadCancel();
-                                this.doSearch();
-                            } else {
-                                this.$message.error(res.message || "保存失败");
-                            }
-                        });
-                    } else {
-                        this.$axios({
-                            method: "post",
-                            url: this.$api.systemManagement.saveTask,
-                            data: { ...this.form },
-                        }).then((res) => {
-                            if (res.code == 200) {
-                                this.$message.success("保存成功");
-                                this.uploadCancel();
-                                this.doSearch();
-                            } else {
-                                this.$message.error(res.message || "保存失败");
-                            }
-                        });
-                    }
-                }
-            });
+        {
+          label: '评价开始时间',
+          prop: 'startEvaluationTime',
         },
-        uploadCancel() {
-            this.dialogVisible = false;
+        {
+          label: '评价结束时间',
+          prop: 'endEvaluationTime',
         },
-        attachmentChange(obj) {
-            this.attachmentList = obj;
+        {
+          label: '评价结果',
+          prop: 'evaluate_result',
+          template: true,
         },
-        handleChange(file) {
-            this.file = file;
-            this.form.fileName = file.name;
-        },
-        sceneTypeChange(v) {
-            if (v === "4") {
-                this.$refs.form.clearValidate("dataDirectory");
-            } else {
-                this.file = null;
-                this.form.fileName = "";
-                this.$refs.form.clearValidate("fileName");
-            }
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
         },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        // firstRequest: false,
+        data: this.$api.systemManagement.getSceneImporPagetList,
+        param: {},
+      },
+      form: {
+        name: '', // 任务名称
+        sceneType: '', // 场景分类
+        dataDirectory: '', // 场景路径
+        fileName: '', // 文件名称
+        sceneEvaluationRuleId: '', // 复杂度评价脚本
+      },
+      rules: {
+        name: [{ required: true, message: '请输入', trigger: 'blur' }],
+        sceneType: [{ required: true, message: '请选择', trigger: 'change' }],
+        dataDirectory: [{ required: true, message: '请输入', trigger: 'blur' }],
+        fileName: [{ required: true, message: '请上传', trigger: 'change' }],
+      },
+      sceneTypeList: [],
+      dialogVisible: false,
+      file: null,
+      errRocordVisible: false,
+      errorMessage: '',
+      timer: null,
+      //   测试mock数据
+      scriptOptions: [],
+    }
+  },
+
+  methods: {
+    doSearch(isTimer = false) {
+      // if (this.uploadDate) {
+      //     this.searchParams.timeBegin = `${this.uploadDate[0]}`;
+      //     this.searchParams.timeEnd = `${this.uploadDate[1]}`;
+      // } else {
+      //     this.searchParams.timeBegin = "";
+      //     this.searchParams.timeEnd = "";
+      // }
+
+      let timeBegin = ''
+      if (this.searchParams.timeBegin) {
+        timeBegin = `${this.searchParams.timeBegin} 00:00:00`
+      }
+
+      let timeEnd = ''
+      if (this.searchParams.timeEnd) {
+        timeEnd = `${this.searchParams.timeEnd} 23:59:59`
+      }
+
+      if (timeBegin && timeEnd && timeBegin > timeEnd) {
+        this.$message.error('结束时间不能早于开始时间')
+        return
+      }
+
+      let pageMap = {
+        name: this.searchParams.name,
+        timeBegin,
+        timeEnd,
+        resetPageNum: !isTimer ? false : this.pagination.currentPage || 1,
+      }
+
+      if (!isTimer) this.pagination.currentPage = 1
+
+      this.refreshList(pageMap)
+
+      if (this.timer) clearInterval(this.timer)
+
+      this.timer = setInterval(() => {
+        if (this.$refs['table']) this.doSearch(true)
+      }, 1000 * 60)
+    },
+    //刷新table
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doReset() {
+      this.searchParams = {
+        name: '',
+        timeBegin: '',
+        timeEnd: '',
+      }
+      // this.uploadDate = "";
+      this.doSearch(false)
+    },
+    addOne() {
+      this.form = {
+        name: '', // 任务名称
+        sceneType: '', // 场景类型
+        dataDirectory: '', // 场景路径
+        fileName: '', // 文件上传
+        sceneEvaluationRuleId: '', // 复杂度评价脚本
+      }
+      this.file = null
+
+      this.dialogVisible = true
+
+      this.$nextTick(() => {
+        this.$refs.form.clearValidate()
+      })
+      this.getScriptList()
+    },
+    // 获取脚本列表
+    getScriptList(){
+     this.$axios({
+        method: 'post',
+        url: this.$api.sceneLibrary.getScriptListByType,
+        data: {
+          sceneEvaluationType: ["1"]},
+      }).then(res=>{
+        const arr = (res.info[1] || []).map(item=>{
+          item.label = item.ruleName
+          item.value = item.ruleId
+          return item
+        })
+        this.scriptOptions = [...arr]
+      })
+    },
+
+    viewRow(errorMessage) {
+      this.errorMessage = errorMessage
+      this.errRocordVisible = true
     },
+    delRow(id) {
+      this.$confirm(
+        '确认是否删除?(温馨提示:文件较大,删除时间较长请您耐心等待)',
+        '提示',
+        {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning',
+        }
+      ).then(() => {
+        this.$axios({
+          method: 'post',
+          url: this.$api.systemManagement.deleteTask,
+          timeout: 1000 * 60 * 30,
+          data: {
+            id,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('删除成功')
+          } else {
+            this.$message.error(res.message || '删除失败')
+          }
+          this.doSearch()
+        })
+      })
+    },
+    errClose() {
+      this.errRocordVisible = false
+      this.errorMessage = ''
+    },
+    uploadConfirm() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          if (this.form.sceneType === '4') {
+            let formData = new FormData()
+            await formData.append('taskName', this.form.name)
+            await formData.append('name', this.file.name)
+            await formData.append('file', this.file.raw)
+
+            await this.$axios({
+              method: 'post',
+              url: this.$api.systemManagement.saveSceneGeneralTemplateAll,
+              data: formData,
+              withCredentials: true,
+              headers: {
+                'Content-type': 'multipart/form-data',
+              },
+            }).then((res) => {
+              if (res.code == 200) {
+                this.$message.success('保存成功')
+                this.uploadCancel()
+                this.doSearch()
+              } else {
+                this.$message.error(res.message || '保存失败')
+              }
+            })
+          } else {
+            this.$axios({
+              method: 'post',
+              url: this.$api.systemManagement.saveTask,
+              data: { ...this.form },
+            }).then((res) => {
+              if (res.code == 200) {
+                this.$message.success('保存成功')
+                this.uploadCancel()
+                this.doSearch()
+              } else {
+                this.$message.error(res.message || '保存失败')
+              }
+            })
+          }
+        }
+      })
+    },
+    uploadCancel() {
+      this.dialogVisible = false
+    },
+    attachmentChange(obj) {
+      this.attachmentList = obj
+    },
+    handleChange(file) {
+      this.file = file
+      this.form.fileName = file.name
+    },
+    sceneTypeChange(v) {
+      if (v === '4') {
+        this.$refs.form.clearValidate('dataDirectory')
+      } else {
+        this.file = null
+        this.form.fileName = ''
+        this.$refs.form.clearValidate('fileName')
+      }
+    },
+  },
 
-    async mounted() {
-        if (this.timer) clearInterval(this.timer);
+  async mounted() {
+    if (this.timer) clearInterval(this.timer)
 
-        this.timer = setInterval(() => {
-            if (this.$refs["table"]) this.doSearch(true);
-        }, 1000 * 60);
+    this.timer = setInterval(() => {
+      if (this.$refs['table']) this.doSearch(true)
+    }, 1000 * 60)
 
-        await this.$dicsListsInit({
-            sceneTypeList: "sceneType",
-        });
-    },
+    await this.$dicsListsInit({
+      sceneTypeList: 'sceneType',
+    })
+  },
 
-    beforeDestroy() {
-        clearInterval(this.timer);
-    },
-};
+  beforeDestroy() {
+    clearInterval(this.timer)
+  },
+}
 </script>
 
 <style lang='less' scoped>
 .btnsPanel {
-    margin: 45px 40px 15px;
-    text-align: right;
+  margin: 45px 40px 15px;
+  text-align: right;
 }
 
 .errRecord {
-    color: @themeColor;
-    cursor: pointer;
+  color: @themeColor;
+  cursor: pointer;
 }
 
 .tdBtn {
-    margin-right: 10px;
+  margin-right: 10px;
 
-    &:last-child {
-        margin-right: 0;
-    }
+  &:last-child {
+    margin-right: 0;
+  }
 }
 
 .upload {
-    margin-top: 15px;
+  margin-top: 15px;
 }
 </style>

+ 131 - 0
src/views/workManagement/components/openDriver.vue

@@ -0,0 +1,131 @@
+<template>
+	<div id="ThreeJS" class="three_div"></div>
+</template>
+
+
+<script>
+	import {
+		getStdMapMixin
+	} from "@/mixin/workManagement/getStdMapMixin.js"
+	import {
+		openDriveMixin
+	} from "@/mixin/workManagement/openDriveMixin.js"
+
+
+	export default {
+		name: "OpenDrive",
+		mixins: [getStdMapMixin, openDriveMixin],
+		components: {
+			// vueQr,
+			// glHome,
+		},
+		data() {
+			return {
+				isLoaded: false,
+				lineArr:[],
+				startPointJson: {},
+				endPointJson: {},
+				timer: ''
+			};
+		},
+		props: {
+			mapId: {
+				type: String,
+				default: () => ""
+			},
+			startPoint: {
+				type: Object,
+				default: () => {}
+			},
+			endPoint: {
+				type: Object,
+				default: () => {}
+			},
+			sections: {
+				type: Array,
+				default: () =>[]
+			}
+		},
+		methods: {
+			changeMap(fileUrl) {
+				this.onFileSelect(fileUrl);
+			},
+			getMapDetails(mapId) {
+				
+				this.$axios({
+					method: "post",
+					url: this.$api.workManagement.mapDetails,
+					data: {
+						mapId
+					}
+				}).then((res) => {
+					if (res.code == 200) {
+						if(this.isLoaded == true){
+							this.reloadNewMap(res.info.mapPath);
+						}else{
+							this.loadMap(res.info.mapPath);
+							this.isLoaded = true;
+						}
+						
+					}
+				})
+			},
+			reloadMap(){
+				this.reloadOdrMap();
+				this.initData();
+			},
+			initData(){
+				// this.startPoint = {};
+				// this.endPoint = {};
+				// this.sections = [];
+			}
+		},
+		mounted() {
+		},
+		updated() {
+
+		},
+		watch: {
+			mapId: {
+				handler(newVal, oldVal) {
+					this.getMapDetails(newVal);
+				}
+			},
+			startPoint: {
+				handler(newVal, oldVal) {
+					this.drawPoint(newVal);
+				}
+			},
+			endPoint: {
+				handler(newVal, oldVal) {
+					this.drawPoint(newVal);
+				}
+			},
+			sections: {
+				handler(newVal, oldVal) {
+					if(this.lineArr && this.lineArr.length > 0){
+						this.lineArr.forEach((elem, index) => {
+							this.clearColorLine(elem.roadId, elem.laneId);
+						})
+						//this.clearPoint();
+					}
+					newVal.forEach((elem, index) => {
+						this.fillColorLine(elem.roadId, elem.laneId);
+					})
+					this.lineArr = newVal;
+				}
+			}
+		}
+	};
+</script>
+<style scoped lang="less">
+	.three_div {
+		width: 100% !important;
+		height: 100% !important;
+	}
+
+	/deep/ canvas {
+		width: 100% !important;
+		height: 100% !important;
+	}
+</style>

+ 189 - 0
src/views/workManagement/components/pathDialog.vue

@@ -0,0 +1,189 @@
+<template>
+	<el-dialog title="选择轨迹" :visible.sync="open" width="25%" :before-close="onClose" :modal="false"
+		:close-on-click-modal="false">
+		<el-form ref="form" :model="selectRecord" label-width="100px" size="mini">
+			<el-form-item label="选择轨迹">
+				<el-select v-model="dataParams.pathId" @change="switchTrack">
+					<el-option v-for="item in trackList" :key="item.id" :label="getPathName(item.pathSort)"
+						:value="item.id">
+					</el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item label="轨迹起点">
+				<el-select v-model="dataParams.pathStartJson" value-key="name" @change="switchStartPoint">
+					<el-option v-for="(item, index) in selectTrack.startPoints" :key="index" :label="item.name"
+						:value="item" :disabled="checkOption(selectTrack.id, item.name, 'start')">
+					</el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item label="轨迹终点">
+				<el-select v-model="dataParams.pathEndJson" value-key="name" @change="switchEndPoint">
+					<el-option v-for="(item, index) in selectTrack.endPoints" :key="index" :label="item.name"
+						:value="item" :disabled="checkOption(selectTrack.id, item.name, 'end')">
+					</el-option>
+				</el-select>
+			</el-form-item>
+			<el-form-item label="车辆朝向">
+				<el-input v-model="dataParams.pathStartJson.h" disabled></el-input>
+			</el-form-item>
+		</el-form>
+		<span slot="footer" class="dialog-footer">
+			<el-button @click="onClose">取 消</el-button>
+			<el-button type="primary" @click="onSubmit">确 定</el-button>
+		</span>
+	</el-dialog>
+</template>
+
+<script>
+	export default {
+		name: "PathDialog",
+		components: {
+			// vueQr,
+			// glHome,
+		},
+		data() {
+			return {
+				selectRecord: {
+					pathStartJson: {
+
+					}
+				},
+				trackList: [],
+				selectTrack: {},
+				dataParams: {
+					pathId: "",
+					pathStartJson: {},
+					pathEndJson: {}
+				},
+				preStartPointName: "",
+				preEndPointName: ""
+			};
+		},
+		props: {
+			open: {
+				type: Boolean,
+				default: _ => false
+			},
+			params: {
+				type: Object,
+				default: _ => {}
+			}
+
+		},
+		computed: {
+			getPathName() {
+				return id => "轨迹" + id;
+			}
+		},
+		methods: {
+			checkOption(pathId, pointName, type) {
+				if (!this.dataParams.selectedPoints[pathId]) {
+					return false;
+				}
+
+				if (!this.dataParams.selectedPoints[pathId][type]) {
+					return false;
+				}
+				return this.dataParams.selectedPoints[pathId][type].includes(pointName);
+			},
+			isEmptyJson(obj) {
+				return Object.keys(obj).length === 0;
+			},
+			getMapDetails(mapId) {
+				this.$axios({
+					method: "post",
+					url: this.$api.workManagement.mapDetails,
+					data: {
+						mapId
+					}
+				}).then((res) => {
+					if (res.code == 200 && res.info) {
+						console.log(res.info.path)
+						this.trackList = res.info.path;
+						this.switchTrack(this.params.pathId);
+					}
+				})
+			},
+			switchTrack(id) {
+				let isFirst = this.isEmptyJson(this.selectTrack);
+				this.trackList.forEach((elem, index) => {
+					if (elem.id == id) {
+						this.selectTrack = elem;
+					}
+				});
+				if (!isFirst) {
+					this.dataParams.pathStartJson = {};
+					this.dataParams.pathEndJson = {};
+				}
+				this.changeMap();
+
+			},
+			switchStartPoint(newVal) {
+				let currentSelectPath = this.dataParams.selectedPoints[this.selectTrack.id];
+				if (!currentSelectPath) {
+					currentSelectPath = {
+						'start': [],
+						'end': []
+					};
+				}
+				let pointNames = currentSelectPath["start"];
+				let searchIndex = pointNames.indexOf(this.preStartPointName);
+				if (searchIndex != -1) {
+					pointNames.splice(searchIndex, 1);
+				}
+				pointNames.push(newVal.name)
+				this.preStartPointName = newVal.name;
+				this.changeMap();
+			},
+			switchEndPoint(newVal) {
+				let currentSelectPath = this.dataParams.selectedPoints[this.selectTrack.id];
+				if (!currentSelectPath) {
+					currentSelectPath = {
+						'start': [],
+						'end': []
+					};
+				}
+				let pointNames = currentSelectPath["end"];
+
+				let searchIndex = pointNames.indexOf(this.preEndPointName);
+				if (searchIndex != -1) {
+					pointNames.splice(searchIndex, 1);
+				}
+				pointNames.push(newVal.name)
+				this.preEndPointName = newVal.name;
+				this.changeMap();
+			},
+			changeMap() {
+				let data = Object.assign({}, this.dataParams, {
+					sections: this.selectTrack.sections
+				})
+				data.pathStartJson.type = "start";
+				data.pathEndJson.type = "end";
+				this.$emit("change", data);
+			},
+			onClose() {
+				this.$emit("onClose");
+			},
+			onSubmit() {
+				this.$emit("onSubmit", Object.assign({}, this.dataParams, {
+					sections: this.selectTrack.sections,
+					pathSort: this.selectTrack.pathSort
+				}));
+			}
+		},
+		watch: {
+			params: {
+				handler(newVal, oldVal) {
+					this.selectTrack = {};
+					this.dataParams = JSON.parse(JSON.stringify(newVal));
+					this.preStartPointName = this.dataParams.pathStartJson.name;
+					this.preEndPointName = this.dataParams.pathEndJson.name;
+					this.getMapDetails(newVal.mapId);
+				}
+			}
+		}
+	}
+</script>
+
+<style>
+</style>

+ 398 - 0
src/views/workManagement/components/simulationTable.vue

@@ -0,0 +1,398 @@
+<template>
+	<div class="container">
+		<div class="table-operate">
+			<el-button class="btn" type="primary" @click="add">添加</el-button>
+			<el-button class="btn btn-info" type="info" @click="settingsSimulation">设为仿真视角</el-button>
+		</div>
+		<el-table class="table-content" ref="multipleTable" :data="tableData" tooltip-effect="dark" style="width: 100%">
+			<el-table-column label="序号">
+				<template slot-scope="scope">
+					<el-radio v-model="currentIndex" :label="getRowIndex(scope.$index)"
+						@change="changeRowIndex(getRowIndex(scope.$index), scope.row)"></el-radio>
+				</template>
+			</el-table-column>
+			<el-table-column label="选择车辆">
+				<template slot-scope="scope">
+					<el-select v-model="scope.row.carId" class="algorithm-select">
+						<el-option v-for="item in carList" :key="item.code" :label="item.name" :value="item.code">
+						</el-option>
+					</el-select>
+				</template>
+			</el-table-column>
+			<el-table-column label="选择算法">
+				<template slot-scope="scope">
+					<el-select v-model="scope.row.algorithmId" class="algorithm-select">
+						<el-option v-for="item in algorithmList" :key="item.code" :label="item.name" :value="item.code">
+						</el-option>
+					</el-select>
+				</template>
+			</el-table-column>
+			<el-table-column label="选择轨迹">
+				<template slot-scope="scope">
+					<div @click="showDialog(scope.row)" class="path-text">{{getSelectPathText(scope.row)}}</div>
+				</template>
+			</el-table-column>
+			<el-table-column label="操作">
+				<template slot-scope="scope">
+					<el-button class="delete-btn" size="mini-btn" type="danger"
+						@click="deleteRecord(scope.row)">删除</el-button>
+				</template>
+			</el-table-column>
+		</el-table>
+	</div>
+</template>
+
+<script>
+	export default {
+		name: "SimulationTable",
+		components: {
+			// vueQr,
+			// glHome,
+		},
+		data() {
+			return {
+				currentIndex: null,
+				tableData: [],
+				carList: [],
+				algorithmList: [],
+				selectRow: {},
+				showRow: {},
+				notSaved: [],
+				contentHasSave: false,
+				mockData: {
+					"sceneId": "",
+					"carId": "",
+					"carName": "",
+					"sceneCarId": "",
+					"algorithmId": "",
+					"algorithmType": 0,
+					"pathId": "",
+					"pathStart": {},
+					"pathEnd": {}
+				},
+				defaultData: {
+					"newType": "new",
+					"newUuid": "",
+					"id": "",
+					"sceneId": "",
+					"carId": "",
+					"algorithmId": "",
+					"algorithmType": 0,
+					"pathId": "",
+					"sceneCarId": null,
+					"pathStartJson": {
+
+					},
+					"pathEndJson": {}
+				},
+				collectPointsSelected: {}
+			};
+		},
+		props: {
+			sceneId: {
+				type: String,
+				default: _ => ""
+			},
+			mapId: {
+				type: String,
+				default: _ => ""
+			}
+		},
+		computed: {
+			getSelectPathText(row) {
+				return (row) => {
+					if (row.pathStartJson.name == null || row.pathEndJson.name == null) {
+						return "请选择轨迹";
+					} else {
+						return "轨迹" + row.pathSort + " (" + row.pathStartJson.name + "," + row.pathEndJson.name + ")"
+					}
+				}
+			}
+		},
+		mounted() {
+			this.getCarList();
+			this.getAlgorithmList();
+			this.getSceneCarList();
+		},
+		methods: {
+			add() {
+				let newRow = JSON.parse(JSON.stringify(this.defaultData));
+				newRow.newUuid = this.getUUID();
+				this.tableData.push(newRow);
+				this.notSaved.push(newRow);
+
+			},
+			updateRow(data) {
+				this.showRow.pathId = data.pathId;
+				this.showRow.pathStartJson = data.pathStartJson;
+				this.showRow.pathEndJson = data.pathEndJson;
+				this.showRow.pathSort = data.pathSort;
+			},
+			getRowIndex(rowIndex) {
+				return rowIndex + 1;
+			},
+			changeRowIndex(index, row) {
+				this.currentIndex = index;
+				this.selectRow = row;
+				this.$emit("changeRow", row);
+			},
+			showDialog(row) {
+				this.showRow = row;
+				this.collectSelectedPoints(this.tableData);
+				let data = {
+					pathId: row.pathId,
+					pathStartJson: row.pathStartJson,
+					pathEndJson: row.pathEndJson,
+					selectedPoints: this.collectPointsSelected
+				};
+				this.$emit("openDialog", data);
+			},
+			getSceneCarList() {
+				this.$axios({
+					method: "post",
+					url: this.$api.workManagement.sceneCarList,
+					data: {
+						"sceneId": this.sceneId,
+						"mapId": this.mapId,
+						"pageNum": "1",
+						"pageSize": 999999
+					}
+				}).then((res) => {
+					if (res.code == 200) {
+						this.tableData = res.info.list;
+						this.initCurrentIndex();
+					}
+				})
+			},
+			initCurrentIndex(){
+				this.currentIndex = null;
+				this.selectRow = null;
+				let length = this.tableData.length;
+				for(let index = 0; index < length; index ++){
+					let record = this.tableData[index];
+					if(record.isSimulationCar == 1){
+						this.currentIndex = this.getRowIndex(index);
+						this.selectRow = record;
+					}
+				}
+			},
+			getCarList() {
+				this.$axios({
+					method: "post",
+					url: this.$api.workManagement.carList,
+					data: {
+						"dropDownType": "2",
+						"algorithmType": "1"
+					}
+				}).then((res) => {
+					if (res.code == 200) {
+						this.carList = [...res.info[0].dropDownList[0].children, ...res.info[0]
+							.dropDownList[1]
+							.children
+						];
+						if (this.carList.length > 0) {
+							this.selectCarId = this.carList[0].code;
+						}
+					}
+				})
+			},
+			collectSelectedPoints(dataList) {
+				this.collectPointsSelected = {};
+				dataList.forEach((elem, index) => {
+					if (elem.pathId) {
+						if (!this.collectPointsSelected[elem.pathId]) {
+							this.collectPointsSelected[elem.pathId] = {};
+						}
+						let tarckSelected = this.collectPointsSelected[elem.pathId];
+						if (!tarckSelected.start) {
+							tarckSelected.start = [];
+						}
+						tarckSelected.start.push(elem.pathStartJson.name);
+						if (!tarckSelected.end) {
+							tarckSelected.end = [];
+						}
+						tarckSelected.end.push(elem.pathEndJson.name);
+					}
+				})
+			},
+			deleteRecord(row) {
+
+				this.$confirm('此操作将删除该记录, 是否继续?', '提示', {
+					confirmButtonText: '确定',
+					cancelButtonText: '取消',
+					type: 'warning'
+				}).then(() => {
+					if (row.newType) {
+						this.removeViewTableRecord(row);
+					} else {
+						this.$axios({
+							method: "post",
+							url: this.$api.workManagement.deleteRecord,
+							data: {
+								"sceneCarId": row.id
+							}
+						}).then((res) => {
+							if (res.code == 200) {
+								this.removeViewTableRecord(row);
+								this.initCurrentIndex();
+							}
+						})
+					}
+				}).catch(() => {});
+			},
+			removeViewTableRecord(row) {
+				let length = this.tableData.length;
+				for (let index = 0; index < length; index++) {
+					let elem = this.tableData[index];
+					if ((row.newUuid && row.newUuid == elem.newUuid) || (row.id && row.id == elem.id)) {
+						this.tableData.splice(index, 1);
+						break;
+					}
+				}
+			},
+			getAlgorithmList() {
+				this.$axios({
+					method: "post",
+					url: this.$api.workManagement.algorithmList,
+					data: {
+						"dropDownType": "1",
+						"algorithmType": "1"
+					}
+				}).then((res) => {
+					if (res.code == 200 && res.info) {
+						this.algorithmList = [...res.info[0].dropDownList[0].children, ...res.info[0]
+							.dropDownList[
+								1].children
+						];
+						if (this.algorithmList.length > 0) {
+							this.selectAlgorithmId = this.algorithmList[0].code;
+						}
+					}
+				})
+			},
+			settingsSimulation() {
+				this.$emit("simulationBtnCallBack", this.selectRow, this.settingsSimulationConfirm);
+			},
+			settingsSimulationConfirm(row) {
+				// this.searchSimulation(row.id)
+			},
+			saveAll(mapId) {
+				this.$axios({
+					method: "post",
+					url: this.$api.workManagement.saveOrUpdateSceneCarList,
+					data: {
+						"mapId": mapId,
+						"sceneId": this.sceneId,
+						"paramList": this.switchModel(this.tableData)
+					}
+				}).then((res) => {
+					if (res.code == 200) {
+						this.$message({
+							message: '保存成功',
+							type: 'success'
+						});
+						this.getSceneCarList();
+					} else {
+						this.$message({
+							message: '保存失败',
+							type: 'warning'
+						});
+					}
+				})
+			},
+			switchModel(dataArr) {
+				let newDataArr = []
+				dataArr.forEach((elem, index) => {
+					let data = {
+						"sceneId": elem.sceneId,
+						"carId": elem.carId,
+						"carName": elem.carName,
+						"sceneCarId": elem.sceneCarId,
+						"algorithmId": elem.algorithmId,
+						"algorithmType": elem.algorithmType,
+						"pathId": elem.pathId,
+						"pathStart": elem.pathStartJson,
+						"pathEnd": elem.pathEndJson
+					}
+					if (elem.newType) {
+						data.sceneId = this.sceneId;
+						data.sceneCarId = "";
+					} else {
+						data.sceneCarId = elem.id;
+					}
+
+					newDataArr.push(data);
+				})
+				return newDataArr;
+			},
+			S4() {
+				return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
+			},
+			getUUID() {
+				return (this.S4() + this.S4() + "-" + this.S4() + "-" + this.S4() + "-" + this.S4() + "-" + this
+					.S4() +
+					this.S4() + this.S4());
+			}
+		},
+		watch: {
+			mapId: {
+				handler(newVal, oldVal) {
+					this.getSceneCarList();
+				}
+			}
+		}
+	}
+</script>
+
+<style lang='less' scoped>
+	.container {
+		width: 100%;
+		height: 100%;
+		display: flex;
+		flex-direction: column;
+	}
+
+	.table-operate {
+		height: 3.1rem;
+		display: flex;
+		flex-direction: row;
+		justify-content: right;
+		align-items: center;
+	}
+
+	.btn {
+		color: #FFFFFF;
+		height: 2.5rem;
+		margin: 1rem;
+	}
+	
+	.btn-info{
+		background-color: #909399 !important;
+		color: #ffffff !important;
+	}
+	
+	.table-content {
+		flex: auto;
+	}
+
+	.delete-btn {
+		background-color: #f56c6c !important;
+		color: #ffffff !important;
+		border-radius: 0.5rem;
+	}
+
+	.path-text {
+		cursor: pointer;
+		font-size: 0.75rem;
+	}
+
+	/deep/ .table-content {
+		height: 100%;
+		overflow-y: scroll;
+	}
+
+	/deep/ .el-input,
+	/deep/ .el-input__inner {
+		width: 100px !important;
+	}
+</style>

+ 187 - 0
src/views/workManagement/evaluationResults.vue

@@ -0,0 +1,187 @@
+<template>
+  <div
+    style="
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+      padding: 20px 50px;
+    "
+  >
+    <h2
+      style="
+        width: 100%;
+        text-align: center;
+        font-size: 28px;
+        font-weight: bold;
+      "
+    >
+      评价结果
+    </h2>
+    <p
+      style="
+        font-size: 18px;
+        font-weight: bold;
+        border-bottom: 1px solid #ccc;
+        padding-bottom: 15px;
+      "
+    >
+      仿真评价
+    </p>
+    <p
+      style="
+        width: 100%;
+        text-align: center;
+        font-size: 18px;
+        color: #000;
+        margin-top: 30px;
+      "
+    >
+      {{ describe }}
+    </p>
+    <tableList
+      ref="table"
+      style="margin: 30px 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      index
+    >
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <span v-if="!isEdit" @click="" class="elIcon"> 评价结果 </span>
+          <span v-if="isEdit" @click="" class="elIcon"> 编辑 </span>
+          <span v-if="isEdit" @click="" class="elIcon"> 删除 </span>
+        </template>
+      </el-table-column>
+    </tableList>
+    <p
+      style="
+        font-size: 18px;
+        font-weight: bold;
+        border-bottom: 1px solid #ccc;
+        padding-bottom: 15px;
+      "
+    >
+      仿真回放
+    </p>
+    <div
+      style="
+        margin: 20px 0;
+        width: 100%;
+        display: flex;
+        justify-content: end;
+        align-items: center;
+      "
+    >
+      <span>回放视角:</span>
+      <el-select v-model="viewKey">
+        <el-option
+          v-for="item in viewOptions"
+          :key="item.value"
+          :label="item.label"
+          :value="item.value"
+        >
+        </el-option>
+      </el-select>
+    </div>
+    <div
+      style="width: 100%; height: 500px; border: 2px dashed #ccc; padding: 10px"
+    >
+      <video
+        ref="videoPlayer"
+        controls
+        style="width: 100%; height: 100%"
+        autoplay
+        :src="videoList[viewKey]"
+      >
+      </video>
+    </div>
+  </div>
+</template>
+
+<script>
+import tableList from '@/components/grid/TableList'
+
+export default {
+  name: 'evaluationResults', // 多仿真模式 评价结果
+  components: { tableList },
+  data() {
+    return {
+      viewKey: 0,
+      viewOptions: [
+        {
+          value: 0,
+          label: '总视角',
+        },
+        // {
+        //   value: 1,
+        //   label: '多仿真视角',
+        // },
+      ],
+      playUrl:'', // 当前播放地址
+      videoList: [], // 视频地址列表
+      describe: '', // 评价描述
+      columns: [
+        {
+          label: '事故类型',
+          prop: 'type',
+        },
+        {
+          label: '状态',
+          prop: 'status',
+        },
+      ],
+      getDataWay: {
+        //加载表格数据
+        dataType: 'data',
+        type: 'post',
+        // firstRequest: false,
+        data: [],
+        param: {},
+      },
+    }
+  },
+  methods: {
+    // 获取评价信息
+    getMulationSceneResult(id) {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.viewMulationSceneResult,
+        data: {
+          sceneId: id,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.describe = res.info.phrases
+          this.getDataWay.data = [
+            {
+              type: '碰撞',
+              status: res.info.collisionDetail[0].abnormalTimeDescription,
+            },
+            {
+              type: '异常停车',
+              status: res.info.abnormalParkingDetail[0].abnormalTimeDescription,
+            },
+            {
+              type: '冲出车道',
+              status: res.info.outOfPavementDetail[0].abnormalTimeDescription,
+            },
+          ]
+          this.playUrl = res.info.projectResultOverallUrl
+          if(res.info.projectResultSimulationUrl){
+            this.viewOptions = [...this.viewOptions, {value: 1,label: '多仿真视角',}]
+          }
+          this.videoList = [
+            res.info.projectResultOverallUrl,
+            res.info.projectResultSimulationUrl,
+          ]
+        } else {
+          this.$message.error(res.message || '查询信息失败')
+        }
+      })
+    },
+  },
+  mounted() {
+    this.$route.query.id && this.getMulationSceneResult(this.$route.query.id)
+  },
+}
+</script>

+ 509 - 397
src/views/workManagement/manualRunProjectDetail.vue

@@ -1,25 +1,50 @@
 <template>
-    <div>
-        <el-form ref="form" :model="form" :rules="rules" label-width="135px" class="flexBox">
-            <div class="formItemBox">
-                <el-form-item label="项目名称:" prop="projectName">
-                    <el-input placeholder="请输入" maxlength="120" v-autoTrim="{ obj: form, key: 'projectName' }"
-                        v-model="form.projectName">
-                    </el-input>
-                </el-form-item>
-                <el-form-item label="项目描述:" prop="projectDescribe">
-                    <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 4 }" placeholder="请输入" maxlength="300"
-                        v-autoTrim="{ obj: form, key: 'projectDescribe' }" v-model="form.projectDescribe">
-                    </el-input>
-                </el-form-item>
-                <el-form-item label="算法来源:" prop="algorithmType">
-                    <el-radio v-model="form.algorithmType" label="1" @change="typeChange">私有导入</el-radio>
-                    <el-radio v-model="form.algorithmType" label="3" @change="typeChange">算法平台</el-radio>
-                </el-form-item>
-                <el-form-item label="选择算法:" prop="algorithmArrayS">
-                    <el-cascader ref="cascaderA" v-model="form.algorithmArrayS" :options="algorithmList" :props="props"
-                        @change="algorithmSelChange"></el-cascader>
-                    <!-- <el-select v-model="form.algorithm">
+  <div>
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="140px"
+      class="flexBox"
+    >
+      <div class="formItemBox">
+        <el-form-item label="项目名称:" prop="projectName">
+          <el-input
+            placeholder="请输入"
+            maxlength="120"
+            v-autoTrim="{ obj: form, key: 'projectName' }"
+            v-model="form.projectName"
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="项目描述:" prop="projectDescribe">
+          <el-input
+            type="textarea"
+            :autosize="{ minRows: 4, maxRows: 4 }"
+            placeholder="请输入"
+            maxlength="300"
+            v-autoTrim="{ obj: form, key: 'projectDescribe' }"
+            v-model="form.projectDescribe"
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="算法来源:" prop="algorithmType">
+          <el-radio v-model="form.algorithmType" label="1" @change="typeChange"
+            >私有导入</el-radio
+          >
+          <el-radio v-model="form.algorithmType" label="3" @change="typeChange"
+            >算法平台</el-radio
+          >
+        </el-form-item>
+        <el-form-item label="选择算法:" prop="algorithmArrayS">
+          <el-cascader
+            ref="cascaderA"
+            v-model="form.algorithmArrayS"
+            :options="algorithmList"
+            :props="props"
+            @change="algorithmSelChange"
+          ></el-cascader>
+          <!-- <el-select v-model="form.algorithm">
                         <el-option
                             v-for="item in algorithmList"
                             :label="item.name"
@@ -28,11 +53,16 @@
                             :title="item.description"
                         ></el-option>
                     </el-select> -->
-                </el-form-item>
-                <el-form-item label="选择车辆:" prop="vehicleArrayS">
-                    <el-cascader ref="cascaderB" v-model="form.vehicleArrayS" :options="vehicleList" :props="props"
-                        @change="vehicleSelChange"></el-cascader>
-                    <!-- <el-select
+        </el-form-item>
+        <el-form-item label="选择车辆:" prop="vehicleArrayS">
+          <el-cascader
+            ref="cascaderB"
+            v-model="form.vehicleArrayS"
+            :options="vehicleList"
+            :props="props"
+            @change="vehicleSelChange"
+          ></el-cascader>
+          <!-- <el-select
                         v-model="form.vehicle"
                         @change="vehicleSelChange"
                     >
@@ -44,11 +74,16 @@
                             :title="item.description"
                         ></el-option>
                     </el-select> -->
-                </el-form-item>
-                <el-form-item label="选择场景:" prop="sceneArrayS">
-                    <el-cascader ref="cascaderC" v-model="form.sceneArrayS" :options="sceneList" :props="props"
-                        @change="sceneSelChange"></el-cascader>
-                    <!-- <el-select v-model="form.scene" @change="sceneSelChange">
+        </el-form-item>
+        <el-form-item label="选择场景:" prop="sceneArrayS">
+          <el-cascader
+            ref="cascaderC"
+            v-model="form.sceneArrayS"
+            :options="sceneList"
+            :props="props"
+            @change="sceneSelChange"
+          ></el-cascader>
+          <!-- <el-select v-model="form.scene" @change="sceneSelChange">
                         <el-option
                             v-for="item in sceneList"
                             :label="item.name"
@@ -56,22 +91,76 @@
                             :key="item.id"
                         ></el-option>
                     </el-select> -->
-                </el-form-item>
-                <el-form-item label="并行度:" prop="parallelism">
-                    <el-input :disabled="runDisabled" placeholder="请输入" maxlength="10"
-                        v-autoTrim="{ obj: form, key: 'parallelism' }" v-model="form.parallelism">
-                    </el-input>
-                </el-form-item>
-                <el-form-item label="最大仿真时间(s):" prop="maxSimulationTime">
-                    <el-input placeholder="请输入" maxlength="10" v-autoTrim="{ obj: form, key: 'maxSimulationTime' }"
-                        v-model="form.maxSimulationTime">
-                    </el-input>
-                </el-form-item>
-                <el-form-item label="是否选择GPU:" prop="isChoiceGpu">
-                    <el-radio v-model="form.isChoiceGpu" label="0">是</el-radio>
-                    <el-radio v-model="form.isChoiceGpu" label="1">否</el-radio>
-                </el-form-item>
-            </div>
+        </el-form-item>
+        <el-form-item label="并行度:" prop="parallelism">
+          <el-input
+            :disabled="runDisabled"
+            placeholder="请输入"
+            maxlength="10"
+            v-autoTrim="{ obj: form, key: 'parallelism' }"
+            v-model="form.parallelism"
+          >
+          </el-input>
+        </el-form-item>
+        <el-form-item label="场景评价规则:"></el-form-item>
+        <el-form-item label="危险度" class="rule-item" prop="riskEvaluationRuleId">
+          <el-select placeholder="暂不评价" v-model="form.riskEvaluationRuleId">
+            <el-option
+              v-for="(item, idx) in scriptList['2']"
+              :key="idx"
+              :label="item.ruleName"
+              :value="item.ruleId"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="复杂度" class="rule-item" prop="complexityEvaluationRuleId">
+          <el-select placeholder="暂不评价" v-model="form.complexityEvaluationRuleId">
+            <el-option
+              v-for="(item, idx) in scriptList['1']"
+              :key="idx"
+              :label="item.ruleName"
+              :value="item.ruleId"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="暴露率" class="rule-item" prop="exposureRateEvaluationRuleId">
+          <el-select placeholder="暂不评价" v-model="form.exposureRateEvaluationRuleId">
+            <el-option
+              v-for="(item, idx) in scriptList['3']"
+              :key="idx"
+              :label="item.ruleName"
+              :value="item.ruleId"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="覆盖率" class="rule-item" prop="coverageRateEvaluationRuleId">
+          <el-select placeholder="暂不评价" v-model="form.coverageRateEvaluationRuleId">
+            <el-option
+              v-for="(item, idx) in scriptList['4']"
+              :key="idx"
+              :label="item.ruleName"
+              :value="item.ruleId"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="最大仿真时间(s):" prop="maxSimulationTime">
+          <div style="position: relative;">
+            <el-input
+            placeholder="请输入"
+            maxlength="10"
+            v-autoTrim="{ obj: form, key: 'maxSimulationTime' }"
+            v-model="form.maxSimulationTime"
+          >
+          </el-input>
+            <span style="position: absolute; right: -160px;">(最小是5,最大是10000)</span>
+          </div>
+         
+        </el-form-item>
+        <el-form-item label="是否选择GPU:" prop="isChoiceGpu">
+          <el-radio v-model="form.isChoiceGpu" label="0">是</el-radio>
+          <el-radio v-model="form.isChoiceGpu" label="1">否</el-radio>
+        </el-form-item>
+      </div>
 
             <div class="tipBox">
                 <div class="tip tipA">
@@ -91,7 +180,7 @@
                     </div>
                 </div> -->
                 <div class="tip">(最多可用资源:{{ maxCount }})</div>
-                <div class="tip">(最小是5,最大是10000)</div>
+                <!-- <div class="tip">(最小是5,最大是10000)</div> -->
             </div>
         </el-form>
         <div class="btns">
@@ -105,386 +194,409 @@
 
 <script>
 //import  from '';
-let maxCount = 0; // 用于校验
+let maxCount = 0 // 用于校验
 let validateNum = (rule, value, callback) => {
-    !/^(\d+)$/.test(value) && callback(new Error(rule.message));
-    if (+value <= 0 || +value > +maxCount) callback(new Error(rule.message));
-    callback();
-};
+  !/^(\d+)$/.test(value) && callback(new Error(rule.message))
+  if (+value <= 0 || +value > +maxCount) callback(new Error(rule.message))
+  callback()
+}
 let validateNumA = (rule, value, callback) => {
     !/^(\d+)$/.test(value) && callback(new Error(rule.message));
     if (+value < 5 || +value > 10000) callback(new Error(rule.message));
     callback();
 };
 let validateNumB = (rule, value, callback) => {
-    !/^(\d+)$/.test(value) && callback(new Error(rule.message));
-    if (+value <= 0) callback(new Error(rule.message));
-    callback();
-};
+  !/^(\d+)$/.test(value) && callback(new Error(rule.message))
+  if (+value <= 0) callback(new Error(rule.message))
+  callback()
+}
 
 export default {
-    name: "manualRunProjectDetail", // 标准化测试详情
-    components: {},
-    data() {
-        return {
-            form: {
-                id: "",
-                projectName: "", // 项目名称
-                projectDescribe: "", // 项目描述
-                algorithmType: "1", // 算法来源
-                algorithm: "", // 选择算法
-                algorithmArrayS: "", // 选择算法
-                vehicle: "", // 选择车辆
-                vehicleArrayS: "", // 选择车辆
-                scene: "", // 选择场景
-                sceneArrayS: "", // 选择场景
-                parallelism: "", // 并行度
-                maxSimulationTime: "", // 最大仿真时间
-                isChoiceGpu: "0", // 是否选择GPU
-                nowRunState: "10", // 运行状态
-            },
-            algorithmList: [], // 算法对应列表
-            vehicleList: [], // 车辆对应列表
-            sceneList: [], // 场景对应列表
-            maxCount: 0, // 最多可用资源
-            sceneCount: 0, // 场景数量
-            rules: {
-                projectName: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                ],
-                projectDescribe: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                ],
-                algorithmType: [
-                    { required: true, message: "请选择", trigger: "change" },
-                ],
-                algorithmArrayS: [
-                    { required: true, message: "请选择", trigger: "change" },
-                ],
-                vehicleArrayS: [
-                    { required: true, message: "请选择", trigger: "change" },
-                ],
-                sceneArrayS: [
-                    { required: true, message: "请选择", trigger: "change" },
-                ],
-                parallelism: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    // {
-                    //     validator: validateNum,
-                    //     message: "请输入不大于最多可用资源的正整数",
-                    //     trigger: ["blur"],
-                    // },
-                ],
-                maxSimulationTime: [
-                    { required: true, message: "请输入", trigger: "blur" },
-                    {
-                        validator: validateNumA,
-                        message: "请输入不小于5且不大于10000的正整数",
-                        trigger: ["blur"],
-                    },
-                ],
-                isChoiceGpu: [
-                    { required: true, message: "请选择", trigger: "change" },
-                ],
-            },
-            sensors: [], // 选中车辆后对应的传感器数组
-            runDisabled: false, // 若最多可用资源为0,则不可点击"提交"
-            props: {
-                multiple: false,
-                label: "name",
-                value: "code",
-            },
-        };
-    },
-
-    computed: {},
-
-    methods: {
-        async getLists(dropDownType = "") {
-            await this.$axios({
-                method: "post",
-                url: this.$api.workManagement.selectDropDownByTypeNew,
-                data: {
-                    dropDownType,
-                    algorithmType: this.form.algorithmType,
-                },
-            }).then((res) => {
-                if (res.code == 200 && res.info) {
-                    res.info.forEach((item) => {
-                        if (item.type === "1") {
-                            // item.dropDownList.forEach((i) => {
-                            //     if (i.share === "1") i.name = i.name + "(公有)";
-                            // });
-
-                            this.algorithmList = item.dropDownList;
-                        } else if (item.type === "2") {
-                            // item.dropDownList.forEach((i) => {
-                            //     if (i.share === "1") i.name = i.name + "(公有)";
-                            // });
-
-                            this.vehicleList = item.dropDownList;
-                        } else if (item.type === "3") {
-                            // item.dropDownList.forEach((i) => {
-                            //     if (i.share === "1") i.name = i.name + "(公有)";
-                            // });
-
-                            this.sceneList = item.dropDownList;
-                        }
-                        // 空表示第一次进,有值表示在切换算法来源,需要清空选择算法的值
-                        if (dropDownType) {
-                            this.form.algorithm = "";
-                            this.form.algorithmArrayS = [];
-                            this.$nextTick(() => {
-                                // this.$refs.form.clearValidate("algorithm");
-                                this.$refs.form.clearValidate("algorithmArrayS");
-                            });
-                        }
-                    });
-                } else {
-                    this.$message.error(res.message || "获取信息失败");
-                }
-            });
-        },
-        typeChange() {
-            this.getLists("1");
-        },
-        async getMaxSimulationTime() {
-            await this.$axios({
-                method: "post",
-                url: this.$api.workManagement.selectMaxParallelism,
-                data: {},
-            }).then((res) => {
-                if (res.code == 200 && res.info && res.info != 0) {
-                    this.maxCount = maxCount = res.info;
-                    if (res.info == -1) {
-                        this.rules.parallelism.push({
-                            validator: validateNumB,
-                            message: "请输入正整数",
-                            trigger: ["blur"],
-                        });
-                    } else {
-                        this.rules.parallelism.push({
-                            validator: validateNum,
-                            message: "请输入不大于最多可用资源的正整数",
-                            trigger: ["blur"],
-                        });
-                    }
-                } else if (res.code == 200 && res.info == 0) {
-                    this.maxCount = maxCount = 0;
-                    this.runDisabled = true;
-                    this.form.parallelism = 0;
-                } else {
-                    this.$message.error(res.message || "获取信息失败");
-                }
-            });
-        },
-        algorithmSelChange(v) {
-            // console.log(v);
-            // console.log(this.$refs.cascaderA.getCheckedNodes(true)[0].data.vo);
-            let item = this.$refs.cascaderA.getCheckedNodes(true)[0].data.vo;
-            this.form.algorithm = item.id;
+  name: 'manualRunProjectDetail', // 标准化测试详情
+  components: {},
+  data() {
+    return {
+      form: {
+        id: '',
+        projectName: '', // 项目名称
+        projectDescribe: '', // 项目描述
+        algorithmType: '1', // 算法来源
+        algorithm: '', // 选择算法
+        algorithmArrayS: '', // 选择算法
+        vehicle: '', // 选择车辆
+        vehicleArrayS: '', // 选择车辆
+        scene: '', // 选择场景
+        sceneArrayS: '', // 选择场景
+        parallelism: '', // 并行度
+        maxSimulationTime: '', // 最大仿真时间
+        isChoiceGpu: '0', // 是否选择GPU
+        nowRunState: '10', // 运行状态
+        complexityEvaluationRuleId: '', // 复杂度
+        riskEvaluationRuleId: '', // 危险度
+        exposureRateEvaluationRuleId: '', // 暴露率
+        coverageRateEvaluationRuleId: '', // 覆盖率
+      },
+      algorithmList: [], // 算法对应列表
+      vehicleList: [], // 车辆对应列表
+      sceneList: [], // 场景对应列表
+      maxCount: 0, // 最多可用资源
+      sceneCount: 0, // 场景数量
+      scriptList: {}, // 评价脚本列表
+      rules: {
+        projectName: [{ required: true, message: '请输入', trigger: 'blur' }],
+        projectDescribe: [
+          { required: true, message: '请输入', trigger: 'blur' },
+        ],
+        algorithmType: [
+          { required: true, message: '请选择', trigger: 'change' },
+        ],
+        algorithmArrayS: [
+          { required: true, message: '请选择', trigger: 'change' },
+        ],
+        vehicleArrayS: [
+          { required: true, message: '请选择', trigger: 'change' },
+        ],
+        sceneArrayS: [{ required: true, message: '请选择', trigger: 'change' }],
+        parallelism: [
+          { required: true, message: '请输入', trigger: 'blur' },
+          // {
+          //     validator: validateNum,
+          //     message: "请输入不大于最多可用资源的正整数",
+          //     trigger: ["blur"],
+          // },
+        ],
+        maxSimulationTime: [
+          { required: true, message: '请输入', trigger: 'blur' },
+          {
+            validator: validateNumA,
+            message: '请输入不小于5且不大于10000的正整数',
+            trigger: ['blur'],
+          },
+        ],
+        isChoiceGpu: [{ required: true, message: '请选择', trigger: 'change' }],
+      },
+      sensors: [], // 选中车辆后对应的传感器数组
+      runDisabled: false, // 若最多可用资源为0,则不可点击"提交"
+      props: {
+        multiple: false,
+        label: 'name',
+        value: 'code',
+      },
+    }
+  },
+
+  computed: {},
+
+  methods: {
+    async getLists(dropDownType = '') {
+      await this.$axios({
+        method: 'post',
+        url: this.$api.workManagement.selectDropDownByTypeNew,
+        data: {
+          dropDownType,
+          algorithmType: this.form.algorithmType,
         },
-        vehicleSelChange(v) {
-            let item = this.$refs.cascaderB.getCheckedNodes(true)[0].data.vo;
-            this.form.vehicle = item.id;
-
-            let sensor = item.sensor;
-            if (!sensor) {
-                this.sensors = [];
-            } else {
-                this.sensors = sensor.split(",");
+      }).then((res) => {
+        if (res.code == 200 && res.info) {
+          res.info.forEach((item) => {
+            if (item.type === '1') {
+              // item.dropDownList.forEach((i) => {
+              //     if (i.share === "1") i.name = i.name + "(公有)";
+              // });
+
+              this.algorithmList = item.dropDownList
+            } else if (item.type === '2') {
+              // item.dropDownList.forEach((i) => {
+              //     if (i.share === "1") i.name = i.name + "(公有)";
+              // });
+
+              this.vehicleList = item.dropDownList
+            } else if (item.type === '3') {
+              // item.dropDownList.forEach((i) => {
+              //     if (i.share === "1") i.name = i.name + "(公有)";
+              // });
+
+              this.sceneList = item.dropDownList
             }
-
-            // let sensor = this.vehicleList.find((i) => i.id === item).sensor;
-
-            // if (!sensor) {
-            //     this.sensors = [];
-            // } else {
-            //     this.sensors = sensor.split(",");
-            // }
-        },
-        sceneSelChange(v) {
-            let item = this.$refs.cascaderC.getCheckedNodes(true)[0].data.vo;
-            this.form.scene = item.id;
-            this.sceneCount = item.sceneNum
-
-            // this.sceneCount = this.sceneList.find(
-            //     (i) => i.id === item
-            // ).sceneNum;
-        },
-        save(isAdd = false, needChange = false) {
-            // isAdd是否强制新增,needChange是否需要改变状态
-            this.$refs.form.validate((valid) => {
-                if (valid) {
-                    if (isAdd) {
-                        // 另存为
-                        this.form.id = "";
-                    }
-
-                    this.form.nowRunState = "10";
-
-                    this.$axios({
-                        method: "post",
-                        url: this.$api.workManagement.addOrUpdateProject,
-                        data: {
-                            ...this.form,
-                        },
-                    }).then((res) => {
-                        if (res.code == 200) {
-                            this.$message.success("保存成功");
-                            if (needChange) {
-                                this.form.id = res.info;
-                                this.stateChange();
-                            } else {
-                                this.cancel();
-                            }
-                        } else {
-                            this.$message.error(res.message || "保存失败");
-                        }
-                    });
-                }
-            });
-        },
-        cancel() {
-            this.$router.replace({ path: "/manualRunProjectList" });
-        },
-        stateChange() {
-            this.$axios({
-                method: "post",
-                url: this.$api.workManagement.updateProjectNowRunState,
-                data: {
-                    id: this.form.id,
-                    nowRunState: "20",
-                },
-            }).then((res) => {
-                if (res.code == 200) {
-                    this.$message.success("提交成功");
-                    this.cancel();
-                } else {
-                    this.$message.error(res.message || "提交失败");
-                }
-            });
+            // 空表示第一次进,有值表示在切换算法来源,需要清空选择算法的值
+            if (dropDownType) {
+              this.form.algorithm = ''
+              this.form.algorithmArrayS = []
+              this.$nextTick(() => {
+                // this.$refs.form.clearValidate("algorithm");
+                this.$refs.form.clearValidate('algorithmArrayS')
+              })
+            }
+          })
+        } else {
+          this.$message.error(res.message || '获取信息失败')
+        }
+      })
+    },
+    typeChange() {
+      this.getLists('1')
+    },
+    async getMaxSimulationTime() {
+      await this.$axios({
+        method: 'post',
+        url: this.$api.workManagement.selectMaxParallelism,
+        data: {},
+      }).then((res) => {
+        if (res.code == 200 && res.info && res.info != 0) {
+          this.maxCount = maxCount = res.info
+          if (res.info == -1) {
+            this.rules.parallelism.push({
+              validator: validateNumB,
+              message: '请输入正整数',
+              trigger: ['blur'],
+            })
+          } else {
+            this.rules.parallelism.push({
+              validator: validateNum,
+              message: '请输入不大于最多可用资源的正整数',
+              trigger: ['blur'],
+            })
+          }
+        } else if (res.code == 200 && res.info == 0) {
+          this.maxCount = maxCount = 0
+          this.runDisabled = true
+          this.form.parallelism = 0
+        } else {
+          this.$message.error(res.message || '获取信息失败')
+        }
+      })
+    },
+    algorithmSelChange(v) {
+      // console.log(v);
+      // console.log(this.$refs.cascaderA.getCheckedNodes(true)[0].data.vo);
+      let item = this.$refs.cascaderA.getCheckedNodes(true)[0].data.vo
+      this.form.algorithm = item.id
+    },
+    vehicleSelChange(v) {
+      let item = this.$refs.cascaderB.getCheckedNodes(true)[0].data.vo
+      this.form.vehicle = item.id
+
+      let sensor = item.sensor
+      if (!sensor) {
+        this.sensors = []
+      } else {
+        this.sensors = sensor.split(',')
+      }
+
+      // let sensor = this.vehicleList.find((i) => i.id === item).sensor;
+
+      // if (!sensor) {
+      //     this.sensors = [];
+      // } else {
+      //     this.sensors = sensor.split(",");
+      // }
+    },
+    sceneSelChange(v) {
+      let item = this.$refs.cascaderC.getCheckedNodes(true)[0].data.vo
+      this.form.scene = item.id
+      this.sceneCount = item.sceneNum
+
+      // this.sceneCount = this.sceneList.find(
+      //     (i) => i.id === item
+      // ).sceneNum;
+    },
+    getScriptList() {
+      this.$axios({
+        method: 'post',
+        url: this.$api.sceneLibrary.getScriptListByType,
+        data: {
+          sceneEvaluationType: ['1', '2', '3', '4'],
         },
+      }).then((res) => {
+        this.scriptList = res.info
+      })
     },
-
-    mounted() {
-        if (this.$route.query.id) {
-            let id = "";
-            this.form.id = id = this.$route.query.id;
-
-            if (id) {
-                this.$axios({
-                    method: "post",
-                    url: this.$api.workManagement.selectProjectById,
-                    data: {
-                        id,
-                    },
-                }).then(async (res) => {
-                    if (res.code == 200 && res.info) {
-                        this.form = res.info;
-                        await this.getLists();
-                        await this.getMaxSimulationTime();
-                        this.vehicleSelChange(res.info.vehicle);
-                        this.sceneSelChange(res.info.scene);
-                    } else {
-                        this.$message.error(res.message || "获取信息失败");
-                    }
-                });
+    save(isAdd = false, needChange = false) {
+      // isAdd是否强制新增,needChange是否需要改变状态
+      this.$refs.form.validate((valid) => {
+        if (valid) {
+          if (isAdd) {
+            // 另存为
+            this.form.id = ''
+          }
+
+          this.form.nowRunState = '10'
+
+          this.$axios({
+            method: 'post',
+            url: this.$api.workManagement.addOrUpdateProject,
+            data: {
+              ...this.form,
+            },
+          }).then((res) => {
+            if (res.code == 200) {
+              this.$message.success('保存成功')
+              if (needChange) {
+                this.form.id = res.info
+                this.stateChange()
+              } else {
+                this.cancel()
+              }
+            } else {
+              this.$message.error(res.message || '保存失败')
             }
+          })
+        }
+      })
+    },
+    cancel() {
+      this.$router.replace({ path: '/manualRunProjectList' })
+    },
+    stateChange() {
+      this.$axios({
+        method: 'post',
+        url: this.$api.workManagement.updateProjectNowRunState,
+        data: {
+          id: this.form.id,
+          nowRunState: '20',
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.$message.success('提交成功')
+          this.cancel()
         } else {
-            this.getLists();
-            this.getMaxSimulationTime();
+          this.$message.error(res.message || '提交失败')
         }
+      })
     },
-};
+  },
+
+  mounted() {
+    if (this.$route.query.id) {
+      let id = ''
+      this.form.id = id = this.$route.query.id
+
+      if (id) {
+        this.$axios({
+          method: 'post',
+          url: this.$api.workManagement.selectProjectById,
+          data: {
+            id,
+          },
+        }).then(async (res) => {
+          if (res.code == 200 && res.info) {
+            this.form = res.info
+            await this.getLists()
+            await this.getMaxSimulationTime()
+            this.vehicleSelChange(res.info.vehicle)
+            this.sceneSelChange(res.info.scene)
+          } else {
+            this.$message.error(res.message || '获取信息失败')
+          }
+        })
+      }
+      this.getScriptList()
+    } else {
+      this.getLists()
+      this.getMaxSimulationTime()
+      this.getScriptList()
+    }
+  },
+}
 </script>
 
 <style lang='less' scoped>
 .el-form {
-    width: 60%;
-    min-width: 900px;
-    padding-top: 60px;
-    margin: 0 auto;
-
-    .formItemBox {
-        flex: 1;
-
-        /deep/ .el-input,
-        .el-select,
-        .el-cascader {
-            width: 100%;
-        }
-
-        .el-cascader {
-            height: 32px;
-            line-height: 32px;
-        }
+  width: 60%;
+  min-width: 900px;
+  padding-top: 60px;
+  margin: 0 auto;
+
+  .formItemBox {
+    flex: 1;
+
+    /deep/ .el-input,
+    .el-select,
+    .el-cascader {
+      width: 100%;
     }
 
-    .el-textarea {
-        height: 96px;
+    .el-cascader {
+      height: 32px;
+      line-height: 32px;
     }
+  }
 
-    .tipBox {
-        min-width: 270px;
-        margin-left: 20px;
+  .el-textarea {
+    height: 96px;
+  }
 
-        .tip {
-            margin-bottom: 22px;
-            line-height: 32px;
-        }
-
-        .tipA {
-            height: 32px;
-            // 按54往上加
-            margin-top: 280px;
-
-            .iconA {
-                background: url("../../assets/common/image/sensor/001.png") center no-repeat;
-                background-size: contain;
-            }
+  .tipBox {
+    min-width: 270px;
+    margin-left: 20px;
 
-            .iconB {
-                background: url("../../assets/common/image/sensor/002.png") center no-repeat;
-                background-size: contain;
-            }
-
-            .iconC {
-                background: url("../../assets/common/image/sensor/003.png") center no-repeat;
-                background-size: contain;
-            }
-
-            .iconD {
-                background: url("../../assets/common/image/sensor/004.png") center no-repeat;
-                background-size: contain;
-            }
-
-            .iconE {
-                background: url("../../assets/common/image/sensor/005.png") center no-repeat;
-                background-size: contain;
-            }
+    .tip {
+      margin-bottom: 22px;
+      line-height: 32px;
+    }
+    .tip1{
+      margin-bottom: -100px;
+      border: 1px solid black;
+    }
 
-            span {
-                display: inline-block;
-                width: 18px;
-                height: 18px;
-                margin-top: 7px;
-                margin-right: 6px;
-            }
-        }
+    .tipA {
+      height: 32px;
+      // 按54往上加
+      margin-top: 280px;
+
+      .iconA {
+        background: url('../../assets/common/image/sensor/001.png') center
+          no-repeat;
+        background-size: contain;
+      }
+
+      .iconB {
+        background: url('../../assets/common/image/sensor/002.png') center
+          no-repeat;
+        background-size: contain;
+      }
+
+      .iconC {
+        background: url('../../assets/common/image/sensor/003.png') center
+          no-repeat;
+        background-size: contain;
+      }
+
+      .iconD {
+        background: url('../../assets/common/image/sensor/004.png') center
+          no-repeat;
+        background-size: contain;
+      }
+
+      .iconE {
+        background: url('../../assets/common/image/sensor/005.png') center
+          no-repeat;
+        background-size: contain;
+      }
+
+      span {
+        display: inline-block;
+        width: 18px;
+        height: 18px;
+        margin-top: 7px;
+        margin-right: 6px;
+      }
+    }
 
-        .tipB {
-            padding-top: 54px;
-        }
+    .tipB {
+      padding-top: 54px;
+    }
 
-        .tipBtnBox {
-            margin-left: 20px;
-        }
+    .tipBtnBox {
+      margin-left: 20px;
     }
+  }
+}
+.rule-item {
+  margin-left: 60px;
 }
-
 .btns {
-    padding-top: 30px;
-    text-align: center;
+  padding-top: 30px;
+  text-align: center;
 }
-</style>
+</style>

+ 48 - 4
src/views/workManagement/manualRunProjectList.vue

@@ -147,12 +147,12 @@
                 selection
                 index
             >
-                <el-table-column label="操作" slot="cgInfos" align="center">
+                <el-table-column label="操作" slot="cgInfos" align="center" width="150" fixed="right">
                     <template v-slot="scope">
                         <i
                             v-if="scope.row.nowRunState !== '10'"
                             @click="
-                                viewRow(scope.row.id, scope.row.projectName)
+                                viewRow(scope.row.id, scope.row.projectName,scope)
                             "
                             class="el-icon-view elIcon"
                             title="查看"
@@ -315,6 +315,50 @@ export default {
                     // },
                 },
                 // {
+                //     label: "复杂度评价结果",
+                //     prop: "simulationManualProjectEvaluation",
+                //     formatter(row){
+                //         if(row.simulationManualProjectEvaluation){
+                //             switch (row.simulationManualProjectEvaluation.complexityEvaluationStatus) {
+                //                 case '0':
+                //                     return '未开始';
+                //                 case '1':
+                //                     return '评价中';
+                //                 case '2':
+                //                     return '评价完成';
+                //                 case '3':
+                //                     return '评价失败';
+                //                 default :
+                //                     return '-'
+                //             }
+                //         }else{
+                //             return '-'
+                //         }
+                //     }
+                // },
+                // {
+                //     label: "危险度评价结果",
+                //     prop: "simulationManualProjectEvaluation1",
+                //     formatter(row){
+                //         if(row.simulationManualProjectEvaluation){
+                //             switch (row.simulationManualProjectEvaluation.riskEvaluationStatus) {
+                //                 case '0':
+                //                     return '未开始';
+                //                 case '1':
+                //                     return '评价中';
+                //                 case '2':
+                //                     return '评价完成';
+                //                 case '3':
+                //                     return '评价失败';
+                //                 default :
+                //                     return '-'
+                //             }
+                //         }else{
+                //             return '-'
+                //         }
+                //     }
+                // },
+                // {
                 //     label: "停/启用",
                 //     prop: "asd",
                 //     template: true,
@@ -561,10 +605,11 @@ export default {
             this.delRow(arr.join(","));
         },
 
-        viewRow(id, name) {
+        viewRow(id, name,opt) {
             // 修改项目详情的tabname
             this.$store.commit("getProjectInfoTabname", name);
             localStorage.setItem("projectInfoTabname", name);
+            localStorage.setItem("evaluateOpt", JSON.stringify(opt.row.simulationManualProjectEvaluation || {}));
 
             this.$router.push({
                 path: "/manualRunProjectList/projectInfo",
@@ -642,7 +687,6 @@ export default {
             if (this.$refs["table"]) this.doSearch(true);
         }, 1000 * 60);
 
-        // console.log(666);
         await this.$dicsListsInit({
             nowRunStateList: "projectRunState",
             evaluationLevelList: "evaluationLevel",

+ 316 - 0
src/views/workManagement/multimodeSimulationEdit.vue

@@ -0,0 +1,316 @@
+<template>
+	<div class="container">
+		<div class="select-map" :class="{'no-interaction': isDisabled}">
+			地图选择:
+			<el-select class="select-content" v-model="openDrive.mapId" placeholder="请选择" @change="changeMapId">
+				<el-option v-for="(item, index) in mapList" :key="item.id" :label="item.mapName" :value="item.id">
+				</el-option>
+			</el-select>
+		</div>
+		<div class="content">
+			<open-drive class="map" ref="openDrive" :mapId="openDrive.mapId" :startPoint="openDrive.pathStartJson"
+				:endPoint="openDrive.pathEndJson" :sections="openDrive.sections"></open-drive>
+			<SimulationTable ref="table" @simulationBtnCallBack="settingSimulation" @openDialog="showDialog"
+				class="table" :sceneId="sceneId" :mapId="openDrive.mapId" :class="{'no-interaction': isDisabled}" />
+		</div>
+		<div class="operate" :class="{'no-interaction': isDisabled}">
+			<el-button @click="saveAll" class="btn" type="primary">保存</el-button>
+			<el-button @click="back" class="btn" type="info">返回</el-button>
+		</div>
+		<PathDialog :open="dialog.dialogOpen" :params="dialog.dialogParam" @onClose="closeDialog"
+			@onSubmit="sumbitDialog" @change="changeMap" />
+	</div>
+</template>
+
+<script>
+	import OpenDrive from "@/views/workManagement/components/openDriver";
+	import PathDialog from "@/views/workManagement/components/pathDialog";
+	import SimulationTable from "@/views/workManagement/components/simulationTable";
+
+	export default {
+		name: "MultimodeSimulationEdit", // 工作管理
+		components: {
+			OpenDrive,
+			PathDialog,
+			SimulationTable
+		},
+		data() {
+			return {
+				isDisabled: false,
+				mapList: [],
+				sceneId: "",
+				projectId:"", // 项目id
+				dialog: {
+					dialogParam: {},
+					dialogOpen: false
+				},
+				openDrive: {
+					mapId: "",
+					pathStartJson: {},
+					pathEndJson: {},
+					sections: []
+				}
+			}
+
+		},
+		beforeMount() {
+			this.sceneId = this.$route.query.sceneId;
+			this.projectId = this.$route.query.projectId
+			// if(!this.sceneId){
+			// 	this.sceneId = "b1e8fb96cf8a41d9a0364d29a9289628";
+			// }
+		},
+		mounted() {
+			this.getMapList();
+			
+		},
+		methods: {
+			getDefaultMap(defaultMapId) {
+				this.$axios({
+					method: "post",
+					url: this.$api.workManagement.getMultiSimulationSceneDetail,
+					data: {
+						"sceneId": this.sceneId
+					}
+				}).then((res) => {
+					if (res.code == 200) {
+						if(res.info.mapId){
+							this.openDrive.mapId = res.info.mapId;
+						}else{
+							this.openDrive.mapId = defaultMapId;
+						}
+					}
+				})
+			},
+			changeMapId() {
+				console.log(this.openDrive.mapId);
+			},
+			getMapList() {
+				this.$axios({
+					method: "post",
+					url: this.$api.workManagement.mapList,
+					data: {
+						"pageNum": 0,
+						"pageSize": 999999
+					}
+				}).then((res) => {
+					if (res.code == 200) {
+						this.mapList = res.info;
+						if (this.mapList.length > 0) {
+							this.$axios({
+								method: "post",
+								url: this.$api.workManagement.mapList,
+								data: {
+									"pageNum": 0,
+									"pageSize": 99999
+								}
+							}).then((res) => {
+								if (res.code == 200) {
+									this.mapList = res.info;
+									if (this.mapList.length > 0) {
+										this.getDefaultMap(this.mapList[0].id);
+									}
+								}
+							})
+						}
+
+					}
+				})
+			},
+			settingSimulation(row, callBack) {
+				if (row.id == null || row.id == "") {
+					this.$message({
+						message: '警告哦,请选择一条已保存记录',
+						type: 'warning'
+					});
+					return;
+				}
+
+				this.$confirm('确定设为仿真视角?')
+					.then(_ => {
+						this.$axios({
+							method: "post",
+							url: this.$api.workManagement.settingsSimulation,
+							data: {
+								"sceneCarId": row.id,
+							}
+						}).then((res) => {
+							if (res.code == 200) {
+								callBack(row);
+								this.$message({
+									message: '设为仿真视角成功',
+									type: 'success'
+								});
+							} else {
+								this.$message({
+									message: '设为仿真视角失败',
+									type: 'warning'
+								});
+							}
+						})
+					})
+					.catch(_ => {});
+
+			},
+			reloadMap() {
+				setTimeout(() => {
+					this.$refs.openDrive.reloadMap();
+				}, 50);
+			},
+			changeMap(data) {
+				this.openDrive = data;
+			},
+			showDialog(data) {
+				this.isDisabled = true;
+				this.dialog.dialogOpen = true;
+				this.dialog.dialogParam = Object.assign({}, data, {
+					mapId: this.openDrive.mapId
+				});
+			},
+			closeDialog() {
+				this.dialog.dialogOpen = false;
+				this.isDisabled = false;
+				this.reloadMap();
+			},
+			sumbitDialog(data) {
+				this.dialog.dialogOpen = false;
+				this.isDisabled = false;
+				this.$refs.table.updateRow(data);
+				this.reloadMap();
+			},
+			saveAll() {
+				this.$refs.table.saveAll(this.openDrive.mapId);
+			},
+			back() {
+
+				// this.$router.go(-1);
+				this.$router.push({
+					path:'/simulationEdit',
+					query:{
+						mode:'edit',
+						id:this.projectId
+					}
+				})
+			}
+		}
+	};
+</script>
+
+<style lang='less' scoped>
+	* {
+		margin: 0;
+		padding: 0;
+		box-sizing: content-box;
+	}
+
+	.mainBox {
+		padding-bottom: 0px !important
+	}
+
+	.container {
+		/* background-color: rebeccapurple; */
+		height: 100%;
+		width: 100%;
+		display: flex;
+		flex-direction: column;
+		padding: 0 0.5rem;
+	}
+
+	.select-map {
+		font-size: 1rem;
+		color: #333333;
+		letter-spacing: 0.05rem;
+		display: flex;
+		align-items: center;
+		padding-left: 1rem;
+		width: 100%;
+		/* padding: 1rem; */
+		height: 4rem;
+	}
+
+	.content {
+		display: flex;
+		flex-direction: row;
+		padding: 0.2rem;
+		height: 38rem;
+	}
+
+	.operate {
+		height: 4rem;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		padding: 0rem;
+	}
+
+
+	.block {
+		height: auto;
+		width: 100%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.map {
+		flex: 1.5;
+	}
+
+	.table {
+		flex: 1;
+		border: 0.05rem solid #DCDCDC;
+		margin: 0 0.2rem 0 0.25rem;
+	}
+
+	.btn {
+		color: #FFFFFF;
+		height: 1.5rem;
+		margin: 1rem;
+	}
+
+	.open-drive {
+		width: 100%;
+		height: 100%;
+	}
+
+	.delete-btn {
+		color: #FFFFFF;
+		border-radius: 0.5rem;
+	}
+
+	/deep/ div.cell {
+		text-align: center;
+	}
+
+	/deep/ th div.cell {
+		font-size: .9rem;
+		font-weight: bold;
+	}
+
+	.block {
+		border: none !important;
+	}
+
+	.el-dialog__wrapper {
+		pointer-events: none;
+
+		/deep/ .el-dialog {
+			pointer-events: auto;
+		}
+	}
+
+	/deep/ .el-dialog {
+		position: absolute !important;
+		top: 0 !important;
+		right: 10rem !important;
+	}
+
+	.no-interaction {
+		pointer-events: none;
+		/* 其他样式,比如背景色、边框等 */
+		/* 	  background-color: #f0f0f0;
+	  border: 1px solid #ccc; */
+		/* 	  padding: 10px;
+	  margin: 10px; */
+	}
+</style>

+ 157 - 10
src/views/workManagement/projectInfo.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="projectInfoPanel">
         <div v-show="!$route.path.includes('taskInfo') &&
-            !$route.path.includes('evaluationReport')
+            !$route.path.includes('evaluationReport') && !$route.path.includes('sceneReport')
             ">
             <div class="headPanel panel">
                 <div class="titlePanel">
@@ -65,6 +65,59 @@
                 </div>
             </div>
 
+            <div class="headPanel panel">
+                <div class="titlePanel">
+                    <div class="titlePanelBor">场景评价</div>
+                </div>
+                <div class="boxContent">
+                    <div class="info">
+                        <span>危险度规则:</span>
+                        <b>{{ ruleDetailInfo.riskEvaluationRuleName || '-' }}</b>
+                    </div>
+                    <!-- <div class="info">
+                        <span>危险度评价结果:</span>
+                        <b>{{ JSON.stringify(evaluateOpt)!='{}'?evaluateStatusMap[evaluateOpt.riskEvaluationStatus]:'-'}}</b>
+                    </div> -->
+                    <div class="info">
+                        <span>复杂度规则:</span>
+                        <b>{{ ruleDetailInfo.complexityEvaluationRuleName || '-' }}</b>
+                    </div>
+                    <!-- <div class="info">
+                        <span>复杂度评价结果:</span>
+                        <b>{{ JSON.stringify(evaluateOpt)!='{}'?evaluateStatusMap[evaluateOpt.complexityEvaluationStatus]:'-'}}</b>
+                    </div> -->
+                    <div class="info">
+                        <span>覆盖率规则:</span>
+                        <b>{{ ruleDetailInfo.coverageRateEvaluationRuleName || '-' }}</b>
+                    </div>
+                    <div class="info">
+                        <span>暴露率规则:</span>
+                        <b>{{ ruleDetailInfo.exposureRateEvaluationRuleName || '-' }}</b>
+                    </div>
+                    <div class="info">
+                        <span>场景数量:</span>
+                        <b>{{ ruleDetailInfo.sceneNum || 0 }}</b>
+                    </div>
+                    <div class="info">
+                        <span>场景测试包覆盖率:</span>
+                        <b>{{ ruleDetailInfo.testPackageCoverageRate || '-' }}</b>
+                    </div>
+                    <div class="info">
+                        <span>场景测试包暴露率:</span>
+                        <b>{{ ruleDetailInfo.testPackageExposureRate || '-' }}</b>
+                    </div>
+                </div>
+            </div>
+            <div class="scorePanel panel">
+                <div class="titlePanel">
+                    <div class="titlePanelBor">评价列表</div>
+                </div>
+                <div class="box">
+                    <tableList style="margin: 30px 0" :columns="columnsB" :getDataWay="getDataWayB" :pagination="paginationB">
+                    </tableList>
+                </div>
+            </div>
+
             <div class="flexBox topPanel">
                 <div class="box panel boxB">
                     <div class="titlePanel">
@@ -98,6 +151,16 @@
                                 仿真云测试报告
                             </div>
                         </div>
+                        <div v-if="info.reportForReferenceLib"  class="cbox" @click="jumpReport" style="margin-left: 20px">
+                            <img :src="downImgSrc" width="100%" v-bind:class="{
+                                cursor: info.nowRunState === '30',
+                            }" />
+                            <div v-bind:class="{
+                                cursor: info.nowRunState === '30',
+                            }">
+                                场景评价报告
+                            </div>
+                        </div>
                     </div>
                 </div>
             </div>
@@ -130,8 +193,8 @@
                                 <span v-show="isOpen" class="view close" @click="showAll(false)" title="关闭全部"></span>
                             </div>
 
-                            <three-show v-loading="loading" @loadingDone="loadingDone" ref="threeShow" :carModel="carModel"
-                                :allSensor="allSensor"></three-show>
+                            <three-show v-loading="loading" @loadingDone="loadingDone" ref="threeShow"
+                                :carModel="carModel" :allSensor="allSensor"></three-show>
 
                             <div v-show="configBox" class="conditions">
                                 <el-form ref="formA" :model="formA" :rules="rulesA" label-width="99px" disabled>
@@ -206,20 +269,30 @@
                         <div class="chart">
                             <div class="pieTitle">任务运行状态统计:</div>
                             <div class="pie">
-                                <pie-chart-project-info id="projectInfoPieA" :stateList="stateList" stateName="stateName"
-                                    seriesName="任务运行状态统计"></pie-chart-project-info>
+                                <pie-chart-project-info id="projectInfoPieA" :stateList="stateList"
+                                    stateName="stateName" seriesName="任务运行状态统计"></pie-chart-project-info>
                             </div>
                         </div>
                         <div class="chart">
                             <div class="pieTitle">得分统计:</div>
                             <div class="pie">
-                                <pie-chart-project-info id="projectInfoPieB" :stateList="resultList" stateName="resultName"
-                                    seriesName="得分统计"></pie-chart-project-info>
+                                <pie-chart-project-info id="projectInfoPieB" :stateList="resultList"
+                                    stateName="resultName" seriesName="得分统计"></pie-chart-project-info>
                             </div>
                         </div>
                     </div>
                     <div>
                         <tableList ref="table" :columns="columns" :getDataWay="getDataWay" :pagination="pagination">
+                            <el-table-column label="危险度进度" slot="risk" align="center">
+                                <template v-slot="scope">
+                                   <span>{{JSON.stringify(evaluateOpt)!='{}'?evaluateStatusMap[evaluateOpt.riskEvaluationStatus]:'-'}}</span>
+                                </template>
+                            </el-table-column>
+                            <el-table-column label="复杂度进度" slot="complex" align="center">
+                                <template v-slot="scope">
+                                   <span>{{JSON.stringify(evaluateOpt)!='{}'?evaluateStatusMap[evaluateOpt.complexityEvaluationStatus]:'-'}}</span>
+                                </template>
+                            </el-table-column>
                             <el-table-column label="操作" slot="cgInfos" align="center">
                                 <template v-slot="scope">
                                     <i @click="viewRow(scope.row)" class="el-icon-view elIcon" title="查看"></i>
@@ -230,7 +303,8 @@
                 </div>
             </div>
         </div>
-        <router-view v-show="$route.path.includes('taskInfo') || $route.path.includes('evaluationReport')"></router-view>
+        <router-view
+            v-show="$route.path.includes('taskInfo') || $route.path.includes('evaluationReport')"></router-view>
         <!-- <router-view v-else></router-view> -->
     </div>
 </template>
@@ -258,6 +332,9 @@ export default {
             projectType: "", // 1手动 2自动
             info: {},
             evaluationLevel: "",
+            evaluateOpt:{}, // 评价结果信息
+            evaluateStatusMap:['未评级','评价中','评价完成','评价失败'],
+            ruleDetailInfo: {}, // 规则详情列表
             columns: [
                 {
                     label: "ID",
@@ -287,6 +364,16 @@ export default {
                     label: "得分",
                     prop: "score",
                 },
+                {
+                    label: "危险度进度",
+                    prop: "risk",
+                    template: true,
+                },
+                {
+                    label: "复杂度进度",
+                    prop: "complex",
+                    template: true,
+                },
                 {
                     label: "操作",
                     prop: "cgInfos",
@@ -315,6 +402,28 @@ export default {
                     prop: "scoreRatio",
                 },
             ],
+            columnsB: [
+                {
+                    label: "场景名称",
+                    prop: "sceneName",
+                },
+                {
+                    label: "危险度",
+                    prop: "risk",
+                },
+                {
+                    label: "危险度等级",
+                    prop: "riskLevel",
+                },
+                {
+                    label: "复杂度",
+                    prop: "complexity",
+                },
+                {
+                    label: "复杂度等级",
+                    prop: "complexityLevel",
+                },
+            ],
             pagination: {
                 //分页使用
                 currentPage: 1,
@@ -342,6 +451,26 @@ export default {
                 data: [],
                 param: {},
             },
+            getDataWayB: {
+                //加载表格数据
+                dataType: "url",
+                type: "post",
+                // firstRequest: false,
+                data: this.$api.workManagement.querySceneEvaluationDetail,
+                param: {
+                    id: this.$route.query.id,
+                    projectType: this.$route.query.projectType,
+                },
+            },
+            paginationB: {
+                //分页使用
+                currentPage: 1,
+                pageSize: 10,
+                position: "right",
+                pageSizes: [10, 30, 50, 100, 200],
+                layout: "sizes, total, prev, pager, next, jumper",
+            },
+            
             // 传感器对象集合
             configList: {
                 camera: [],
@@ -383,6 +512,14 @@ export default {
     },
 
     methods: {
+        jumpReport(){
+            if(this.info.nowRunState === '30'){
+                this.$router.push({
+                    name: "sceneReport",
+                    query: { id: this.id,projectType:this.projectType },
+                });
+            }
+        },
         viewRow(row) {
             let path = "/manualRunProjectList/projectInfo/taskInfo";
             if (this.projectType === "2") {
@@ -557,7 +694,7 @@ export default {
         if (this.$route.query.id) {
             this.id = this.$route.query.id;
             this.projectType = this.$route.query.projectType || "1";
-
+            this.evaluateOpt = JSON.parse(localStorage.getItem('evaluateOpt'))
             this.$axios({
                 method: "post",
                 url: this.$api.workManagement.selectProjectDetailsById,
@@ -602,6 +739,16 @@ export default {
                     this.$message.error(res.message || "获取信息失败");
                 }
             });
+            this.$axios({
+                method: "post",
+                url: this.$api.workManagement.getEvaluationRuleDetail,
+                data: {
+                    id: this.id,
+                    projectType: this.projectType,
+                },
+            }).then(res => {
+                this.ruleDetailInfo = res.info
+            })
         }
     },
 };
@@ -644,7 +791,7 @@ export default {
 
             span {
                 display: block;
-                width: 105px;
+                min-width: 105px;
                 color: @gray;
             }
 

+ 1846 - 0
src/views/workManagement/sceneReport.vue

@@ -0,0 +1,1846 @@
+<template>
+  <div class="report_box">
+    <div class="pdf_box" ref="pdfContent">
+      <!-- 报告封面 -->
+      <div class="report_banner">
+        <h1>场景评价报告</h1>
+        <div class="report_table">
+          <div class="table_item">
+            <p>场景测试包:</p>
+            <span>{{ info.projectName }}</span>
+          </div>
+          <div class="table_item">
+            <p>场景数量:</p>
+            <span>{{ info.sceneNum }}</span>
+          </div>
+          <div class="table_item">
+            <p>算法名称:</p>
+            <span>{{ info.algorithmName }}</span>
+          </div>
+          <div class="table_item tiem-last">
+            <p>报告时间:</p>
+            <span>{{ info.finishTime }}</span>
+          </div>
+        </div>
+        <h4>国汽(北京)智能网联汽车研究院有限公司</h4>
+      </div>
+      <!-- 评价报告 -->
+      <div class="report_content">
+        <h3>评价报告</h3>
+        <p class="subtitle">一、测试得分说明</p>
+        <p class="text">
+          针对<span style="border-bottom: 2px solid red">{{
+            info.algorithmName
+          }}</span
+          >,进行场景的算法验证,共有{{
+            Number(info.scenePassNum)
+          }}例场景通过,通过率{{ Number(info.passRate) * 100 }}%。其中<span
+            style="border-bottom: 2px solid red"
+            >{{ info.packageName }}</span
+          >的场景复杂度、危险度分布结果如下图所示。
+        </p>
+        <!-- 复杂度图表 -->
+        <div class="echart-box" ref="myChart_complex"></div>
+        <p class="echart_desc">图1-1 复杂度分布图</p>
+        <!-- 危险度图表 -->
+        <div class="echart-box" ref="myChart_risk"></div>
+        <p class="echart_desc">图1-2 危险度分布图</p>
+        <p class="text">
+          复杂度/危险度分数与复杂度/危险度等级的对应关系见附录。算法在不同复杂度/危险度等级的结果分布图如下。正常情况下评价等级越高则算法通过的数量越少,该图可判断场景评价和算法评价的合理性。
+        </p>
+        <!-- 算法不同复杂度等级分布图表 -->
+        <div class="echart-box" ref="myChart_complex_scale"></div>
+        <p class="echart_desc">图1-3 算法在不同复杂度等级的结果分布图</p>
+        <!-- 算法不同危险度等级分布图表 -->
+        <div class="echart-box" ref="myChart_risk_scale"></div>
+        <p class="echart_desc">图1-4 算法在不同危险度等级的结果分布图</p>
+        <p class="subtitle">二、场景分布情况</p>
+        <p class="text">
+          本次场景评价涉及场景{{ Number(info.sceneNum) }}例,共{{
+            Number(info.sceneNum)
+          }}类基准场景类别。具体参数分布情况如下:
+        </p>
+        <p class="text">1)他车动作</p>
+        <p class="text">他车动作共涵盖直行、汇入等,分布图如下:</p>
+        <!-- 他车动作分布图表 -->
+        <div class="echart-box" ref="myChart_othcar_scale"></div>
+        <p class="echart_desc">图2-1 他车动作类别分布图</p>
+        <p class="text">
+          危险度或复杂度在不同他车动作类别的结果分布如下图所示,根据分布图可对场景生成算法进行调整。例如对于全部是复杂度高或者复杂度低的场景,需要对参数或类别有所调整,使生成的场景更加合理,更好的服务于算法迭代。
+        </p>
+        <!-- 危险度他车分布图表 -->
+        <div class="echart-box" ref="myChart_risk_othcar_scale"></div>
+        <p class="echart_desc">图2-2 危险度在不同他车动作类别的结果分布图</p>
+        <!-- 复杂度他车分布图表 -->
+        <div class="echart-box" ref="myChart_complex_othcar_scale"></div>
+        <p class="echart_desc">图2-3 复杂度在不同他车动作类别的结果分布图</p>
+        <p class="text">2)天气条件</p>
+        <p class="text">
+          天气包含晴天、雨天共{{
+            Object.keys(info.weatherTypeForNum || {}).length || ''
+          }}类,分布图如下:
+        </p>
+        <!-- 天气分布 -->
+        <div class="echart-box" ref="myChart_weather_scale"></div>
+        <p class="echart_desc">图2-4 天气分布图</p>
+        <p class="text">
+          危险度或复杂度在不同他车动作类别的结果分布如下图所示,根据分布图可对场景生成算法进行调整。例如对于全部是复杂度高或者复杂度低的场景,可对参数或类别有所调整,使生成的场景更加合理,更好的服务于算法迭代。
+        </p>
+        <!-- 危险度天气分布图表 -->
+        <div class="echart-box" ref="myChart_risk_weather_scale"></div>
+        <p class="echart_desc">图2-5 危险度在不同天气类别下的结果分布图</p>
+        <!-- 复杂度天气分布图表 -->
+        <div class="echart-box" ref="myChart_complex_weather_scale"></div>
+        <p class="echart_desc">图2-6 复杂度在不同天气下的结果分布图</p>
+        <p class="text">3)道路条件</p>
+        <p class="text">
+          覆盖道路类型为城市普通道路、高速道路,运行区域主要为主路…,道路类型、运行区域、平面几何和纵断面几何的场景分布情况如下:
+        </p>
+        <!-- 道路类型分布 -->
+        <div class="echart-box" ref="myChart_roadtype_scale"></div>
+        <p class="echart_desc">图2-7 道路类型分布图</p>
+        <!-- 运行区域分布图 -->
+        <div class="echart-box" ref="myChart_region_scale"></div>
+        <p class="echart_desc">图2-8 运行区域分布图</p>
+        <!-- 道路几何-平面分布图 -->
+        <div class="echart-box" ref="myChart_roadplane_scale"></div>
+        <p class="echart_desc">图2-9 道路几何-平面分布图</p>
+        <!-- 道路几何-纵断面分布图 -->
+        <div class="echart-box" ref="myChart_roadportrait_scale"></div>
+        <p class="echart_desc">图2-10 道路几何-纵断面分布图</p>
+        <p class="text">
+          危险度或复杂度在不同他车动作类别的结果分布如下图所示,根据分布图可对场景生成算法进行调整。例如对于全部是复杂度高或者复杂度低的场景,可对参数或类别有所调整,使生成的场景更加合理,更好的服务于算法迭代。
+        </p>
+        <!-- 危险度不同运行区域分布图 -->
+        <div class="echart-box" ref="myChart_risk_region_scale"></div>
+        <p class="echart_desc">图2-11危险度在不同运行区域下的结果分布图</p>
+        <!-- 复杂度不同运行区域分布图 -->
+        <div class="echart-box" ref="myChart_complex_region_scale"></div>
+        <p class="echart_desc">图2-12 复杂度在不同运行区域下的结果分布图</p>
+        <!-- 危险度不同运行区域分布图 -->
+        <div class="echart-box" ref="myChart_risk_road_scale"></div>
+        <p class="echart_desc">图2-13 危险度在不同道路平面下的结果分布图</p>
+        <!-- 复杂度不同运行区域分布图 -->
+        <div class="echart-box" ref="myChart_complex_road_scale"></div>
+        <p class="echart_desc">图2-14复杂度在不同道路平面下的结果分布图</p>
+        <!-- 危险度不同纵断面分布图 -->
+        <div class="echart-box" ref="myChart_risk_roadportrait_scale"></div>
+        <p class="echart_desc">图2-15 危险度在不同道路纵断面下的结果分布图</p>
+        <!-- 复杂度不同纵断面分布图 -->
+        <div class="echart-box" ref="myChart_complex_roadportrait_scale"></div>
+        <p class="echart_desc">图2-16 复杂度在不同道路纵断面下的结果分布图</p>
+        <p class="subtitle">三、算法表现分析</p>
+        <p class="text">
+          算法在不同他车动作类别的结果分布,主要是看在不同类别下算法的表现是否会不同,通过性场景的多少对于算法以后选择场景类型有指导性意义。
+        </p>
+        <!-- 算法在不同他车动作结果分布图 -->
+        <div class="echart-box" ref="myChart_algorithm_othcar_scale"></div>
+        <p class="echart_desc">
+          图3-1 算法在不同他车动作类别与运行区域的结果分布
+        </p>
+        <!-- 算法在不同天气类型结果分布图 -->
+        <div class="echart-box" ref="myChart_algorithm_weather_scale"></div>
+        <p class="echart_desc">图3-2 算法在不同天气类别与运行区域的结果分布</p>
+        <!-- 算法在不同道路结果分布图 -->
+        <div class="echart-box" ref="myChart_algorithm_road_scale"></div>
+        <p class="echart_desc">图3-3 算法在不同道路平面与纵断面的结果分布</p>
+        <p class="subtitle">四、详细评分情况</p>
+        <p class="text">
+          {{ info.algorithmName }}算法在{{
+            Number(info.sceneNum)
+          }}类场景的详细得分情况见表4-1
+        </p>
+        <p class="echart_desc">表4-1 评价结果表</p>
+        <el-table :data="tableDataA" border style="width: 100%">
+          <el-table-column
+            v-for="item in tableColumnA"
+            :prop="item.key"
+            :label="item.label"
+          >
+          </el-table-column>
+        </el-table>
+        <p class="subtitle">附录</p>
+        <p class="echart_desc">表5-1 评价结果表</p>
+        <el-table :data="tableDataB" border style="width: 100%">
+          <el-table-column
+            v-for="item in tableColumnB"
+            :prop="item.key"
+            :label="item.label"
+          >
+          </el-table-column>
+        </el-table>
+        <el-table
+          :data="tableDataC"
+          border
+          style="width: 100%; margin-top: 50px"
+        >
+          <el-table-column
+            v-for="item in tableColumnC"
+            :prop="item.key"
+            :label="item.label"
+          >
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+    <button @click="down">下载</button>
+  </div>
+</template>
+
+<script>
+import html2canvas from 'html2canvas'
+import jsPDF from 'jspdf'
+import * as echarts from 'echarts'
+export default {
+  name:'sceneReport',
+  data() {
+    return {
+      tableColumnA: [
+        {
+          label: '场景名称',
+          key: 'sceneName',
+        },
+        {
+          label: '复杂度分值',
+          key: 'complexity',
+        },
+        {
+          label: '复杂度等级',
+          key: 'complexityLevel',
+        },
+        {
+          label: '危险度分值',
+          key: 'risk',
+        },
+        {
+          label: '危险度等级',
+          key: 'riskLevel',
+        },
+        {
+          label: '算法得分',
+          key: 'scoreResult',
+        },
+      ],
+      tableColumnB: [
+        {
+          label: '复杂度分值',
+          key: 'a',
+        },
+        {
+          label: '复杂度等级',
+          key: 'b',
+        },
+      ],
+      tableColumnC: [
+        {
+          label: '危险度分值',
+          key: 'a',
+        },
+        {
+          label: '危险度等级',
+          key: 'b',
+        },
+      ],
+      tableDataA: [],
+      tableDataB: [
+        { a: '(75,inf]', b: 'A' },
+        { a: '(50,75]', b: 'B' },
+        { a: '(25,50]', b: 'C' },
+        { a: '[0,25]', b: 'D' },
+      ],
+      tableDataC: [
+        { a: '(75,inf]', b: 'A' },
+        { a: '(50,75]', b: 'B' },
+        { a: '(25,50]', b: 'C' },
+        { a: '[0,25]', b: 'D' },
+      ],
+      info: {}, // 报告数据
+    }
+  },
+  mounted() {
+    const { id, projectType } = this.$route.query
+    this.getReportDetail(id, projectType)
+  },
+  methods: {
+    // 获取报告
+    getReportDetail(id, projectType) {
+      this.$axios({
+        method: 'post',
+        url: this.$api.workManagement.getStandardTestReport,
+        data: { id, projectType },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.info = res.info
+          this.tableDataA = res.info.manualProjectTaskVos
+          this.echartInit(res.info)
+        } else {
+          this.$message.error('获取失败', res.message)
+        }
+      })
+    },
+    // 图表初始化
+    echartInit(info) {
+      const chart_complex = echarts.init(this.$refs.myChart_complex) // 复杂度分布图
+      const chart_risk = echarts.init(this.$refs.myChart_risk) // 危险度分布图
+      const chart_complex_scale = echarts.init(this.$refs.myChart_complex_scale) // 算法复杂度分布
+      const chart_risk_scale = echarts.init(this.$refs.myChart_risk_scale) // 算法危险度分布
+      const chart_othcar_scale = echarts.init(this.$refs.myChart_othcar_scale) // 他车动作类别分布图
+      const chart_risk_othcar_scale = echarts.init(
+        this.$refs.myChart_risk_othcar_scale
+      ) // 危险度他车动作分布
+      const chart_complex_othcar_scale = echarts.init(
+        this.$refs.myChart_complex_othcar_scale
+      ) // 复杂度他车动作分布
+      const chart_weather_scale = echarts.init(this.$refs.myChart_weather_scale) // 天气分布
+      const chart_complex_weather_scale = echarts.init(
+        this.$refs.myChart_complex_weather_scale
+      ) // 复杂度天气分布
+      const chart_risk_weather_scale = echarts.init(
+        this.$refs.myChart_risk_weather_scale
+      ) // 危险度天气分布
+      const chart_roadtype_scale = echarts.init(
+        this.$refs.myChart_roadtype_scale
+      ) // 道路类型分布
+      const chart_region_scale = echarts.init(this.$refs.myChart_region_scale) // 运行区域分布图
+      const chart_roadplane_scale = echarts.init(
+        this.$refs.myChart_roadplane_scale
+      ) // 道路平面分布
+      const chart_roadportrait_scale = echarts.init(
+        this.$refs.myChart_roadportrait_scale
+      ) // 道路纵断分布
+      const chart_risk_region_scale = echarts.init(
+        this.$refs.myChart_risk_region_scale
+      ) // 危险度不同运行区域分布
+      const chart_complex_region_scale = echarts.init(
+        this.$refs.myChart_complex_region_scale
+      ) // 复杂度不同运行区域分布
+      const chart_risk_road_scale = echarts.init(
+        this.$refs.myChart_risk_road_scale
+      ) // 危险度不同道路分布
+      const chart_complex_road_scale = echarts.init(
+        this.$refs.myChart_complex_road_scale
+      ) // 复杂度不同道路分布
+      const chart_risk_roadportrait_scale = echarts.init(
+        this.$refs.myChart_risk_roadportrait_scale
+      ) // 危险度不同道路分布
+      const chart_complex_roadportrait_scale = echarts.init(
+        this.$refs.myChart_complex_roadportrait_scale
+      ) // 复杂度不同道路分布
+
+      const chart_algorithm_othcar_scale = echarts.init(
+        this.$refs.myChart_algorithm_othcar_scale
+      ) // 算法在不同他车动作类别分布
+
+      const chart_algorithm_weather_scale = echarts.init(
+        this.$refs.myChart_algorithm_weather_scale
+      ) // 算法在不同天气类别分布
+
+      const chart_algorithm_road_scale = echarts.init(
+        this.$refs.myChart_algorithm_road_scale
+      ) // 算法在不同道路类别分布
+      /*************************************/
+      chart_complex.setOption({
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow',
+          },
+        },
+        legend: {},
+        xAxis: {
+          type: 'category',
+          data: [
+            '0-10',
+            '10-20',
+            '20-30',
+            '30-40',
+            '40-50',
+            '50-60',
+            '60-70',
+            '70-80',
+            '80-90',
+            '90-100',
+          ],
+        },
+        yAxis: {
+          type: 'value',
+        },
+        series: [
+          {
+            data: [
+              info.compRange['[0,10]'] || null,
+              info.compRange['(10,20]'] || null,
+              info.compRange['(20,30]'] || null,
+              info.compRange['(30,40]'] || null,
+              info.compRange['(40,50]'] || null,
+              info.compRange['(50,60]'] || null,
+              info.compRange['(60,70]'] || null,
+              info.compRange['(70,80]'] || null,
+              info.compRange['(80,90]'] || null,
+              info.compRange['(90,100]'] || null,
+            ],
+            type: 'bar',
+            label: {
+              show: true, // 显示数值
+              position: 'top', // 数值显示的位置
+            },
+          },
+        ],
+      })
+
+      chart_risk.setOption({
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow',
+          },
+        },
+        legend: {},
+        xAxis: {
+          type: 'category',
+          data: [
+            '0-10',
+            '10-20',
+            '20-30',
+            '30-40',
+            '40-50',
+            '50-60',
+            '60-70',
+            '70-80',
+            '80-90',
+            '90-100',
+            '100-inf',
+          ],
+        },
+        yAxis: {
+          type: 'value',
+        },
+        series: [
+          {
+            data: [
+              info.riskRange['[0,10]'] || null,
+              info.riskRange['(10,20]'] || null,
+              info.riskRange['(20,30]'] || null,
+              info.riskRange['(30,40]'] || null,
+              info.riskRange['(40,50]'] || null,
+              info.riskRange['(50,60]'] || null,
+              info.riskRange['(60,70]'] || null,
+              info.riskRange['(70,80]'] || null,
+              info.riskRange['(80,90]'] || null,
+              info.riskRange['(90,100]'] || null,
+              info.riskRange['(100,+∞)'] || null,
+            ],
+            type: 'bar',
+            label: {
+              show: true, // 显示数值
+              position: 'top', // 数值显示的位置
+            },
+          },
+        ],
+      })
+
+      /** */
+      chart_complex_scale.setOption({
+        legend: {},
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow',
+          },
+        },
+        legend: {},
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        yAxis: {
+          type: 'value',
+        },
+        xAxis: {
+          type: 'category',
+          data: ['A', 'B', 'C', 'D'],
+        },
+        series: [
+          {
+            name: '不通过',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: [
+              info.compLevelForPassNum['A']
+                ? info.compLevelForPassNum['A'].unPassNum
+                : null,
+              info.compLevelForPassNum['B']
+                ? info.compLevelForPassNum['B'].unPassNum
+                : null,
+              info.compLevelForPassNum['C']
+                ? info.compLevelForPassNum['C'].unPassNum
+                : null,
+              info.compLevelForPassNum['D']
+                ? info.compLevelForPassNum['D'].unPassNum
+                : null,
+            ],
+          },
+          {
+            name: '通过',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: [
+              info.compLevelForPassNum['A']
+                ? info.compLevelForPassNum['A'].passNum
+                : null,
+              info.compLevelForPassNum['B']
+                ? info.compLevelForPassNum['B'].passNum
+                : null,
+              info.compLevelForPassNum['C']
+                ? info.compLevelForPassNum['C'].passNum
+                : null,
+              info.compLevelForPassNum['D']
+                ? info.compLevelForPassNum['D'].passNum
+                : null,
+            ],
+          },
+        ],
+      })
+      chart_risk_scale.setOption({
+        legend: {},
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow',
+          },
+        },
+        legend: {},
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        yAxis: {
+          type: 'value',
+        },
+        xAxis: {
+          type: 'category',
+          data: ['A', 'B', 'C', 'D'],
+        },
+        series: [
+          {
+            name: '不通过',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: [
+              info.riskLevelForPassNum['A']
+                ? info.riskLevelForPassNum['A'].unPassNum
+                : null,
+              info.riskLevelForPassNum['B']
+                ? info.riskLevelForPassNum['B'].unPassNum
+                : null,
+              info.riskLevelForPassNum['C']
+                ? info.riskLevelForPassNum['C'].unPassNum
+                : null,
+              info.riskLevelForPassNum['D']
+                ? info.riskLevelForPassNum['D'].unPassNum
+                : null,
+            ],
+          },
+          {
+            name: '通过',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: [
+              info.riskLevelForPassNum['A']
+                ? info.riskLevelForPassNum['A'].passNum
+                : null,
+              info.riskLevelForPassNum['B']
+                ? info.riskLevelForPassNum['B'].passNum
+                : null,
+              info.riskLevelForPassNum['C']
+                ? info.riskLevelForPassNum['C'].passNum
+                : null,
+              info.riskLevelForPassNum['D']
+                ? info.riskLevelForPassNum['D'].passNum
+                : null,
+            ],
+          },
+        ],
+      })
+      /** */
+
+      chart_othcar_scale.setOption({
+        xAxis: {
+          type: 'value',
+          boundaryGap: [0, 0.01],
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.otherBehaviorTypeForNum),
+        },
+        series: {
+          type: 'bar',
+          data: Object.values(info.otherBehaviorTypeForNum),
+        },
+      })
+
+      chart_risk_othcar_scale.setOption({
+        legend: {},
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.otherBehaviorForCompLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.otherBehaviorForCompLevelNum).map(
+              (item) => info.otherBehaviorForCompLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.otherBehaviorForCompLevelNum).map(
+              (item) => info.otherBehaviorForCompLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.otherBehaviorForCompLevelNum).map(
+              (item) => info.otherBehaviorForCompLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.otherBehaviorForCompLevelNum).map(
+              (item) => info.otherBehaviorForCompLevelNum[item].D
+            ),
+          },
+        ],
+      })
+      chart_complex_othcar_scale.setOption({
+        legend: {},
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.otherBehaviorForRiskLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.otherBehaviorForRiskLevelNum).map(
+              (item) => info.otherBehaviorForRiskLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.otherBehaviorForRiskLevelNum).map(
+              (item) => info.otherBehaviorForRiskLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.otherBehaviorForRiskLevelNum).map(
+              (item) => info.otherBehaviorForRiskLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.otherBehaviorForRiskLevelNum).map(
+              (item) => info.otherBehaviorForRiskLevelNum[item].D
+            ),
+          },
+        ],
+      })
+
+      chart_weather_scale.setOption({
+        tooltip: {
+          trigger: 'item',
+        },
+        legend: {
+          top: '5%',
+          left: 'center',
+        },
+        series: [
+          {
+            name: '天气类型',
+            type: 'pie',
+            radius: ['40%', '70%'],
+            avoidLabelOverlap: false,
+            label: {
+              show: false,
+              position: 'center',
+            },
+            emphasis: {
+              label: {
+                show: true,
+                fontSize: 20,
+                fontWeight: 'bold',
+              },
+            },
+            labelLine: {
+              show: false,
+            },
+            data: Object.keys(info.weatherTypeForNum).map((item) => {
+              return {
+                value: info.weatherTypeForNum[item],
+                name: item,
+              }
+            }),
+          },
+        ],
+      })
+
+      chart_complex_weather_scale.setOption({
+        legend: {},
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.weatherForCompLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherForCompLevelNum).map(
+              (item) => info.weatherForCompLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherForCompLevelNum).map(
+              (item) => info.weatherForCompLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherForCompLevelNum).map(
+              (item) => info.weatherForCompLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherForCompLevelNum).map(
+              (item) => info.weatherForCompLevelNum[item].D
+            ),
+          },
+        ],
+      })
+
+      chart_risk_weather_scale.setOption({
+        legend: {},
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.weatherForRiskLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherForRiskLevelNum).map(
+              (item) => info.weatherForRiskLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherForRiskLevelNum).map(
+              (item) => info.weatherForRiskLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherForRiskLevelNum).map(
+              (item) => info.weatherForRiskLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherForRiskLevelNum).map(
+              (item) => info.weatherForRiskLevelNum[item].D
+            ),
+          },
+        ],
+      })
+
+      chart_roadtype_scale.setOption({
+        tooltip: {
+          trigger: 'item',
+        },
+        legend: {
+          top: '5%',
+          left: 'center',
+        },
+        series: [
+          {
+            name: '道路类型',
+            type: 'pie',
+            radius: ['40%', '70%'],
+            avoidLabelOverlap: false,
+            label: {
+              show: false,
+              position: 'center',
+            },
+            emphasis: {
+              label: {
+                show: true,
+                fontSize: 20,
+                fontWeight: 'bold',
+              },
+            },
+            labelLine: {
+              show: false,
+            },
+            data: Object.keys(info.roadTypeForNum).map((item) => {
+              return {
+                value: info.roadTypeForNum[item],
+                name: item,
+              }
+            }),
+          },
+        ],
+      })
+
+      chart_region_scale.setOption({
+        xAxis: {
+          type: 'value',
+          boundaryGap: [0, 0.01],
+        },
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.operationAreaTypeForNum),
+        },
+        series: {
+          type: 'bar',
+          data: Object.values(info.operationAreaTypeForNum),
+        },
+      })
+
+      chart_roadplane_scale.setOption({
+        xAxis: {
+          type: 'category',
+          data: Object.keys(info.roadGeometryPlaneTypeForNum),
+        },
+        yAxis: {
+          type: 'value',
+        },
+        series: [
+          {
+            data: Object.values(info.roadGeometryPlaneTypeForNum),
+            type: 'bar',
+          },
+        ],
+      })
+      chart_roadportrait_scale.setOption({
+        xAxis: {
+          type: 'category',
+          data: Object.keys(info.roadGeometryVerticalTypeForNum),
+        },
+        yAxis: {
+          type: 'value',
+        },
+        series: [
+          {
+            data: Object.values(info.roadGeometryVerticalTypeForNum),
+            type: 'bar',
+          },
+        ],
+      })
+
+      chart_risk_region_scale.setOption({
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        legend: {},
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.operationAreaForRiskLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.operationAreaForRiskLevelNum).map(
+              (item) => info.operationAreaForRiskLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.operationAreaForRiskLevelNum).map(
+              (item) => info.operationAreaForRiskLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.operationAreaForRiskLevelNum).map(
+              (item) => info.operationAreaForRiskLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.operationAreaForRiskLevelNum).map(
+              (item) => info.operationAreaForRiskLevelNum[item].D
+            ),
+          },
+        ],
+      })
+
+      chart_complex_region_scale.setOption({
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        legend: {},
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.operationAreaForCompLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.operationAreaForCompLevelNum).map(
+              (item) => info.operationAreaForCompLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.operationAreaForCompLevelNum).map(
+              (item) => info.operationAreaForCompLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.operationAreaForCompLevelNum).map(
+              (item) => info.operationAreaForCompLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.operationAreaForCompLevelNum).map(
+              (item) => info.operationAreaForCompLevelNum[item].D
+            ),
+          },
+        ],
+      })
+
+      chart_risk_road_scale.setOption({
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        legend: {},
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.roadGeometryPlaneForRiskLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryPlaneForRiskLevelNum).map(
+              (item) => info.roadGeometryPlaneForRiskLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryPlaneForRiskLevelNum).map(
+              (item) => info.roadGeometryPlaneForRiskLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryPlaneForRiskLevelNum).map(
+              (item) => info.roadGeometryPlaneForRiskLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryPlaneForRiskLevelNum).map(
+              (item) => info.roadGeometryPlaneForRiskLevelNum[item].D
+            ),
+          },
+        ],
+      })
+
+      chart_complex_road_scale.setOption({
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        legend: {},
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.roadGeometryPlaneForCompLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryPlaneForCompLevelNum).map(
+              (item) => info.roadGeometryPlaneForCompLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryPlaneForCompLevelNum).map(
+              (item) => info.roadGeometryPlaneForCompLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryPlaneForCompLevelNum).map(
+              (item) => info.roadGeometryPlaneForCompLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryPlaneForCompLevelNum).map(
+              (item) => info.roadGeometryPlaneForCompLevelNum[item].D
+            ),
+          },
+        ],
+      })
+
+      chart_risk_roadportrait_scale.setOption({
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        legend: {},
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.roadGeometryVerticalForRiskLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryVerticalForRiskLevelNum).map(
+              (item) => info.roadGeometryVerticalForRiskLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryVerticalForRiskLevelNum).map(
+              (item) => info.roadGeometryVerticalForRiskLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryVerticalForRiskLevelNum).map(
+              (item) => info.roadGeometryVerticalForRiskLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryVerticalForRiskLevelNum).map(
+              (item) => info.roadGeometryVerticalForRiskLevelNum[item].D
+            ),
+          },
+        ],
+      })
+      chart_complex_roadportrait_scale.setOption({
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        legend: {},
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.roadGeometryVerticalForCompLevelNum),
+        },
+        series: [
+          {
+            name: 'A',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryVerticalForCompLevelNum).map(
+              (item) => info.roadGeometryVerticalForCompLevelNum[item].A
+            ),
+          },
+          {
+            name: 'B',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryVerticalForCompLevelNum).map(
+              (item) => info.roadGeometryVerticalForCompLevelNum[item].B
+            ),
+          },
+          {
+            name: 'C',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryVerticalForCompLevelNum).map(
+              (item) => info.roadGeometryVerticalForCompLevelNum[item].C
+            ),
+          },
+          {
+            name: 'D',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadGeometryVerticalForCompLevelNum).map(
+              (item) => info.roadGeometryVerticalForCompLevelNum[item].D
+            ),
+          },
+        ],
+      })
+      chart_algorithm_othcar_scale.setOption(
+        {
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+              type: 'shadow',
+            },
+          },
+          legend: {},
+          grid: {
+            left: '3%',
+            right: '4%',
+            bottom: '3%',
+            containLabel: true,
+          },
+          legend: {},
+          xAxis: {
+            type: 'value',
+          },
+          yAxis: {
+            type: 'category',
+            data: Object.keys(info.otherBehaviorAndAreaPassNum),
+          },
+          series: [
+            {
+              name: '通过',
+              type: 'bar',
+              stack: 'total',
+              label: {
+                show: true,
+              },
+              emphasis: {
+                focus: 'series',
+              },
+              data: Object.keys(info.otherBehaviorAndAreaPassNum).map(
+                (item) => info.otherBehaviorAndAreaPassNum[item].passNum
+              ),
+            },
+            {
+              name: '不通过',
+              type: 'bar',
+              stack: 'total',
+              label: {
+                show: true,
+              },
+              emphasis: {
+                focus: 'series',
+              },
+              data: Object.keys(info.otherBehaviorAndAreaPassNum).map(
+                (item) => info.otherBehaviorAndAreaPassNum[item].unPassNum
+              ),
+            },
+          ],
+        }
+        //   {
+        //   legend: {},
+        //   tooltip: {
+        //     trigger: 'axis',
+        //     axisPointer: {
+        //       type: 'shadow',
+        //     },
+        //   },
+        //   grid: {
+        //     left: '3%',
+        //     right: '4%',
+        //     bottom: '3%',
+        //     containLabel: true,
+        //   },
+        //   yAxis: {
+        //     type: 'value',
+        //   },
+        //   xAxis: {
+        //     type: 'category',
+        //     data: Object.keys(info.otherBehaviorAndAreaPassNum),
+        //   },
+        //   series: [
+        //     {
+        //       name: '不通过',
+        //       type: 'bar',
+        //       stack: 'total',
+        //       label: {
+        //         show: true,
+        //       },
+        //       emphasis: {
+        //         focus: 'series',
+        //       },
+        //       data: Object.keys(info.otherBehaviorAndAreaPassNum).map(item=>{
+        //         return info.otherBehaviorAndAreaPassNum[item]?info.otherBehaviorAndAreaPassNum[item]['unPassNum'] :null
+        //       }),
+        //     },
+        //     {
+        //       name: '通过',
+        //       type: 'bar',
+        //       stack: 'total',
+        //       label: {
+        //         show: true,
+        //       },
+        //       emphasis: {
+        //         focus: 'series',
+        //       },
+        //       data: Object.keys(info.otherBehaviorAndAreaPassNum).map(item=>{
+        //         return info.otherBehaviorAndAreaPassNum[item]?info.otherBehaviorAndAreaPassNum[item]['passNum'] : null
+        //       }),
+        //     },
+        //   ],
+        // }
+      )
+      chart_algorithm_weather_scale.setOption({
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow',
+          },
+        },
+        legend: {},
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        legend: {},
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.weatherAndAreaPassNum),
+        },
+        series: [
+          {
+            name: '通过',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherAndAreaPassNum).map(
+              (item) => info.weatherAndAreaPassNum[item].passNum
+            ),
+          },
+          {
+            name: '不通过',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.weatherAndAreaPassNum).map(
+              (item) => info.weatherAndAreaPassNum[item].unPassNum
+            ),
+          },
+        ],
+      })
+      chart_algorithm_road_scale.setOption({
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            type: 'shadow',
+          },
+        },
+        legend: {},
+        grid: {
+          left: '3%',
+          right: '4%',
+          bottom: '3%',
+          containLabel: true,
+        },
+        legend: {},
+        xAxis: {
+          type: 'value',
+        },
+        yAxis: {
+          type: 'category',
+          data: Object.keys(info.roadPlanePassNum),
+        },
+        series: [
+          {
+            name: '通过',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadPlanePassNum).map(
+              (item) => info.roadPlanePassNum[item].passNum
+            ),
+          },
+          {
+            name: '不通过',
+            type: 'bar',
+            stack: 'total',
+            label: {
+              show: true,
+            },
+            emphasis: {
+              focus: 'series',
+            },
+            data: Object.keys(info.roadPlanePassNum).map(
+              (item) => info.roadPlanePassNum[item].unPassNum
+            ),
+          },
+        ],
+      })
+    },
+    // 下载报告
+    down() {
+      const content = this.$refs.pdfContent
+      html2canvas(content).then((canvas) => {
+        var contentWidth = canvas.width
+        var contentHeight = canvas.height
+        //一页pdf显示html页面生成的canvas高度;
+        var pageHeight = (contentWidth / 592.28) * 841.89
+        //未生成pdf的html页面高度
+        var leftHeight = contentHeight
+        //页面偏移
+        var position = 0
+        //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
+        var imgWidth = 595.28
+        var imgHeight = (592.28 / contentWidth) * contentHeight
+
+        var pageData = canvas.toDataURL('image/jpeg', 1.0)
+
+        var pdf = new jsPDF('', 'pt', 'a4')
+
+        //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
+        //当内容未超过pdf一页显示的范围,无需分页
+
+        if (leftHeight < pageHeight) {
+          pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
+        } else {
+          while (leftHeight > 0) {
+            pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
+            leftHeight -= pageHeight
+            position -= 841.89
+            //避免添加空白页
+            if (leftHeight > 0) {
+              pdf.addPage()
+            }
+          }
+        }
+        pdf.save('报告.pdf')
+      })
+    },
+  },
+}
+</script>
+
+<style lang="less" scoped>
+.report_box {
+  width: 100% !important;
+  height: 100% !important;
+  border: 1px solid #ccc;
+  display: flex !important;
+  flex-direction: column !important;
+  align-items: center !important;
+  .pdf_box {
+    box-sizing: border-box;
+    width: 80%;
+    height: 100%;
+    padding: 20px;
+    display: flex;
+    flex-direction: column;
+    align-content: center;
+    .report_banner {
+      width: 100%;
+      height: 2000px;
+      background-image: url('../../assets/common/image/report_banner.png');
+      background-repeat: no-repeat;
+      background-position: center;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      h1 {
+        margin-top: 350px;
+        font-size: 82px;
+        font-weight: bold;
+        color: #000;
+      }
+      .report_table {
+        margin-top: 250px;
+        width: 500px;
+        height: auto;
+        .table_item {
+          width: 100%;
+          height: 40px;
+          border-bottom: none;
+          display: flex;
+          align-items: center;
+          p {
+            width: 200px;
+            text-align: center;
+            font-size: 18px;
+          }
+          span {
+            width: 100%;
+            text-align: left;
+            padding-left: 50px;
+            font-size: 18px;
+          }
+        }
+      }
+      h4 {
+        margin-top: 100px;
+        font-size: 18px;
+      }
+    }
+    .report_content {
+      box-sizing: border-box;
+      padding: 0 30px;
+      width: 100%;
+      min-height: 500px;
+      h3 {
+        margin-top: 50px;
+        text-align: center;
+        font-size: 26px;
+        color: #3397ff;
+      }
+    }
+  }
+
+  .subtitle {
+    font-size: 18px;
+    font-weight: bold;
+    color: #000;
+    margin: 30px 0 30px;
+  }
+  .text {
+    font-size: 16px;
+    text-indent: 36px;
+    margin-bottom: 10px;
+  }
+  .echart-box {
+    width: 100%;
+    min-height: 300px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    margin-top: 30px;
+  }
+  .echart_desc {
+    font-size: 12px;
+    text-align: center;
+    margin-bottom: 30px;
+  }
+}
+</style>

+ 352 - 0
src/views/workManagement/simulationEdit.vue

@@ -0,0 +1,352 @@
+<template>
+  <router-view v-if="$route.path.includes('multimodeSimulationEdit')"></router-view>
+  <div
+      v-else 
+      style="
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+      padding: 20px 50px;
+    ">
+    <p style="
+        font-size: 18px;
+        font-weight: bold;
+        border-bottom: 1px solid #ccc;
+        padding-bottom: 15px;
+      ">
+      基础信息
+    </p>
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">项目名称</span>
+        <el-input v-model="baseInfo.projectName" size="small" clearable placeholder="请输入" maxlength="60"
+          :disabled="!isEdit">
+        </el-input>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">最大仿真时间(s)</span>
+        <el-input v-model="baseInfo.projectMaxSeconds" size="small" clearable placeholder="请输入" maxlength="60"
+          :disabled="!isEdit">
+        </el-input>
+        <span style="color: red" class="label">(最小是5,最大4500)</span>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">项目描述</span>
+        <el-input v-model="baseInfo.projectDescription" size="small" clearable placeholder="请输入" maxlength="60"
+          :disabled="!isEdit">
+        </el-input>
+      </template>
+    </search-layout>
+    <p style="
+        font-size: 18px;
+        font-weight: bold;
+        border-bottom: 1px solid #ccc;
+        padding-bottom: 15px;
+        margin-top: 30px;
+      ">
+      场景详情
+    </p>
+    <div style="display: flex; justify-content: end; margin: 20px 50px">
+      <el-button v-if="configBtnShow" class="addBtn" icon="el-icon-circle-plus-outline" @click="addConfig"
+        type="primary">添加</el-button>
+      <el-button v-if="configBtnShow" class="addBtn" icon="el-icon-circle-plus-outline" @click="copyConfig"
+        type="primary">复制配置</el-button>
+    </div>
+    <tableList v-if="tableShow" ref="table" style="margin: 0 30px 30px" :columns="columns" :getDataWay="getDataWay"
+      :pagination="pagination" selection index :needSelectedCallBack="true" :selectedCallBack="selectedCallBackB"
+      :selectedAllCallBack="selectedAllCallBackB">
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <i v-if="isEdit" @click="navigatorEdit(scope.row.id)" class="elIcon el-icon-edit-outline" title="编辑">
+          </i>
+          <i v-if="isEdit" @click="deleteScene(scope.row.id)" class="elIcon el-icon-delete" title="删除">
+          </i>
+        </template>
+      </el-table-column>
+    </tableList>
+    <div style="display: flex; justify-content: center; margin-top: 30px">
+      <el-button type="primary" @click="createTask">保存</el-button>
+      <el-button type="primary" @click="saveTask">提交</el-button>
+      <el-button @click="cancelHandle">取消</el-button>
+    </div>
+  </div>
+</template>
+
+<script>
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+export default {
+  name: 'simulationEdit',
+  components: { searchLayout, tableList },
+
+  data () {
+    return {
+      isEdit: true, // 模式, 默认编辑模式 false 预览
+      isUpdate: false, //  更新模式
+      tableShow: false, // 是否显示表格,新增默认不显示
+      configBtnShow: false,
+      projectId: '', // 仿真任务id
+      baseInfo: {
+        projectName: '', // 项目名称
+        projectMaxSeconds: '', // 最大仿真时间
+        projectDescription: '', // 项目描述
+      },
+      selectSceneIds: [], // 选中ids
+      columns: [
+        {
+          label: '地图文件',
+          prop: 'mapName',
+        },
+        {
+          label: '车辆数量',
+          prop: 'carNums',
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        data: this.$api.multimode.queryMulationSceneList,
+        param: {
+          projectId: this.$route.query.id || '',
+        },
+      },
+    }
+  },
+  mounted () {
+    this.isEdit = ['edit', 'add'].includes(this.$route.query.mode)
+      ? true
+      : false
+    this.isUpdate = ['edit', 'preview'].includes(this.$route.query.mode) ? true : false
+    this.configBtnShow = this.$route.query.mode == 'edit' ? true : false
+    if (['edit', 'preview'].includes(this.$route.query.mode)) {
+      this.tableShow = true
+    }
+    if (this.$route.query.id) {
+      this.projectId = this.$route.query.id
+      this.getTaskDetailById(this.$route.query.id)
+    }else{
+      this.$store.commit("getEvaluateTabname", '多仿真任务详情');
+      localStorage.setItem("evaluateTabname", '多仿真任务详情');
+    }
+  },
+  methods: {
+    // 获取任务详情信息
+    getTaskDetailById (id) {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.queryMulationDetailById,
+        data: {
+          projectId: id,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.baseInfo = {
+            projectName: res.info.projectName, // 项目名称
+            projectMaxSeconds: res.info.projectMaxSeconds, // 最大仿真时间
+            projectDescription: res.info.projectDescription, // 项目描述
+          }
+          this.$store.commit("getEvaluateTabname", res.info.projectName);
+          localStorage.setItem("evaluateTabname", res.info.projectName);
+        } else {
+          this.$message.error(res.message || '查询信息失败')
+        }
+      })
+    },
+    deleteScene (id) {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.deleteMulationScene,
+        data: {
+          sceneId: id,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.refreshList({ projectId: this.projectId })
+          this.$message.success('删除成功')
+        } else {
+          this.$message.error(res.message || '删除失败')
+        }
+      })
+    },
+    // 提交
+    saveTask () {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.saveMulationTask,
+        data: {
+          projectId: this.projectId,
+          projectName: this.baseInfo.projectName,
+          projectMaxSeconds: this.baseInfo.projectMaxSeconds,
+          projectDescription: this.baseInfo.projectDescription,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.$message.success('提交成功')
+          this.$router.push({
+            path: '/multimodeSimulation',
+          })
+        } else {
+          this.$message.error(res.message || '提交失败')
+        }
+      })
+    },
+    // 刷新场景列表
+    refreshList (param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    // 复制场景列表
+    copyConfig () {
+      if (this.selectSceneIds.length <= 0) {
+        this.$message.warning('请选择要复制的列表')
+        return
+      } else {
+        this.$axios({
+          method: 'post',
+          url: this.$api.multimode.copyMulationScene,
+          data: {
+            sceneIdList: this.selectSceneIds,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('复制成功')
+            this.refreshList({ projectId: this.projectId })
+          } else {
+            this.$message.error(res.message || '复制失败')
+          }
+        })
+      }
+    },
+    // 新增场景列表
+    addConfig () {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.addMulationSceneList,
+        data: {
+          projectId: this.projectId,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.isEdit = true
+          this.$message.success('添加成功')
+          this.selectSceneIds = []
+          this.refreshList({ projectId: this.projectId })
+        } else {
+          this.$message.error(res.message || '添加失败')
+        }
+      })
+    },
+    // 单列表选中
+    selectedCallBackB (row, type) {
+      // 选中
+      if (type == 1) {
+        const arr = this.selectSceneIds
+        arr.push(row.id)
+        this.selectSceneIds = arr
+      } else {
+        // 取消选中
+        this.selectSceneIds = this.selectSceneIds.filter(
+          (item) => item !== row.id
+        )
+      }
+    },
+    // 全选
+    selectedAllCallBackB (row) {
+      const arr = []
+      row.forEach((item) => {
+        arr.push(item.id)
+      })
+      this.selectSceneIds = arr
+    },
+    // 创建仿真任务
+    createTask () {
+      // 编辑,更新
+      if (this.isUpdate) {
+        this.$axios({
+          method: 'post',
+          url: this.$api.multimode.updateMulationSceneList,
+          data: {
+            projectId: this.projectId,
+            projectName: this.baseInfo.projectName,
+            projectMaxSeconds: this.baseInfo.projectMaxSeconds,
+            projectDescription: this.baseInfo.projectDescription,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('仿真任务更新成功')
+          } else {
+            this.$message.error(res.message || '任务更新失败')
+          }
+        })
+      } else {
+        // 创建
+        if (
+          this.baseInfo.projectName &&
+          this.baseInfo.projectMaxSeconds &&
+          this.baseInfo.projectDescription
+        ) {
+          this.$axios({
+            method: 'post',
+            url: this.$api.multimode.createMulationTask,
+            data: {
+              projectName: this.baseInfo.projectName,
+              projectMaxSeconds: this.baseInfo.projectMaxSeconds,
+              projectDescription: this.baseInfo.projectDescription,
+            },
+          }).then((res) => {
+            if (res.code == 200) {
+              this.$message.success('仿真任务创建成功')
+              this.getDataWay.param.projectId = res.info.projectId
+              this.projectId = res.info.projectId
+              this.isEdit = false
+              this.configBtnShow = true
+              this.tableShow = true
+              this.isUpdate = true
+            } else {
+              this.$message.error(res.message || '查询信息失败')
+            }
+          })
+        } else {
+          this.$message.warning('请填写完整信息后再保存')
+        }
+      }
+    },
+    cancelHandle () {
+      this.$router.back()
+    },
+    // 跳转场景评价
+    toEvaluate (row) {
+      this.$router.push({
+        path: '/multimodeSimulation/simulationEvaluate/evaluationResults',
+        query: { id: row.id },
+      })
+    },
+    navigatorEdit (id) {
+      this.$store.commit("getEvaluateTabname", this.baseInfo.projectName);
+      localStorage.setItem("evaluateTabname", this.baseInfo.projectName);
+      this.$router.push({
+        name: 'multimodeSimulationEdit',
+        query: {
+          sceneId: id,
+          projectId: this.projectId
+        },
+      })
+    },
+  },
+}
+</script>

+ 435 - 0
src/views/workManagement/simulationEvaluate.vue

@@ -0,0 +1,435 @@
+<template>
+  <router-view v-if="$route.path.includes('evaluationResults')"></router-view>
+  <div
+    v-else
+    style="
+      width: 100%;
+      display: flex;
+      flex-direction: column;
+      padding: 20px 50px;
+    "
+  >
+    <p
+      style="
+        font-size: 18px;
+        font-weight: bold;
+        border-bottom: 1px solid #ccc;
+        padding-bottom: 15px;
+      "
+    >
+      基础信息
+    </p>
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">项目名称</span>
+        <el-input
+          v-model="baseInfo.projectName"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          :disabled="!isEdit"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem3">
+        <span class="label">最大仿真时间(s)</span>
+        <el-input
+          v-model="baseInfo.projectMaxSeconds"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          :disabled="!isEdit"
+        >
+        </el-input>
+        <span style="color: red" class="label">(最小是5,最大4500)</span>
+      </template>
+      <template slot="searchItem8">
+        <span class="label">项目描述</span>
+        <el-input
+          v-model="baseInfo.projectDescription"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+          :disabled="!isEdit"
+        >
+        </el-input>
+      </template>
+    </search-layout>
+    <p
+      style="
+        font-size: 18px;
+        font-weight: bold;
+        border-bottom: 1px solid #ccc;
+        padding-bottom: 15px;
+        margin-top: 30px;
+      "
+    >
+      场景详情
+    </p>
+    <div style="display: flex; justify-content: end; margin: 20px 50px">
+      <el-button
+        v-if="configBtnShow"
+        class="addBtn"
+        icon="el-icon-circle-plus-outline"
+        @click="addConfig"
+        type="primary"
+        >添加</el-button
+      >
+      <el-button
+        v-if="configBtnShow"
+        class="addBtn"
+        icon="el-icon-circle-plus-outline"
+        @click="copyConfig"
+        type="primary"
+        >复制配置</el-button
+      >
+    </div>
+    <tableList
+      v-if="tableShow"
+      ref="table"
+      style="margin: 0 30px 30px"
+      :columns="columns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      selection
+      index
+      :needSelectedCallBack="true"
+      :selectedCallBack="selectedCallBackB"
+      :selectedAllCallBack="selectedAllCallBackB"
+    >
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <span
+            v-if="!isEdit && ![2, 4, 6, null].includes(scope.row.taskStatus)"
+            @click="toEvaluate(scope.row)"
+            class="elIcon"
+          >
+            评价结果
+          </span>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+    </tableList>
+    <!-- <div style="display: flex; justify-content: center; margin-top: 30px">
+      <el-button type="primary" @click="createTask">保存</el-button>
+      <el-button type="primary" @click="saveTask">提交</el-button>
+      <el-button @click="cancelHandle">取消</el-button>
+    </div> -->
+  </div>
+</template>
+
+<script>
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+export default {
+  name: 'simulationEvaluate',
+  components: { searchLayout, tableList },
+
+  data() {
+    return {
+      isEdit: true, // 模式, 默认编辑模式 false 预览
+      isUpdate: false, //  更新模式
+      tableShow: false, // 是否显示表格,新增默认不显示
+      configBtnShow: false,
+      projectId: '', // 仿真任务id
+      baseInfo: {
+        projectName: '', // 项目名称
+        projectMaxSeconds: '', // 最大仿真时间
+        projectDescription: '', // 项目描述
+      },
+      selectSceneIds: [], // 选中ids
+      columns: [
+        {
+          label: '地图文件',
+          prop: 'mapName',
+        },
+        {
+          label: '车辆数量',
+          prop: 'carNums',
+        },
+        {
+          label: '运行开始时间',
+          prop: 'startTimeStr',
+        },
+        {
+          label: '运行结束时间',
+          prop: 'endTimeStr',
+        },
+        {
+          label: '运行状态',
+          prop: 'taskStatus',
+          formatter(row) {
+            switch (Number(row.taskStatus)) {
+              case 2:
+                return '手动终止'
+              case 3:
+                return '完成'
+              case 4:
+                return '自动终止'
+              case 5:
+                return '待分析'
+              case 6:
+                return 'terminated'
+              default:
+                return '-'
+            }
+          },
+        },
+        {
+          label: '运行结果',
+          prop: 'taskStatus',
+          formatter(row) {
+            if ([3, 5, '3', '5'].includes(row.taskStatus)) {
+              return '成功'
+            } else {
+              return '-'
+            }
+          },
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        data: this.$api.multimode.queryMulationSceneList,
+        param: {
+          projectId: this.$route.query.id || '',
+        },
+      },
+    }
+  },
+  mounted() {
+    this.isEdit = ['edit', 'add'].includes(this.$route.query.mode)
+      ? true
+      : false
+    this.isUpdate = ['edit', 'preview'].includes(this.$route.query.mode)
+      ? true
+      : false
+    this.configBtnShow = this.$route.query.mode == 'edit' ? true : false
+    if (['edit', 'preview'].includes(this.$route.query.mode)) {
+      this.tableShow = true
+    }
+    if (this.$route.query.id) {
+      this.projectId = this.$route.query.id
+      this.getTaskDetailById(this.$route.query.id)
+    }
+  },
+  methods: {
+    // 获取任务详情信息
+    getTaskDetailById(id) {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.queryMulationDetailById,
+        data: {
+          projectId: id,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.baseInfo = {
+            projectName: res.info.projectName, // 项目名称
+            projectMaxSeconds: res.info.projectMaxSeconds, // 最大仿真时间
+            projectDescription: res.info.projectDescription, // 项目描述
+          }
+        } else {
+          this.$message.error(res.message || '查询信息失败')
+        }
+      })
+    },
+    deleteScene(id) {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.deleteMulationScene,
+        data: {
+          sceneId: id,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.refreshList({ projectId: this.projectId })
+          this.$message.success('删除成功')
+        } else {
+          this.$message.error(res.message || '删除失败')
+        }
+      })
+    },
+    // 提交
+    saveTask() {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.saveMulationTask,
+        data: {
+          projectId: this.projectId,
+          projectName: this.baseInfo.projectName,
+          projectMaxSeconds: this.baseInfo.projectMaxSeconds,
+          projectDescription: this.baseInfo.projectDescription,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.$message.success('提交成功')
+          this.$router.push({
+            path: '/multimodeSimulation',
+          })
+        } else {
+          this.$message.error(res.message || '提交失败')
+        }
+      })
+    },
+    // 刷新场景列表
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    // 复制场景列表
+    copyConfig() {
+      if (this.selectSceneIds.length <= 0) {
+        this.$message.warning('请选择要复制的列表')
+        return
+      } else {
+        this.$axios({
+          method: 'post',
+          url: this.$api.multimode.copyMulationScene,
+          data: {
+            sceneIdList: this.selectSceneIds,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('复制成功')
+            this.refreshList({ projectId: this.projectId })
+          } else {
+            this.$message.error(res.message || '复制失败')
+          }
+        })
+      }
+    },
+    // 新增场景列表
+    addConfig() {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.addMulationSceneList,
+        data: {
+          projectId: this.projectId,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.isEdit = true
+          this.$message.success('添加成功')
+          this.selectSceneIds = []
+          this.refreshList({ projectId: this.projectId })
+        } else {
+          this.$message.error(res.message || '添加失败')
+        }
+      })
+    },
+    // 单列表选中
+    selectedCallBackB(row, type) {
+      // 选中
+      if (type == 1) {
+        const arr = this.selectSceneIds
+        arr.push(row.id)
+        this.selectSceneIds = arr
+      } else {
+        // 取消选中
+        this.selectSceneIds = this.selectSceneIds.filter(
+          (item) => item !== row.id
+        )
+      }
+    },
+    // 全选
+    selectedAllCallBackB(row) {
+      const arr = []
+      row.forEach((item) => {
+        arr.push(item.id)
+      })
+      this.selectSceneIds = arr
+    },
+    // 创建仿真任务
+    createTask() {
+      // 编辑,更新
+      if (this.isUpdate) {
+        this.$axios({
+          method: 'post',
+          url: this.$api.multimode.updateMulationSceneList,
+          data: {
+            projectId: this.projectId,
+            projectName: this.baseInfo.projectName,
+            projectMaxSeconds: this.baseInfo.projectMaxSeconds,
+            projectDescription: this.baseInfo.projectDescription,
+          },
+        }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success('仿真任务更新成功')
+          } else {
+            this.$message.error(res.message || '任务更新失败')
+          }
+        })
+      } else {
+        // 创建
+        if (
+          this.baseInfo.projectName &&
+          this.baseInfo.projectMaxSeconds &&
+          this.baseInfo.projectDescription
+        ) {
+          this.$axios({
+            method: 'post',
+            url: this.$api.multimode.createMulationTask,
+            data: {
+              projectName: this.baseInfo.projectName,
+              projectMaxSeconds: this.baseInfo.projectMaxSeconds,
+              projectDescription: this.baseInfo.projectDescription,
+            },
+          }).then((res) => {
+            if (res.code == 200) {
+              this.$message.success('仿真任务创建成功')
+              this.getDataWay.param.projectId = res.info.projectId
+              this.projectId = res.info.projectId
+              this.isEdit = false
+              this.configBtnShow = true
+              this.tableShow = true
+              this.isUpdate = true
+            } else {
+              this.$message.error(res.message || '查询信息失败')
+            }
+          })
+        } else {
+          this.$message.warning('请填写完整信息后再保存')
+        }
+      }
+    },
+    cancelHandle() {
+      this.$router.back()
+    },
+    // 跳转场景评价
+    toEvaluate(row) {
+      this.$router.push({
+        path: '/multimodeSimulation/simulationEvaluate/evaluationResults',
+        query: { id: row.id },
+      })
+    },
+    navigatorEdit(id) {
+      this.$router.push({
+        name: 'multimodeSimulationEdit',
+        query: {
+          sceneId: id,
+          projectId: this.projectId,
+        },
+      })
+    },
+  },
+}
+</script>

+ 287 - 0
src/views/workManagement/simulationHome.vue

@@ -0,0 +1,287 @@
+<template>
+    <router-view v-if="$route.path.includes('simulationMap')"></router-view>
+    <router-view v-else-if="$route.path.includes('simulationEdit')"></router-view>
+    <router-view v-else-if="$route.path.includes('simulationEvaluate')"></router-view>
+
+    
+  <div v-else class="multimodeSimulation">
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">项目ID</span>
+        <el-input
+          v-model="searchParams.projectId"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem1">
+        <span class="label">项目名称</span>
+        <el-input
+          v-model="searchParams.projectName"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem4">
+        <span class="label">项目进度</span>
+        <el-select
+          v-model="searchParams.projectStatus"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+        >
+          <el-option
+            v-for="(item, idx) in [
+              { label: '未开始', value: '0' },
+              { label: '运行中', value: '1' },
+              { label: '已终止', value: '2' },
+              { label: '已完成', value: '3' },
+            ]"
+            :label="item.label"
+            :value="item.value"
+            :key="idx"
+          ></el-option>
+        </el-select>
+      </template>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+        <el-button type="primary" @click="doReset">重置</el-button>
+      </template>
+    </search-layout>
+    <div></div>
+    <div style="display: flex; justify-content: end; margin: 20px 50px">
+      <el-button
+        class="addBtn"
+        icon="el-icon-circle-plus-outline"
+        @click="mapConfig"
+        type="primary"
+        >地图管理</el-button>
+      <el-button
+        class="addBtn"
+        icon="el-icon-circle-plus-outline"
+        @click="addConfig"
+        type="primary"
+        >新增</el-button
+      >
+    </div>
+    <tableList
+      ref="table"
+      style="margin: 0 30px 30px"
+      :columns="simulationColumns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      index
+    >
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <!-- <span v-if="scope.row.projectStatus==1" @click="" class="elIcon"> 查看 </span> -->
+          <i
+            v-if="scope.row.projectStatus == '3'"
+            @click="jumpEvaluate('preview',scope.row.id,scope)"
+            class="el-icon-view elIcon"
+            title="查看"
+          >
+          </i>
+          <i
+            v-if="scope.row.projectStatus == '0'"
+            @click="jumpDetailPage('edit',scope.row.id)"
+            class="el-icon-edit-outline elIcon"
+            title="编辑"
+          >
+          </i>
+          <i @click="downloadTask(scope.row)" v-if="scope.row.projectStatus == '3'" class="el-icon-download elIcon" title="下载">
+          </i>
+          <i @click="deleteById(scope.row)" class="elIcon el-icon-delete" title="删除">  </i>
+          <i
+            v-if="scope.row.projectStatus == '2'"
+            @click="updateTask(scope.row)"
+            class="elIcon myIconPause"
+            title="终止"
+          >
+            
+          </i>
+
+          <i
+            v-if="scope.row.projectStatus == '0'"
+            @click="updateTask(scope.row)"
+            class="elIcon el-icon-refresh-right"
+            title="运行"
+          >
+          </i>
+        </template>
+      </el-table-column>
+    </tableList>
+  </div>
+</template>
+<script>
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+import { mapState } from 'vuex'
+export default {
+  name: 'multimodeSimulation', // 多模式仿真
+  components: { searchLayout, tableList },
+  data() {
+    return {
+      searchParams: {
+        projectId: '', // 项目id
+        projectName: '', // 项目名称
+        projectStatus: '', // 项目进度
+      },
+      // 多模式仿真表头
+      simulationColumns: [
+        {
+          label: '项目ID',
+          prop: 'id',
+        },
+        {
+          label: '项目名称',
+          prop: 'projectName',
+        },
+        {
+          label: '场景数量',
+          prop: 'sceneNums',
+        },
+        {
+          label: '创建时间',
+          prop: 'createTime',
+        },
+        {
+          label: '进度',
+          prop: 'projectStatusValue',
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        data: this.$api.multimode.queryMulationList,
+        param: {},
+      },
+    }
+  },
+  methods: {
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doSearch() {
+      this.refreshList({ ...this.searchParams })
+    },
+    doReset() {
+      this.searchParams = {
+        projectId: '', // 项目id
+        projectName: '', // 项目名称
+        projectStatus: '', // 项目进度
+      }
+      this.doSearch()
+      // this.refreshList()
+    },
+    // 仿真任务状态更新
+    updateTask(row) {
+      const { id, projectStatus } = row
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.updateMulationStatus,
+        data: {
+          projectId: id,
+          projectStatus: projectStatus == 0 || 2 ? 1 : 2,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.$message.success('状态更新成功')
+          this.doSearch()
+        } else {
+          this.$message.error(res.message || '更新失败')
+        }
+      })
+    },
+    // 删除仿真列表
+    deleteById(row) {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.deleteMulationById,
+        data: { projectId: row.id },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.$message.success('删除成功')
+          this.doSearch()
+        } else {
+          this.$message.error(res.message || '删除失败')
+        }
+      })
+    },
+    // 下载仿真任务
+    downloadTask(row){
+      this.$axios({
+        method: 'get',
+        url: `${this.$api.multimode.downloadMulation}?projectId=${row.id}`,
+        responseType: "blob", 
+      }).then((res) => {
+       this.$blobZipDown(res,row.projectName)
+      })
+    },
+    addConfig() {
+      this.$router.push({
+        path: '/multimodeSimulation/simulationEdit',
+        query: { mode: 'add' },
+      })
+    },
+    // 跳转地图管理
+    mapConfig(){
+      this.$router.push({
+        path: "/multimodeSimulation/simulationMap",
+      })
+    },
+    // 跳转评价页面
+    jumpEvaluate(mode,id,opt){
+      this.$store.commit("getEvaluateTabname", opt.row.projectName);
+      localStorage.setItem("evaluateTabname", opt.row.projectName);
+      this.$router.push({
+        path: '/multimodeSimulation/simulationEvaluate',
+        query: { mode,id },
+      })
+    },
+    jumpDetailPage(mode,id) {
+      this.$router.push({
+        path: '/multimodeSimulation/simulationEdit',
+        query: { mode,id },
+      })
+    },
+  },
+}
+</script>
+<style lang='less' scoped>
+// @import './common/util.less';
+.naturalDrivingScenarioListPanel {
+  .inputBox {
+    .label {
+      min-width: 75px;
+    }
+  }
+
+  .btnsPanel {
+    text-align: right;
+  }
+}
+</style>

+ 371 - 0
src/views/workManagement/simulationMap.vue

@@ -0,0 +1,371 @@
+<template>
+  <div class="multimodeSimulation">
+    <search-layout :needBox="true">
+      <template slot="searchItem1">
+        <span class="label">地图名称</span>
+        <el-input
+          v-model="searchParams.mapName"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+        >
+        </el-input>
+      </template>
+      <template slot="searchItem1">
+        <span class="label">地图描述</span>
+        <el-input
+          v-model="searchParams.mapDescription"
+          size="small"
+          clearable
+          placeholder="请输入"
+          maxlength="60"
+        >
+        </el-input>
+      </template>
+      <template slot="searchBtn1">
+        <el-button type="primary" @click="doSearch">查询</el-button>
+      </template>
+    </search-layout>
+    <div></div>
+    <div style="display: flex; justify-content: end; margin: 20px 50px">
+      <el-button
+        class="addBtn"
+        icon="el-icon-arrow-left"
+        @click="routeBack"
+        type="primary"
+        >返回任务</el-button
+      >
+      <el-button
+        class="addBtn"
+        icon="el-icon-circle-plus-outline"
+        @click="addConfig"
+        type="primary"
+        >新增</el-button
+      >
+    </div>
+    <tableList
+      ref="table"
+      style="margin: 0 30px 30px"
+      :columns="mapColumns"
+      :getDataWay="getDataWay"
+      :pagination="pagination"
+      index
+    >
+      <el-table-column label="操作" slot="cgInfos" align="center" width="180">
+        <template v-slot="scope">
+          <i @click="editMapDetail(scope.row)" class="elIcon el-icon-edit-outline" title="编辑">  </i>
+          <i @click="deleteMapById(scope.row)" class="elIcon el-icon-delete" title="删除">  </i>
+        </template>
+      </el-table-column>
+    </tableList>
+    <el-dialog
+      :title="isEdit ? '编辑地图' : '新增地图'"
+      :visible.sync="editVisible"
+      width="480px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+      @close="closeDialog"
+    >
+      <el-form
+        ref="editInfo"
+        :model="editInfo"
+        label-width="150px"
+        style="display: flex; flex-wrap: wrap; justify-content: space-between"
+      >
+        <el-form-item label="地图名称">
+          <el-input
+            v-model="editInfo.mapName"
+            placeholder="请输入"
+            :disabled="isEdit"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="轨迹数量">
+          <el-input v-model="editInfo.pathNum" placeholder="请输入"></el-input>
+        </el-form-item>
+        <el-form-item label="地图描述">
+          <el-input
+            v-model="editInfo.mapDescription"
+            placeholder="请输入"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="OpenDrive文件" v-if="!isEdit">
+          <el-upload
+            :multiple="false"
+            action=""
+            class="upload-demo"
+            list-type="card"
+            :file-list="openFile"
+            :http-request="(e) => uploadHandle('opendrive', e)"
+            :on-remove="() => fileRemove('opendrive')"
+          >
+            <el-button size="small" type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+        <el-form-item label="Json文件" v-if="!isEdit">
+          <el-upload
+            :multiple="false"
+            action=""
+            class="upload-demo"
+            list-type="card"
+            :file-list="jsonFile"
+            :http-request="(e) => uploadHandle('json', e)"
+            :on-remove="() => fileRemove('json')"
+          >
+            <el-button size="small" type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+        <el-form-item label="Osgb文件" v-if="!isEdit">
+          <el-upload
+            :multiple="false"
+            action=""
+            class="upload-demo"
+            list-type="card"
+            :file-list="osgbFile"
+            :http-request="(e) => uploadHandle('osgb', e)"
+            :on-remove="() => fileRemove('osgb')"
+          >
+            <el-button size="small" type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+      </el-form>
+      <div style="width: 100%; display: flex; justify-content: center">
+        <el-button @click="closeDialog">取消</el-button>
+        <el-button @click="addMulationMap" type="primary">确认</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import searchLayout from '@/components/grid/searchLayout'
+import tableList from '@/components/grid/TableList'
+export default {
+  name: 'simulationMap', // 多模式仿真地图
+  components: { searchLayout, tableList },
+  data() {
+    return {
+      searchParams: {
+        mapName: '', // 地图名称
+        mapDescription: '', // 地图描述
+      },
+      selectMapId: '', // 当前编辑地图id
+      editVisible: false, // 地图编辑
+      isEdit: false,
+      openFile: [], // opendrive文件
+      jsonFile: [], // json文件
+      osgbFile: [], // osgb文件
+      // 地图管理表头
+      mapColumns: [
+        {
+          label: '地图名称',
+          prop: 'mapName',
+        },
+        {
+          label: '轨迹数量',
+          prop: 'pathNum',
+        },
+        {
+          label: '地图描述',
+          prop: 'mapDescription',
+        },
+        {
+          label: '创建时间',
+          prop: 'createTime',
+        },
+        {
+          label: '操作',
+          prop: 'cgInfos',
+          template: true,
+        },
+      ],
+      editInfo: {
+        mapName: '',
+        mapDescription: '',
+        pathNum: '',
+      }, // 编辑数据
+      pagination: {
+        //分页使用
+        currentPage: 1,
+        pageSize: 10,
+        position: 'right',
+        pageSizes: [10, 30, 50, 100, 200],
+        layout: 'sizes, total, prev, pager, next, jumper',
+      },
+      getDataWay: {
+        //加载表格数据
+        dataType: 'url',
+        type: 'post',
+        data: this.$api.multimode.queryMulationMapList,
+        param: {},
+      },
+    }
+  },
+  methods: {
+    refreshList(param) {
+      param
+        ? this.$refs['table'].loadData(param)
+        : this.$refs['table'].loadData()
+    },
+    doSearch() {
+      this.refreshList({ ...this.searchParams })
+    },
+    doReset() {
+      this.searchParams = {
+        mapName: '', // 地图名称
+        mapDescription: '', // 地图描述
+      }
+      this.refreshList()
+    },
+
+    uploadHandle(type, e) {
+      switch (type) {
+        case 'opendrive':
+          this.openFile = [e.file]
+          break
+        case 'json':
+          this.jsonFile = [e.file]
+          break
+        case 'osgb':
+          this.osgbFile = [e.file]
+          break
+      }
+    },
+    // 地图编辑
+    editMapDetail(row) {
+      const { id } = row
+      this.selectMapId = id
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.queryMapDetailByID,
+        data: {
+          mapId: id,
+        },
+      }).then((res) => {
+        if (res.code == 200) {
+          this.editInfo = {
+            mapName: res.info.mapName,
+            mapDescription: res.info.mapDescription,
+            pathNum: res.info.pathNum,
+          }
+          this.editVisible = true
+          this.isEdit = true
+        } else {
+          this.$message.error(res.message || '查询详情信息失败')
+        }
+      })
+    },
+    fileRemove(type) {
+      switch (type) {
+        case 'opendrive':
+          this.openFile = []
+          break
+        case 'json':
+          this.jsonFile = []
+          break
+        case 'osgb':
+          this.osgbFile = []
+          break
+      }
+    },
+    // 更新地图
+    updateMap() {
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.updateMapDetail,
+        data: {
+          mapId: this.selectMapId,
+          pathNum:this.editInfo.pathNum,
+          mapDescription:this.editInfo.mapDescription
+        },
+      }).then((res) => {
+        if(res.code ==200){
+          this.$message.success('地图更新成功')
+          this.editVisible = false
+          this.refreshList({ ...this.searchParams })
+        }else{
+          this.$message.error(res.message || '地图更新失败')
+        }
+      })
+    },
+    deleteMapById(row){
+      const { id } = row
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.deleteMapById,
+        data: {
+          mapId: id,
+        },
+      }).then((res) => {
+        if(res.code ==200){
+          this.$message.success('删除成功')
+          this.refreshList({ ...this.searchParams })
+        }else{
+          this.$message.error(res.message || '删除失败')
+        }
+      })
+    },
+    addMulationMap() {
+      if (this.isEdit) {
+        this.updateMap()
+        return
+      }
+      // addMulationMap
+      let formData = new FormData()
+      const json = JSON.stringify(this.editInfo)
+      const blob = new Blob([json], {
+        type: 'application/json',
+      })
+      formData.append('content', blob)
+      formData.append('fileJson', this.jsonFile[0])
+      formData.append('fileDriver', this.openFile[0])
+      formData.append('fileOsgb', this.osgbFile[0])
+      this.$axios({
+        method: 'post',
+        url: this.$api.multimode.addMulationMap,
+        data: formData,
+        withCredentials: true,
+        headers: {
+          'Content-type': 'multipart/form-data',
+        },
+      }).then((res) => {
+        if(res.code ==200){
+          this.$message.success('新增成功')
+          this.editVisible = false
+          this.refreshList({ ...this.searchParams })
+        }else{
+          this.$message.error(res.message || '新增失败')
+        }
+      })
+    },
+    addConfig() {
+      this.editVisible = true
+      this.isEdit = false
+    },
+    routeBack(){
+      this.$router.back()
+    },
+    closeDialog() {
+      this.editInfo = {
+        mapName: '',
+        mapDescription: '',
+        pathNum: '',
+      }
+      this.editVisible = false
+    },
+  },
+}
+</script>
+<style lang='less' scoped>
+// @import './common/util.less';
+.naturalDrivingScenarioListPanel {
+  .inputBox {
+    .label {
+      min-width: 75px;
+    }
+  }
+
+  .btnsPanel {
+    text-align: right;
+  }
+}
+</style>

+ 7 - 7
vue.config.js

@@ -24,7 +24,7 @@ module.exports = {
     productionSourceMap: false,
     chainWebpack: config => {
         config
-            .entry('./src/main.js')
+            .entry(['./src/main'])
             .add('babel-polyfill');
         config.resolve.symlinks(true); // 修复热更新失效
         // 添加别名
@@ -72,12 +72,12 @@ module.exports = {
         }
     },
     devServer: { //跨域
-        port: "8082", //端口号
-        open: true, //配置自动启动浏览器
+        port: "8002", //端口号
+        open: false, //配置自动启动浏览器
         hot: true,
         proxy: { // 配置跨域处理 可以设置多个
             '/simulation/oauth': {
-                target: 'http://36.110.106.156', // online-new
+                target: 'http://60.205.245.110:7001', // online-new
                 changeOrigin: true,
                 secure: false, // 如果是https接口,需要配置这个参数
                 pathRewrite: {
@@ -85,7 +85,7 @@ module.exports = {
                 }
             },
             '/simulation/resource/common': {
-                target: 'http://36.110.106.156', // online-new
+                target: 'http://60.205.245.110:8001', // online-new
                 changeOrigin: true,
                 secure: false, // 如果是https接口,需要配置这个参数
                 pathRewrite: {
@@ -93,7 +93,7 @@ module.exports = {
                 }
             },
             '/simulation/resource/server': {
-                target: 'http://36.110.106.156', // online-new
+                target: 'http://60.205.245.110:8005', // online-new
                 changeOrigin: true,
                 secure: false, // 如果是https接口,需要配置这个参数
                 pathRewrite: {
@@ -101,7 +101,7 @@ module.exports = {
                 }
             },
             '/simulation/resource/video': {
-                target: 'http://36.110.106.156', // online-new
+                target: 'http://60.205.245.110:8007', // online-new
                 changeOrigin: true,
                 secure: false, // 如果是https接口,需要配置这个参数
                 pathRewrite: {

+ 10612 - 0
yarn.lock

@@ -0,0 +1,10612 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+  integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+  dependencies:
+    "@jridgewell/gen-mapping" "^0.3.5"
+    "@jridgewell/trace-mapping" "^0.3.24"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2":
+  version "7.24.2"
+  resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae"
+  integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==
+  dependencies:
+    "@babel/highlight" "^7.24.2"
+    picocolors "^1.0.0"
+
+"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a"
+  integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==
+
+"@babel/core@^7.0.0", "@babel/core@^7.12.10":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/core/-/core-7.24.4.tgz#1f758428e88e0d8c563874741bc4ffc4f71a4717"
+  integrity sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==
+  dependencies:
+    "@ampproject/remapping" "^2.2.0"
+    "@babel/code-frame" "^7.24.2"
+    "@babel/generator" "^7.24.4"
+    "@babel/helper-compilation-targets" "^7.23.6"
+    "@babel/helper-module-transforms" "^7.23.3"
+    "@babel/helpers" "^7.24.4"
+    "@babel/parser" "^7.24.4"
+    "@babel/template" "^7.24.0"
+    "@babel/traverse" "^7.24.1"
+    "@babel/types" "^7.24.0"
+    convert-source-map "^2.0.0"
+    debug "^4.1.0"
+    gensync "^1.0.0-beta.2"
+    json5 "^2.2.3"
+    semver "^6.3.1"
+
+"@babel/generator@^7.24.1", "@babel/generator@^7.24.4":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498"
+  integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==
+  dependencies:
+    "@babel/types" "^7.24.0"
+    "@jridgewell/gen-mapping" "^0.3.5"
+    "@jridgewell/trace-mapping" "^0.3.25"
+    jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
+  integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15":
+  version "7.22.15"
+  resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956"
+  integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==
+  dependencies:
+    "@babel/types" "^7.22.15"
+
+"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6":
+  version "7.23.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991"
+  integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==
+  dependencies:
+    "@babel/compat-data" "^7.23.5"
+    "@babel/helper-validator-option" "^7.23.5"
+    browserslist "^4.22.2"
+    lru-cache "^5.1.1"
+    semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz#c806f73788a6800a5cfbbc04d2df7ee4d927cce3"
+  integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.22.5"
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-function-name" "^7.23.0"
+    "@babel/helper-member-expression-to-functions" "^7.23.0"
+    "@babel/helper-optimise-call-expression" "^7.22.5"
+    "@babel/helper-replace-supers" "^7.24.1"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    semver "^6.3.1"
+
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5":
+  version "7.22.15"
+  resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1"
+  integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.22.5"
+    regexpu-core "^5.3.1"
+    semver "^6.3.1"
+
+"@babel/helper-define-polyfill-provider@^0.6.1":
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz#fadc63f0c2ff3c8d02ed905dcea747c5b0fb74fd"
+  integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==
+  dependencies:
+    "@babel/helper-compilation-targets" "^7.22.6"
+    "@babel/helper-plugin-utils" "^7.22.5"
+    debug "^4.1.1"
+    lodash.debounce "^4.0.8"
+    resolve "^1.14.2"
+
+"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+  integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
+"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0":
+  version "7.23.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
+  integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+  dependencies:
+    "@babel/template" "^7.22.15"
+    "@babel/types" "^7.23.0"
+
+"@babel/helper-hoist-variables@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+  integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-member-expression-to-functions@^7.23.0":
+  version "7.23.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366"
+  integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==
+  dependencies:
+    "@babel/types" "^7.23.0"
+
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3":
+  version "7.24.3"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128"
+  integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==
+  dependencies:
+    "@babel/types" "^7.24.0"
+
+"@babel/helper-module-transforms@^7.23.3":
+  version "7.23.3"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1"
+  integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-module-imports" "^7.22.15"
+    "@babel/helper-simple-access" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    "@babel/helper-validator-identifier" "^7.22.20"
+
+"@babel/helper-optimise-call-expression@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
+  integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+  version "7.24.0"
+  resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz#945681931a52f15ce879fd5b86ce2dae6d3d7f2a"
+  integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==
+
+"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0"
+  integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.22.5"
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-wrap-function" "^7.22.20"
+
+"@babel/helper-replace-supers@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1"
+  integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-member-expression-to-functions" "^7.23.0"
+    "@babel/helper-optimise-call-expression" "^7.22.5"
+
+"@babel/helper-simple-access@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
+  integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
+  integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-split-export-declaration@^7.22.6":
+  version "7.22.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+  integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+  dependencies:
+    "@babel/types" "^7.22.5"
+
+"@babel/helper-string-parser@^7.23.4":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e"
+  integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==
+
+"@babel/helper-validator-identifier@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+  integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
+"@babel/helper-validator-option@^7.23.5":
+  version "7.23.5"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
+  integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
+
+"@babel/helper-wrap-function@^7.22.20":
+  version "7.22.20"
+  resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569"
+  integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==
+  dependencies:
+    "@babel/helper-function-name" "^7.22.5"
+    "@babel/template" "^7.22.15"
+    "@babel/types" "^7.22.19"
+
+"@babel/helpers@^7.24.4":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.4.tgz#dc00907fd0d95da74563c142ef4cd21f2cb856b6"
+  integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==
+  dependencies:
+    "@babel/template" "^7.24.0"
+    "@babel/traverse" "^7.24.1"
+    "@babel/types" "^7.24.0"
+
+"@babel/highlight@^7.24.2":
+  version "7.24.2"
+  resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26"
+  integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.22.20"
+    chalk "^2.4.2"
+    js-tokens "^4.0.0"
+    picocolors "^1.0.0"
+
+"@babel/parser@^7.23.5", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4", "@babel/parser@^7.7.0":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88"
+  integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==
+
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz#6125f0158543fb4edf1c22f322f3db67f21cb3e1"
+  integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf"
+  integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3"
+  integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+    "@babel/plugin-transform-optional-chaining" "^7.24.1"
+
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988"
+  integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-proposal-async-generator-functions@^7.2.0":
+  version "7.20.7"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
+  integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.20.2"
+    "@babel/helper-remap-async-to-generator" "^7.18.9"
+    "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-proposal-class-properties@^7.0.0":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
+  integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-proposal-decorators@^7.1.0":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz#bab2b9e174a2680f0a80f341f3ec70f809f8bb4b"
+  integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.24.1"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-decorators" "^7.24.1"
+
+"@babel/plugin-proposal-json-strings@^7.2.0":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b"
+  integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-proposal-object-rest-spread@^7.3.4":
+  version "7.20.7"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a"
+  integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==
+  dependencies:
+    "@babel/compat-data" "^7.20.5"
+    "@babel/helper-compilation-targets" "^7.20.7"
+    "@babel/helper-plugin-utils" "^7.20.2"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+    "@babel/plugin-transform-parameters" "^7.20.7"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.2.0":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
+  integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
+  version "7.21.0-placeholder-for-preset-env.2"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
+  integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
+
+"@babel/plugin-proposal-unicode-property-regex@^7.2.0":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
+  integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-syntax-async-generators@^7.2.0", "@babel/plugin-syntax-async-generators@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+  integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+  version "7.12.13"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+  integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+  integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-decorators@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa"
+  integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+  integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+  integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-import-assertions@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971"
+  integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-syntax-import-attributes@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093"
+  integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+  integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+  integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10"
+  integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+  integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+  integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+  integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.2.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+  integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.2.0", "@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+  integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+  integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+  integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+  integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
+  integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-arrow-functions@^7.2.0", "@babel/plugin-transform-arrow-functions@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27"
+  integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-async-generator-functions@^7.24.3":
+  version "7.24.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89"
+  integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-remap-async-to-generator" "^7.22.20"
+    "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-transform-async-to-generator@^7.24.1", "@babel/plugin-transform-async-to-generator@^7.3.4":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4"
+  integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==
+  dependencies:
+    "@babel/helper-module-imports" "^7.24.1"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-remap-async-to-generator" "^7.22.20"
+
+"@babel/plugin-transform-block-scoped-functions@^7.2.0", "@babel/plugin-transform-block-scoped-functions@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380"
+  integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-block-scoping@^7.24.4", "@babel/plugin-transform-block-scoping@^7.3.4":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz#28f5c010b66fbb8ccdeef853bef1935c434d7012"
+  integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-class-properties@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29"
+  integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.24.1"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-class-static-block@^7.24.4":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4"
+  integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.24.4"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-transform-classes@^7.24.1", "@babel/plugin-transform-classes@^7.3.4":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz#5bc8fc160ed96378184bc10042af47f50884dcb1"
+  integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.22.5"
+    "@babel/helper-compilation-targets" "^7.23.6"
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-function-name" "^7.23.0"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-replace-supers" "^7.24.1"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.2.0", "@babel/plugin-transform-computed-properties@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7"
+  integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/template" "^7.24.0"
+
+"@babel/plugin-transform-destructuring@^7.2.0", "@babel/plugin-transform-destructuring@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz#b1e8243af4a0206841973786292b8c8dd8447345"
+  integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-dotall-regex@^7.2.0", "@babel/plugin-transform-dotall-regex@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13"
+  integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.22.15"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-duplicate-keys@^7.2.0", "@babel/plugin-transform-duplicate-keys@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88"
+  integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-dynamic-import@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd"
+  integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-transform-exponentiation-operator@^7.2.0", "@babel/plugin-transform-exponentiation-operator@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4"
+  integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==
+  dependencies:
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-export-namespace-from@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd"
+  integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-transform-for-of@^7.2.0", "@babel/plugin-transform-for-of@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd"
+  integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+
+"@babel/plugin-transform-function-name@^7.2.0", "@babel/plugin-transform-function-name@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361"
+  integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==
+  dependencies:
+    "@babel/helper-compilation-targets" "^7.23.6"
+    "@babel/helper-function-name" "^7.23.0"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-json-strings@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7"
+  integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-transform-literals@^7.2.0", "@babel/plugin-transform-literals@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096"
+  integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-logical-assignment-operators@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40"
+  integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-transform-member-expression-literals@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489"
+  integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-modules-amd@^7.2.0", "@babel/plugin-transform-modules-amd@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39"
+  integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==
+  dependencies:
+    "@babel/helper-module-transforms" "^7.23.3"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9"
+  integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==
+  dependencies:
+    "@babel/helper-module-transforms" "^7.23.3"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-simple-access" "^7.22.5"
+
+"@babel/plugin-transform-modules-systemjs@^7.24.1", "@babel/plugin-transform-modules-systemjs@^7.3.4":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e"
+  integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==
+  dependencies:
+    "@babel/helper-hoist-variables" "^7.22.5"
+    "@babel/helper-module-transforms" "^7.23.3"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-validator-identifier" "^7.22.20"
+
+"@babel/plugin-transform-modules-umd@^7.2.0", "@babel/plugin-transform-modules-umd@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef"
+  integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==
+  dependencies:
+    "@babel/helper-module-transforms" "^7.23.3"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5", "@babel/plugin-transform-named-capturing-groups-regex@^7.3.0":
+  version "7.22.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f"
+  integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+    "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-new-target@^7.0.0", "@babel/plugin-transform-new-target@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34"
+  integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988"
+  integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-transform-numeric-separator@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8"
+  integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-transform-object-rest-spread@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz#5a3ce73caf0e7871a02e1c31e8b473093af241ff"
+  integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==
+  dependencies:
+    "@babel/helper-compilation-targets" "^7.23.6"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+    "@babel/plugin-transform-parameters" "^7.24.1"
+
+"@babel/plugin-transform-object-super@^7.2.0", "@babel/plugin-transform-object-super@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520"
+  integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-replace-supers" "^7.24.1"
+
+"@babel/plugin-transform-optional-catch-binding@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da"
+  integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-transform-optional-chaining@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz#26e588acbedce1ab3519ac40cc748e380c5291e6"
+  integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-transform-parameters@^7.2.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz#983c15d114da190506c75b616ceb0f817afcc510"
+  integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-private-methods@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a"
+  integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.24.1"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-private-property-in-object@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz#756443d400274f8fb7896742962cc1b9f25c1f6a"
+  integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.22.5"
+    "@babel/helper-create-class-features-plugin" "^7.24.1"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-transform-property-literals@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825"
+  integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-regenerator@^7.24.1", "@babel/plugin-transform-regenerator@^7.3.4":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c"
+  integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    regenerator-transform "^0.15.2"
+
+"@babel/plugin-transform-reserved-words@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1"
+  integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-runtime@^7.12.10", "@babel/plugin-transform-runtime@^7.4.0":
+  version "7.24.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f"
+  integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==
+  dependencies:
+    "@babel/helper-module-imports" "^7.24.3"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    babel-plugin-polyfill-corejs2 "^0.4.10"
+    babel-plugin-polyfill-corejs3 "^0.10.1"
+    babel-plugin-polyfill-regenerator "^0.6.1"
+    semver "^6.3.1"
+
+"@babel/plugin-transform-shorthand-properties@^7.2.0", "@babel/plugin-transform-shorthand-properties@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55"
+  integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-spread@^7.2.0", "@babel/plugin-transform-spread@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391"
+  integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+
+"@babel/plugin-transform-sticky-regex@^7.2.0", "@babel/plugin-transform-sticky-regex@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9"
+  integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-template-literals@^7.2.0", "@babel/plugin-transform-template-literals@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7"
+  integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-typeof-symbol@^7.2.0", "@babel/plugin-transform-typeof-symbol@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz#6831f78647080dec044f7e9f68003d99424f94c7"
+  integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-unicode-escapes@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4"
+  integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-unicode-property-regex@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e"
+  integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.22.15"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-unicode-regex@^7.2.0", "@babel/plugin-transform-unicode-regex@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385"
+  integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.22.15"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/plugin-transform-unicode-sets-regex@^7.24.1":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f"
+  integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.22.15"
+    "@babel/helper-plugin-utils" "^7.24.0"
+
+"@babel/preset-env@^7.0.0 < 7.4.0":
+  version "7.3.4"
+  resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1"
+  integrity sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==
+  dependencies:
+    "@babel/helper-module-imports" "^7.0.0"
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/plugin-proposal-async-generator-functions" "^7.2.0"
+    "@babel/plugin-proposal-json-strings" "^7.2.0"
+    "@babel/plugin-proposal-object-rest-spread" "^7.3.4"
+    "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.2.0"
+    "@babel/plugin-syntax-async-generators" "^7.2.0"
+    "@babel/plugin-syntax-json-strings" "^7.2.0"
+    "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
+    "@babel/plugin-transform-arrow-functions" "^7.2.0"
+    "@babel/plugin-transform-async-to-generator" "^7.3.4"
+    "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
+    "@babel/plugin-transform-block-scoping" "^7.3.4"
+    "@babel/plugin-transform-classes" "^7.3.4"
+    "@babel/plugin-transform-computed-properties" "^7.2.0"
+    "@babel/plugin-transform-destructuring" "^7.2.0"
+    "@babel/plugin-transform-dotall-regex" "^7.2.0"
+    "@babel/plugin-transform-duplicate-keys" "^7.2.0"
+    "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
+    "@babel/plugin-transform-for-of" "^7.2.0"
+    "@babel/plugin-transform-function-name" "^7.2.0"
+    "@babel/plugin-transform-literals" "^7.2.0"
+    "@babel/plugin-transform-modules-amd" "^7.2.0"
+    "@babel/plugin-transform-modules-commonjs" "^7.2.0"
+    "@babel/plugin-transform-modules-systemjs" "^7.3.4"
+    "@babel/plugin-transform-modules-umd" "^7.2.0"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0"
+    "@babel/plugin-transform-new-target" "^7.0.0"
+    "@babel/plugin-transform-object-super" "^7.2.0"
+    "@babel/plugin-transform-parameters" "^7.2.0"
+    "@babel/plugin-transform-regenerator" "^7.3.4"
+    "@babel/plugin-transform-shorthand-properties" "^7.2.0"
+    "@babel/plugin-transform-spread" "^7.2.0"
+    "@babel/plugin-transform-sticky-regex" "^7.2.0"
+    "@babel/plugin-transform-template-literals" "^7.2.0"
+    "@babel/plugin-transform-typeof-symbol" "^7.2.0"
+    "@babel/plugin-transform-unicode-regex" "^7.2.0"
+    browserslist "^4.3.4"
+    invariant "^2.2.2"
+    js-levenshtein "^1.1.3"
+    semver "^5.3.0"
+
+"@babel/preset-env@^7.12.11":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.24.4.tgz#46dbbcd608771373b88f956ffb67d471dce0d23b"
+  integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==
+  dependencies:
+    "@babel/compat-data" "^7.24.4"
+    "@babel/helper-compilation-targets" "^7.23.6"
+    "@babel/helper-plugin-utils" "^7.24.0"
+    "@babel/helper-validator-option" "^7.23.5"
+    "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4"
+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1"
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1"
+    "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1"
+    "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
+    "@babel/plugin-syntax-async-generators" "^7.8.4"
+    "@babel/plugin-syntax-class-properties" "^7.12.13"
+    "@babel/plugin-syntax-class-static-block" "^7.14.5"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+    "@babel/plugin-syntax-import-assertions" "^7.24.1"
+    "@babel/plugin-syntax-import-attributes" "^7.24.1"
+    "@babel/plugin-syntax-import-meta" "^7.10.4"
+    "@babel/plugin-syntax-json-strings" "^7.8.3"
+    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+    "@babel/plugin-syntax-top-level-await" "^7.14.5"
+    "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+    "@babel/plugin-transform-arrow-functions" "^7.24.1"
+    "@babel/plugin-transform-async-generator-functions" "^7.24.3"
+    "@babel/plugin-transform-async-to-generator" "^7.24.1"
+    "@babel/plugin-transform-block-scoped-functions" "^7.24.1"
+    "@babel/plugin-transform-block-scoping" "^7.24.4"
+    "@babel/plugin-transform-class-properties" "^7.24.1"
+    "@babel/plugin-transform-class-static-block" "^7.24.4"
+    "@babel/plugin-transform-classes" "^7.24.1"
+    "@babel/plugin-transform-computed-properties" "^7.24.1"
+    "@babel/plugin-transform-destructuring" "^7.24.1"
+    "@babel/plugin-transform-dotall-regex" "^7.24.1"
+    "@babel/plugin-transform-duplicate-keys" "^7.24.1"
+    "@babel/plugin-transform-dynamic-import" "^7.24.1"
+    "@babel/plugin-transform-exponentiation-operator" "^7.24.1"
+    "@babel/plugin-transform-export-namespace-from" "^7.24.1"
+    "@babel/plugin-transform-for-of" "^7.24.1"
+    "@babel/plugin-transform-function-name" "^7.24.1"
+    "@babel/plugin-transform-json-strings" "^7.24.1"
+    "@babel/plugin-transform-literals" "^7.24.1"
+    "@babel/plugin-transform-logical-assignment-operators" "^7.24.1"
+    "@babel/plugin-transform-member-expression-literals" "^7.24.1"
+    "@babel/plugin-transform-modules-amd" "^7.24.1"
+    "@babel/plugin-transform-modules-commonjs" "^7.24.1"
+    "@babel/plugin-transform-modules-systemjs" "^7.24.1"
+    "@babel/plugin-transform-modules-umd" "^7.24.1"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5"
+    "@babel/plugin-transform-new-target" "^7.24.1"
+    "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1"
+    "@babel/plugin-transform-numeric-separator" "^7.24.1"
+    "@babel/plugin-transform-object-rest-spread" "^7.24.1"
+    "@babel/plugin-transform-object-super" "^7.24.1"
+    "@babel/plugin-transform-optional-catch-binding" "^7.24.1"
+    "@babel/plugin-transform-optional-chaining" "^7.24.1"
+    "@babel/plugin-transform-parameters" "^7.24.1"
+    "@babel/plugin-transform-private-methods" "^7.24.1"
+    "@babel/plugin-transform-private-property-in-object" "^7.24.1"
+    "@babel/plugin-transform-property-literals" "^7.24.1"
+    "@babel/plugin-transform-regenerator" "^7.24.1"
+    "@babel/plugin-transform-reserved-words" "^7.24.1"
+    "@babel/plugin-transform-shorthand-properties" "^7.24.1"
+    "@babel/plugin-transform-spread" "^7.24.1"
+    "@babel/plugin-transform-sticky-regex" "^7.24.1"
+    "@babel/plugin-transform-template-literals" "^7.24.1"
+    "@babel/plugin-transform-typeof-symbol" "^7.24.1"
+    "@babel/plugin-transform-unicode-escapes" "^7.24.1"
+    "@babel/plugin-transform-unicode-property-regex" "^7.24.1"
+    "@babel/plugin-transform-unicode-regex" "^7.24.1"
+    "@babel/plugin-transform-unicode-sets-regex" "^7.24.1"
+    "@babel/preset-modules" "0.1.6-no-external-plugins"
+    babel-plugin-polyfill-corejs2 "^0.4.10"
+    babel-plugin-polyfill-corejs3 "^0.10.4"
+    babel-plugin-polyfill-regenerator "^0.6.1"
+    core-js-compat "^3.31.0"
+    semver "^6.3.1"
+
+"@babel/preset-modules@0.1.6-no-external-plugins":
+  version "0.1.6-no-external-plugins"
+  resolved "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
+  integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/types" "^7.4.4"
+    esutils "^2.0.2"
+
+"@babel/regjsgen@^0.8.0":
+  version "0.8.0"
+  resolved "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
+  integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
+
+"@babel/runtime-corejs2@^7.2.0":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/runtime-corejs2/-/runtime-corejs2-7.24.4.tgz#3dac044ea9989e46b99b5f5ac038dbdd12e20e10"
+  integrity sha512-ZCKqyUKt/Coimg+3Kafu43yNetgYnTXzNbEGAgxc81J5sI0qFNbQ613w7PNny+SmijAmGVroL0GDvx5rG/JI5Q==
+  dependencies:
+    core-js "^2.6.12"
+    regenerator-runtime "^0.14.0"
+
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.0", "@babel/runtime@^7.8.4":
+  version "7.24.4"
+  resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd"
+  integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==
+  dependencies:
+    regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.22.15", "@babel/template@^7.24.0":
+  version "7.24.0"
+  resolved "https://registry.npmmirror.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50"
+  integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==
+  dependencies:
+    "@babel/code-frame" "^7.23.5"
+    "@babel/parser" "^7.24.0"
+    "@babel/types" "^7.24.0"
+
+"@babel/traverse@^7.24.1", "@babel/traverse@^7.7.0":
+  version "7.24.1"
+  resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c"
+  integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==
+  dependencies:
+    "@babel/code-frame" "^7.24.1"
+    "@babel/generator" "^7.24.1"
+    "@babel/helper-environment-visitor" "^7.22.20"
+    "@babel/helper-function-name" "^7.23.0"
+    "@babel/helper-hoist-variables" "^7.22.5"
+    "@babel/helper-split-export-declaration" "^7.22.6"
+    "@babel/parser" "^7.24.1"
+    "@babel/types" "^7.24.0"
+    debug "^4.3.1"
+    globals "^11.1.0"
+
+"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
+  version "7.24.0"
+  resolved "https://registry.npmmirror.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf"
+  integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==
+  dependencies:
+    "@babel/helper-string-parser" "^7.23.4"
+    "@babel/helper-validator-identifier" "^7.22.20"
+    to-fast-properties "^2.0.0"
+
+"@discoveryjs/json-ext@0.5.7":
+  version "0.5.7"
+  resolved "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
+  integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
+
+"@gar/promisify@^1.0.1":
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6"
+  integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==
+
+"@hapi/address@2.x.x":
+  version "2.1.4"
+  resolved "https://registry.npmmirror.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
+  integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==
+
+"@hapi/bourne@1.x.x":
+  version "1.3.2"
+  resolved "https://registry.npmmirror.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a"
+  integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==
+
+"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0":
+  version "8.5.1"
+  resolved "https://registry.npmmirror.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06"
+  integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==
+
+"@hapi/joi@^15.0.1":
+  version "15.1.1"
+  resolved "https://registry.npmmirror.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7"
+  integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==
+  dependencies:
+    "@hapi/address" "2.x.x"
+    "@hapi/bourne" "1.x.x"
+    "@hapi/hoek" "8.x.x"
+    "@hapi/topo" "3.x.x"
+
+"@hapi/topo@3.x.x":
+  version "3.1.6"
+  resolved "https://registry.npmmirror.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29"
+  integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==
+  dependencies:
+    "@hapi/hoek" "^8.3.0"
+
+"@intervolga/optimize-cssnano-plugin@^1.0.5":
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz#be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8"
+  integrity sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==
+  dependencies:
+    cssnano "^4.0.0"
+    cssnano-preset-default "^4.0.0"
+    postcss "^7.0.0"
+
+"@jridgewell/gen-mapping@^0.3.5":
+  version "0.3.5"
+  resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+  integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+  dependencies:
+    "@jridgewell/set-array" "^1.2.1"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+    "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+  integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+  integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+  version "1.4.15"
+  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+  integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+  version "0.3.25"
+  resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+  integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.1.0"
+    "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+  integrity sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==
+  dependencies:
+    call-me-maybe "^1.0.1"
+    glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.stat@^1.1.2":
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
+  integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
+
+"@npmcli/fs@^1.0.0":
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257"
+  integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==
+  dependencies:
+    "@gar/promisify" "^1.0.1"
+    semver "^7.3.5"
+
+"@npmcli/move-file@^1.0.1":
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674"
+  integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==
+  dependencies:
+    mkdirp "^1.0.4"
+    rimraf "^3.0.2"
+
+"@polka/url@^1.0.0-next.24":
+  version "1.0.0-next.25"
+  resolved "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817"
+  integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==
+
+"@sindresorhus/is@^4.0.0":
+  version "4.6.0"
+  resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
+  integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
+
+"@soda/friendly-errors-webpack-plugin@^1.7.1":
+  version "1.8.1"
+  resolved "https://registry.npmmirror.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz#4d4fbb1108993aaa362116247c3d18188a2c6c85"
+  integrity sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==
+  dependencies:
+    chalk "^3.0.0"
+    error-stack-parser "^2.0.6"
+    string-width "^4.2.3"
+    strip-ansi "^6.0.1"
+
+"@szmarczak/http-timer@^4.0.5":
+  version "4.0.6"
+  resolved "https://registry.npmmirror.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
+  integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
+  dependencies:
+    defer-to-connect "^2.0.0"
+
+"@transloadit/prettier-bytes@0.0.7":
+  version "0.0.7"
+  resolved "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz#cdb5399f445fdd606ed833872fa0cabdbc51686b"
+  integrity sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==
+
+"@types/cacheable-request@^6.0.1":
+  version "6.0.3"
+  resolved "https://registry.npmmirror.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183"
+  integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==
+  dependencies:
+    "@types/http-cache-semantics" "*"
+    "@types/keyv" "^3.1.4"
+    "@types/node" "*"
+    "@types/responselike" "^1.0.0"
+
+"@types/event-emitter@^0.3.3":
+  version "0.3.5"
+  resolved "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz#ce9b513f72c50dcf0443a12165a93a79ba7a7092"
+  integrity sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==
+
+"@types/glob@^7.1.1":
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
+  integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
+  dependencies:
+    "@types/minimatch" "*"
+    "@types/node" "*"
+
+"@types/http-cache-semantics@*":
+  version "4.0.4"
+  resolved "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4"
+  integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==
+
+"@types/json-schema@^7.0.5":
+  version "7.0.15"
+  resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+  integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/keyv@^3.1.4":
+  version "3.1.4"
+  resolved "https://registry.npmmirror.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
+  integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
+  dependencies:
+    "@types/node" "*"
+
+"@types/minimatch@*":
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca"
+  integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
+
+"@types/node@*":
+  version "20.12.7"
+  resolved "https://registry.npmmirror.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384"
+  integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==
+  dependencies:
+    undici-types "~5.26.4"
+
+"@types/normalize-package-data@^2.4.0":
+  version "2.4.4"
+  resolved "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
+  integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
+
+"@types/q@^1.5.1":
+  version "1.5.8"
+  resolved "https://registry.npmmirror.com/@types/q/-/q-1.5.8.tgz#95f6c6a08f2ad868ba230ead1d2d7f7be3db3837"
+  integrity sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==
+
+"@types/responselike@^1.0.0":
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50"
+  integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==
+  dependencies:
+    "@types/node" "*"
+
+"@uppy/companion-client@^2.2.2":
+  version "2.2.2"
+  resolved "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz#c70b42fdcca728ef88b3eebf7ee3e2fa04b4923b"
+  integrity sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==
+  dependencies:
+    "@uppy/utils" "^4.1.2"
+    namespace-emitter "^2.0.1"
+
+"@uppy/core@^2.1.1":
+  version "2.3.4"
+  resolved "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz#260b85b6bf3aa03cdc67da231f8c69cfbfdcc84a"
+  integrity sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==
+  dependencies:
+    "@transloadit/prettier-bytes" "0.0.7"
+    "@uppy/store-default" "^2.1.1"
+    "@uppy/utils" "^4.1.3"
+    lodash.throttle "^4.1.1"
+    mime-match "^1.0.2"
+    namespace-emitter "^2.0.1"
+    nanoid "^3.1.25"
+    preact "^10.5.13"
+
+"@uppy/store-default@^2.1.1":
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz#62a656a099bdaa012306e054d093754cb2d36e3e"
+  integrity sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==
+
+"@uppy/utils@^4.1.2", "@uppy/utils@^4.1.3":
+  version "4.1.3"
+  resolved "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz#9d0be6ece4df25f228d30ef40be0f14208258ce3"
+  integrity sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==
+  dependencies:
+    lodash.throttle "^4.1.1"
+
+"@uppy/xhr-upload@^2.0.3":
+  version "2.1.3"
+  resolved "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz#0d4e355332fe0c6eb372d7731315e04d02aeeb18"
+  integrity sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==
+  dependencies:
+    "@uppy/companion-client" "^2.2.2"
+    "@uppy/utils" "^4.1.2"
+    nanoid "^3.1.25"
+
+"@vue/babel-helper-vue-jsx-merge-props@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz#8d53a1e21347db8edbe54d339902583176de09f2"
+  integrity sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==
+
+"@vue/babel-plugin-transform-vue-jsx@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz#4d4b3d46a39ea62b7467dd6e26ce47f7ceafb2fe"
+  integrity sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==
+  dependencies:
+    "@babel/helper-module-imports" "^7.0.0"
+    "@babel/plugin-syntax-jsx" "^7.2.0"
+    "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0"
+    html-tags "^2.0.0"
+    lodash.kebabcase "^4.1.1"
+    svg-tags "^1.0.0"
+
+"@vue/babel-preset-app@^3.12.1":
+  version "3.12.1"
+  resolved "https://registry.npmmirror.com/@vue/babel-preset-app/-/babel-preset-app-3.12.1.tgz#24c477052f078f30fdb7735103b14dd1fa2cbfe1"
+  integrity sha512-Zjy5jQaikV1Pz+ri0YgXFS7q4/5wCxB5tRkDOEIt5+4105u0Feb/pvH20nVL6nx9GyXrECFfcm7Yxr/z++OaPQ==
+  dependencies:
+    "@babel/helper-module-imports" "^7.0.0"
+    "@babel/plugin-proposal-class-properties" "^7.0.0"
+    "@babel/plugin-proposal-decorators" "^7.1.0"
+    "@babel/plugin-syntax-dynamic-import" "^7.0.0"
+    "@babel/plugin-syntax-jsx" "^7.0.0"
+    "@babel/plugin-transform-runtime" "^7.4.0"
+    "@babel/preset-env" "^7.0.0 < 7.4.0"
+    "@babel/runtime" "^7.0.0"
+    "@babel/runtime-corejs2" "^7.2.0"
+    "@vue/babel-preset-jsx" "^1.0.0"
+    babel-plugin-dynamic-import-node "^2.2.0"
+    babel-plugin-module-resolver "3.2.0"
+    core-js "^2.6.5"
+
+"@vue/babel-preset-jsx@^1.0.0":
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz#f4914ba314235ab097bc4372ed67473c0780bfcc"
+  integrity sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==
+  dependencies:
+    "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0"
+    "@vue/babel-plugin-transform-vue-jsx" "^1.4.0"
+    "@vue/babel-sugar-composition-api-inject-h" "^1.4.0"
+    "@vue/babel-sugar-composition-api-render-instance" "^1.4.0"
+    "@vue/babel-sugar-functional-vue" "^1.4.0"
+    "@vue/babel-sugar-inject-h" "^1.4.0"
+    "@vue/babel-sugar-v-model" "^1.4.0"
+    "@vue/babel-sugar-v-on" "^1.4.0"
+
+"@vue/babel-sugar-composition-api-inject-h@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz#187e1389f8871d89ece743bb50aed713be9d6c85"
+  integrity sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==
+  dependencies:
+    "@babel/plugin-syntax-jsx" "^7.2.0"
+
+"@vue/babel-sugar-composition-api-render-instance@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz#2c1607ae6dffdab47e785bc01fa45ba756e992c1"
+  integrity sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==
+  dependencies:
+    "@babel/plugin-syntax-jsx" "^7.2.0"
+
+"@vue/babel-sugar-functional-vue@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz#60da31068567082287c7337c66ef4df04e0a1029"
+  integrity sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==
+  dependencies:
+    "@babel/plugin-syntax-jsx" "^7.2.0"
+
+"@vue/babel-sugar-inject-h@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz#bf39aa6631fb1d0399b1c49b4c59e1c8899b4363"
+  integrity sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==
+  dependencies:
+    "@babel/plugin-syntax-jsx" "^7.2.0"
+
+"@vue/babel-sugar-v-model@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz#a51d986609f430c4f70ada3a93cc560a2970f720"
+  integrity sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==
+  dependencies:
+    "@babel/plugin-syntax-jsx" "^7.2.0"
+    "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0"
+    "@vue/babel-plugin-transform-vue-jsx" "^1.4.0"
+    camelcase "^5.0.0"
+    html-tags "^2.0.0"
+    svg-tags "^1.0.0"
+
+"@vue/babel-sugar-v-on@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz#43b7106a9672d8cbeefc0eb8afe1d376edc6166e"
+  integrity sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==
+  dependencies:
+    "@babel/plugin-syntax-jsx" "^7.2.0"
+    "@vue/babel-plugin-transform-vue-jsx" "^1.4.0"
+    camelcase "^5.0.0"
+
+"@vue/cli-overlay@^3.12.1":
+  version "3.12.1"
+  resolved "https://registry.npmmirror.com/@vue/cli-overlay/-/cli-overlay-3.12.1.tgz#bdfde8f7123561ab06e4e4c60b854cc5092f5ab1"
+  integrity sha512-Bym92EN+lj+cNRN2ozbYyH+V8DMXWGbCDUk+hiJ4EYDBZfBkZKvalk1/mOBFwyxiopnnbOEBAAhL/UuMQ1xARg==
+
+"@vue/cli-plugin-babel@^3.9.0":
+  version "3.12.1"
+  resolved "https://registry.npmmirror.com/@vue/cli-plugin-babel/-/cli-plugin-babel-3.12.1.tgz#9a79159de8cd086b013fa6d78a39830b2e2ec706"
+  integrity sha512-Zetvz8PikLCGomeKOKu8pC9YQ7cfxs7pGpvEOzaxGdhMnebhjAYR6i6dOB57A6N5lhxQksXCtYTv26QgfiIpdg==
+  dependencies:
+    "@babel/core" "^7.0.0"
+    "@vue/babel-preset-app" "^3.12.1"
+    "@vue/cli-shared-utils" "^3.12.1"
+    babel-loader "^8.0.5"
+    webpack "^4.0.0"
+
+"@vue/cli-plugin-eslint@^3.9.0":
+  version "3.12.1"
+  resolved "https://registry.npmmirror.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.12.1.tgz#302c463867f38e790bb996eafdf7159c782dc8cf"
+  integrity sha512-tVTZlEZsy3sQbO4LLWFK11yzlWwqVAqaM+IY+BeWHITBzEJKh2KmouG+x6x/reXiU3qROsMJ4Ej3Hs8buSMWyQ==
+  dependencies:
+    "@vue/cli-shared-utils" "^3.12.1"
+    babel-eslint "^10.0.1"
+    eslint-loader "^2.1.2"
+    globby "^9.2.0"
+    webpack "^4.0.0"
+    yorkie "^2.0.0"
+  optionalDependencies:
+    eslint "^4.19.1"
+    eslint-plugin-vue "^4.7.1"
+
+"@vue/cli-service@^3.9.0":
+  version "3.12.1"
+  resolved "https://registry.npmmirror.com/@vue/cli-service/-/cli-service-3.12.1.tgz#13220b1c189254e7c003390df329086f9b6e77e6"
+  integrity sha512-PDxNrTGnSKzeV1ruFlsRIAO8JcPizwT0EJXq9GeyooU+p+sOkv7aKkCBJQVYNjZapD1NOGWx6CvAAC/wAW+gew==
+  dependencies:
+    "@intervolga/optimize-cssnano-plugin" "^1.0.5"
+    "@soda/friendly-errors-webpack-plugin" "^1.7.1"
+    "@vue/cli-overlay" "^3.12.1"
+    "@vue/cli-shared-utils" "^3.12.1"
+    "@vue/component-compiler-utils" "^3.0.0"
+    "@vue/preload-webpack-plugin" "^1.1.0"
+    "@vue/web-component-wrapper" "^1.2.0"
+    acorn "^6.1.1"
+    acorn-walk "^6.1.1"
+    address "^1.0.3"
+    autoprefixer "^9.5.1"
+    browserslist "^4.5.4"
+    cache-loader "^2.0.1"
+    case-sensitive-paths-webpack-plugin "^2.2.0"
+    chalk "^2.4.2"
+    cli-highlight "^2.1.0"
+    clipboardy "^2.0.0"
+    cliui "^5.0.0"
+    copy-webpack-plugin "^4.6.0"
+    css-loader "^1.0.1"
+    cssnano "^4.1.10"
+    current-script-polyfill "^1.0.0"
+    debug "^4.1.1"
+    default-gateway "^5.0.2"
+    dotenv "^7.0.0"
+    dotenv-expand "^5.1.0"
+    escape-string-regexp "^1.0.5"
+    file-loader "^3.0.1"
+    fs-extra "^7.0.1"
+    globby "^9.2.0"
+    hash-sum "^1.0.2"
+    html-webpack-plugin "^3.2.0"
+    launch-editor-middleware "^2.2.1"
+    lodash.defaultsdeep "^4.6.1"
+    lodash.mapvalues "^4.6.0"
+    lodash.transform "^4.6.0"
+    mini-css-extract-plugin "^0.8.0"
+    minimist "^1.2.0"
+    ora "^3.4.0"
+    portfinder "^1.0.20"
+    postcss-loader "^3.0.0"
+    read-pkg "^5.0.0"
+    semver "^6.0.0"
+    slash "^2.0.0"
+    source-map-url "^0.4.0"
+    ssri "^6.0.1"
+    string.prototype.padend "^3.0.0"
+    terser-webpack-plugin "^1.2.3"
+    thread-loader "^2.1.2"
+    url-loader "^1.1.2"
+    vue-loader "^15.7.0"
+    webpack "^4.0.0"
+    webpack-bundle-analyzer "^3.3.0"
+    webpack-chain "^4.11.0"
+    webpack-dev-server "^3.4.1"
+    webpack-merge "^4.2.1"
+
+"@vue/cli-shared-utils@^3.12.1":
+  version "3.12.1"
+  resolved "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-3.12.1.tgz#bcf076287ddadeebbb97c6a748dfe9ff50ec8df0"
+  integrity sha512-jFblzRFjutGwu5utOKdVlPlsbA1lBUNNQlAThzNqej+JtTKJjnvjlhjKX0Gq0oOny5FjKWhoyfQ74p9h1qE6JQ==
+  dependencies:
+    "@hapi/joi" "^15.0.1"
+    chalk "^2.4.1"
+    execa "^1.0.0"
+    launch-editor "^2.2.1"
+    lru-cache "^5.1.1"
+    node-ipc "^9.1.1"
+    open "^6.3.0"
+    ora "^3.4.0"
+    request "^2.87.0"
+    request-promise-native "^1.0.7"
+    semver "^6.0.0"
+    string.prototype.padstart "^3.0.0"
+
+"@vue/compiler-sfc@2.7.16":
+  version "2.7.16"
+  resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz#ff81711a0fac9c68683d8bb00b63f857de77dc83"
+  integrity sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==
+  dependencies:
+    "@babel/parser" "^7.23.5"
+    postcss "^8.4.14"
+    source-map "^0.6.1"
+  optionalDependencies:
+    prettier "^1.18.2 || ^2.0.0"
+
+"@vue/component-compiler-utils@^3.0.0", "@vue/component-compiler-utils@^3.1.0":
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9"
+  integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==
+  dependencies:
+    consolidate "^0.15.1"
+    hash-sum "^1.0.2"
+    lru-cache "^4.1.2"
+    merge-source-map "^1.1.0"
+    postcss "^7.0.36"
+    postcss-selector-parser "^6.0.2"
+    source-map "~0.6.1"
+    vue-template-es2015-compiler "^1.9.0"
+  optionalDependencies:
+    prettier "^1.18.2 || ^2.0.0"
+
+"@vue/preload-webpack-plugin@^1.1.0":
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz#ceb924b4ecb3b9c43871c7a429a02f8423e621ab"
+  integrity sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==
+
+"@vue/web-component-wrapper@^1.2.0":
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a"
+  integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==
+
+"@wangeditor/basic-modules@^1.1.7":
+  version "1.1.7"
+  resolved "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz#a9c3ccf4ef53332f29550d59d3676e15f395946f"
+  integrity sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==
+  dependencies:
+    is-url "^1.2.4"
+
+"@wangeditor/code-highlight@^1.0.3":
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz#90256857714d5c0cf83ac475aea64db7bf29a7cd"
+  integrity sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==
+  dependencies:
+    prismjs "^1.23.0"
+
+"@wangeditor/core@^1.1.19":
+  version "1.1.19"
+  resolved "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz#f9155f7fd92d03cb1982405b3b82e54c31f1c2b0"
+  integrity sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==
+  dependencies:
+    "@types/event-emitter" "^0.3.3"
+    event-emitter "^0.3.5"
+    html-void-elements "^2.0.0"
+    i18next "^20.4.0"
+    scroll-into-view-if-needed "^2.2.28"
+    slate-history "^0.66.0"
+
+"@wangeditor/editor-for-vue@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz#62674d56354319ff8dcc83db5c62cec4437ee906"
+  integrity sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA==
+
+"@wangeditor/editor@^5.1.14":
+  version "5.1.23"
+  resolved "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz#c9d2007b7cb0ceef6b72692b4ee87b01ee2367b3"
+  integrity sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==
+  dependencies:
+    "@uppy/core" "^2.1.1"
+    "@uppy/xhr-upload" "^2.0.3"
+    "@wangeditor/basic-modules" "^1.1.7"
+    "@wangeditor/code-highlight" "^1.0.3"
+    "@wangeditor/core" "^1.1.19"
+    "@wangeditor/list-module" "^1.0.5"
+    "@wangeditor/table-module" "^1.1.4"
+    "@wangeditor/upload-image-module" "^1.0.2"
+    "@wangeditor/video-module" "^1.1.4"
+    dom7 "^3.0.0"
+    is-hotkey "^0.2.0"
+    lodash.camelcase "^4.3.0"
+    lodash.clonedeep "^4.5.0"
+    lodash.debounce "^4.0.8"
+    lodash.foreach "^4.5.0"
+    lodash.isequal "^4.5.0"
+    lodash.throttle "^4.1.1"
+    lodash.toarray "^4.4.0"
+    nanoid "^3.2.0"
+    slate "^0.72.0"
+    snabbdom "^3.1.0"
+
+"@wangeditor/list-module@^1.0.5":
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz#3fc0b167acddf885536b45fa0c127f9c6adaea33"
+  integrity sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==
+
+"@wangeditor/table-module@^1.1.4":
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz#757d4a5868b2b658041cd323854a4d707c8347e9"
+  integrity sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==
+
+"@wangeditor/upload-image-module@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz#89e9b9467e10cbc6b11dc5748e08dd23aaebee30"
+  integrity sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==
+
+"@wangeditor/video-module@^1.1.4":
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz#b9df1b3ab2cd53f678b19b4d927e200774a6f532"
+  integrity sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==
+
+"@webassemblyjs/ast@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
+  integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
+  dependencies:
+    "@webassemblyjs/helper-module-context" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/wast-parser" "1.9.0"
+
+"@webassemblyjs/floating-point-hex-parser@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
+  integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
+
+"@webassemblyjs/helper-api-error@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
+  integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
+
+"@webassemblyjs/helper-buffer@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
+  integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
+
+"@webassemblyjs/helper-code-frame@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
+  integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
+  dependencies:
+    "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/helper-fsm@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
+  integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
+
+"@webassemblyjs/helper-module-context@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
+  integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+
+"@webassemblyjs/helper-wasm-bytecode@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
+  integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
+
+"@webassemblyjs/helper-wasm-section@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
+  integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+
+"@webassemblyjs/ieee754@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
+  integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
+  dependencies:
+    "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
+  integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
+  dependencies:
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
+  integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
+
+"@webassemblyjs/wasm-edit@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
+  integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/helper-wasm-section" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+    "@webassemblyjs/wasm-opt" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+    "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/wasm-gen@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
+  integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/ieee754" "1.9.0"
+    "@webassemblyjs/leb128" "1.9.0"
+    "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wasm-opt@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
+  integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+
+"@webassemblyjs/wasm-parser@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
+  integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-api-error" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/ieee754" "1.9.0"
+    "@webassemblyjs/leb128" "1.9.0"
+    "@webassemblyjs/utf8" "1.9.0"
+
+"@webassemblyjs/wast-parser@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
+  integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/floating-point-hex-parser" "1.9.0"
+    "@webassemblyjs/helper-api-error" "1.9.0"
+    "@webassemblyjs/helper-code-frame" "1.9.0"
+    "@webassemblyjs/helper-fsm" "1.9.0"
+    "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/wast-printer@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
+  integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/wast-parser" "1.9.0"
+    "@xtuc/long" "4.2.2"
+
+"@xtuc/ieee754@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+  integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+  version "4.2.2"
+  resolved "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8:
+  version "1.3.8"
+  resolved "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+  integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+  dependencies:
+    mime-types "~2.1.34"
+    negotiator "0.6.3"
+
+acorn-jsx@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+  integrity sha512-AU7pnZkguthwBjKgCg6998ByQNIMjbuDQZ8bb78QAFZwPfmKia8AIzgY/gWgqCjnht8JLdXmB4YxA0KaV60ncQ==
+  dependencies:
+    acorn "^3.0.4"
+
+acorn-jsx@^5.0.0:
+  version "5.3.2"
+  resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+  integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn-walk@^6.1.1:
+  version "6.2.0"
+  resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
+  integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
+
+acorn-walk@^7.1.1:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+  integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
+acorn-walk@^8.0.0:
+  version "8.3.2"
+  resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa"
+  integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==
+
+acorn@^3.0.4:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+  integrity sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==
+
+acorn@^5.5.0:
+  version "5.7.4"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
+  integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
+
+acorn@^6.0.2, acorn@^6.0.7, acorn@^6.1.1, acorn@^6.4.1:
+  version "6.4.2"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
+  integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==
+
+acorn@^7.1.1:
+  version "7.4.1"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+  integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+acorn@^8.0.4:
+  version "8.11.3"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
+  integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
+
+address@^1.0.3:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e"
+  integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==
+
+adler-32@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/adler-32/-/adler-32-1.2.0.tgz#6a3e6bf0a63900ba15652808cb15c6813d1a5f25"
+  integrity sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==
+  dependencies:
+    exit-on-epipe "~1.0.1"
+    printj "~1.1.0"
+
+adler-32@~1.3.0:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2"
+  integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==
+
+aggregate-error@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+  integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+  dependencies:
+    clean-stack "^2.0.0"
+    indent-string "^4.0.0"
+
+ajv-errors@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+  integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+  integrity sha512-ZFztHzVRdGLAzJmpUT9LNFLe1YiVOEylcaNpEutM26PVTCtOD919IMfD01CgbRouB42Dd9atjx1HseC15DgOZA==
+
+ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2:
+  version "3.5.2"
+  resolved "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+  integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^5.2.3, ajv@^5.3.0:
+  version "5.5.2"
+  resolved "https://registry.npmmirror.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+  integrity sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==
+  dependencies:
+    co "^4.6.0"
+    fast-deep-equal "^1.0.0"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.3.0"
+
+ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.9.1:
+  version "6.12.6"
+  resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+  integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+alphanum-sort@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+  integrity sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==
+
+ansi-colors@^3.0.0:
+  version "3.2.4"
+  resolved "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
+  integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
+
+ansi-escapes@^3.0.0, ansi-escapes@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
+  integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
+
+ansi-html-community@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
+  integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+  integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
+
+ansi-regex@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1"
+  integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
+
+ansi-regex@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
+  integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
+
+ansi-regex@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+  integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+  integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+  dependencies:
+    color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+  dependencies:
+    color-convert "^2.0.1"
+
+any-promise@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+  integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==
+
+anymatch@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+  dependencies:
+    micromatch "^3.1.4"
+    normalize-path "^2.1.1"
+
+anymatch@~3.1.2:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+  integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+  dependencies:
+    normalize-path "^3.0.0"
+    picomatch "^2.0.4"
+
+aproba@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+  integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+arch@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
+  integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+  integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==
+
+arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+  integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
+
+array-buffer-byte-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
+  integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
+  dependencies:
+    call-bind "^1.0.5"
+    is-array-buffer "^3.0.4"
+
+array-flatten@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+  integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+array-flatten@^2.1.0:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
+  integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
+
+array-union@^1.0.1, array-union@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+  integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+  integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==
+
+array.prototype.reduce@^1.0.6:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz#6aadc2f995af29cb887eb866d981dc85ab6f7dc7"
+  integrity sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
+    es-array-method-boxes-properly "^1.0.0"
+    es-errors "^1.3.0"
+    es-object-atoms "^1.0.0"
+    is-string "^1.0.7"
+
+arraybuffer.prototype.slice@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6"
+  integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
+  dependencies:
+    array-buffer-byte-length "^1.0.1"
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    es-abstract "^1.22.3"
+    es-errors "^1.2.1"
+    get-intrinsic "^1.2.3"
+    is-array-buffer "^3.0.4"
+    is-shared-array-buffer "^1.0.2"
+
+asn1.js@^4.10.1:
+  version "4.10.1"
+  resolved "https://registry.npmmirror.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.6"
+  resolved "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
+  integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
+  dependencies:
+    safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+  integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
+
+assert@^1.1.1:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/assert/-/assert-1.5.1.tgz#038ab248e4ff078e7bc2485ba6e6388466c78f76"
+  integrity sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==
+  dependencies:
+    object.assign "^4.1.4"
+    util "^0.10.4"
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+  integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
+
+astral-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+  integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+
+async-each@^1.0.1:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/async-each/-/async-each-1.0.6.tgz#52f1d9403818c179b7561e11a5d1b77eb2160e77"
+  integrity sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==
+
+async-limiter@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+  integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
+
+async-validator@~1.8.1:
+  version "1.8.5"
+  resolved "https://registry.npmmirror.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0"
+  integrity sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==
+  dependencies:
+    babel-runtime "6.x"
+
+async@^2.6.4:
+  version "2.6.4"
+  resolved "https://registry.npmmirror.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
+  integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
+  dependencies:
+    lodash "^4.17.14"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+atob@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+autoprefixer@^9.5.1:
+  version "9.8.8"
+  resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a"
+  integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==
+  dependencies:
+    browserslist "^4.12.0"
+    caniuse-lite "^1.0.30001109"
+    normalize-range "^0.1.2"
+    num2fraction "^1.2.2"
+    picocolors "^0.2.1"
+    postcss "^7.0.32"
+    postcss-value-parser "^4.1.0"
+
+available-typed-arrays@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+  integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+  dependencies:
+    possible-typed-array-names "^1.0.0"
+
+aws-sign2@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+  integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
+
+aws4@^1.8.0:
+  version "1.12.0"
+  resolved "https://registry.npmmirror.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3"
+  integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==
+
+axios@^0.19.0:
+  version "0.19.2"
+  resolved "https://registry.npmmirror.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
+  integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
+  dependencies:
+    follow-redirects "1.5.10"
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.npmmirror.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+  integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==
+  dependencies:
+    chalk "^1.1.3"
+    esutils "^2.0.2"
+    js-tokens "^3.0.2"
+
+babel-eslint@^10.0.1, babel-eslint@^10.0.2:
+  version "10.1.0"
+  resolved "https://registry.npmmirror.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+  integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "@babel/parser" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
+    eslint-visitor-keys "^1.0.0"
+    resolve "^1.12.0"
+
+babel-helper-vue-jsx-merge-props@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6"
+  integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==
+
+babel-loader@^8.0.5, babel-loader@^8.2.2:
+  version "8.3.0"
+  resolved "https://registry.npmmirror.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8"
+  integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==
+  dependencies:
+    find-cache-dir "^3.3.1"
+    loader-utils "^2.0.0"
+    make-dir "^3.1.0"
+    schema-utils "^2.6.5"
+
+babel-plugin-dynamic-import-node@^2.2.0:
+  version "2.3.3"
+  resolved "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+  integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+  dependencies:
+    object.assign "^4.1.0"
+
+babel-plugin-module-resolver@3.2.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7"
+  integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==
+  dependencies:
+    find-babel-config "^1.1.0"
+    glob "^7.1.2"
+    pkg-up "^2.0.0"
+    reselect "^3.0.1"
+    resolve "^1.4.0"
+
+babel-plugin-polyfill-corejs2@^0.4.10:
+  version "0.4.10"
+  resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz#276f41710b03a64f6467433cab72cbc2653c38b1"
+  integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==
+  dependencies:
+    "@babel/compat-data" "^7.22.6"
+    "@babel/helper-define-polyfill-provider" "^0.6.1"
+    semver "^6.3.1"
+
+babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4:
+  version "0.10.4"
+  resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77"
+  integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==
+  dependencies:
+    "@babel/helper-define-polyfill-provider" "^0.6.1"
+    core-js-compat "^3.36.1"
+
+babel-plugin-polyfill-regenerator@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz#4f08ef4c62c7a7f66a35ed4c0d75e30506acc6be"
+  integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==
+  dependencies:
+    "@babel/helper-define-polyfill-provider" "^0.6.1"
+
+babel-plugin-transform-remove-console@^6.9.4:
+  version "6.9.4"
+  resolved "https://registry.npmmirror.com/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz#b980360c067384e24b357a588d807d3c83527780"
+  integrity sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==
+
+babel-plugin-transform-runtime@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.npmmirror.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee"
+  integrity sha512-cpGMVC1vt/772y3jx1gwSaTitQVZuFDlllgreMsZ+rTYC6jlYXRyf5FQOgSnckOiA5QmzbXTyBY2A5AmZXF1fA==
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-polyfill@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.npmmirror.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+  integrity sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==
+  dependencies:
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    regenerator-runtime "^0.10.5"
+
+babel-runtime@6.x, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
+balanced-match@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base64-js@^1.0.2:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+  integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.npmmirror.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
+batch-processor@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/batch-processor/-/batch-processor-1.0.0.tgz#75c95c32b748e0850d10c2b168f6bdbe9891ace8"
+  integrity sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==
+
+batch@0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+  integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+  integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==
+  dependencies:
+    tweetnacl "^0.14.3"
+
+bfj@^6.1.1:
+  version "6.1.2"
+  resolved "https://registry.npmmirror.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f"
+  integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==
+  dependencies:
+    bluebird "^3.5.5"
+    check-types "^8.0.3"
+    hoopy "^0.1.4"
+    tryer "^1.0.1"
+
+big.js@^3.1.3:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+  integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
+
+big.js@^5.2.2:
+  version "5.2.2"
+  resolved "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+binary-extensions@^1.0.0:
+  version "1.13.1"
+  resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+  integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+binary-extensions@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+  integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
+bindings@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+  integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+  dependencies:
+    file-uri-to-path "1.0.0"
+
+bluebird@^3.1.1, bluebird@^3.5.1, bluebird@^3.5.5:
+  version "3.7.2"
+  resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+  integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
+  version "4.12.0"
+  resolved "https://registry.npmmirror.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+  integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.0.0, bn.js@^5.2.1:
+  version "5.2.1"
+  resolved "https://registry.npmmirror.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
+  integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
+
+body-parser@1.20.2:
+  version "1.20.2"
+  resolved "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd"
+  integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==
+  dependencies:
+    bytes "3.1.2"
+    content-type "~1.0.5"
+    debug "2.6.9"
+    depd "2.0.0"
+    destroy "1.2.0"
+    http-errors "2.0.0"
+    iconv-lite "0.4.24"
+    on-finished "2.4.1"
+    qs "6.11.0"
+    raw-body "2.5.2"
+    type-is "~1.6.18"
+    unpipe "1.0.0"
+
+bonjour@^3.5.0:
+  version "3.5.0"
+  resolved "https://registry.npmmirror.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
+  integrity sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==
+  dependencies:
+    array-flatten "^2.1.0"
+    deep-equal "^1.0.1"
+    dns-equal "^1.0.0"
+    dns-txt "^2.0.2"
+    multicast-dns "^6.0.1"
+    multicast-dns-service-types "^1.1.0"
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+  integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+bootstrap@^4.3.1:
+  version "4.6.2"
+  resolved "https://registry.npmmirror.com/bootstrap/-/bootstrap-4.6.2.tgz#8e0cd61611728a5bf65a3a2b8d6ff6c77d5d7479"
+  integrity sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^2.3.1, braces@^2.3.2:
+  version "2.3.2"
+  resolved "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
+braces@~3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+  dependencies:
+    fill-range "^7.0.1"
+
+brorand@^1.0.1, brorand@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+  integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
+
+browserify-aes@^1.0.4, browserify-aes@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+  integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+  dependencies:
+    buffer-xor "^1.0.3"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.3"
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+  integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+  integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+    safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0, browserify-rsa@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d"
+  integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==
+  dependencies:
+    bn.js "^5.0.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.2.3"
+  resolved "https://registry.npmmirror.com/browserify-sign/-/browserify-sign-4.2.3.tgz#7afe4c01ec7ee59a89a558a4b75bd85ae62d4208"
+  integrity sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==
+  dependencies:
+    bn.js "^5.2.1"
+    browserify-rsa "^4.1.0"
+    create-hash "^1.2.0"
+    create-hmac "^1.1.7"
+    elliptic "^6.5.5"
+    hash-base "~3.0"
+    inherits "^2.0.4"
+    parse-asn1 "^5.1.7"
+    readable-stream "^2.3.8"
+    safe-buffer "^5.2.1"
+
+browserify-zlib@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+  integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
+  dependencies:
+    pako "~1.0.5"
+
+browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.22.2, browserslist@^4.23.0, browserslist@^4.3.4, browserslist@^4.5.4:
+  version "4.23.0"
+  resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab"
+  integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==
+  dependencies:
+    caniuse-lite "^1.0.30001587"
+    electron-to-chromium "^1.4.668"
+    node-releases "^2.0.14"
+    update-browserslist-db "^1.0.13"
+
+buffer-from@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+  integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer-indexof@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
+  integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
+
+buffer-xor@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+  integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
+
+buffer@^4.3.0:
+  version "4.9.2"
+  resolved "https://registry.npmmirror.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+  integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+  integrity sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==
+
+bytes@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+  integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
+
+bytes@3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+  integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+cacache@^10.0.4:
+  version "10.0.4"
+  resolved "https://registry.npmmirror.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+  integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==
+  dependencies:
+    bluebird "^3.5.1"
+    chownr "^1.0.1"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    lru-cache "^4.1.1"
+    mississippi "^2.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.2"
+    ssri "^5.2.4"
+    unique-filename "^1.1.0"
+    y18n "^4.0.0"
+
+cacache@^12.0.2:
+  version "12.0.4"
+  resolved "https://registry.npmmirror.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
+  integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
+  dependencies:
+    bluebird "^3.5.5"
+    chownr "^1.1.1"
+    figgy-pudding "^3.5.1"
+    glob "^7.1.4"
+    graceful-fs "^4.1.15"
+    infer-owner "^1.0.3"
+    lru-cache "^5.1.1"
+    mississippi "^3.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.3"
+    ssri "^6.0.1"
+    unique-filename "^1.1.1"
+    y18n "^4.0.0"
+
+cacache@^15.0.5:
+  version "15.3.0"
+  resolved "https://registry.npmmirror.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
+  integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==
+  dependencies:
+    "@npmcli/fs" "^1.0.0"
+    "@npmcli/move-file" "^1.0.1"
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    glob "^7.1.4"
+    infer-owner "^1.0.4"
+    lru-cache "^6.0.0"
+    minipass "^3.1.1"
+    minipass-collect "^1.0.2"
+    minipass-flush "^1.0.5"
+    minipass-pipeline "^1.2.2"
+    mkdirp "^1.0.3"
+    p-map "^4.0.0"
+    promise-inflight "^1.0.1"
+    rimraf "^3.0.2"
+    ssri "^8.0.1"
+    tar "^6.0.2"
+    unique-filename "^1.1.1"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
+cache-loader@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/cache-loader/-/cache-loader-2.0.1.tgz#5758f41a62d7c23941e3c3c7016e6faeb03acb07"
+  integrity sha512-V99T3FOynmGx26Zom+JrVBytLBsmUCzVG2/4NnUKgvXN4bEV42R1ERl1IyiH/cvFIDA1Ytq2lPZ9tXDSahcQpQ==
+  dependencies:
+    loader-utils "^1.1.0"
+    mkdirp "^0.5.1"
+    neo-async "^2.6.0"
+    normalize-path "^3.0.0"
+    schema-utils "^1.0.0"
+
+cacheable-lookup@^5.0.3:
+  version "5.0.4"
+  resolved "https://registry.npmmirror.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
+  integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
+
+cacheable-request@^7.0.2:
+  version "7.0.4"
+  resolved "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817"
+  integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==
+  dependencies:
+    clone-response "^1.0.2"
+    get-stream "^5.1.0"
+    http-cache-semantics "^4.0.0"
+    keyv "^4.0.0"
+    lowercase-keys "^2.0.0"
+    normalize-url "^6.0.1"
+    responselike "^2.0.0"
+
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+  integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+  dependencies:
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    function-bind "^1.1.2"
+    get-intrinsic "^1.2.4"
+    set-function-length "^1.2.1"
+
+call-me-maybe@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa"
+  integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==
+
+caller-callsite@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+  integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==
+  dependencies:
+    callsites "^2.0.0"
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+  integrity sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g==
+  dependencies:
+    callsites "^0.2.0"
+
+caller-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+  integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==
+  dependencies:
+    caller-callsite "^2.0.0"
+
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+  integrity sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A==
+
+callsites@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+  integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==
+
+callsites@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camel-case@3.0.x:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+  integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==
+  dependencies:
+    no-case "^2.2.0"
+    upper-case "^1.1.1"
+
+camelcase@^5.0.0:
+  version "5.3.1"
+  resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+  integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-api@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+  integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-lite "^1.0.0"
+    lodash.memoize "^4.1.2"
+    lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001587:
+  version "1.0.30001609"
+  resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz#fc34fad75c0c6d6d6303bdbceec2da8f203dabd6"
+  integrity sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==
+
+case-sensitive-paths-webpack-plugin@^2.2.0:
+  version "2.4.0"
+  resolved "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4"
+  integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+  integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
+
+cfb@^1.1.4:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44"
+  integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==
+  dependencies:
+    adler-32 "~1.3.0"
+    crc-32 "~1.2.0"
+
+chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1, chalk@^2.4.2:
+  version "2.4.2"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chalk@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
+chalk@^4.0.0:
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
+chardet@^0.4.0:
+  version "0.4.2"
+  resolved "https://registry.npmmirror.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+  integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==
+
+chardet@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+  integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
+check-types@^8.0.3:
+  version "8.0.3"
+  resolved "https://registry.npmmirror.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
+  integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
+
+chokidar@^2.1.8:
+  version "2.1.8"
+  resolved "https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
+  integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==
+  dependencies:
+    anymatch "^2.0.0"
+    async-each "^1.0.1"
+    braces "^2.3.2"
+    glob-parent "^3.1.0"
+    inherits "^2.0.3"
+    is-binary-path "^1.0.0"
+    is-glob "^4.0.0"
+    normalize-path "^3.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.2.1"
+    upath "^1.1.1"
+  optionalDependencies:
+    fsevents "^1.2.7"
+
+chokidar@^3.4.1:
+  version "3.6.0"
+  resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+  integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+  dependencies:
+    anymatch "~3.1.2"
+    braces "~3.0.2"
+    glob-parent "~5.1.2"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.6.0"
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+chownr@^1.0.1, chownr@^1.1.1:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+  integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+chownr@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
+  integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+
+chrome-trace-event@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
+  integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+
+ci-info@^1.5.0:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
+  integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.3"
+  resolved "https://registry.npmmirror.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+  integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+clean-css@4.2.x:
+  version "4.2.4"
+  resolved "https://registry.npmmirror.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178"
+  integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==
+  dependencies:
+    source-map "~0.6.0"
+
+clean-stack@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+  integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cli-cursor@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==
+  dependencies:
+    restore-cursor "^2.0.0"
+
+cli-highlight@^2.1.0:
+  version "2.1.11"
+  resolved "https://registry.npmmirror.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf"
+  integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==
+  dependencies:
+    chalk "^4.0.0"
+    highlight.js "^10.7.1"
+    mz "^2.4.0"
+    parse5 "^5.1.1"
+    parse5-htmlparser2-tree-adapter "^6.0.0"
+    yargs "^16.0.0"
+
+cli-spinners@^2.0.0:
+  version "2.9.2"
+  resolved "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41"
+  integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==
+
+cli-width@^2.0.0:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
+  integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
+
+clipboardy@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/clipboardy/-/clipboardy-2.3.0.tgz#3c2903650c68e46a91b388985bc2774287dba290"
+  integrity sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==
+  dependencies:
+    arch "^2.1.1"
+    execa "^1.0.0"
+    is-wsl "^2.1.1"
+
+cliui@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+  integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+  dependencies:
+    string-width "^3.1.0"
+    strip-ansi "^5.2.0"
+    wrap-ansi "^5.1.0"
+
+cliui@^7.0.2:
+  version "7.0.4"
+  resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+  integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^7.0.0"
+
+clone-response@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3"
+  integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==
+  dependencies:
+    mimic-response "^1.0.0"
+
+clone@^1.0.2:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+  integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
+
+clone@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+  integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.npmmirror.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+  integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
+
+coa@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+  integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
+  dependencies:
+    "@types/q" "^1.5.1"
+    chalk "^2.4.1"
+    q "^1.1.2"
+
+codepage@~1.14.0:
+  version "1.14.0"
+  resolved "https://registry.npmmirror.com/codepage/-/codepage-1.14.0.tgz#8cbe25481323559d7d307571b0fff91e7a1d2f99"
+  integrity sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw==
+  dependencies:
+    commander "~2.14.1"
+    exit-on-epipe "~1.0.1"
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.9.0, color-convert@^1.9.3:
+  version "1.9.3"
+  resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+  dependencies:
+    color-name "1.1.3"
+
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+  dependencies:
+    color-name "~1.1.4"
+
+color-name@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+  integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@^1.0.0, color-name@~1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-string@^1.6.0:
+  version "1.9.1"
+  resolved "https://registry.npmmirror.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
+  integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
+  dependencies:
+    color-name "^1.0.0"
+    simple-swizzle "^0.2.2"
+
+color@^3.0.0:
+  version "3.2.1"
+  resolved "https://registry.npmmirror.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164"
+  integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==
+  dependencies:
+    color-convert "^1.9.3"
+    color-string "^1.6.0"
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@*:
+  version "12.0.0"
+  resolved "https://registry.npmmirror.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592"
+  integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==
+
+commander@2.17.x, commander@~2.17.1:
+  version "2.17.1"
+  resolved "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
+  integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
+
+commander@^2.18.0, commander@^2.20.0:
+  version "2.20.3"
+  resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^7.2.0:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+  integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
+commander@~2.14.1:
+  version "2.14.1"
+  resolved "https://registry.npmmirror.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa"
+  integrity sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==
+
+commander@~2.19.0:
+  version "2.19.0"
+  resolved "https://registry.npmmirror.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+  integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+  integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
+
+component-emitter@^1.2.1:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17"
+  integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==
+
+compressible@~2.0.16:
+  version "2.0.18"
+  resolved "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+  integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
+  dependencies:
+    mime-db ">= 1.43.0 < 2"
+
+compression-webpack-plugin@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.npmmirror.com/compression-webpack-plugin/-/compression-webpack-plugin-5.0.2.tgz#df84e682cfa1fb2a230e71cf83d50c323d5369c2"
+  integrity sha512-F2G4cQfsMZ6CiPlG22Q5EDUCqnfyZqTjyJP5cMgNYUbBg/dUzV3hto8yTFFIogDCTWooVbePHQE0qL6FrJUSsA==
+  dependencies:
+    cacache "^15.0.5"
+    find-cache-dir "^3.3.1"
+    schema-utils "^2.7.0"
+    serialize-javascript "^4.0.0"
+    webpack-sources "^1.4.3"
+
+compression@^1.7.4:
+  version "1.7.4"
+  resolved "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
+  integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+  dependencies:
+    accepts "~1.3.5"
+    bytes "3.0.0"
+    compressible "~2.0.16"
+    debug "2.6.9"
+    on-headers "~1.0.2"
+    safe-buffer "5.1.2"
+    vary "~1.1.2"
+
+compute-scroll-into-view@^1.0.20:
+  version "1.0.20"
+  resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43"
+  integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+concat-stream@^1.5.0, concat-stream@^1.6.0:
+  version "1.6.2"
+  resolved "https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+  dependencies:
+    buffer-from "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+connect-history-api-fallback@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
+  integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
+
+console-browserify@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+  integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
+
+consolidate@^0.15.1:
+  version "0.15.1"
+  resolved "https://registry.npmmirror.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
+  integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==
+  dependencies:
+    bluebird "^3.1.1"
+
+constants-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+  integrity sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==
+
+content-disposition@0.5.4:
+  version "0.5.4"
+  resolved "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+  integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+  dependencies:
+    safe-buffer "5.2.1"
+
+content-type@~1.0.4, content-type@~1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+  integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+convert-source-map@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+  integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+cookie-signature@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+  integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmmirror.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051"
+  integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==
+
+copy-anything@^2.0.1:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480"
+  integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==
+  dependencies:
+    is-what "^3.14.1"
+
+copy-concurrently@^1.0.0:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+  integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
+  dependencies:
+    aproba "^1.1.1"
+    fs-write-stream-atomic "^1.0.8"
+    iferr "^0.1.5"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+  integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==
+
+copy-webpack-plugin@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.npmmirror.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae"
+  integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==
+  dependencies:
+    cacache "^10.0.4"
+    find-cache-dir "^1.0.0"
+    globby "^7.1.1"
+    is-glob "^4.0.0"
+    loader-utils "^1.1.0"
+    minimatch "^3.0.4"
+    p-limit "^1.0.0"
+    serialize-javascript "^1.4.0"
+
+core-js-compat@^3.31.0, core-js-compat@^3.36.1:
+  version "3.36.1"
+  resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.36.1.tgz#1818695d72c99c25d621dca94e6883e190cea3c8"
+  integrity sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==
+  dependencies:
+    browserslist "^4.23.0"
+
+core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.12, core-js@^2.6.5:
+  version "2.6.12"
+  resolved "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+  integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+  integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
+
+core-util-is@~1.0.0:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+  integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cosmiconfig@^5.0.0:
+  version "5.2.1"
+  resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+  integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
+  dependencies:
+    import-fresh "^2.0.0"
+    is-directory "^0.3.1"
+    js-yaml "^3.13.1"
+    parse-json "^4.0.0"
+
+crc-32@~1.2.0:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+  integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+create-ecdh@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.npmmirror.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e"
+  integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.5.3"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    md5.js "^1.3.4"
+    ripemd160 "^2.0.1"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.npmmirror.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+  integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+  version "6.0.5"
+  resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+  integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+  dependencies:
+    nice-try "^1.0.4"
+    path-key "^2.0.1"
+    semver "^5.5.0"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^7.0.0:
+  version "7.0.3"
+  resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+  integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+  dependencies:
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
+
+crypto-browserify@^3.11.0:
+  version "3.12.0"
+  resolved "https://registry.npmmirror.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+    randomfill "^1.0.3"
+
+css-color-names@0.0.4, css-color-names@^0.0.4:
+  version "0.0.4"
+  resolved "https://registry.npmmirror.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+  integrity sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==
+
+css-declaration-sorter@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
+  integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==
+  dependencies:
+    postcss "^7.0.1"
+    timsort "^0.3.0"
+
+css-loader@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/css-loader/-/css-loader-1.0.1.tgz#6885bb5233b35ec47b006057da01cc640b6b79fe"
+  integrity sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==
+  dependencies:
+    babel-code-frame "^6.26.0"
+    css-selector-tokenizer "^0.7.0"
+    icss-utils "^2.1.0"
+    loader-utils "^1.0.2"
+    lodash "^4.17.11"
+    postcss "^6.0.23"
+    postcss-modules-extract-imports "^1.2.0"
+    postcss-modules-local-by-default "^1.2.0"
+    postcss-modules-scope "^1.1.0"
+    postcss-modules-values "^1.3.0"
+    postcss-value-parser "^3.3.0"
+    source-list-map "^2.0.0"
+
+css-select-base-adapter@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+  integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
+
+css-select@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+  integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
+  dependencies:
+    boolbase "^1.0.0"
+    css-what "^3.2.1"
+    domutils "^1.7.0"
+    nth-check "^1.0.2"
+
+css-select@^4.1.3:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b"
+  integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
+  dependencies:
+    boolbase "^1.0.0"
+    css-what "^6.0.1"
+    domhandler "^4.3.1"
+    domutils "^2.8.0"
+    nth-check "^2.0.1"
+
+css-selector-tokenizer@^0.7.0:
+  version "0.7.3"
+  resolved "https://registry.npmmirror.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz#735f26186e67c749aaf275783405cf0661fae8f1"
+  integrity sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==
+  dependencies:
+    cssesc "^3.0.0"
+    fastparse "^1.1.2"
+
+css-tree@1.0.0-alpha.37:
+  version "1.0.0-alpha.37"
+  resolved "https://registry.npmmirror.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
+  integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==
+  dependencies:
+    mdn-data "2.0.4"
+    source-map "^0.6.1"
+
+css-tree@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
+  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
+  dependencies:
+    mdn-data "2.0.14"
+    source-map "^0.6.1"
+
+css-what@^3.2.1:
+  version "3.4.2"
+  resolved "https://registry.npmmirror.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4"
+  integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
+
+css-what@^6.0.1:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
+  integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+
+cssesc@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+  integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff"
+  integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==
+  dependencies:
+    css-declaration-sorter "^4.0.1"
+    cssnano-util-raw-cache "^4.0.1"
+    postcss "^7.0.0"
+    postcss-calc "^7.0.1"
+    postcss-colormin "^4.0.3"
+    postcss-convert-values "^4.0.1"
+    postcss-discard-comments "^4.0.2"
+    postcss-discard-duplicates "^4.0.2"
+    postcss-discard-empty "^4.0.1"
+    postcss-discard-overridden "^4.0.1"
+    postcss-merge-longhand "^4.0.11"
+    postcss-merge-rules "^4.0.3"
+    postcss-minify-font-values "^4.0.2"
+    postcss-minify-gradients "^4.0.2"
+    postcss-minify-params "^4.0.2"
+    postcss-minify-selectors "^4.0.2"
+    postcss-normalize-charset "^4.0.1"
+    postcss-normalize-display-values "^4.0.2"
+    postcss-normalize-positions "^4.0.2"
+    postcss-normalize-repeat-style "^4.0.2"
+    postcss-normalize-string "^4.0.2"
+    postcss-normalize-timing-functions "^4.0.2"
+    postcss-normalize-unicode "^4.0.1"
+    postcss-normalize-url "^4.0.1"
+    postcss-normalize-whitespace "^4.0.2"
+    postcss-ordered-values "^4.1.2"
+    postcss-reduce-initial "^4.0.3"
+    postcss-reduce-transforms "^4.0.2"
+    postcss-svgo "^4.0.3"
+    postcss-unique-selectors "^4.0.1"
+
+cssnano-util-get-arguments@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+  integrity sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==
+
+cssnano-util-get-match@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+  integrity sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==
+
+cssnano-util-raw-cache@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
+  integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==
+  dependencies:
+    postcss "^7.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
+  integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==
+
+cssnano@^4.0.0, cssnano@^4.1.10:
+  version "4.1.11"
+  resolved "https://registry.npmmirror.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99"
+  integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==
+  dependencies:
+    cosmiconfig "^5.0.0"
+    cssnano-preset-default "^4.0.8"
+    is-resolvable "^1.0.0"
+    postcss "^7.0.0"
+
+csso@^4.0.2:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+  integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+  dependencies:
+    css-tree "^1.1.2"
+
+csstype@^3.1.0:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+  integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+current-script-polyfill@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/current-script-polyfill/-/current-script-polyfill-1.0.0.tgz#f31cf7e4f3e218b0726e738ca92a02d3488ef615"
+  integrity sha512-qv8s+G47V6Hq+g2kRE5th+ASzzrL7b6l+tap1DHKK25ZQJv3yIFhH96XaQ7NGL+zRW3t/RDbweJf/dJDe5Z5KA==
+
+cyclist@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/cyclist/-/cyclist-1.0.2.tgz#673b5f233bf34d8e602b949429f8171d9121bea3"
+  integrity sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==
+
+d@1, d@^1.0.1, d@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de"
+  integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==
+  dependencies:
+    es5-ext "^0.10.64"
+    type "^2.7.2"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==
+  dependencies:
+    assert-plus "^1.0.0"
+
+data-view-buffer@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
+  integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
+  dependencies:
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
+    is-data-view "^1.0.1"
+
+data-view-byte-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2"
+  integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
+  dependencies:
+    call-bind "^1.0.7"
+    es-errors "^1.3.0"
+    is-data-view "^1.0.1"
+
+data-view-byte-offset@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a"
+  integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
+  dependencies:
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
+    is-data-view "^1.0.1"
+
+de-indent@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+  integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
+
+debounce@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5"
+  integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
+  version "2.6.9"
+  resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+  dependencies:
+    ms "2.0.0"
+
+debug@=3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+  integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
+  dependencies:
+    ms "2.0.0"
+
+debug@^3.1.0, debug@^3.2.7:
+  version "3.2.7"
+  resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+  integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+  dependencies:
+    ms "^2.1.1"
+
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+  version "4.3.4"
+  resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+  dependencies:
+    ms "2.1.2"
+
+decamelize@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+  integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
+
+decode-uri-component@^0.2.0:
+  version "0.2.2"
+  resolved "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
+  integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
+
+decompress-response@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+  integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+  dependencies:
+    mimic-response "^3.1.0"
+
+deep-equal@^1.0.1:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.2.tgz#78a561b7830eef3134c7f6f3a3d6af272a678761"
+  integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==
+  dependencies:
+    is-arguments "^1.1.1"
+    is-date-object "^1.0.5"
+    is-regex "^1.1.4"
+    object-is "^1.1.5"
+    object-keys "^1.1.1"
+    regexp.prototype.flags "^1.5.1"
+
+deep-is@~0.1.3:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deepmerge@^1.2.0, deepmerge@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753"
+  integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==
+
+default-gateway@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
+  integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==
+  dependencies:
+    execa "^1.0.0"
+    ip-regex "^2.1.0"
+
+default-gateway@^5.0.2:
+  version "5.0.5"
+  resolved "https://registry.npmmirror.com/default-gateway/-/default-gateway-5.0.5.tgz#4fd6bd5d2855d39b34cc5a59505486e9aafc9b10"
+  integrity sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==
+  dependencies:
+    execa "^3.3.0"
+
+defaults@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a"
+  integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==
+  dependencies:
+    clone "^1.0.2"
+
+defer-to-connect@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
+  integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
+
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+  integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+  dependencies:
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    gopd "^1.0.1"
+
+define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+  integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+  dependencies:
+    define-data-property "^1.0.1"
+    has-property-descriptors "^1.0.0"
+    object-keys "^1.1.1"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
+del@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4"
+  integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==
+  dependencies:
+    "@types/glob" "^7.1.1"
+    globby "^6.1.0"
+    is-path-cwd "^2.0.0"
+    is-path-in-cwd "^2.0.0"
+    p-map "^2.0.0"
+    pify "^4.0.1"
+    rimraf "^2.6.3"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+depd@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+  integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+depd@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+  integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
+
+des.js@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/des.js/-/des.js-1.1.0.tgz#1d37f5766f3bbff4ee9638e871a8768c173b81da"
+  integrity sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+destroy@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+  integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-node@^2.0.4:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
+  integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
+
+diffie-hellman@^5.0.0:
+  version "5.0.3"
+  resolved "https://registry.npmmirror.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+  integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+dir-glob@^2.0.0, dir-glob@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
+  integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
+  dependencies:
+    path-type "^3.0.0"
+
+dns-equal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
+  integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==
+
+dns-packet@^1.3.1:
+  version "1.3.4"
+  resolved "https://registry.npmmirror.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f"
+  integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==
+  dependencies:
+    ip "^1.1.0"
+    safe-buffer "^5.0.1"
+
+dns-txt@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
+  integrity sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==
+  dependencies:
+    buffer-indexof "^1.0.0"
+
+doctrine@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+  integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+  dependencies:
+    esutils "^2.0.2"
+
+doctrine@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+  dependencies:
+    esutils "^2.0.2"
+
+dom-converter@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
+  integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
+  dependencies:
+    utila "~0.4"
+
+dom-serializer@0:
+  version "0.2.2"
+  resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+  integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+  dependencies:
+    domelementtype "^2.0.1"
+    entities "^2.0.0"
+
+dom-serializer@^1.0.1:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30"
+  integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
+  dependencies:
+    domelementtype "^2.0.1"
+    domhandler "^4.2.0"
+    entities "^2.0.0"
+
+dom7@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz#b861ce5d67a6becd7aaa3ad02942ff14b1240331"
+  integrity sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==
+  dependencies:
+    ssr-window "^3.0.0-alpha.1"
+
+domain-browser@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+  integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
+
+domelementtype@1:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+  integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1, domelementtype@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+  integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
+  integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
+  dependencies:
+    domelementtype "^2.2.0"
+
+domutils@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+domutils@^2.5.2, domutils@^2.8.0:
+  version "2.8.0"
+  resolved "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
+  integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
+  dependencies:
+    dom-serializer "^1.0.1"
+    domelementtype "^2.2.0"
+    domhandler "^4.2.0"
+
+dot-prop@^5.2.0:
+  version "5.3.0"
+  resolved "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+  integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+  dependencies:
+    is-obj "^2.0.0"
+
+dotenv-expand@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0"
+  integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==
+
+dotenv@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c"
+  integrity sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==
+
+duplexer@^0.1.1, duplexer@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
+  integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+  version "3.7.1"
+  resolved "https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+  integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
+  dependencies:
+    end-of-stream "^1.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+    stream-shift "^1.0.0"
+
+easy-stack@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/easy-stack/-/easy-stack-1.0.1.tgz#8afe4264626988cabb11f3c704ccd0c835411066"
+  integrity sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==
+
+ecc-jsbn@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+  integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==
+  dependencies:
+    jsbn "~0.1.0"
+    safer-buffer "^2.1.0"
+
+echarts@^4.3.0:
+  version "4.9.0"
+  resolved "https://registry.npmmirror.com/echarts/-/echarts-4.9.0.tgz#a9b9baa03f03a2a731e6340c55befb57a9e1347d"
+  integrity sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==
+  dependencies:
+    zrender "4.3.2"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+  integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+ejs@^2.6.1:
+  version "2.7.4"
+  resolved "https://registry.npmmirror.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
+  integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
+
+electron-to-chromium@^1.4.668:
+  version "1.4.736"
+  resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz#ecb4348f4d5c70fb1e31c347e5bad6b751066416"
+  integrity sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==
+
+element-resize-detector@^1.1.15:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/element-resize-detector/-/element-resize-detector-1.2.4.tgz#3e6c5982dd77508b5fa7e6d5c02170e26325c9b1"
+  integrity sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==
+  dependencies:
+    batch-processor "1.0.0"
+
+element-ui@^2.10.1:
+  version "2.15.14"
+  resolved "https://registry.npmmirror.com/element-ui/-/element-ui-2.15.14.tgz#3c34df79467636592812d720d2e6784e7a6ec2ea"
+  integrity sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==
+  dependencies:
+    async-validator "~1.8.1"
+    babel-helper-vue-jsx-merge-props "^2.0.0"
+    deepmerge "^1.2.0"
+    normalize-wheel "^1.0.1"
+    resize-observer-polyfill "^1.5.0"
+    throttle-debounce "^1.0.1"
+
+elliptic@^6.5.3, elliptic@^6.5.5:
+  version "6.5.5"
+  resolved "https://registry.npmmirror.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded"
+  integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==
+  dependencies:
+    bn.js "^4.11.9"
+    brorand "^1.1.0"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.1"
+    inherits "^2.0.4"
+    minimalistic-assert "^1.0.1"
+    minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^7.0.1:
+  version "7.0.3"
+  resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+  integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+  integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==
+
+emojis-list@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+  integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+encodeurl@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+  integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.4"
+  resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+  dependencies:
+    once "^1.4.0"
+
+enhanced-resolve@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec"
+  integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.5.0"
+    tapable "^1.0.0"
+
+entities@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+  integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+errno@^0.1.1, errno@^0.1.3, errno@~0.1.7:
+  version "0.1.8"
+  resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+  integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.3.1:
+  version "1.3.2"
+  resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+  dependencies:
+    is-arrayish "^0.2.1"
+
+error-stack-parser@^2.0.6:
+  version "2.1.4"
+  resolved "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286"
+  integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==
+  dependencies:
+    stackframe "^1.3.4"
+
+es-abstract@^1.17.2, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2:
+  version "1.23.3"
+  resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
+  integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
+  dependencies:
+    array-buffer-byte-length "^1.0.1"
+    arraybuffer.prototype.slice "^1.0.3"
+    available-typed-arrays "^1.0.7"
+    call-bind "^1.0.7"
+    data-view-buffer "^1.0.1"
+    data-view-byte-length "^1.0.1"
+    data-view-byte-offset "^1.0.0"
+    es-define-property "^1.0.0"
+    es-errors "^1.3.0"
+    es-object-atoms "^1.0.0"
+    es-set-tostringtag "^2.0.3"
+    es-to-primitive "^1.2.1"
+    function.prototype.name "^1.1.6"
+    get-intrinsic "^1.2.4"
+    get-symbol-description "^1.0.2"
+    globalthis "^1.0.3"
+    gopd "^1.0.1"
+    has-property-descriptors "^1.0.2"
+    has-proto "^1.0.3"
+    has-symbols "^1.0.3"
+    hasown "^2.0.2"
+    internal-slot "^1.0.7"
+    is-array-buffer "^3.0.4"
+    is-callable "^1.2.7"
+    is-data-view "^1.0.1"
+    is-negative-zero "^2.0.3"
+    is-regex "^1.1.4"
+    is-shared-array-buffer "^1.0.3"
+    is-string "^1.0.7"
+    is-typed-array "^1.1.13"
+    is-weakref "^1.0.2"
+    object-inspect "^1.13.1"
+    object-keys "^1.1.1"
+    object.assign "^4.1.5"
+    regexp.prototype.flags "^1.5.2"
+    safe-array-concat "^1.1.2"
+    safe-regex-test "^1.0.3"
+    string.prototype.trim "^1.2.9"
+    string.prototype.trimend "^1.0.8"
+    string.prototype.trimstart "^1.0.8"
+    typed-array-buffer "^1.0.2"
+    typed-array-byte-length "^1.0.1"
+    typed-array-byte-offset "^1.0.2"
+    typed-array-length "^1.0.6"
+    unbox-primitive "^1.0.2"
+    which-typed-array "^1.1.15"
+
+es-array-method-boxes-properly@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e"
+  integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
+
+es-define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+  integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+  dependencies:
+    get-intrinsic "^1.2.4"
+
+es-errors@^1.2.1, es-errors@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+  integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
+  integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+  dependencies:
+    es-errors "^1.3.0"
+
+es-set-tostringtag@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
+  integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+  dependencies:
+    get-intrinsic "^1.2.4"
+    has-tostringtag "^1.0.2"
+    hasown "^2.0.1"
+
+es-to-primitive@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+  integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+  dependencies:
+    is-callable "^1.1.4"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14:
+  version "0.10.64"
+  resolved "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
+  integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
+  dependencies:
+    es6-iterator "^2.0.3"
+    es6-symbol "^3.1.3"
+    esniff "^2.0.1"
+    next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-promise@^4.2.8:
+  version "4.2.8"
+  resolved "https://registry.npmmirror.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+  integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+  version "3.1.4"
+  resolved "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c"
+  integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==
+  dependencies:
+    d "^1.0.2"
+    ext "^1.7.0"
+
+escalade@^3.1.1:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
+  integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+  integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-loader@^2.1.2:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/eslint-loader/-/eslint-loader-2.2.1.tgz#28b9c12da54057af0845e2a6112701a2f6bf8337"
+  integrity sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==
+  dependencies:
+    loader-fs-cache "^1.0.0"
+    loader-utils "^1.0.2"
+    object-assign "^4.0.1"
+    object-hash "^1.1.4"
+    rimraf "^2.6.1"
+
+eslint-plugin-vue@^4.7.1:
+  version "4.7.1"
+  resolved "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-4.7.1.tgz#c829b9fc62582c1897b5a0b94afd44ecca511e63"
+  integrity sha512-esETKhVMI7Vdli70Wt4bvAwnZBJeM0pxVX9Yb0wWKxdCJc2EADalVYK/q2FzMw8oKN0wPMdqVCKS8kmR89recA==
+  dependencies:
+    vue-eslint-parser "^2.0.3"
+
+eslint-plugin-vue@^5.0.0:
+  version "5.2.3"
+  resolved "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz#3ee7597d823b5478804b2feba9863b1b74273961"
+  integrity sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==
+  dependencies:
+    vue-eslint-parser "^5.0.0"
+
+eslint-scope@^3.7.1:
+  version "3.7.3"
+  resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535"
+  integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-scope@^4.0.0, eslint-scope@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848"
+  integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==
+  dependencies:
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-utils@^1.3.1:
+  version "1.4.3"
+  resolved "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
+  integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
+  dependencies:
+    eslint-visitor-keys "^1.1.0"
+
+eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+  integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint@^4.19.1:
+  version "4.19.1"
+  resolved "https://registry.npmmirror.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
+  integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==
+  dependencies:
+    ajv "^5.3.0"
+    babel-code-frame "^6.22.0"
+    chalk "^2.1.0"
+    concat-stream "^1.6.0"
+    cross-spawn "^5.1.0"
+    debug "^3.1.0"
+    doctrine "^2.1.0"
+    eslint-scope "^3.7.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^3.5.4"
+    esquery "^1.0.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^11.0.1"
+    ignore "^3.3.3"
+    imurmurhash "^0.1.4"
+    inquirer "^3.0.6"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.9.1"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.3.0"
+    lodash "^4.17.4"
+    minimatch "^3.0.2"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.2"
+    pluralize "^7.0.0"
+    progress "^2.0.0"
+    regexpp "^1.0.1"
+    require-uncached "^1.0.3"
+    semver "^5.3.0"
+    strip-ansi "^4.0.0"
+    strip-json-comments "~2.0.1"
+    table "4.0.2"
+    text-table "~0.2.0"
+
+eslint@^5.16.0:
+  version "5.16.0"
+  resolved "https://registry.npmmirror.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
+  integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    ajv "^6.9.1"
+    chalk "^2.1.0"
+    cross-spawn "^6.0.5"
+    debug "^4.0.1"
+    doctrine "^3.0.0"
+    eslint-scope "^4.0.3"
+    eslint-utils "^1.3.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^5.0.1"
+    esquery "^1.0.1"
+    esutils "^2.0.2"
+    file-entry-cache "^5.0.1"
+    functional-red-black-tree "^1.0.1"
+    glob "^7.1.2"
+    globals "^11.7.0"
+    ignore "^4.0.6"
+    import-fresh "^3.0.0"
+    imurmurhash "^0.1.4"
+    inquirer "^6.2.2"
+    js-yaml "^3.13.0"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.3.0"
+    lodash "^4.17.11"
+    minimatch "^3.0.4"
+    mkdirp "^0.5.1"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.2"
+    progress "^2.0.0"
+    regexpp "^2.0.1"
+    semver "^5.5.1"
+    strip-ansi "^4.0.0"
+    strip-json-comments "^2.0.1"
+    table "^5.2.3"
+    text-table "^0.2.0"
+
+esniff@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
+  integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
+  dependencies:
+    d "^1.0.1"
+    es5-ext "^0.10.62"
+    event-emitter "^0.3.5"
+    type "^2.7.2"
+
+espree@^3.5.2, espree@^3.5.4:
+  version "3.5.4"
+  resolved "https://registry.npmmirror.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+  integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
+  dependencies:
+    acorn "^5.5.0"
+    acorn-jsx "^3.0.0"
+
+espree@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f"
+  integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==
+  dependencies:
+    acorn "^6.0.2"
+    acorn-jsx "^5.0.0"
+    eslint-visitor-keys "^1.0.0"
+
+espree@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a"
+  integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==
+  dependencies:
+    acorn "^6.0.7"
+    acorn-jsx "^5.0.0"
+    eslint-visitor-keys "^1.0.0"
+
+esprima@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.0.0, esquery@^1.0.1:
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
+  integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+  dependencies:
+    estraverse "^5.1.0"
+
+esrecurse@^4.1.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+  integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+  dependencies:
+    estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+  version "5.3.0"
+  resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+  integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+  integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+  version "1.8.1"
+  resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+  integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+event-emitter@^0.3.5:
+  version "0.3.5"
+  resolved "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+event-pubsub@4.3.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e"
+  integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==
+
+eventemitter3@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba"
+  integrity sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==
+
+eventemitter3@^4.0.0:
+  version "4.0.7"
+  resolved "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+  integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+events@^3.0.0:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+  integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+eventsource@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508"
+  integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+  dependencies:
+    md5.js "^1.3.4"
+    safe-buffer "^5.1.1"
+
+execa@^0.8.0:
+  version "0.8.0"
+  resolved "https://registry.npmmirror.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da"
+  integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+  integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+  dependencies:
+    cross-spawn "^6.0.0"
+    get-stream "^4.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^3.3.0:
+  version "3.4.0"
+  resolved "https://registry.npmmirror.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89"
+  integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==
+  dependencies:
+    cross-spawn "^7.0.0"
+    get-stream "^5.0.0"
+    human-signals "^1.1.1"
+    is-stream "^2.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^4.0.0"
+    onetime "^5.1.0"
+    p-finally "^2.0.0"
+    signal-exit "^3.0.2"
+    strip-final-newline "^2.0.0"
+
+exit-on-epipe@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692"
+  integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+express@^4.16.3, express@^4.17.1:
+  version "4.19.2"
+  resolved "https://registry.npmmirror.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465"
+  integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==
+  dependencies:
+    accepts "~1.3.8"
+    array-flatten "1.1.1"
+    body-parser "1.20.2"
+    content-disposition "0.5.4"
+    content-type "~1.0.4"
+    cookie "0.6.0"
+    cookie-signature "1.0.6"
+    debug "2.6.9"
+    depd "2.0.0"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    finalhandler "1.2.0"
+    fresh "0.5.2"
+    http-errors "2.0.0"
+    merge-descriptors "1.0.1"
+    methods "~1.1.2"
+    on-finished "2.4.1"
+    parseurl "~1.3.3"
+    path-to-regexp "0.1.7"
+    proxy-addr "~2.0.7"
+    qs "6.11.0"
+    range-parser "~1.2.1"
+    safe-buffer "5.2.1"
+    send "0.18.0"
+    serve-static "1.15.0"
+    setprototypeof "1.2.0"
+    statuses "2.0.1"
+    type-is "~1.6.18"
+    utils-merge "1.0.1"
+    vary "~1.1.2"
+
+ext@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
+  integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+  dependencies:
+    type "^2.7.2"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+extend@^3.0.2, extend@~3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+  integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+external-editor@^2.0.4:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
+  integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
+  dependencies:
+    chardet "^0.4.0"
+    iconv-lite "^0.4.17"
+    tmp "^0.0.33"
+
+external-editor@^3.0.3:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
+  integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
+  dependencies:
+    chardet "^0.7.0"
+    iconv-lite "^0.4.24"
+    tmp "^0.0.33"
+
+extglob@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+extsprintf@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+  integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==
+
+extsprintf@^1.2.0:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
+  integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
+
+fast-deep-equal@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+  integrity sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==
+
+fast-deep-equal@^3.1.1:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-diff@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154"
+  integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==
+
+fast-glob@^2.2.6:
+  version "2.2.7"
+  resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
+  integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==
+  dependencies:
+    "@mrmlnc/readdir-enhanced" "^2.2.1"
+    "@nodelib/fs.stat" "^1.1.2"
+    glob-parent "^3.1.0"
+    is-glob "^4.0.0"
+    merge2 "^1.2.3"
+    micromatch "^3.1.10"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+  integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@~2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+  integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastparse@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
+  integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==
+
+faye-websocket@^0.11.3, faye-websocket@^0.11.4:
+  version "0.11.4"
+  resolved "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da"
+  integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==
+  dependencies:
+    websocket-driver ">=0.5.1"
+
+fflate@^0.3.8:
+  version "0.3.11"
+  resolved "https://registry.npmmirror.com/fflate/-/fflate-0.3.11.tgz#2c440d7180fdeb819e64898d8858af327b042a5d"
+  integrity sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A==
+
+figgy-pudding@^3.5.1:
+  version "3.5.2"
+  resolved "https://registry.npmmirror.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
+  integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
+
+figures@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  integrity sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w==
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+file-entry-cache@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
+  integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
+  dependencies:
+    flat-cache "^2.0.1"
+
+file-loader@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa"
+  integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==
+  dependencies:
+    loader-utils "^1.0.2"
+    schema-utils "^1.0.0"
+
+file-uri-to-path@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+  integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+filesize@^3.6.1:
+  version "3.6.1"
+  resolved "https://registry.npmmirror.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
+  integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+  dependencies:
+    to-regex-range "^5.0.1"
+
+finalhandler@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32"
+  integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
+  dependencies:
+    debug "2.6.9"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    on-finished "2.4.1"
+    parseurl "~1.3.3"
+    statuses "2.0.1"
+    unpipe "~1.0.0"
+
+find-babel-config@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2"
+  integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==
+  dependencies:
+    json5 "^0.5.1"
+    path-exists "^3.0.0"
+
+find-cache-dir@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
+  integrity sha512-Z9XSBoNE7xQiV6MSgPuCfyMokH2K7JdpRkOYE1+mu3d4BFJtx3GW+f6Bo4q8IX6rlf5MYbLBKW0pjl2cWdkm2A==
+  dependencies:
+    commondir "^1.0.1"
+    mkdirp "^0.5.1"
+    pkg-dir "^1.0.0"
+
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  integrity sha512-46TFiBOzX7xq/PcSWfFwkyjpemdRnMe31UQF+os0y+1W3k95f6R4SEt02Hj4p3X0Mir9gfrkmOtshFidS0VPUg==
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
+find-cache-dir@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
+  integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^2.0.0"
+    pkg-dir "^3.0.0"
+
+find-cache-dir@^3.3.1:
+  version "3.3.2"
+  resolved "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
+  integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^3.0.2"
+    pkg-dir "^4.1.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==
+  dependencies:
+    locate-path "^2.0.0"
+
+find-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+  integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+  dependencies:
+    locate-path "^3.0.0"
+
+find-up@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+  integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+  dependencies:
+    locate-path "^5.0.0"
+    path-exists "^4.0.0"
+
+flat-cache@^1.2.1:
+  version "1.3.4"
+  resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
+  integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
+  dependencies:
+    circular-json "^0.3.1"
+    graceful-fs "^4.1.2"
+    rimraf "~2.6.2"
+    write "^0.2.1"
+
+flat-cache@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
+  integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
+  dependencies:
+    flatted "^2.0.0"
+    rimraf "2.6.3"
+    write "1.0.3"
+
+flatted@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
+  integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
+
+flush-write-stream@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
+  integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.3.6"
+
+follow-redirects@1.5.10:
+  version "1.5.10"
+  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
+  integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
+  dependencies:
+    debug "=3.1.0"
+
+follow-redirects@^1.0.0:
+  version "1.15.6"
+  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+  integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+
+font-awesome@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.npmmirror.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133"
+  integrity sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==
+
+for-each@^0.3.3:
+  version "0.3.3"
+  resolved "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+  integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+  dependencies:
+    is-callable "^1.1.3"
+
+for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+  integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+  integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
+
+form-data@~2.3.2:
+  version "2.3.3"
+  resolved "https://registry.npmmirror.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+  integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.6"
+    mime-types "^2.1.12"
+
+forwarded@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+  integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+frac@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
+  integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==
+  dependencies:
+    map-cache "^0.2.2"
+
+fresh@0.5.2:
+  version "0.5.2"
+  resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+  integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+from2@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-extra@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+  integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs-minipass@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
+  integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
+  dependencies:
+    minipass "^3.0.0"
+
+fs-write-stream-atomic@^1.0.8:
+  version "1.0.10"
+  resolved "https://registry.npmmirror.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  integrity sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==
+  dependencies:
+    graceful-fs "^4.1.2"
+    iferr "^0.1.5"
+    imurmurhash "^0.1.4"
+    readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@^1.2.7:
+  version "1.2.13"
+  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
+  integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+  dependencies:
+    bindings "^1.5.0"
+    nan "^2.12.1"
+
+fsevents@~2.3.2:
+  version "2.3.3"
+  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+  integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+fullcalendar@3.10.1:
+  version "3.10.1"
+  resolved "https://registry.npmmirror.com/fullcalendar/-/fullcalendar-3.10.1.tgz#cca3f9a2656a7e978a3f3facb7f35934a91185db"
+  integrity sha512-E0ioaHVmwdS4es8pNTUNva7505wPkUMFdn9JGFLYo+J12ARhN3zDBwoPj2DfB8rL7Yc1sSve+FqDHC3s2SZ7Fw==
+
+function-bind@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+  integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
+  integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.2.0"
+    es-abstract "^1.22.1"
+    functions-have-names "^1.2.3"
+
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+  integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
+
+functions-have-names@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+  integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+gensync@^1.0.0-beta.2:
+  version "1.0.0-beta.2"
+  resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+  integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+  integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+  dependencies:
+    es-errors "^1.3.0"
+    function-bind "^1.1.2"
+    has-proto "^1.0.1"
+    has-symbols "^1.0.3"
+    hasown "^2.0.0"
+
+get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+  integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==
+
+get-stream@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+  integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+  dependencies:
+    pump "^3.0.0"
+
+get-stream@^5.0.0, get-stream@^5.1.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+  integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+  dependencies:
+    pump "^3.0.0"
+
+get-symbol-description@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5"
+  integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
+  dependencies:
+    call-bind "^1.0.5"
+    es-errors "^1.3.0"
+    get-intrinsic "^1.2.4"
+
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+  integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob-parent@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  integrity sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==
+  dependencies:
+    is-glob "^3.1.0"
+    path-dirname "^1.0.0"
+
+glob-parent@~5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+  dependencies:
+    is-glob "^4.0.1"
+
+glob-to-regexp@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+  integrity sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==
+
+glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.2.0:
+  version "7.2.3"
+  resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+  integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.1.1"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^11.0.1, globals@^11.1.0, globals@^11.7.0:
+  version "11.12.0"
+  resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globalthis@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
+  integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+  dependencies:
+    define-properties "^1.1.3"
+
+globby@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+  integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==
+  dependencies:
+    array-union "^1.0.1"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+globby@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.npmmirror.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680"
+  integrity sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==
+  dependencies:
+    array-union "^1.0.1"
+    dir-glob "^2.0.0"
+    glob "^7.1.2"
+    ignore "^3.3.5"
+    pify "^3.0.0"
+    slash "^1.0.0"
+
+globby@^9.2.0:
+  version "9.2.0"
+  resolved "https://registry.npmmirror.com/globby/-/globby-9.2.0.tgz#fd029a706c703d29bdd170f4b6db3a3f7a7cb63d"
+  integrity sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==
+  dependencies:
+    "@types/glob" "^7.1.1"
+    array-union "^1.0.2"
+    dir-glob "^2.2.2"
+    fast-glob "^2.2.6"
+    glob "^7.1.3"
+    ignore "^4.0.3"
+    pify "^4.0.1"
+    slash "^2.0.0"
+
+gopd@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+  integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+  dependencies:
+    get-intrinsic "^1.1.3"
+
+"got@>=8.0 <12.0":
+  version "11.8.6"
+  resolved "https://registry.npmmirror.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
+  integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
+  dependencies:
+    "@sindresorhus/is" "^4.0.0"
+    "@szmarczak/http-timer" "^4.0.5"
+    "@types/cacheable-request" "^6.0.1"
+    "@types/responselike" "^1.0.0"
+    cacheable-lookup "^5.0.3"
+    cacheable-request "^7.0.2"
+    decompress-response "^6.0.0"
+    http2-wrapper "^1.0.0-beta.5.2"
+    lowercase-keys "^2.0.0"
+    p-cancelable "^2.0.0"
+    responselike "^2.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+  version "4.2.11"
+  resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+  integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+gzip-size@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
+  integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
+  dependencies:
+    duplexer "^0.1.1"
+    pify "^4.0.1"
+
+gzip-size@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462"
+  integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==
+  dependencies:
+    duplexer "^0.1.2"
+
+handle-thing@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
+  integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
+
+har-schema@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+  integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==
+
+har-validator@~5.1.3:
+  version "5.1.5"
+  resolved "https://registry.npmmirror.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+  integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+  dependencies:
+    ajv "^6.12.3"
+    har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+  integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+  integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+  integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+  dependencies:
+    es-define-property "^1.0.0"
+
+has-proto@^1.0.1, has-proto@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+  integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+
+has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+  integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+  integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+  dependencies:
+    has-symbols "^1.0.3"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+  integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6"
+  integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==
+
+hash-base@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+  integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+  dependencies:
+    inherits "^2.0.4"
+    readable-stream "^3.6.0"
+    safe-buffer "^5.2.0"
+
+hash-base@~3.0:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  integrity sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+hash-sum@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+  integrity sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.1.7"
+  resolved "https://registry.npmmirror.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+  integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+  dependencies:
+    inherits "^2.0.3"
+    minimalistic-assert "^1.0.1"
+
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+  integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+  dependencies:
+    function-bind "^1.1.2"
+
+he@1.2.x, he@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+  integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+hex-color-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+  integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==
+
+highlight.js@^10.7.1:
+  version "10.7.3"
+  resolved "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
+  integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==
+
+hmac-drbg@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
+hoopy@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
+  integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
+
+hosted-git-info@^2.1.4:
+  version "2.8.9"
+  resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+  integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+hpack.js@^2.1.6:
+  version "2.1.6"
+  resolved "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+  integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==
+  dependencies:
+    inherits "^2.0.1"
+    obuf "^1.0.0"
+    readable-stream "^2.0.1"
+    wbuf "^1.1.0"
+
+hsl-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+  integrity sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==
+
+hsla-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+  integrity sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==
+
+html-entities@^1.3.1:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc"
+  integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==
+
+html-escaper@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+  integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+html-minifier@^3.2.3:
+  version "3.5.21"
+  resolved "https://registry.npmmirror.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c"
+  integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==
+  dependencies:
+    camel-case "3.0.x"
+    clean-css "4.2.x"
+    commander "2.17.x"
+    he "1.2.x"
+    param-case "2.1.x"
+    relateurl "0.2.x"
+    uglify-js "3.4.x"
+
+html-tags@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz#10b30a386085f43cede353cc8fa7cb0deeea668b"
+  integrity sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==
+
+html-void-elements@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f"
+  integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
+
+html-webpack-plugin@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b"
+  integrity sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==
+  dependencies:
+    html-minifier "^3.2.3"
+    loader-utils "^0.2.16"
+    lodash "^4.17.3"
+    pretty-error "^2.0.2"
+    tapable "^1.0.0"
+    toposort "^1.0.0"
+    util.promisify "1.0.0"
+
+htmlparser2@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7"
+  integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==
+  dependencies:
+    domelementtype "^2.0.1"
+    domhandler "^4.0.0"
+    domutils "^2.5.2"
+    entities "^2.0.0"
+
+http-cache-semantics@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
+  integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
+
+http-deceiver@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+  integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
+
+http-errors@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+  integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+  dependencies:
+    depd "2.0.0"
+    inherits "2.0.4"
+    setprototypeof "1.2.0"
+    statuses "2.0.1"
+    toidentifier "1.0.1"
+
+http-errors@~1.6.2:
+  version "1.6.3"
+  resolved "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+  integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.3"
+    setprototypeof "1.1.0"
+    statuses ">= 1.4.0 < 2"
+
+http-parser-js@>=0.5.1:
+  version "0.5.8"
+  resolved "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3"
+  integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==
+
+http-proxy-middleware@0.19.1:
+  version "0.19.1"
+  resolved "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a"
+  integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==
+  dependencies:
+    http-proxy "^1.17.0"
+    is-glob "^4.0.0"
+    lodash "^4.17.11"
+    micromatch "^3.1.10"
+
+http-proxy@^1.17.0:
+  version "1.18.1"
+  resolved "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+  integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
+  dependencies:
+    eventemitter3 "^4.0.0"
+    follow-redirects "^1.0.0"
+    requires-port "^1.0.0"
+
+http-signature@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==
+  dependencies:
+    assert-plus "^1.0.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+http2-wrapper@^1.0.0-beta.5.2:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
+  integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
+  dependencies:
+    quick-lru "^5.1.1"
+    resolve-alpn "^1.0.0"
+
+https-browserify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+  integrity sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==
+
+human-signals@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+  integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
+i18next@^20.4.0:
+  version "20.6.1"
+  resolved "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz#535e5f6e5baeb685c7d25df70db63bf3cc0aa345"
+  integrity sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==
+  dependencies:
+    "@babel/runtime" "^7.12.0"
+
+iconv-lite@0.4.24, iconv-lite@^0.4.17, iconv-lite@^0.4.24:
+  version "0.4.24"
+  resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+icss-replace-symbols@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+  integrity sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==
+
+icss-utils@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
+  integrity sha512-bsVoyn/1V4R1kYYjLcWLedozAM4FClZUdjE9nIr8uWY7xs78y9DATgwz2wGU7M+7z55KenmmTkN2DVJ7bqzjAA==
+  dependencies:
+    postcss "^6.0.1"
+
+ieee754@^1.1.4:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+  integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+iferr@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.npmmirror.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+  integrity sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==
+
+ignore@^3.3.3, ignore@^3.3.5:
+  version "3.3.10"
+  resolved "https://registry.npmmirror.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+  integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
+
+ignore@^4.0.3, ignore@^4.0.6:
+  version "4.0.6"
+  resolved "https://registry.npmmirror.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+  integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
+
+image-size@~0.5.0:
+  version "0.5.5"
+  resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
+  integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
+
+immer@^9.0.6:
+  version "9.0.21"
+  resolved "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176"
+  integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
+
+import-cwd@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
+  integrity sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==
+  dependencies:
+    import-from "^2.1.0"
+
+import-fresh@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+  integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==
+  dependencies:
+    caller-path "^2.0.0"
+    resolve-from "^3.0.0"
+
+import-fresh@^3.0.0:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+  integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
+import-from@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
+  integrity sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==
+  dependencies:
+    resolve-from "^3.0.0"
+
+import-local@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+  integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
+  dependencies:
+    pkg-dir "^3.0.0"
+    resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+  integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+indent-string@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+  integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+indexes-of@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+  integrity sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==
+
+infer-owner@^1.0.3, infer-owner@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+  integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+  integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
+
+inquirer@^3.0.6:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+  integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==
+  dependencies:
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.0"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^2.0.4"
+    figures "^2.0.0"
+    lodash "^4.3.0"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rx-lite "^4.0.8"
+    rx-lite-aggregates "^4.0.8"
+    string-width "^2.1.0"
+    strip-ansi "^4.0.0"
+    through "^2.3.6"
+
+inquirer@^6.2.2:
+  version "6.5.2"
+  resolved "https://registry.npmmirror.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
+  integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
+  dependencies:
+    ansi-escapes "^3.2.0"
+    chalk "^2.4.2"
+    cli-cursor "^2.1.0"
+    cli-width "^2.0.0"
+    external-editor "^3.0.3"
+    figures "^2.0.0"
+    lodash "^4.17.12"
+    mute-stream "0.0.7"
+    run-async "^2.2.0"
+    rxjs "^6.4.0"
+    string-width "^2.1.0"
+    strip-ansi "^5.1.0"
+    through "^2.3.6"
+
+internal-ip@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
+  integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==
+  dependencies:
+    default-gateway "^4.2.0"
+    ipaddr.js "^1.9.0"
+
+internal-slot@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
+  integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
+  dependencies:
+    es-errors "^1.3.0"
+    hasown "^2.0.0"
+    side-channel "^1.0.4"
+
+invariant@^2.2.2:
+  version "2.2.4"
+  resolved "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+  integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+  dependencies:
+    loose-envify "^1.0.0"
+
+ip-regex@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
+  integrity sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==
+
+ip@^1.1.0, ip@^1.1.5:
+  version "1.1.9"
+  resolved "https://registry.npmmirror.com/ip/-/ip-1.1.9.tgz#8dfbcc99a754d07f425310b86a99546b1151e396"
+  integrity sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==
+
+ipaddr.js@1.9.1, ipaddr.js@^1.9.0:
+  version "1.9.1"
+  resolved "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+  integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+is-absolute-url@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+  integrity sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==
+
+is-absolute-url@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
+  integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==
+
+is-accessor-descriptor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4"
+  integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==
+  dependencies:
+    hasown "^2.0.0"
+
+is-arguments@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+  integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
+is-array-buffer@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
+  integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
+  dependencies:
+    call-bind "^1.0.2"
+    get-intrinsic "^1.2.1"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+  integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-arrayish@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+  integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-bigint@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+  integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+  dependencies:
+    has-bigints "^1.0.1"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  integrity sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-binary-path@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+  integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+  dependencies:
+    binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+  integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+  integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-ci@^1.0.10:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
+  integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
+  dependencies:
+    ci-info "^1.5.0"
+
+is-color-stop@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+  integrity sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==
+  dependencies:
+    css-color-names "^0.0.4"
+    hex-color-regex "^1.1.0"
+    hsl-regex "^1.0.0"
+    hsla-regex "^1.0.0"
+    rgb-regex "^1.0.1"
+    rgba-regex "^1.0.0"
+
+is-core-module@^2.13.0:
+  version "2.13.1"
+  resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
+  integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+  dependencies:
+    hasown "^2.0.0"
+
+is-data-descriptor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb"
+  integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==
+  dependencies:
+    hasown "^2.0.0"
+
+is-data-view@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f"
+  integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
+  dependencies:
+    is-typed-array "^1.1.13"
+
+is-date-object@^1.0.1, is-date-object@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+  integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
+is-descriptor@^0.1.0:
+  version "0.1.7"
+  resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33"
+  integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==
+  dependencies:
+    is-accessor-descriptor "^1.0.1"
+    is-data-descriptor "^1.0.1"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306"
+  integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==
+  dependencies:
+    is-accessor-descriptor "^1.0.1"
+    is-data-descriptor "^1.0.1"
+
+is-directory@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+  integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==
+
+is-docker@^2.0.0:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+  integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+  integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+  integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==
+
+is-fullwidth-code-point@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  integrity sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==
+  dependencies:
+    is-extglob "^2.1.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-hotkey@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz#1835a68171a91e5c9460869d96336947c8340cef"
+  integrity sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==
+
+is-negative-zero@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+  integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+
+is-number-object@^1.0.4:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+  integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+  integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-path-cwd@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb"
+  integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
+
+is-path-in-cwd@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb"
+  integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==
+  dependencies:
+    is-path-inside "^2.1.0"
+
+is-path-inside@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
+  integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==
+  dependencies:
+    path-is-inside "^1.0.2"
+
+is-plain-obj@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+  integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+  dependencies:
+    isobject "^3.0.1"
+
+is-plain-object@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
+  integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
+is-regex@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+  integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
+is-resolvable@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+  integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688"
+  integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
+  dependencies:
+    call-bind "^1.0.7"
+
+is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+  integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==
+
+is-stream@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+  integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.0.5, is-string@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+  integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+  integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+  dependencies:
+    has-symbols "^1.0.2"
+
+is-typed-array@^1.1.13:
+  version "1.1.13"
+  resolved "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
+  integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
+  dependencies:
+    which-typed-array "^1.1.14"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+  integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
+
+is-url@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+  integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
+is-weakref@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+  integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+  dependencies:
+    call-bind "^1.0.2"
+
+is-what@^3.14.1:
+  version "3.14.1"
+  resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
+  integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
+
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+  integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==
+
+is-wsl@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+  dependencies:
+    is-docker "^2.0.0"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isarray@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+  integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+  integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+  integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+  integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
+
+javascript-stringify@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/javascript-stringify/-/javascript-stringify-1.6.0.tgz#142d111f3a6e3dae8f4a9afd77d45855b5a9cce3"
+  integrity sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==
+
+jquery@^3.4.1:
+  version "3.7.1"
+  resolved "https://registry.npmmirror.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
+  integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==
+
+js-file-download@^0.4.8:
+  version "0.4.12"
+  resolved "https://registry.npmmirror.com/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821"
+  integrity sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==
+
+js-levenshtein@^1.1.3:
+  version "1.1.6"
+  resolved "https://registry.npmmirror.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d"
+  integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==
+
+js-message@1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/js-message/-/js-message-1.0.7.tgz#fbddd053c7a47021871bb8b2c95397cc17c20e47"
+  integrity sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==
+
+js-queue@2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/js-queue/-/js-queue-2.0.2.tgz#0be590338f903b36c73d33c31883a821412cd482"
+  integrity sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==
+  dependencies:
+    easy-stack "^1.0.1"
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+  integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==
+
+js-yaml@^3.13.0, js-yaml@^3.13.1, js-yaml@^3.9.1:
+  version "3.14.1"
+  resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+  integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+  integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==
+
+jsesc@^2.5.1:
+  version "2.5.2"
+  resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+  integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+
+json-buffer@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+  integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+  integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-parse-even-better-errors@^2.3.0:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+  integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+  integrity sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+  integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
+  integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+  integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+  integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
+json5@^0.5.0, json5@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.npmmirror.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+  integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==
+
+json5@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
+  integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
+  dependencies:
+    minimist "^1.2.0"
+
+json5@^2.1.2, json5@^2.2.3:
+  version "2.2.3"
+  resolved "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+  integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonfile@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsprim@^1.2.2:
+  version "1.4.2"
+  resolved "https://registry.npmmirror.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
+  integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.4.0"
+    verror "1.10.0"
+
+keyv@^4.0.0:
+  version "4.5.4"
+  resolved "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+  integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+  dependencies:
+    json-buffer "3.0.1"
+
+killable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
+  integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^6.0.2:
+  version "6.0.3"
+  resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+  integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+launch-editor-middleware@^2.2.1:
+  version "2.6.1"
+  resolved "https://registry.npmmirror.com/launch-editor-middleware/-/launch-editor-middleware-2.6.1.tgz#7f2f400d8dda2283b69d02e9d83b1d272fef2bfb"
+  integrity sha512-Fg/xYhf7ARmRp40n18wIfJyuAMEjXo67Yull7uF7d0OJ3qA4EYJISt1XfPPn69IIJ5jKgQwzcg6DqHYo95LL/g==
+  dependencies:
+    launch-editor "^2.6.1"
+
+launch-editor@^2.2.1, launch-editor@^2.6.1:
+  version "2.6.1"
+  resolved "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c"
+  integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==
+  dependencies:
+    picocolors "^1.0.0"
+    shell-quote "^1.8.1"
+
+less-loader@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/less-loader/-/less-loader-5.0.0.tgz#498dde3a6c6c4f887458ee9ed3f086a12ad1b466"
+  integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==
+  dependencies:
+    clone "^2.1.1"
+    loader-utils "^1.1.0"
+    pify "^4.0.1"
+
+less@^3.9.0:
+  version "3.13.1"
+  resolved "https://registry.npmmirror.com/less/-/less-3.13.1.tgz#0ebc91d2a0e9c0c6735b83d496b0ab0583077909"
+  integrity sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==
+  dependencies:
+    copy-anything "^2.0.1"
+    tslib "^1.10.0"
+  optionalDependencies:
+    errno "^0.1.1"
+    graceful-fs "^4.1.2"
+    image-size "~0.5.0"
+    make-dir "^2.1.0"
+    mime "^1.4.1"
+    native-request "^1.0.5"
+    source-map "~0.6.0"
+
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+lines-and-columns@^1.1.6:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+  integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+loader-fs-cache@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9"
+  integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==
+  dependencies:
+    find-cache-dir "^0.1.1"
+    mkdirp "^0.5.1"
+
+loader-runner@^2.3.1, loader-runner@^2.4.0:
+  version "2.4.0"
+  resolved "https://registry.npmmirror.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
+  integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
+
+loader-utils@^0.2.16:
+  version "0.2.17"
+  resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+  integrity sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+    object-assign "^4.0.1"
+
+loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
+  version "1.4.2"
+  resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3"
+  integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^1.0.1"
+
+loader-utils@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
+  integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^2.1.2"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+  integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+  dependencies:
+    p-locate "^3.0.0"
+    path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+  integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+  dependencies:
+    p-locate "^4.1.0"
+
+lodash.camelcase@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+  integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
+lodash.clonedeep@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+  integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==
+
+lodash.debounce@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+  integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.defaultsdeep@^4.6.0, lodash.defaultsdeep@^4.6.1:
+  version "4.6.1"
+  resolved "https://registry.npmmirror.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6"
+  integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==
+
+lodash.foreach@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+  integrity sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==
+
+lodash.isequal@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+  integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
+lodash.kebabcase@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
+  integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==
+
+lodash.mapvalues@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.npmmirror.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c"
+  integrity sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==
+
+lodash.memoize@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+  integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
+
+lodash.throttle@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
+  integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==
+
+lodash.toarray@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
+  integrity sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==
+
+lodash.transform@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.npmmirror.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0"
+  integrity sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==
+
+lodash.uniq@^4.5.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+  integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==
+
+lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0:
+  version "4.17.21"
+  resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+  integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==
+  dependencies:
+    chalk "^2.0.1"
+
+loglevel@^1.6.8:
+  version "1.9.1"
+  resolved "https://registry.npmmirror.com/loglevel/-/loglevel-1.9.1.tgz#d63976ac9bcd03c7c873116d41c2a85bafff1be7"
+  integrity sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==
+
+loose-envify@^1.0.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+  integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+  dependencies:
+    js-tokens "^3.0.0 || ^4.0.0"
+
+lower-case@^1.1.1:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+  integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==
+
+lowercase-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+  integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2:
+  version "4.1.5"
+  resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+  integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+lru-cache@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+  integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+  dependencies:
+    yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
+make-dir@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+  integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
+  dependencies:
+    pify "^3.0.0"
+
+make-dir@^2.0.0, make-dir@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+  integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+  dependencies:
+    pify "^4.0.1"
+    semver "^5.6.0"
+
+make-dir@^3.0.2, make-dir@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+  integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+  dependencies:
+    semver "^6.0.0"
+
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+  integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==
+  dependencies:
+    object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+  version "1.3.5"
+  resolved "https://registry.npmmirror.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+  integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+    safe-buffer "^5.1.2"
+
+mdn-data@2.0.14:
+  version "2.0.14"
+  resolved "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
+  integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+
+mdn-data@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
+  integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+  integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+memory-fs@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  integrity sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+memory-fs@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
+  integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+merge-descriptors@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+  integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
+
+merge-source-map@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646"
+  integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==
+  dependencies:
+    source-map "^0.6.1"
+
+merge-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.2.3:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+methods@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+  integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+micromatch@^3.1.10, micromatch@^3.1.4:
+  version "3.1.10"
+  resolved "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+  integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.3.1"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    extglob "^2.0.4"
+    fragment-cache "^0.2.1"
+    kind-of "^6.0.2"
+    nanomatch "^1.2.9"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
+  version "1.52.0"
+  resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-match@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8"
+  integrity sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==
+  dependencies:
+    wildcard "^1.1.0"
+
+mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
+  version "2.1.35"
+  resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+  integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+  dependencies:
+    mime-db "1.52.0"
+
+mime@1.6.0, mime@^1.4.1:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mime@^2.0.3, mime@^2.4.4:
+  version "2.6.0"
+  resolved "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
+  integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+
+mimic-fn@^1.0.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+  integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+
+mimic-fn@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-response@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+  integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+mimic-response@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+  integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
+mini-css-extract-plugin@^0.8.0:
+  version "0.8.2"
+  resolved "https://registry.npmmirror.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz#a875e169beb27c88af77dd962771c9eedc3da161"
+  integrity sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==
+  dependencies:
+    loader-utils "^1.1.0"
+    normalize-url "1.9.1"
+    schema-utils "^1.0.0"
+    webpack-sources "^1.1.0"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+  integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+  integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
+
+minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+  integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.6:
+  version "1.2.8"
+  resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+  integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass-collect@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
+  integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-flush@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373"
+  integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass-pipeline@^1.2.2:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c"
+  integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==
+  dependencies:
+    minipass "^3.0.0"
+
+minipass@^3.0.0, minipass@^3.1.1:
+  version "3.3.6"
+  resolved "https://registry.npmmirror.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a"
+  integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==
+  dependencies:
+    yallist "^4.0.0"
+
+minipass@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
+  integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
+
+minizlib@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
+  integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
+  dependencies:
+    minipass "^3.0.0"
+    yallist "^4.0.0"
+
+mississippi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+  integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^2.0.1"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+mississippi@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
+  integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^3.0.0"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+  version "1.3.2"
+  resolved "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+  integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.6, mkdirp@~0.5.1:
+  version "0.5.6"
+  resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+  integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+  dependencies:
+    minimist "^1.2.6"
+
+mkdirp@^1.0.3, mkdirp@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+mockjs@^1.0.1-beta3:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz#e6a0c378e91906dbaff20911cc0273b3c7d75b06"
+  integrity sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==
+  dependencies:
+    commander "*"
+
+moment@^2.24.0:
+  version "2.30.1"
+  resolved "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz#f8c91c07b7a786e30c59926df530b4eac96974ae"
+  integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==
+
+move-concurrently@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  integrity sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==
+  dependencies:
+    aproba "^1.1.1"
+    copy-concurrently "^1.0.0"
+    fs-write-stream-atomic "^1.0.8"
+    mkdirp "^0.5.1"
+    rimraf "^2.5.4"
+    run-queue "^1.0.3"
+
+mrmime@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4"
+  integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+  integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3, ms@^2.1.1:
+  version "2.1.3"
+  resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multicast-dns-service-types@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
+  integrity sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==
+
+multicast-dns@^6.0.1:
+  version "6.2.3"
+  resolved "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
+  integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==
+  dependencies:
+    dns-packet "^1.3.1"
+    thunky "^1.0.2"
+
+mute-stream@0.0.7:
+  version "0.0.7"
+  resolved "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+  integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==
+
+mz@^2.4.0:
+  version "2.7.0"
+  resolved "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+  integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+  dependencies:
+    any-promise "^1.0.0"
+    object-assign "^4.0.1"
+    thenify-all "^1.0.0"
+
+namespace-emitter@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz#978d51361c61313b4e6b8cf6f3853d08dfa2b17c"
+  integrity sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==
+
+nan@^2.12.1:
+  version "2.19.0"
+  resolved "https://registry.npmmirror.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0"
+  integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==
+
+nanoid@^3.1.25, nanoid@^3.2.0, nanoid@^3.3.7:
+  version "3.3.7"
+  resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+  integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+nanomatch@^1.2.9:
+  version "1.2.13"
+  resolved "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+native-request@^1.0.5:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/native-request/-/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0"
+  integrity sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+  integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+negotiator@0.6.3:
+  version "0.6.3"
+  resolved "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+  integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
+  version "2.6.2"
+  resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+  integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+next-tick@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+  integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+nice-try@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+  integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+no-case@^2.2.0:
+  version "2.3.2"
+  resolved "https://registry.npmmirror.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+  integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
+  dependencies:
+    lower-case "^1.1.1"
+
+node-forge@^0.10.0:
+  version "0.10.0"
+  resolved "https://registry.npmmirror.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3"
+  integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==
+
+node-ipc@^9.1.1:
+  version "9.2.1"
+  resolved "https://registry.npmmirror.com/node-ipc/-/node-ipc-9.2.1.tgz#b32f66115f9d6ce841dc4ec2009d6a733f98bb6b"
+  integrity sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==
+  dependencies:
+    event-pubsub "4.3.0"
+    js-message "1.0.7"
+    js-queue "2.0.2"
+
+node-libs-browser@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
+  integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.2.0"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^3.0.0"
+    https-browserify "^1.0.0"
+    os-browserify "^0.3.0"
+    path-browserify "0.0.1"
+    process "^0.11.10"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.3.3"
+    stream-browserify "^2.0.1"
+    stream-http "^2.7.2"
+    string_decoder "^1.0.0"
+    timers-browserify "^2.0.4"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.11.0"
+    vm-browserify "^1.0.1"
+
+node-releases@^2.0.14:
+  version "2.0.14"
+  resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
+  integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+
+normalize-package-data@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+  dependencies:
+    hosted-git-info "^2.1.4"
+    resolve "^1.10.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379"
+  integrity sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==
+
+normalize-path@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+  integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
+
+normalize-url@1.9.1:
+  version "1.9.1"
+  resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+  integrity sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==
+  dependencies:
+    object-assign "^4.0.1"
+    prepend-http "^1.0.0"
+    query-string "^4.1.0"
+    sort-keys "^1.0.0"
+
+normalize-url@^3.0.0:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
+  integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
+
+normalize-url@^6.0.1:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
+  integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
+
+normalize-wheel@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45"
+  integrity sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA==
+
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==
+  dependencies:
+    path-key "^2.0.0"
+
+npm-run-path@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+  integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+  dependencies:
+    path-key "^3.0.0"
+
+nth-check@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+  integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
+  dependencies:
+    boolbase "~1.0.0"
+
+nth-check@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+  integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+  dependencies:
+    boolbase "^1.0.0"
+
+num2fraction@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+  integrity sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==
+
+oauth-sign@~0.9.0:
+  version "0.9.0"
+  resolved "https://registry.npmmirror.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+  integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-hash@^1.1.4:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
+  integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
+
+object-inspect@^1.13.1:
+  version "1.13.1"
+  resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
+  integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+
+object-is@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.npmmirror.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07"
+  integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+
+object-keys@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+  integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==
+  dependencies:
+    isobject "^3.0.0"
+
+object.assign@^4.1.0, object.assign@^4.1.4, object.assign@^4.1.5:
+  version "4.1.5"
+  resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
+  integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+  dependencies:
+    call-bind "^1.0.5"
+    define-properties "^1.2.1"
+    has-symbols "^1.0.3"
+    object-keys "^1.1.1"
+
+object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
+  version "2.1.8"
+  resolved "https://registry.npmmirror.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz#2f1fe0606ec1a7658154ccd4f728504f69667923"
+  integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==
+  dependencies:
+    array.prototype.reduce "^1.0.6"
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
+    es-object-atoms "^1.0.0"
+    gopd "^1.0.1"
+    safe-array-concat "^1.1.2"
+
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==
+  dependencies:
+    isobject "^3.0.1"
+
+object.values@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
+  integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-object-atoms "^1.0.0"
+
+obuf@^1.0.0, obuf@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
+  integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
+
+on-finished@2.4.1:
+  version "2.4.1"
+  resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+  integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+  dependencies:
+    ee-first "1.1.1"
+
+on-headers@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+  integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+  dependencies:
+    wrappy "1"
+
+onetime@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+  integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==
+  dependencies:
+    mimic-fn "^1.0.0"
+
+onetime@^5.1.0:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+  integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+  dependencies:
+    mimic-fn "^2.1.0"
+
+open@^6.3.0:
+  version "6.4.0"
+  resolved "https://registry.npmmirror.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9"
+  integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==
+  dependencies:
+    is-wsl "^1.1.0"
+
+opener@^1.5.1, opener@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.npmmirror.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
+  integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
+
+opn@^5.5.0:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
+  integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==
+  dependencies:
+    is-wsl "^1.1.0"
+
+optionator@^0.8.2:
+  version "0.8.3"
+  resolved "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+  integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.6"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    word-wrap "~1.2.3"
+
+ora@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.npmmirror.com/ora/-/ora-3.4.0.tgz#bf0752491059a3ef3ed4c85097531de9fdbcd318"
+  integrity sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==
+  dependencies:
+    chalk "^2.4.2"
+    cli-cursor "^2.1.0"
+    cli-spinners "^2.0.0"
+    log-symbols "^2.2.0"
+    strip-ansi "^5.2.0"
+    wcwidth "^1.0.1"
+
+os-browserify@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+  integrity sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==
+
+os-tmpdir@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+  integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
+
+p-cancelable@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
+  integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+  integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
+
+p-finally@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561"
+  integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==
+
+p-limit@^1.0.0, p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+  dependencies:
+    p-try "^1.0.0"
+
+p-limit@^2.0.0, p-limit@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+  integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+  dependencies:
+    p-try "^2.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==
+  dependencies:
+    p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+  integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+  dependencies:
+    p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+  integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+  dependencies:
+    p-limit "^2.2.0"
+
+p-map@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
+  integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
+
+p-map@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+  integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+  dependencies:
+    aggregate-error "^3.0.0"
+
+p-retry@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
+  integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==
+  dependencies:
+    retry "^0.12.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+  integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==
+
+p-try@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+pako@~1.0.5:
+  version "1.0.11"
+  resolved "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+parallel-transform@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
+  integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
+  dependencies:
+    cyclist "^1.0.1"
+    inherits "^2.0.3"
+    readable-stream "^2.1.5"
+
+param-case@2.1.x:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+  integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==
+  dependencies:
+    no-case "^2.2.0"
+
+parchment@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/parchment/-/parchment-1.1.4.tgz#aeded7ab938fe921d4c34bc339ce1168bc2ffde5"
+  integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==
+
+parent-module@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+  dependencies:
+    callsites "^3.0.0"
+
+parse-asn1@^5.0.0, parse-asn1@^5.1.7:
+  version "5.1.7"
+  resolved "https://registry.npmmirror.com/parse-asn1/-/parse-asn1-5.1.7.tgz#73cdaaa822125f9647165625eb45f8a051d2df06"
+  integrity sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==
+  dependencies:
+    asn1.js "^4.10.1"
+    browserify-aes "^1.2.0"
+    evp_bytestokey "^1.0.3"
+    hash-base "~3.0"
+    pbkdf2 "^3.1.2"
+    safe-buffer "^5.2.1"
+
+parse-json@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+  integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==
+  dependencies:
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+
+parse-json@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+  integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    error-ex "^1.3.1"
+    json-parse-even-better-errors "^2.3.0"
+    lines-and-columns "^1.1.6"
+
+parse5-htmlparser2-tree-adapter@^6.0.0:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6"
+  integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==
+  dependencies:
+    parse5 "^6.0.1"
+
+parse5@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
+  integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
+
+parse5@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+  integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+parseurl@~1.3.2, parseurl@~1.3.3:
+  version "1.3.3"
+  resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+  integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+  integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==
+
+path-browserify@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.npmmirror.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+  integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
+
+path-dirname@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+  integrity sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+  integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+path-exists@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+  integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+  integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-is-inside@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+  integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==
+
+path-key@^2.0.0, path-key@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+  integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
+
+path-key@^3.0.0, path-key@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+  integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+  version "0.1.7"
+  resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+  integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
+
+path-type@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+  integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+  dependencies:
+    pify "^3.0.0"
+
+pbkdf2@^3.0.3, pbkdf2@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+  integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+  integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
+
+picocolors@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
+  integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
+
+picocolors@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+  integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.1:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+  integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pify@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+  integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+  integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
+
+pify@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+  integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+  integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==
+
+pkg-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
+  integrity sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg==
+  dependencies:
+    find-up "^1.0.0"
+
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  integrity sha512-ojakdnUgL5pzJYWw2AIDEupaQCX5OPbM688ZevubICjdIX01PRSYKqm33fJoCOJBRseYCTUlQRnBNX+Pchaejw==
+  dependencies:
+    find-up "^2.1.0"
+
+pkg-dir@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+  integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+  dependencies:
+    find-up "^3.0.0"
+
+pkg-dir@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+  integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+  dependencies:
+    find-up "^4.0.0"
+
+pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
+  integrity sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==
+  dependencies:
+    find-up "^2.1.0"
+
+pluralize@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+  integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==
+
+popper.js@^1.15.0:
+  version "1.16.1"
+  resolved "https://registry.npmmirror.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
+  integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==
+
+portfinder@^1.0.20, portfinder@^1.0.26:
+  version "1.0.32"
+  resolved "https://registry.npmmirror.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81"
+  integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==
+  dependencies:
+    async "^2.6.4"
+    debug "^3.2.7"
+    mkdirp "^0.5.6"
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+  integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==
+
+possible-typed-array-names@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
+  integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
+
+postcss-calc@^7.0.1:
+  version "7.0.5"
+  resolved "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e"
+  integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==
+  dependencies:
+    postcss "^7.0.27"
+    postcss-selector-parser "^6.0.2"
+    postcss-value-parser "^4.0.2"
+
+postcss-colormin@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
+  integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==
+  dependencies:
+    browserslist "^4.0.0"
+    color "^3.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-convert-values@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
+  integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-discard-comments@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
+  integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-discard-duplicates@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
+  integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-discard-empty@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
+  integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-discard-overridden@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
+  integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-load-config@^2.0.0:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a"
+  integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==
+  dependencies:
+    cosmiconfig "^5.0.0"
+    import-cwd "^2.0.0"
+
+postcss-loader@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
+  integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
+  dependencies:
+    loader-utils "^1.1.0"
+    postcss "^7.0.0"
+    postcss-load-config "^2.0.0"
+    schema-utils "^1.0.0"
+
+postcss-merge-longhand@^4.0.11:
+  version "4.0.11"
+  resolved "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
+  integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==
+  dependencies:
+    css-color-names "0.0.4"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+    stylehacks "^4.0.0"
+
+postcss-merge-rules@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
+  integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-api "^3.0.0"
+    cssnano-util-same-parent "^4.0.0"
+    postcss "^7.0.0"
+    postcss-selector-parser "^3.0.0"
+    vendors "^1.0.0"
+
+postcss-minify-font-values@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
+  integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
+  integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    is-color-stop "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
+  integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==
+  dependencies:
+    alphanum-sort "^1.0.0"
+    browserslist "^4.0.0"
+    cssnano-util-get-arguments "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+    uniqs "^2.0.0"
+
+postcss-minify-selectors@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
+  integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==
+  dependencies:
+    alphanum-sort "^1.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-selector-parser "^3.0.0"
+
+postcss-modules-extract-imports@^1.2.0:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a"
+  integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==
+  dependencies:
+    postcss "^6.0.1"
+
+postcss-modules-local-by-default@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+  integrity sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-scope@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+  integrity sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==
+  dependencies:
+    css-selector-tokenizer "^0.7.0"
+    postcss "^6.0.1"
+
+postcss-modules-values@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+  integrity sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==
+  dependencies:
+    icss-replace-symbols "^1.1.0"
+    postcss "^6.0.1"
+
+postcss-normalize-charset@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
+  integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==
+  dependencies:
+    postcss "^7.0.0"
+
+postcss-normalize-display-values@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
+  integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==
+  dependencies:
+    cssnano-util-get-match "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
+  integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
+  integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    cssnano-util-get-match "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
+  integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==
+  dependencies:
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
+  integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==
+  dependencies:
+    cssnano-util-get-match "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-unicode@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
+  integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==
+  dependencies:
+    browserslist "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-url@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
+  integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==
+  dependencies:
+    is-absolute-url "^2.0.0"
+    normalize-url "^3.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-normalize-whitespace@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
+  integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
+  integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==
+  dependencies:
+    cssnano-util-get-arguments "^4.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-reduce-initial@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
+  integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==
+  dependencies:
+    browserslist "^4.0.0"
+    caniuse-api "^3.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+
+postcss-reduce-transforms@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
+  integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==
+  dependencies:
+    cssnano-util-get-match "^4.0.0"
+    has "^1.0.0"
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+
+postcss-selector-parser@^3.0.0:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270"
+  integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==
+  dependencies:
+    dot-prop "^5.2.0"
+    indexes-of "^1.0.1"
+    uniq "^1.0.1"
+
+postcss-selector-parser@^6.0.2:
+  version "6.0.16"
+  resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04"
+  integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==
+  dependencies:
+    cssesc "^3.0.0"
+    util-deprecate "^1.0.2"
+
+postcss-svgo@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e"
+  integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==
+  dependencies:
+    postcss "^7.0.0"
+    postcss-value-parser "^3.0.0"
+    svgo "^1.0.0"
+
+postcss-unique-selectors@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
+  integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==
+  dependencies:
+    alphanum-sort "^1.0.0"
+    postcss "^7.0.0"
+    uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0:
+  version "3.3.1"
+  resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
+  integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
+
+postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
+  integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+
+postcss@^6.0.1, postcss@^6.0.23:
+  version "6.0.23"
+  resolved "https://registry.npmmirror.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+  integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==
+  dependencies:
+    chalk "^2.4.1"
+    source-map "^0.6.1"
+    supports-color "^5.4.0"
+
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36:
+  version "7.0.39"
+  resolved "https://registry.npmmirror.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
+  integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
+  dependencies:
+    picocolors "^0.2.1"
+    source-map "^0.6.1"
+
+postcss@^8.4.14:
+  version "8.4.38"
+  resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
+  integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
+  dependencies:
+    nanoid "^3.3.7"
+    picocolors "^1.0.0"
+    source-map-js "^1.2.0"
+
+preact@^10.5.13:
+  version "10.20.2"
+  resolved "https://registry.npmmirror.com/preact/-/preact-10.20.2.tgz#0b343299a8c020562311cc25db93b3d832ec5e71"
+  integrity sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+  integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
+
+prepend-http@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+  integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==
+
+"prettier@^1.18.2 || ^2.0.0":
+  version "2.8.8"
+  resolved "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
+  integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
+
+pretty-error@^2.0.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6"
+  integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==
+  dependencies:
+    lodash "^4.17.20"
+    renderkid "^2.0.4"
+
+printj@~1.1.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222"
+  integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==
+
+prismjs@^1.23.0:
+  version "1.29.0"
+  resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12"
+  integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==
+
+process-nextick-args@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+  version "0.11.10"
+  resolved "https://registry.npmmirror.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+  integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
+
+progress@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+  integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+promise-inflight@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+  integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==
+
+proxy-addr@~2.0.7:
+  version "2.0.7"
+  resolved "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+  integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+  dependencies:
+    forwarded "0.2.0"
+    ipaddr.js "1.9.1"
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+  integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+  integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==
+
+psl@^1.1.28:
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+  integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+public-encrypt@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+  integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+    safe-buffer "^5.1.2"
+
+pump@^2.0.0, pump@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pump@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+pumpify@^1.3.3:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+  integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
+  dependencies:
+    duplexify "^3.6.0"
+    inherits "^2.0.3"
+    pump "^2.0.0"
+
+punycode@^1.2.4, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+  integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==
+
+punycode@^2.1.0, punycode@^2.1.1:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+  integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+q@^1.1.2:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+  integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==
+
+qs@6.11.0:
+  version "6.11.0"
+  resolved "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
+  integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
+  dependencies:
+    side-channel "^1.0.4"
+
+qs@^6.11.2:
+  version "6.12.1"
+  resolved "https://registry.npmmirror.com/qs/-/qs-6.12.1.tgz#39422111ca7cbdb70425541cba20c7d7b216599a"
+  integrity sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==
+  dependencies:
+    side-channel "^1.0.6"
+
+qs@~6.5.2:
+  version "6.5.3"
+  resolved "https://registry.npmmirror.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
+  integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
+
+query-string@^4.1.0:
+  version "4.3.4"
+  resolved "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+  integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==
+  dependencies:
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+  integrity sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==
+
+querystringify@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+  integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+quick-lru@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
+  integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
+
+quill-delta@^3.6.2:
+  version "3.6.3"
+  resolved "https://registry.npmmirror.com/quill-delta/-/quill-delta-3.6.3.tgz#b19fd2b89412301c60e1ff213d8d860eac0f1032"
+  integrity sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==
+  dependencies:
+    deep-equal "^1.0.1"
+    extend "^3.0.2"
+    fast-diff "1.1.2"
+
+quill-image-drop-module@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/quill-image-drop-module/-/quill-image-drop-module-1.0.3.tgz#0e5ec8329dd67a12126f166b191bf64d2057a7d3"
+  integrity sha512-HP0Y2kb3nQk1QbRKZzEe1j3mArRQerN5B/U/MlXrOnxmhy3m/xYmVv0YoE13vWnGnBOIcoXGJ/9fi7l6AwsP8Q==
+  dependencies:
+    quill "^1.2.2"
+
+quill-image-resize-module@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/quill-image-resize-module/-/quill-image-resize-module-3.0.0.tgz#0fd93746a837336d95b2f536140416a623c71771"
+  integrity sha512-1TZBnUxU/WIx5dPyVjQ9yN7C6mLZSp04HyWBEMqT320DIq4MW4JgzlOPDZX5ZpBM3bU6sacU4kTLUc8VgYQZYw==
+  dependencies:
+    lodash "^4.17.4"
+    quill "^1.2.2"
+    raw-loader "^0.5.1"
+
+quill@^1.2.2, quill@^1.3.4:
+  version "1.3.7"
+  resolved "https://registry.npmmirror.com/quill/-/quill-1.3.7.tgz#da5b2f3a2c470e932340cdbf3668c9f21f9286e8"
+  integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==
+  dependencies:
+    clone "^2.1.1"
+    deep-equal "^1.0.1"
+    eventemitter3 "^2.0.3"
+    extend "^3.0.2"
+    parchment "^1.1.4"
+    quill-delta "^3.6.2"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+  dependencies:
+    safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
+  dependencies:
+    randombytes "^2.0.5"
+    safe-buffer "^5.1.0"
+
+range-parser@^1.2.1, range-parser@~1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+  integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.2:
+  version "2.5.2"
+  resolved "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+  integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+  dependencies:
+    bytes "3.1.2"
+    http-errors "2.0.0"
+    iconv-lite "0.4.24"
+    unpipe "1.0.0"
+
+raw-loader@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.npmmirror.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
+  integrity sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==
+
+read-pkg@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+  integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+  dependencies:
+    "@types/normalize-package-data" "^2.4.0"
+    normalize-package-data "^2.5.0"
+    parse-json "^5.0.0"
+    type-fest "^0.6.0"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@^2.3.8, readable-stream@~2.3.6:
+  version "2.3.8"
+  resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+  integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
+readable-stream@^3.0.6, readable-stream@^3.6.0:
+  version "3.6.2"
+  resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+  integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+  dependencies:
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
+
+readdirp@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+  integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
+  dependencies:
+    graceful-fs "^4.1.11"
+    micromatch "^3.1.10"
+    readable-stream "^2.0.2"
+
+readdirp@~3.6.0:
+  version "3.6.0"
+  resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+  integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+  dependencies:
+    picomatch "^2.2.1"
+
+regenerate-unicode-properties@^10.1.0:
+  version "10.1.1"
+  resolved "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480"
+  integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==
+  dependencies:
+    regenerate "^1.4.2"
+
+regenerate@^1.4.2:
+  version "1.4.2"
+  resolved "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+  integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.10.5:
+  version "0.10.5"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+  integrity sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==
+
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+  integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.14.0:
+  version "0.14.1"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+  integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+regenerator-transform@^0.15.2:
+  version "0.15.2"
+  resolved "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
+  integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
+  dependencies:
+    "@babel/runtime" "^7.8.4"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2:
+  version "1.5.2"
+  resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
+  integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
+  dependencies:
+    call-bind "^1.0.6"
+    define-properties "^1.2.1"
+    es-errors "^1.3.0"
+    set-function-name "^2.0.1"
+
+regexpp@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
+  integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==
+
+regexpp@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
+  integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
+
+regexpu-core@^5.3.1:
+  version "5.3.2"
+  resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b"
+  integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==
+  dependencies:
+    "@babel/regjsgen" "^0.8.0"
+    regenerate "^1.4.2"
+    regenerate-unicode-properties "^10.1.0"
+    regjsparser "^0.9.1"
+    unicode-match-property-ecmascript "^2.0.0"
+    unicode-match-property-value-ecmascript "^2.1.0"
+
+regjsparser@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709"
+  integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==
+  dependencies:
+    jsesc "~0.5.0"
+
+relateurl@0.2.x:
+  version "0.2.7"
+  resolved "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+  integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==
+
+remove-trailing-separator@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+  integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
+
+renderkid@^2.0.4:
+  version "2.0.7"
+  resolved "https://registry.npmmirror.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609"
+  integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==
+  dependencies:
+    css-select "^4.1.3"
+    dom-converter "^0.2.0"
+    htmlparser2 "^6.1.0"
+    lodash "^4.17.21"
+    strip-ansi "^3.0.1"
+
+repeat-element@^1.1.2:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+  integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+  integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
+
+request-promise-core@1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
+  integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==
+  dependencies:
+    lodash "^4.17.19"
+
+request-promise-native@^1.0.7:
+  version "1.0.9"
+  resolved "https://registry.npmmirror.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28"
+  integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==
+  dependencies:
+    request-promise-core "1.1.4"
+    stealthy-require "^1.1.1"
+    tough-cookie "^2.3.3"
+
+request@^2.87.0:
+  version "2.88.2"
+  resolved "https://registry.npmmirror.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+  integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.8.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.6"
+    extend "~3.0.2"
+    forever-agent "~0.6.1"
+    form-data "~2.3.2"
+    har-validator "~5.1.3"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.19"
+    oauth-sign "~0.9.0"
+    performance-now "^2.1.0"
+    qs "~6.5.2"
+    safe-buffer "^5.1.2"
+    tough-cookie "~2.5.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.3.2"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+  integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-main-filename@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+require-uncached@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  integrity sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
+requires-port@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+  integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+reselect@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/reselect/-/reselect-3.0.1.tgz#efdaa98ea7451324d092b2b2163a6a1d7a9a2147"
+  integrity sha512-b/6tFZCmRhtBMa4xGqiiRp9jh9Aqi2A687Lo265cN0/QohJQEBPiQ52f4QB6i0eF3yp3hmLL21LSGBcML2dlxA==
+
+resize-observer-polyfill@^1.5.0:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+  integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
+resolve-alpn@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
+  integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
+
+resolve-cwd@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+  integrity sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==
+  dependencies:
+    resolve-from "^3.0.0"
+
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+  integrity sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==
+
+resolve-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+  integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==
+
+resolve-from@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+  integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
+
+resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.4.0:
+  version "1.22.8"
+  resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+  integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+  dependencies:
+    is-core-module "^2.13.0"
+    path-parse "^1.0.7"
+    supports-preserve-symlinks-flag "^1.0.0"
+
+responselike@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc"
+  integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==
+  dependencies:
+    lowercase-keys "^2.0.0"
+
+restore-cursor@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+  integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==
+  dependencies:
+    onetime "^2.0.0"
+    signal-exit "^3.0.2"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+retry@^0.12.0:
+  version "0.12.0"
+  resolved "https://registry.npmmirror.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+  integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==
+
+rgb-regex@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+  integrity sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==
+
+rgba-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+  integrity sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==
+
+rimraf@2.6.3, rimraf@~2.6.2:
+  version "2.6.3"
+  resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+  dependencies:
+    glob "^7.1.3"
+
+rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
+  version "2.7.1"
+  resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+  integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+  dependencies:
+    glob "^7.1.3"
+
+rimraf@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+  dependencies:
+    glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+  integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+  dependencies:
+    hash-base "^3.0.0"
+    inherits "^2.0.1"
+
+run-async@^2.2.0:
+  version "2.4.1"
+  resolved "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+  integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  integrity sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==
+  dependencies:
+    aproba "^1.1.1"
+
+rx-lite-aggregates@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+  integrity sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==
+  dependencies:
+    rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+  integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==
+
+rxjs@^6.4.0:
+  version "6.6.7"
+  resolved "https://registry.npmmirror.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
+  integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
+  dependencies:
+    tslib "^1.9.0"
+
+safe-array-concat@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
+  integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
+  dependencies:
+    call-bind "^1.0.7"
+    get-intrinsic "^1.2.4"
+    has-symbols "^1.0.3"
+    isarray "^2.0.5"
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
+  version "5.2.1"
+  resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-regex-test@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
+  integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
+  dependencies:
+    call-bind "^1.0.6"
+    es-errors "^1.3.0"
+    is-regex "^1.1.4"
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==
+  dependencies:
+    ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@~1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+schema-utils@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+  integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
+  dependencies:
+    ajv "^6.1.0"
+    ajv-errors "^1.0.0"
+    ajv-keywords "^3.1.0"
+
+schema-utils@^2.6.5, schema-utils@^2.7.0:
+  version "2.7.1"
+  resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
+  integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
+  dependencies:
+    "@types/json-schema" "^7.0.5"
+    ajv "^6.12.4"
+    ajv-keywords "^3.5.2"
+
+scroll-into-view-if-needed@^2.2.28:
+  version "2.2.31"
+  resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587"
+  integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==
+  dependencies:
+    compute-scroll-into-view "^1.0.20"
+
+select-hose@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+  integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==
+
+selfsigned@^1.10.8:
+  version "1.10.14"
+  resolved "https://registry.npmmirror.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574"
+  integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==
+  dependencies:
+    node-forge "^0.10.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
+  version "5.7.2"
+  resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+  integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.0.0, semver@^6.3.0, semver@^6.3.1:
+  version "6.3.1"
+  resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.5:
+  version "7.6.0"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d"
+  integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==
+  dependencies:
+    lru-cache "^6.0.0"
+
+send@0.18.0:
+  version "0.18.0"
+  resolved "https://registry.npmmirror.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
+  integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+  dependencies:
+    debug "2.6.9"
+    depd "2.0.0"
+    destroy "1.2.0"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    fresh "0.5.2"
+    http-errors "2.0.0"
+    mime "1.6.0"
+    ms "2.1.3"
+    on-finished "2.4.1"
+    range-parser "~1.2.1"
+    statuses "2.0.1"
+
+serialize-javascript@^1.4.0:
+  version "1.9.1"
+  resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"
+  integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==
+
+serialize-javascript@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+  integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+  dependencies:
+    randombytes "^2.1.0"
+
+serve-index@^1.9.1:
+  version "1.9.1"
+  resolved "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
+  integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==
+  dependencies:
+    accepts "~1.3.4"
+    batch "0.6.1"
+    debug "2.6.9"
+    escape-html "~1.0.3"
+    http-errors "~1.6.2"
+    mime-types "~2.1.17"
+    parseurl "~1.3.2"
+
+serve-static@1.15.0:
+  version "1.15.0"
+  resolved "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
+  integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+  dependencies:
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    parseurl "~1.3.3"
+    send "0.18.0"
+
+set-blocking@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+  integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+set-function-length@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+  integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+  dependencies:
+    define-data-property "^1.1.4"
+    es-errors "^1.3.0"
+    function-bind "^1.1.2"
+    get-intrinsic "^1.2.4"
+    gopd "^1.0.1"
+    has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+  integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+  dependencies:
+    define-data-property "^1.1.4"
+    es-errors "^1.3.0"
+    functions-have-names "^1.2.3"
+    has-property-descriptors "^1.0.2"
+
+set-value@^2.0.0, set-value@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+  integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+  integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
+setprototypeof@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+  integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+setprototypeof@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+  integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+  version "2.4.11"
+  resolved "https://registry.npmmirror.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+  dependencies:
+    inherits "^2.0.1"
+    safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+  integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
+
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shell-quote@^1.8.1:
+  version "1.8.1"
+  resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680"
+  integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==
+
+side-channel@^1.0.4, side-channel@^1.0.6:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+  integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+  dependencies:
+    call-bind "^1.0.7"
+    es-errors "^1.3.0"
+    get-intrinsic "^1.2.4"
+    object-inspect "^1.13.1"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+  version "3.0.7"
+  resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+  integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+simple-swizzle@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+  integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
+  dependencies:
+    is-arrayish "^0.3.1"
+
+sirv@^2.0.3:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0"
+  integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==
+  dependencies:
+    "@polka/url" "^1.0.0-next.24"
+    mrmime "^2.0.0"
+    totalist "^3.0.0"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+  integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==
+
+slash@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+  integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
+
+slate-history@^0.66.0:
+  version "0.66.0"
+  resolved "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz#ac63fddb903098ceb4c944433e3f75fe63acf940"
+  integrity sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==
+  dependencies:
+    is-plain-object "^5.0.0"
+
+slate@^0.72.0:
+  version "0.72.8"
+  resolved "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz#5a018edf24e45448655293a68bfbcf563aa5ba81"
+  integrity sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==
+  dependencies:
+    immer "^9.0.6"
+    is-plain-object "^5.0.0"
+    tiny-warning "^1.0.3"
+
+slice-ansi@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+  integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+
+slice-ansi@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
+  integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
+  dependencies:
+    ansi-styles "^3.2.0"
+    astral-regex "^1.0.0"
+    is-fullwidth-code-point "^2.0.0"
+
+snabbdom@^3.1.0:
+  version "3.6.2"
+  resolved "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.2.tgz#57dd66878f6320497fa7f67941df356a045c75a1"
+  integrity sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
+
+sockjs-client@^1.5.0:
+  version "1.6.1"
+  resolved "https://registry.npmmirror.com/sockjs-client/-/sockjs-client-1.6.1.tgz#350b8eda42d6d52ddc030c39943364c11dcad806"
+  integrity sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==
+  dependencies:
+    debug "^3.2.7"
+    eventsource "^2.0.2"
+    faye-websocket "^0.11.4"
+    inherits "^2.0.4"
+    url-parse "^1.5.10"
+
+sockjs@^0.3.21:
+  version "0.3.24"
+  resolved "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce"
+  integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==
+  dependencies:
+    faye-websocket "^0.11.3"
+    uuid "^8.3.2"
+    websocket-driver "^0.7.4"
+
+sort-keys@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+  integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+source-list-map@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+  integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-js@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
+  integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
+
+source-map-resolve@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+  dependencies:
+    atob "^2.1.2"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@~0.5.12:
+  version "0.5.21"
+  resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+  integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+  integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@^0.5.6:
+  version "0.5.7"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+  integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spark-md5@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc"
+  integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==
+
+spdx-correct@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
+  integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66"
+  integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+  integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.17"
+  resolved "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c"
+  integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==
+
+spdy-transport@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
+  integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
+  dependencies:
+    debug "^4.1.0"
+    detect-node "^2.0.4"
+    hpack.js "^2.1.6"
+    obuf "^1.1.2"
+    readable-stream "^3.0.6"
+    wbuf "^1.7.3"
+
+spdy@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b"
+  integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==
+  dependencies:
+    debug "^4.1.0"
+    handle-thing "^2.0.0"
+    http-deceiver "^1.2.7"
+    select-hose "^2.0.0"
+    spdy-transport "^3.0.0"
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+  dependencies:
+    extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+  integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+ssf@~0.11.2:
+  version "0.11.2"
+  resolved "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c"
+  integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==
+  dependencies:
+    frac "~1.1.2"
+
+sshpk@^1.7.0:
+  version "1.18.0"
+  resolved "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028"
+  integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    bcrypt-pbkdf "^1.0.0"
+    dashdash "^1.12.0"
+    ecc-jsbn "~0.1.1"
+    getpass "^0.1.1"
+    jsbn "~0.1.0"
+    safer-buffer "^2.0.2"
+    tweetnacl "~0.14.0"
+
+ssr-window@^3.0.0-alpha.1:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz#fd5b82801638943e0cc704c4691801435af7ac37"
+  integrity sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==
+
+ssri@^5.2.4:
+  version "5.3.0"
+  resolved "https://registry.npmmirror.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+  integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==
+  dependencies:
+    safe-buffer "^5.1.1"
+
+ssri@^6.0.1:
+  version "6.0.2"
+  resolved "https://registry.npmmirror.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5"
+  integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==
+  dependencies:
+    figgy-pudding "^3.5.1"
+
+ssri@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af"
+  integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==
+  dependencies:
+    minipass "^3.1.1"
+
+stable@^0.1.8:
+  version "0.1.8"
+  resolved "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+stackframe@^1.3.4:
+  version "1.3.4"
+  resolved "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310"
+  integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+statuses@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+  integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+"statuses@>= 1.4.0 < 2":
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+  integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
+stealthy-require@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+  integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==
+
+stream-browserify@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+  integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+  integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
+  dependencies:
+    end-of-stream "^1.1.0"
+    stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+  version "2.8.3"
+  resolved "https://registry.npmmirror.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+  integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.3.6"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b"
+  integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==
+
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+  integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
+
+string-width@^2.1.0, string-width@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+  integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+  dependencies:
+    emoji-regex "^7.0.1"
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^5.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+  version "4.2.3"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
+string.prototype.padend@^3.0.0:
+  version "3.1.6"
+  resolved "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz#ba79cf8992609a91c872daa47c6bb144ee7f62a5"
+  integrity sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.2"
+    es-object-atoms "^1.0.0"
+
+string.prototype.padstart@^3.0.0:
+  version "3.1.6"
+  resolved "https://registry.npmmirror.com/string.prototype.padstart/-/string.prototype.padstart-3.1.6.tgz#bda3b28098270e1e285e08318e47ad53bc601ffd"
+  integrity sha512-1y15lz7otgfRTAVK5qbp3eHIga+w8j7+jIH+7HpUrOfnLVl6n0hbspi4EXf4tR+PNOpBjPstltemkx0SvViOCg==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.0"
+    es-object-atoms "^1.0.0"
+
+string.prototype.trim@^1.2.9:
+  version "1.2.9"
+  resolved "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
+  integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-abstract "^1.23.0"
+    es-object-atoms "^1.0.0"
+
+string.prototype.trimend@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
+  integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-object-atoms "^1.0.0"
+
+string.prototype.trimstart@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+  integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
+  dependencies:
+    call-bind "^1.0.7"
+    define-properties "^1.2.1"
+    es-object-atoms "^1.0.0"
+
+string_decoder@^1.0.0, string_decoder@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+  dependencies:
+    safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+  dependencies:
+    safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==
+  dependencies:
+    ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+  integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+  dependencies:
+    ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+  dependencies:
+    ansi-regex "^5.0.1"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+  integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==
+
+strip-final-newline@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+  integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-indent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
+  integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==
+
+strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+  integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
+
+style-loader@^0.23.1:
+  version "0.23.1"
+  resolved "https://registry.npmmirror.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925"
+  integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==
+  dependencies:
+    loader-utils "^1.1.0"
+    schema-utils "^1.0.0"
+
+style-resources-loader@^1.2.1:
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/style-resources-loader/-/style-resources-loader-1.5.0.tgz#6e0585ca475b9dac45387c308be90d74c814f41f"
+  integrity sha512-fIfyvQ+uvXaCBGGAgfh+9v46ARQB1AWdaop2RpQw0PBVuROsTBqGvx8dj0kxwjGOAyq3vepe4AOK3M6+Q/q2jw==
+  dependencies:
+    glob "^7.2.0"
+    loader-utils "^2.0.0"
+    schema-utils "^2.7.0"
+    tslib "^2.3.1"
+
+stylehacks@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
+  integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==
+  dependencies:
+    browserslist "^4.0.0"
+    postcss "^7.0.0"
+    postcss-selector-parser "^3.0.0"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+  integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==
+
+supports-color@^5.3.0, supports-color@^5.4.0:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+  integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+  dependencies:
+    has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+  integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+svg-tags@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+  integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==
+
+svgo@^1.0.0:
+  version "1.3.2"
+  resolved "https://registry.npmmirror.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
+  integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==
+  dependencies:
+    chalk "^2.4.1"
+    coa "^2.0.2"
+    css-select "^2.0.0"
+    css-select-base-adapter "^0.1.1"
+    css-tree "1.0.0-alpha.37"
+    csso "^4.0.2"
+    js-yaml "^3.13.1"
+    mkdirp "~0.5.1"
+    object.values "^1.1.0"
+    sax "~1.2.4"
+    stable "^0.1.8"
+    unquote "~1.1.1"
+    util.promisify "~1.0.0"
+
+table@4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+  integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==
+  dependencies:
+    ajv "^5.2.3"
+    ajv-keywords "^2.1.0"
+    chalk "^2.1.0"
+    lodash "^4.17.4"
+    slice-ansi "1.0.0"
+    string-width "^2.1.1"
+
+table@^5.2.3:
+  version "5.4.6"
+  resolved "https://registry.npmmirror.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
+  integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
+  dependencies:
+    ajv "^6.10.2"
+    lodash "^4.17.14"
+    slice-ansi "^2.1.0"
+    string-width "^3.0.0"
+
+tapable@^1.0.0, tapable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+  integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
+
+tar@^6.0.2:
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/tar/-/tar-6.2.1.tgz#717549c541bc3c2af15751bea94b1dd068d4b03a"
+  integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==
+  dependencies:
+    chownr "^2.0.0"
+    fs-minipass "^2.0.0"
+    minipass "^5.0.0"
+    minizlib "^2.1.1"
+    mkdirp "^1.0.3"
+    yallist "^4.0.0"
+
+terser-webpack-plugin@^1.2.3, terser-webpack-plugin@^1.4.3:
+  version "1.4.5"
+  resolved "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b"
+  integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==
+  dependencies:
+    cacache "^12.0.2"
+    find-cache-dir "^2.1.0"
+    is-wsl "^1.1.0"
+    schema-utils "^1.0.0"
+    serialize-javascript "^4.0.0"
+    source-map "^0.6.1"
+    terser "^4.1.2"
+    webpack-sources "^1.4.0"
+    worker-farm "^1.7.0"
+
+terser@^4.1.2:
+  version "4.8.1"
+  resolved "https://registry.npmmirror.com/terser/-/terser-4.8.1.tgz#a00e5634562de2239fd404c649051bf6fc21144f"
+  integrity sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==
+  dependencies:
+    commander "^2.20.0"
+    source-map "~0.6.1"
+    source-map-support "~0.5.12"
+
+text-table@^0.2.0, text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+  integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+thenify-all@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+  integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==
+  dependencies:
+    thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+  version "3.3.1"
+  resolved "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
+  integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
+  dependencies:
+    any-promise "^1.0.0"
+
+thread-loader@^2.1.2:
+  version "2.1.3"
+  resolved "https://registry.npmmirror.com/thread-loader/-/thread-loader-2.1.3.tgz#cbd2c139fc2b2de6e9d28f62286ab770c1acbdda"
+  integrity sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==
+  dependencies:
+    loader-runner "^2.3.1"
+    loader-utils "^1.1.0"
+    neo-async "^2.6.0"
+
+three-bvh-csg@^0.0.5:
+  version "0.0.5"
+  resolved "https://registry.npmmirror.com/three-bvh-csg/-/three-bvh-csg-0.0.5.tgz#db8254a0b9472edecc10a836c98adc6286ff1dca"
+  integrity sha512-gxqmaV3HlGHUGB857AV8oLoNxx5Q0T7io1DUs5nrCwmmFqjWZT3a8ue7WapE394wY8awFVAMr+YvdSrzqswpFA==
+
+three-css2drender@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/three-css2drender/-/three-css2drender-1.0.0.tgz#2065e64c9d117033c08bfdc957a78edfe4b6ed1b"
+  integrity sha512-redDCSBDvgxiJIm6EDT8WO5WJTVg5gUEy/vjtAgJa/zX4peEUnZ8K+mXo6v94EudbnuI5h48/hQo9NExf04ENg==
+
+three-js-csg@^72.0.0:
+  version "72.0.0"
+  resolved "https://registry.npmmirror.com/three-js-csg/-/three-js-csg-72.0.0.tgz#69e6ae441f3f01089e6f13c87c7288e1c4380bbc"
+  integrity sha512-Fr2pWWaHN1PPgjVsA7P2VZOHrMMXebQmJlasxGYebbSwURRwwi/vlayI69D+3qW39eNXQ6j+iO1VEOVC41mVFQ==
+
+three-obj-mtl-loader@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/three-obj-mtl-loader/-/three-obj-mtl-loader-1.0.3.tgz#2901efd5b77cce29b61733c63f196432ee653667"
+  integrity sha512-0z7BfyG6vYPY9RvxJvL4rq8PbNrF42Kn4zxeqTfeDzJN++2oKbtCQhxHs5vLULnDuCRTEyDFf5TYvO+1vnJ7KQ==
+
+three@^0.124.0:
+  version "0.124.0"
+  resolved "https://registry.npmmirror.com/three/-/three-0.124.0.tgz#14ab1a26ba6c56e51190e1b55695cd3c1e69ea55"
+  integrity sha512-ROXp1Ly7YyF+jC910DQyAWj++Qlw2lQv0qwYLNQwdDbjk4bsOXAfGO92wYTMPNei1GMJUmCxSxc3MjGBTS09Rg==
+
+throttle-debounce@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd"
+  integrity sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==
+
+through2@^2.0.0:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+  integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+  dependencies:
+    readable-stream "~2.3.6"
+    xtend "~4.0.1"
+
+through@^2.3.6:
+  version "2.3.8"
+  resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+  integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
+thunky@^1.0.2:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
+  integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
+
+timers-browserify@^2.0.4:
+  version "2.0.12"
+  resolved "https://registry.npmmirror.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee"
+  integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==
+  dependencies:
+    setimmediate "^1.0.4"
+
+timsort@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+  integrity sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==
+
+tiny-warning@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
+  integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
+
+tinymce@^5.1.5:
+  version "5.10.9"
+  resolved "https://registry.npmmirror.com/tinymce/-/tinymce-5.10.9.tgz#1dfacb3231c71a688d90ff44a0b3f2e91b3b9edf"
+  integrity sha512-5bkrors87X9LhYX2xq8GgPHrIgJYHl87YNs+kBcjQ5I3CiUgzo/vFcGvT3MZQ9QHsEeYMhYO6a5CLGGffR8hMg==
+
+tmp@^0.0.33:
+  version "0.0.33"
+  resolved "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+  integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+  dependencies:
+    os-tmpdir "~1.0.2"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+  integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==
+
+to-fast-properties@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+  integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+  dependencies:
+    is-number "^7.0.0"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+toidentifier@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+  integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+toposort@^1.0.0:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
+  integrity sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==
+
+totalist@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8"
+  integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==
+
+tough-cookie@^2.3.3, tough-cookie@~2.5.0:
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+  integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+  dependencies:
+    psl "^1.1.28"
+    punycode "^2.1.1"
+
+tryer@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
+  integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
+
+tslib@^1.10.0, tslib@^1.9.0:
+  version "1.14.1"
+  resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+  integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.3.1:
+  version "2.6.2"
+  resolved "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
+  integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+
+tty-browserify@0.0.0:
+  version "0.0.0"
+  resolved "https://registry.npmmirror.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+  integrity sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+  integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-fest@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+  integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
+type-is@~1.6.18:
+  version "1.6.18"
+  resolved "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+  integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.24"
+
+type@^2.7.2:
+  version "2.7.2"
+  resolved "https://registry.npmmirror.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
+  integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
+
+typed-array-buffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3"
+  integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
+  dependencies:
+    call-bind "^1.0.7"
+    es-errors "^1.3.0"
+    is-typed-array "^1.1.13"
+
+typed-array-byte-length@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67"
+  integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
+  dependencies:
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+
+typed-array-byte-offset@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
+  integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+  dependencies:
+    available-typed-arrays "^1.0.7"
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+
+typed-array-length@^1.0.6:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
+  integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
+  dependencies:
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-proto "^1.0.3"
+    is-typed-array "^1.1.13"
+    possible-typed-array-names "^1.0.0"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+  integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
+
+uglify-js@3.4.x:
+  version "3.4.10"
+  resolved "https://registry.npmmirror.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f"
+  integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==
+  dependencies:
+    commander "~2.19.0"
+    source-map "~0.6.1"
+
+unbox-primitive@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+  integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+  dependencies:
+    call-bind "^1.0.2"
+    has-bigints "^1.0.2"
+    has-symbols "^1.0.3"
+    which-boxed-primitive "^1.0.2"
+
+undici-types@~5.26.4:
+  version "5.26.5"
+  resolved "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+  integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+unicode-canonical-property-names-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
+  integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+
+unicode-match-property-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
+  integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
+  dependencies:
+    unicode-canonical-property-names-ecmascript "^2.0.0"
+    unicode-property-aliases-ecmascript "^2.0.0"
+
+unicode-match-property-value-ecmascript@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0"
+  integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==
+
+unicode-property-aliases-ecmascript@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd"
+  integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==
+
+union-value@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+  integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^2.0.1"
+
+uniq@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+  integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==
+
+uniqs@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+  integrity sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==
+
+unique-filename@^1.1.0, unique-filename@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+  integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
+  dependencies:
+    unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+  integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
+  dependencies:
+    imurmurhash "^0.1.4"
+
+universalify@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+  integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+  integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+unquote@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+  integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+upath@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+  integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+update-browserslist-db@^1.0.13:
+  version "1.0.13"
+  resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
+  integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
+  dependencies:
+    escalade "^3.1.1"
+    picocolors "^1.0.0"
+
+upper-case@^1.1.1:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+  integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==
+
+uri-js@^4.2.2:
+  version "4.4.1"
+  resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+  integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+  dependencies:
+    punycode "^2.1.0"
+
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+  integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==
+
+url-loader@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8"
+  integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==
+  dependencies:
+    loader-utils "^1.1.0"
+    mime "^2.0.3"
+    schema-utils "^1.0.0"
+
+url-parse@^1.5.10:
+  version "1.5.10"
+  resolved "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+  integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+  dependencies:
+    querystringify "^2.1.1"
+    requires-port "^1.0.0"
+
+url@^0.11.0:
+  version "0.11.3"
+  resolved "https://registry.npmmirror.com/url/-/url-0.11.3.tgz#6f495f4b935de40ce4a0a52faee8954244f3d3ad"
+  integrity sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==
+  dependencies:
+    punycode "^1.4.1"
+    qs "^6.11.2"
+
+use@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+util.promisify@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+  integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
+  dependencies:
+    define-properties "^1.1.2"
+    object.getownpropertydescriptors "^2.0.3"
+
+util.promisify@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
+  integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.2"
+    has-symbols "^1.0.1"
+    object.getownpropertydescriptors "^2.1.0"
+
+util@^0.10.4:
+  version "0.10.4"
+  resolved "https://registry.npmmirror.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+  integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==
+  dependencies:
+    inherits "2.0.3"
+
+util@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.npmmirror.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
+  integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
+  dependencies:
+    inherits "2.0.3"
+
+utila@~0.4:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+  integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+  integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+uuid@^3.3.2:
+  version "3.4.0"
+  resolved "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+  integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+uuid@^8.3.2:
+  version "8.3.2"
+  resolved "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+  integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+vary@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+  integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+vendors@^1.0.0:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+  integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+vm-browserify@^1.0.1:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+  integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
+
+vue-axios@^2.1.4:
+  version "2.1.5"
+  resolved "https://registry.npmmirror.com/vue-axios/-/vue-axios-2.1.5.tgz#1af4bf1218ed71309c76afb38d0f683e312c24a7"
+  integrity sha512-th5xVbInVoyIoe+qY+9GCflEVezxAvztD4xpFF39SRQYqpoKD2qkmX8yv08jJG9a2SgNOCjirjJGSwg/wTrbmA==
+
+vue-cli-plugin-style-resources-loader@^0.1.3:
+  version "0.1.5"
+  resolved "https://registry.npmmirror.com/vue-cli-plugin-style-resources-loader/-/vue-cli-plugin-style-resources-loader-0.1.5.tgz#3e95f4df41f5408e1255664690698c0533648109"
+  integrity sha512-LluhjWTZmpGl3tiXg51EciF+T70IN/9t6UvfmgluJBqxbrb6OV9i7L5lTd+OKtcTeghDkhcBmYhtTxxU4w/8sQ==
+
+vue-cropper@^0.4.9:
+  version "0.4.9"
+  resolved "https://registry.npmmirror.com/vue-cropper/-/vue-cropper-0.4.9.tgz#fe650f32516ecf29014bbd4a9079191c8dc5a5ae"
+  integrity sha512-Uf1i/sCh+ZqSM9hb2YTGRENzJFH+mvDuv8N2brGLjK7UBuF7XDP7zbis8g/dcqZiMojAcBDtObFCn4ERFbRMxQ==
+
+vue-eslint-parser@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1"
+  integrity sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw==
+  dependencies:
+    debug "^3.1.0"
+    eslint-scope "^3.7.1"
+    eslint-visitor-keys "^1.0.0"
+    espree "^3.5.2"
+    esquery "^1.0.0"
+    lodash "^4.17.4"
+
+vue-eslint-parser@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz#00f4e4da94ec974b821a26ff0ed0f7a78402b8a1"
+  integrity sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==
+  dependencies:
+    debug "^4.1.0"
+    eslint-scope "^4.0.0"
+    eslint-visitor-keys "^1.0.0"
+    espree "^4.1.0"
+    esquery "^1.0.1"
+    lodash "^4.17.11"
+
+vue-full-calendar@^2.7.0:
+  version "2.8.0"
+  resolved "https://registry.npmmirror.com/vue-full-calendar/-/vue-full-calendar-2.8.0.tgz#6c29996869ed7e60c5e8e03d5503ec7d7717105d"
+  integrity sha512-+yYEuuolSG6TzBO50e1eae7UB+rjIc/vFXOrH43JwWQ2pX3EAMSY2xE+EtWvBE0N49MJv3xROgY3I2t7OQPV4w==
+  dependencies:
+    babel-plugin-transform-runtime "^6.23.0"
+    fullcalendar "3.10.1"
+    lodash.defaultsdeep "^4.6.0"
+
+vue-hot-reload-api@^2.3.0:
+  version "2.3.4"
+  resolved "https://registry.npmmirror.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
+  integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
+
+vue-loader@^15.7.0:
+  version "15.11.1"
+  resolved "https://registry.npmmirror.com/vue-loader/-/vue-loader-15.11.1.tgz#dee91169211276ed43c5715caef88a56b1f497b0"
+  integrity sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==
+  dependencies:
+    "@vue/component-compiler-utils" "^3.1.0"
+    hash-sum "^1.0.2"
+    loader-utils "^1.1.0"
+    vue-hot-reload-api "^2.3.0"
+    vue-style-loader "^4.1.0"
+
+vue-quill-editor@^3.0.6:
+  version "3.0.6"
+  resolved "https://registry.npmmirror.com/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz#1f85646211d68a31a80a72cb7f45bb2f119bc8fb"
+  integrity sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==
+  dependencies:
+    object-assign "^4.1.1"
+    quill "^1.3.4"
+
+vue-resource@^1.5.1:
+  version "1.5.3"
+  resolved "https://registry.npmmirror.com/vue-resource/-/vue-resource-1.5.3.tgz#2f70dc8d241ff70ed20738a0d77e40b54315cd95"
+  integrity sha512-REhTuEuYSpwmEH/VN4fgDQVC/VXxDK/xsguuiDPnINxOwy1s0CSu//p++osTUkiAXi6d/vptwBpb0AcBIDsXzw==
+  dependencies:
+    got ">=8.0 <12.0"
+
+vue-router@^3.0.7:
+  version "3.6.5"
+  resolved "https://registry.npmmirror.com/vue-router/-/vue-router-3.6.5.tgz#95847d52b9a7e3f1361cb605c8e6441f202afad8"
+  integrity sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==
+
+vue-style-loader@^4.1.0:
+  version "4.1.3"
+  resolved "https://registry.npmmirror.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35"
+  integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==
+  dependencies:
+    hash-sum "^1.0.2"
+    loader-utils "^1.0.2"
+
+vue-template-compiler@^2.6.10:
+  version "2.7.16"
+  resolved "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz#c81b2d47753264c77ac03b9966a46637482bb03b"
+  integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==
+  dependencies:
+    de-indent "^1.0.2"
+    he "^1.2.0"
+
+vue-template-es2015-compiler@^1.9.0:
+  version "1.9.1"
+  resolved "https://registry.npmmirror.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
+  integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
+
+vue@^2.6.10:
+  version "2.7.16"
+  resolved "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz#98c60de9def99c0e3da8dae59b304ead43b967c9"
+  integrity sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==
+  dependencies:
+    "@vue/compiler-sfc" "2.7.16"
+    csstype "^3.1.0"
+
+vuex@^3.1.1:
+  version "3.6.2"
+  resolved "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71"
+  integrity sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==
+
+watchpack-chokidar2@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"
+  integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==
+  dependencies:
+    chokidar "^2.1.8"
+
+watchpack@^1.7.4:
+  version "1.7.5"
+  resolved "https://registry.npmmirror.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453"
+  integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==
+  dependencies:
+    graceful-fs "^4.1.2"
+    neo-async "^2.5.0"
+  optionalDependencies:
+    chokidar "^3.4.1"
+    watchpack-chokidar2 "^2.0.1"
+
+wbuf@^1.1.0, wbuf@^1.7.3:
+  version "1.7.3"
+  resolved "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
+  integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
+  dependencies:
+    minimalistic-assert "^1.0.0"
+
+wcwidth@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+  integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==
+  dependencies:
+    defaults "^1.0.3"
+
+webpack-bundle-analyzer@^3.3.0:
+  version "3.9.0"
+  resolved "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz#f6f94db108fb574e415ad313de41a2707d33ef3c"
+  integrity sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==
+  dependencies:
+    acorn "^7.1.1"
+    acorn-walk "^7.1.1"
+    bfj "^6.1.1"
+    chalk "^2.4.1"
+    commander "^2.18.0"
+    ejs "^2.6.1"
+    express "^4.16.3"
+    filesize "^3.6.1"
+    gzip-size "^5.0.0"
+    lodash "^4.17.19"
+    mkdirp "^0.5.1"
+    opener "^1.5.1"
+    ws "^6.0.0"
+
+webpack-bundle-analyzer@^4.4.0:
+  version "4.10.2"
+  resolved "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd"
+  integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==
+  dependencies:
+    "@discoveryjs/json-ext" "0.5.7"
+    acorn "^8.0.4"
+    acorn-walk "^8.0.0"
+    commander "^7.2.0"
+    debounce "^1.2.1"
+    escape-string-regexp "^4.0.0"
+    gzip-size "^6.0.0"
+    html-escaper "^2.0.2"
+    opener "^1.5.2"
+    picocolors "^1.0.0"
+    sirv "^2.0.3"
+    ws "^7.3.1"
+
+webpack-chain@^4.11.0:
+  version "4.12.1"
+  resolved "https://registry.npmmirror.com/webpack-chain/-/webpack-chain-4.12.1.tgz#6c8439bbb2ab550952d60e1ea9319141906c02a6"
+  integrity sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==
+  dependencies:
+    deepmerge "^1.5.2"
+    javascript-stringify "^1.6.0"
+
+webpack-dev-middleware@^3.7.2:
+  version "3.7.3"
+  resolved "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5"
+  integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==
+  dependencies:
+    memory-fs "^0.4.1"
+    mime "^2.4.4"
+    mkdirp "^0.5.1"
+    range-parser "^1.2.1"
+    webpack-log "^2.0.0"
+
+webpack-dev-server@^3.4.1:
+  version "3.11.3"
+  resolved "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3"
+  integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==
+  dependencies:
+    ansi-html-community "0.0.8"
+    bonjour "^3.5.0"
+    chokidar "^2.1.8"
+    compression "^1.7.4"
+    connect-history-api-fallback "^1.6.0"
+    debug "^4.1.1"
+    del "^4.1.1"
+    express "^4.17.1"
+    html-entities "^1.3.1"
+    http-proxy-middleware "0.19.1"
+    import-local "^2.0.0"
+    internal-ip "^4.3.0"
+    ip "^1.1.5"
+    is-absolute-url "^3.0.3"
+    killable "^1.0.1"
+    loglevel "^1.6.8"
+    opn "^5.5.0"
+    p-retry "^3.0.1"
+    portfinder "^1.0.26"
+    schema-utils "^1.0.0"
+    selfsigned "^1.10.8"
+    semver "^6.3.0"
+    serve-index "^1.9.1"
+    sockjs "^0.3.21"
+    sockjs-client "^1.5.0"
+    spdy "^4.0.2"
+    strip-ansi "^3.0.1"
+    supports-color "^6.1.0"
+    url "^0.11.0"
+    webpack-dev-middleware "^3.7.2"
+    webpack-log "^2.0.0"
+    ws "^6.2.1"
+    yargs "^13.3.2"
+
+webpack-log@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
+  integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==
+  dependencies:
+    ansi-colors "^3.0.0"
+    uuid "^3.3.2"
+
+webpack-merge@^4.2.1:
+  version "4.2.2"
+  resolved "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d"
+  integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==
+  dependencies:
+    lodash "^4.17.15"
+
+webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+  integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+  dependencies:
+    source-list-map "^2.0.0"
+    source-map "~0.6.1"
+
+webpack@^4.0.0:
+  version "4.47.0"
+  resolved "https://registry.npmmirror.com/webpack/-/webpack-4.47.0.tgz#8b8a02152d7076aeb03b61b47dad2eeed9810ebc"
+  integrity sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-module-context" "1.9.0"
+    "@webassemblyjs/wasm-edit" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+    acorn "^6.4.1"
+    ajv "^6.10.2"
+    ajv-keywords "^3.4.1"
+    chrome-trace-event "^1.0.2"
+    enhanced-resolve "^4.5.0"
+    eslint-scope "^4.0.3"
+    json-parse-better-errors "^1.0.2"
+    loader-runner "^2.4.0"
+    loader-utils "^1.2.3"
+    memory-fs "^0.4.1"
+    micromatch "^3.1.10"
+    mkdirp "^0.5.3"
+    neo-async "^2.6.1"
+    node-libs-browser "^2.2.1"
+    schema-utils "^1.0.0"
+    tapable "^1.1.3"
+    terser-webpack-plugin "^1.4.3"
+    watchpack "^1.7.4"
+    webpack-sources "^1.4.1"
+
+websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
+  version "0.7.4"
+  resolved "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
+  integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
+  dependencies:
+    http-parser-js ">=0.5.1"
+    safe-buffer ">=5.1.0"
+    websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
+  integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
+
+which-boxed-primitive@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+  integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+  dependencies:
+    is-bigint "^1.0.1"
+    is-boolean-object "^1.1.0"
+    is-number-object "^1.0.4"
+    is-string "^1.0.5"
+    is-symbol "^1.0.3"
+
+which-module@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
+  integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
+
+which-typed-array@^1.1.14, which-typed-array@^1.1.15:
+  version "1.1.15"
+  resolved "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
+  integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
+  dependencies:
+    available-typed-arrays "^1.0.7"
+    call-bind "^1.0.7"
+    for-each "^0.3.3"
+    gopd "^1.0.1"
+    has-tostringtag "^1.0.2"
+
+which@^1.2.9:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+  dependencies:
+    isexe "^2.0.0"
+
+which@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+  dependencies:
+    isexe "^2.0.0"
+
+wildcard@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5"
+  integrity sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==
+
+wmf@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da"
+  integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==
+
+word-wrap@~1.2.3:
+  version "1.2.5"
+  resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+  integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+word@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961"
+  integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==
+
+worker-farm@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
+  integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
+  dependencies:
+    errno "~0.1.7"
+
+wrap-ansi@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+  integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+  dependencies:
+    ansi-styles "^3.2.0"
+    string-width "^3.0.0"
+    strip-ansi "^5.0.0"
+
+wrap-ansi@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+write@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
+  integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
+  dependencies:
+    mkdirp "^0.5.1"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  integrity sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==
+  dependencies:
+    mkdirp "^0.5.1"
+
+ws@^6.0.0, ws@^6.2.1:
+  version "6.2.2"
+  resolved "https://registry.npmmirror.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e"
+  integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==
+  dependencies:
+    async-limiter "~1.0.0"
+
+ws@^7.3.1:
+  version "7.5.9"
+  resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
+  integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
+
+xlsx@^0.16.9:
+  version "0.16.9"
+  resolved "https://registry.npmmirror.com/xlsx/-/xlsx-0.16.9.tgz#dacd5bb46bda6dd3743940c9c3dc1e2171826256"
+  integrity sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw==
+  dependencies:
+    adler-32 "~1.2.0"
+    cfb "^1.1.4"
+    codepage "~1.14.0"
+    commander "~2.17.1"
+    crc-32 "~1.2.0"
+    exit-on-epipe "~1.0.1"
+    fflate "^0.3.8"
+    ssf "~0.11.2"
+    wmf "~1.0.1"
+    word "~0.3.0"
+
+xtend@^4.0.0, xtend@~4.0.1:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+  integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+y18n@^5.0.5:
+  version "5.0.8"
+  resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+  integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+  integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==
+
+yallist@^3.0.2:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+  integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^13.1.2:
+  version "13.1.2"
+  resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+  integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
+yargs-parser@^20.2.2:
+  version "20.2.9"
+  resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+  integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs@^13.3.2:
+  version "13.3.2"
+  resolved "https://registry.npmmirror.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+  integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+  dependencies:
+    cliui "^5.0.0"
+    find-up "^3.0.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^3.0.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^13.1.2"
+
+yargs@^16.0.0:
+  version "16.2.0"
+  resolved "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+  integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+  dependencies:
+    cliui "^7.0.2"
+    escalade "^3.1.1"
+    get-caller-file "^2.0.5"
+    require-directory "^2.1.1"
+    string-width "^4.2.0"
+    y18n "^5.0.5"
+    yargs-parser "^20.2.2"
+
+yorkie@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9"
+  integrity sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==
+  dependencies:
+    execa "^0.8.0"
+    is-ci "^1.0.10"
+    normalize-path "^1.0.0"
+    strip-indent "^2.0.0"
+
+zrender@4.3.2:
+  version "4.3.2"
+  resolved "https://registry.npmmirror.com/zrender/-/zrender-4.3.2.tgz#ec7432f9415c82c73584b6b7b8c47e1b016209c6"
+  integrity sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==

Некоторые файлы не были показаны из-за большого количества измененных файлов