{"version":3,"file":"CanvasShipSymbol.mjs","sources":["../../../../packages/sdk/CanvasShipSymbol.ts"],"sourcesContent":["import L, { LatLng } from 'leaflet'\nimport { CanvasShip } from '@map-sdk/sdk/model/CanvasShip'\nimport { CanvasShipUtils } from '@map-sdk/sdk/utils/CanvasShipUtils'\nimport { CommUtils } from '@map-sdk/sdk/utils/CommUtils'\nimport type { MyMap } from '@map-sdk/sdk/ShipxyAPISDK'\n\ninterface CanvasShipSymbolOptions {\n  color: string\n  lineColor: string\n  lineWidth: number\n  heightLineColor: string\n  isSelected?: boolean\n  maptype?: any // 根据实际情况定义maptype类型\n  sizeZoom: number\n  minSilouetteZoom: number\n  labelImages?: Record<string, unknown> // 或者定义更具体的类型\n  radarOptions: {\n    color: string\n    lineColor: string\n    heightLineColor: string\n    lineWidth: number\n    iconSize: number\n  }\n}\n\ninterface RadarDrawingOptions {\n  fillStyle: string\n  strokeStyle: string\n  lineWidth: number\n}\n\ninterface ArcDefinition {\n  name: 'arc'\n  area: [number, number][]\n  centerXY: [number, number]\n  headXY: [number, number]\n  headXY2: [number, number]\n  headLength: number\n  radius: number\n}\ninterface CalculatedLabelInfo {\n  center: L.Point\n  l: L.Point\n  r: L.Point\n  x: L.Point\n  position: number\n}\n\ninterface LabelImage {\n  isDraw: boolean\n  imgSize: number\n  imgWidth: number\n  imgOffset: number\n  imgTypes: ('monitor' | 'monitor_nosign' | 'satellite' | 'dplus' | 'beidou')[]\n}\n\ntype Point = [number, number]\n\nexport interface Template {\n  headXY: [number, number]\n  centerXY: Point\n  area: Point[] // 假设每个顶点都是一个Point类型数组\n  radius?: number // 对于drawArc函数，假设模板对象有个可选的圆半径属性\n  headLength?: number\n  name: string\n}\n\ninterface DrawResult {\n  area: Point[]\n  centerXY: Point\n}\n\nclass CanvasShipSymbol extends L.Class {\n  latlng: L.LatLng = new LatLng(0, 0)\n  ctx!: CanvasRenderingContext2D\n  options!: CanvasShipSymbolOptions\n  shipid!: string\n  mmsi!: string\n  lat!: number\n  lng!: number\n  rotate!: number\n  pointCenterGPS: L.Point = new L.Point(0, 0)\n  latlngReal: L.LatLng = new LatLng(0, 0)\n  pointCenterReal: L.Point = new L.Point(0, 0)\n  templater!: Template\n  _map!: MyMap\n  _ship: CanvasShip = new CanvasShip()\n  x!: number\n  y!: number\n  state!: number\n\n  bodyArea: Point[] = []\n  head_x!: number\n  head_y!: number\n\n  constructor(\n    latlng: L.LatLng,\n    map: L.Map,\n    ship: CanvasShip,\n    options?: Partial<CanvasShipSymbolOptions>\n  ) {\n    super()\n\n    if (!ship) {\n      console.error('ship is undefined')\n      return\n    }\n\n    this.options = {\n      color: '',\n      lineColor: '',\n      lineWidth: 1,\n      heightLineColor: '#000000',\n      isSelected: false,\n      maptype: undefined,\n      sizeZoom: 1,\n      minSilouetteZoom: 13,\n      labelImages: {},\n      radarOptions: {\n        color: '#ffa500',\n        lineColor: '#000000',\n        heightLineColor: '#000000',\n        lineWidth: 1,\n        iconSize: 8,\n      },\n    }\n\n    this.latlng = latlng || (ship.getLatlng() as L.LatLng)\n\n    if (!this.latlng) {\n      console.error('latlng is undefined')\n      return\n    }\n\n    this.latlng.lng += ship.offset\n\n    if (map) {\n      this._map = map as any\n      const canvasElement = this._map.getPanes()\n        .canvasShipsPane as HTMLCanvasElement\n      this.ctx = canvasElement.getContext('2d') as CanvasRenderingContext2D\n      // 使用Partial合并默认值和传入的options\n      this.options = { ...this.options, ...options }\n\n      this._ship = ship\n      this.shipid = ship.shipid\n      this.mmsi = ship.mmsi\n      this.lat = this.latlng.lat\n      this.lng = this.latlng.lng\n\n      const defaultOptions: Partial<CanvasShipSymbolOptions> = {\n        color: this.options.color || ship.color || '#d3d3d3',\n        lineColor: this.options.lineColor || ship.lineColor || '#000000',\n        heightLineColor:\n          this.options.heightLineColor || ship.heightLineColor || '#000000',\n        lineWidth: this.options.lineWidth || ship.lineWidth || 1,\n        isSelected: this.options.isSelected || ship.isSelected || false,\n        sizeZoom: this.options.sizeZoom || 1,\n        minSilouetteZoom: this.options.minSilouetteZoom || 13,\n      }\n\n      this.options = { ...defaultOptions, ...this.options }\n\n      this.templater = CanvasShipUtils.getShipTemplater(\n        this._map,\n        this._ship,\n        this.options.minSilouetteZoom\n      )\n\n      this.templater = CanvasShipUtils.sizeZoomShipTemplater(\n        this.templater,\n        this.options.sizeZoom\n      )\n\n      const hdg = 511 === this._ship.hdg_source ? 511 : this._ship.hdg || 0\n      this.rotate = CanvasShipUtils.getAngle(\n        hdg,\n        this._ship.sog || 0,\n        this._ship.cog || 0\n      )\n\n      const containerPoint = this._map.latLngToContainerPoint(this.latlng)\n      this.pointCenterGPS = containerPoint\n      this.latlngReal = latlng\n      this.pointCenterReal = containerPoint\n\n      if (this.templater && this.templater.name === 'nine') {\n        const meters2pixel = CanvasShipUtils.meters2pixel(this._map)\n        const shipRealCenterPoint = CanvasShipUtils.getShipRealCenterPoint(\n          new L.Point(containerPoint.x, containerPoint.y),\n          this._ship,\n          meters2pixel\n        )\n        this.pointCenterReal = shipRealCenterPoint\n        this.latlngReal = this._map.containerPointToLatLng(\n          new L.Point(this.pointCenterReal.x, this.pointCenterReal.y)\n        )\n      }\n\n      this.x = this.pointCenterReal.x || 0\n      this.y = this.pointCenterReal.y || 0\n      this.drawShipTemplater()\n    } else {\n      console.error('map is undefined')\n    }\n  }\n  drawShipTemplater() {\n    this._ship.is_radar\n      ? this._ship.mmsi + !'0' && this._ship.radarid\n        ? this.drawShipRadar(true)\n        : (this.drawShip(this.templater), this.drawShipRadar(false))\n      : this.drawShip(this.templater)\n  }\n  /**\n   * 绘制雷达监测范围小红点 在船舶中间\n   * @param drawDetails\n   * @returns\n   */\n  drawShipRadar(drawDetails: boolean): this {\n    const heightLineColor = this.options.radarOptions.heightLineColor\n    const rotation = this.rotate || 0\n    const centerPosition: Point = [this.x, this.y]\n    const iconHalfSize = this.options.radarOptions.iconSize / 2\n    const arcParams: ArcDefinition = {\n      name: 'arc',\n      area: [\n        [0, iconHalfSize],\n        [iconHalfSize, 0],\n        [2 * iconHalfSize, iconHalfSize],\n        [iconHalfSize, 2 * iconHalfSize],\n      ],\n      centerXY: [iconHalfSize, iconHalfSize],\n      headXY: [iconHalfSize, 0],\n      headXY2: [iconHalfSize, -10],\n      headLength: 10,\n      radius: iconHalfSize,\n    }\n    const drawingStyles: RadarDrawingOptions = {\n      fillStyle: this.options.radarOptions.color,\n      strokeStyle: this.options.radarOptions.lineColor,\n      lineWidth: this.options.radarOptions.lineWidth || 1,\n    }\n\n    const arcResult = this.drawArc(\n      this.ctx,\n      centerPosition,\n      arcParams,\n      drawingStyles\n    )\n    if (arcResult) this.bodyArea = arcResult.area\n\n    if (drawDetails) {\n      const dx = centerPosition[0] - arcParams.centerXY[0]\n      const dy = centerPosition[1] - arcParams.centerXY[1]\n      const rotatedHeadPosition = CanvasShipUtils.pointRotate(\n        centerPosition,\n        [arcParams.headXY[0] + dx, arcParams.headXY[1] + dy],\n        rotation\n      )\n\n      this.head_x = rotatedHeadPosition[0]\n      this.head_y = rotatedHeadPosition[1]\n\n      this._drawHeading(this.ctx, arcParams, heightLineColor)\n      if (this.options.isSelected) {\n        this._drawShipPos(this.ctx, arcParams, centerPosition, this.bodyArea)\n      }\n      this._drawTracks(this.ctx)\n    }\n\n    return this\n  }\n  drawShip(template: Template): this {\n    this.bodyArea = []\n    this.head_x = 0\n    this.head_y = 0\n\n    const rotate = this.rotate || 0\n    const centerXY: [number, number] = [this.x, this.y]\n    const drawingOptions: RadarDrawingOptions = {\n      fillStyle: this.options.color,\n      strokeStyle: this.options.lineColor,\n      lineWidth: this.options.lineWidth,\n    }\n\n    const drawnPolygonInfo = this.drawPolygon(\n      this.ctx,\n      centerXY,\n      rotate,\n      template,\n      drawingOptions\n    )\n    if (drawnPolygonInfo) this.bodyArea = drawnPolygonInfo.area\n\n    const offsetCenterX = centerXY[0] - template.centerXY[0]\n    const offsetCenterY = centerXY[1] - template.centerXY[1]\n    const rotatedHeadPosition = CanvasShipUtils.pointRotate(\n      centerXY,\n      [template.headXY[0] + offsetCenterX, template.headXY[1] + offsetCenterY],\n      rotate\n    )\n\n    this.head_x = rotatedHeadPosition[0]\n    this.head_y = rotatedHeadPosition[1]\n\n    this._drawHeading(this.ctx, template, this.options.heightLineColor)\n\n    if (this.options.isSelected) {\n      this._drawShipPos(this.ctx, template, centerXY, this.bodyArea)\n    }\n\n    this._drawTracks(this.ctx)\n\n    return this\n  }\n  /**\n   * 绘制标签入口方法初始化canvas等\n   * @param calcLabel\n   * @param labelImage\n   * @param labelText\n   * @param txtColor\n   * @param font\n   * @param lableRotate\n   * @param lineColor\n   * @param lineFillColor\n   * @param obliqueLineColor\n   * @returns\n   */\n  drawLable(\n    calcLabel: CalculatedLabelInfo,\n    labelImage: LabelImage,\n    labelText: string,\n    txtColor: string,\n    font: string,\n    lableRotate: number,\n    lineColor: string,\n    lineFillColor: string,\n    obliqueLineColor: string\n  ) {\n    if (!calcLabel) {\n      console.error('drawLable error calcLabel is null.')\n      return\n    }\n\n    const canvasElement = this._map.getPanes()\n      .canvasShipsPane as HTMLCanvasElement\n    const canvas = canvasElement.getContext('2d') as CanvasRenderingContext2D\n\n    this._drawLableCtx(\n      canvas,\n      labelImage.isDraw,\n      labelImage,\n      calcLabel,\n      labelText,\n      txtColor,\n      font,\n      lableRotate,\n      lineColor,\n      lineFillColor,\n      obliqueLineColor\n    )\n  }\n\n  /**\n   * 绘制标签\n   * @param canvas\n   * @param isDraw\n   * @param labelImage\n   * @param calcLabel\n   * @param labelText\n   * @param txtColor\n   * @param font\n   * @param lableRotate\n   * @param lineColor\n   * @param lineFillColor\n   * @param obliqueLineColor\n   */\n  private _drawLableCtx(\n    canvas: CanvasRenderingContext2D,\n    isDraw: boolean,\n    labelImage: LabelImage,\n    calcLabel: CalculatedLabelInfo,\n    labelText: string,\n    txtColor: string,\n    font: string,\n    lableRotate: number,\n    lineColor: string,\n    lineFillColor: string,\n    obliqueLineColor: string\n  ): void {\n    const imageSize = labelImage.imgSize\n    const halfImageSize = imageSize / 2\n    const imgOffset = labelImage.imgOffset\n    let textOffsetX = 0\n    let iconOffsetY = 0\n    const totalIconWidth = imageSize + 2 * imgOffset\n    const imgTypes = labelImage.imgTypes\n    const imgTypesLength = imgTypes.length\n\n    canvas.save()\n\n    if (lableRotate) {\n      canvas.translate(calcLabel.center.x, calcLabel.center.y)\n      canvas.rotate((lableRotate * Math.PI) / 180)\n      canvas.translate(-calcLabel.center.x, -calcLabel.center.y)\n    }\n\n    if (isDraw) {\n      textOffsetX = halfImageSize\n    }\n\n    if (labelText && labelText.length > 0) {\n      const textXOffset = isDraw ? labelImage.imgWidth : 0\n      const rectWidth = calcLabel.r.x - calcLabel.l.x\n      CanvasShipUtils.drawRectangleRadius(\n        canvas,\n        calcLabel.l.x,\n        calcLabel.l.y,\n        rectWidth + 2 * imgOffset,\n        totalIconWidth,\n        lineColor,\n        lineFillColor\n      )\n      this._drawText(\n        canvas,\n        new L.Point(\n          calcLabel.l.x + textXOffset + imgOffset,\n          calcLabel.l.y + 0.75 * totalIconWidth\n        ),\n        labelText,\n        txtColor,\n        font\n      )\n\n      let extraOffsetY = 0\n      switch (calcLabel.position) {\n        case 2:\n        case 3:\n        case 4:\n          extraOffsetY = -totalIconWidth / 4\n          break\n        case 6:\n        case 7:\n          extraOffsetY = totalIconWidth / 4\n          break\n      }\n      iconOffsetY = extraOffsetY\n    }\n\n    if (isDraw) {\n      for (let i = 0; i < imgTypesLength; i++) {\n        const currentImgX =\n          imgOffset + halfImageSize + i * (imageSize + imgOffset)\n        let iconName = ''\n        switch (imgTypes[i]) {\n          case 'monitor':\n            this._drawLabelImageMonitor(\n              canvas,\n              calcLabel.l.x + currentImgX,\n              calcLabel.l.y + 2 * textOffsetX - 4,\n              halfImageSize\n            )\n            break\n          case 'monitor_nosign':\n            this._drawLabelImageMonitor(\n              canvas,\n              calcLabel.l.x + currentImgX,\n              calcLabel.l.y + 2 * textOffsetX - 4,\n              halfImageSize,\n              true\n            )\n            break\n          default:\n            switch (imgTypes[i]) {\n              case 'satellite':\n                iconName = 'S'\n                break\n              case 'dplus':\n                iconName = 'D'\n                break\n              case 'beidou':\n                iconName = '斗'\n            }\n            this._drawIcon(\n              canvas,\n              calcLabel.l.x + currentImgX,\n              calcLabel.l.y + 2 * textOffsetX - 4, //+ iconOffsetY,\n              halfImageSize,\n              iconName\n            )\n        }\n      }\n    }\n\n    this._drawLine(\n      canvas,\n      new L.Point(calcLabel.center.x, calcLabel.center.y),\n      new L.Point(calcLabel.x.x, calcLabel.x.y + iconOffsetY),\n      obliqueLineColor\n    )\n    canvas.restore()\n  }\n  /**\n   * 绘制标签图标\n   * @param canvas\n   * @param x\n   * @param y\n   * @param radius\n   * @param text\n   */\n  private _drawIcon(\n    canvas: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    radius: number,\n    text: string\n  ) {\n    const drawText = CommUtils.isHasZH_cn(text)\n\n    canvas.save()\n    canvas.beginPath()\n    const fillStyle = canvas.createRadialGradient(\n      x,\n      y - radius / 2,\n      radius / 50,\n      x,\n      y - radius / 2,\n      0.6 * radius\n    )\n    fillStyle.addColorStop(0.5, '#ED5835')\n    fillStyle.addColorStop(1, '#ED5835')\n    canvas.arc(x, y, radius, 0, 360)\n    canvas.fillStyle = fillStyle\n    canvas.fill()\n    canvas.closePath()\n    canvas.restore()\n\n    canvas.save()\n    canvas.beginPath()\n    const fontSize = 1.5 * radius\n    canvas.font = `bold ${fontSize}px Arial`\n    canvas.fillStyle = '#fff'\n    let textXOffset = x - 0.35 * fontSize\n    drawText && (textXOffset = x - 0.5 * fontSize)\n    canvas.fillText(text, textXOffset, y + 0.35 * fontSize)\n    canvas.fill()\n    canvas.closePath()\n    canvas.restore()\n  }\n\n  _drawLabelImageMonitor(\n    canvas: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    radius: number,\n    hasSignature?: boolean\n  ) {\n    canvas.save()\n    canvas.beginPath()\n    const fillStyle = canvas.createRadialGradient(\n      x,\n      y - radius / 2,\n      radius / 50,\n      x,\n      y - radius / 2,\n      0.6 * radius\n    )\n    const color = '#ED5835'\n    fillStyle.addColorStop(0.5, color)\n    fillStyle.addColorStop(1, color)\n    canvas.arc(x, y, radius, 0, 360)\n    canvas.fillStyle = fillStyle\n    canvas.fill()\n    canvas.closePath()\n    canvas.restore()\n\n    canvas.save()\n    canvas.beginPath()\n\n    const start = [x - radius / 2, y - radius / 10]\n    const end = [start[0], start[1] + radius / 1.5]\n    const middle = [start[0], start[1] + (end[1] - start[1]) / 2]\n    const topRight = [middle[0] + radius / 3, middle[1]]\n    const center = [x, y]\n    const bottomLeft = [start[0], start[1] - radius / 3]\n    const bottomRight = [topRight[0], topRight[1] - 0.9 * radius]\n    const rightMid = [topRight[0] + 0.8 * radius, center[1]]\n    const midRight = [topRight[0] + radius / 2, topRight[1]]\n\n    canvas.moveTo(start[0], start[1])\n    canvas.lineTo(start[0], start[1])\n    canvas.lineTo(end[0], end[1])\n    canvas.moveTo(middle[0], middle[1])\n    canvas.lineTo(middle[0], middle[1])\n    canvas.lineTo(topRight[0], topRight[1])\n    canvas.lineTo(center[0], center[1])\n    canvas.moveTo(bottomLeft[0], bottomLeft[1])\n    canvas.lineTo(bottomLeft[0], bottomLeft[1])\n    canvas.lineTo(bottomRight[0], bottomRight[1])\n    canvas.lineTo(rightMid[0], rightMid[1])\n    canvas.lineTo(midRight[0], midRight[1])\n    canvas.lineTo(bottomLeft[0], bottomLeft[1])\n\n    canvas.strokeStyle = '#fff'\n    canvas.lineWidth = 1.5\n    canvas.lineJoin = 'round'\n    canvas.stroke()\n    canvas.closePath()\n    canvas.restore()\n\n    if (hasSignature) {\n      const signatureStart = [start[0] - 4, start[1] + 5]\n      const signatureEnd = [rightMid[0] + 1, rightMid[1] - 7]\n\n      canvas.save()\n      canvas.beginPath()\n      canvas.moveTo(signatureStart[0], signatureStart[1])\n      canvas.lineTo(signatureEnd[0], signatureEnd[1])\n      canvas.strokeStyle = '#fff'\n      canvas.lineWidth = 1\n      canvas.lineJoin = 'round'\n      canvas.stroke()\n      canvas.closePath()\n      canvas.restore()\n    }\n  }\n  /**\n   * 绘制标签图标\n   * @param canvas\n   * @param imageName\n   * @param x\n   * @param y\n   * @param width\n   * @param height\n   */\n  _drawLabelImage(\n    canvas: CanvasRenderingContext2D,\n    imageName: string,\n    x: number,\n    y: number,\n    width: number,\n    height: number\n  ) {\n    const image = new Image()\n    image.onload = () => {\n      canvas.save()\n      canvas.drawImage(image, x - width / 2, y - height / 2, width, height)\n      canvas.restore()\n    }\n    image.src = this.options.labelImages?.[imageName] as string\n  }\n\n  /**\n   * 绘制标签文字\n   * @param canvas\n   * @param point\n   * @param text\n   * @param fillStyle\n   * @param font\n   */\n  _drawText(\n    canvas: CanvasRenderingContext2D,\n    point: L.Point,\n    text: string,\n    fillStyle = '#000000',\n    font = '600 12px Arial'\n  ) {\n    canvas.save()\n    canvas.beginPath()\n    canvas.font = font\n    canvas.fillStyle = fillStyle\n    canvas.fillText(text, point.x, point.y)\n    canvas.fill()\n    canvas.closePath()\n    canvas.restore()\n  }\n\n  /**\n   * 绘制标签指向线\n   * @param canvas\n   * @param startPoint\n   * @param endPoint\n   * @param color\n   */\n  _drawLine(\n    canvas: CanvasRenderingContext2D,\n    startPoint: L.Point,\n    endPoint: L.Point,\n    color = '#000000'\n  ) {\n    canvas.save()\n    canvas.beginPath()\n    canvas.moveTo(startPoint.x, startPoint.y)\n    canvas.lineTo(endPoint.x, endPoint.y)\n    canvas.strokeStyle = color\n    canvas.lineWidth = 1\n    canvas.lineJoin = 'round'\n    canvas.stroke()\n    canvas.closePath()\n    canvas.restore()\n  }\n  /**\n   * 绘制船舶指向线\n   * @param canvas\n   * @param template\n   * @param strokeStyle\n   */\n  _drawHeading(\n    canvas: CanvasRenderingContext2D,\n    template: Template,\n    strokeStyle: string\n  ) {\n    let headLength = template.headLength || 15\n    let offset = 5\n    if (template.name === 'nine') {\n      headLength = 50\n      offset = 10\n    }\n\n    if (this._ship.sog && this._ship.sog > 1) {\n      canvas.save()\n      canvas.beginPath()\n      canvas.moveTo(this.head_x, this.head_y)\n\n      const rotatedEndPoint = CanvasShipUtils.pointRotate(\n        [this.head_x, this.head_y],\n        [this.head_x, this.head_y - headLength],\n        this.rotate\n      )\n      canvas.lineTo(rotatedEndPoint[0], rotatedEndPoint[1])\n\n      if (this._ship.rot && this._ship.rot !== 0) {\n        const rotationAngle = this._ship.rot > 0 ? 90 : -90\n        canvas.moveTo(rotatedEndPoint[0], rotatedEndPoint[1])\n        const baseRotatedPoint = CanvasShipUtils.pointRotate(\n          [this.head_x, this.head_y],\n          [this.head_x, this.head_y - headLength - offset],\n          this.rotate\n        )\n        const finalRotatedPoint = CanvasShipUtils.pointRotate(\n          rotatedEndPoint,\n          baseRotatedPoint,\n          rotationAngle\n        )\n        canvas.lineTo(finalRotatedPoint[0], finalRotatedPoint[1])\n      }\n\n      canvas.strokeStyle = strokeStyle\n      canvas.lineWidth = 1\n      canvas.lineJoin = 'round'\n      canvas.stroke()\n      canvas.closePath()\n      canvas.restore()\n    }\n  }\n\n  /**\n   * 绘制选中船舶对象\n   * @param canvas\n   * @param shipType\n   * @param position\n   * @param areaLatLng\n   */\n  _drawShipPos(\n    canvas: CanvasRenderingContext2D,\n    shipType: Template,\n    position: [number, number],\n    areaLatLng: Point[]\n  ) {\n    canvas.save()\n    canvas.beginPath()\n    let minX = 0\n    let minY = 0\n    let maxX = 0\n    let maxY = 0\n    const boundingBox = CanvasShipUtils.getBoundingBoxArea(areaLatLng)\n    if (boundingBox && boundingBox.min) {\n      minX = boundingBox.min.x\n      minY = boundingBox.min.y\n    }\n    if (boundingBox && boundingBox.max) {\n      maxX = boundingBox.max.x\n      maxY = boundingBox.max.y\n    }\n\n    if (shipType && shipType.name === 'three') {\n      minX = position[0] - 8\n      minY = position[1] - 8\n      maxX = position[0] + 8\n      maxY = position[1] + 8\n    }\n\n    canvas.moveTo(minX - 8, minY + 8 - 6)\n    canvas.lineTo(minX - 8, minY - 8)\n    canvas.moveTo(minX - 8, minY - 8)\n    canvas.lineTo(minX + 8 - 6, minY - 8)\n    canvas.moveTo(maxX - 8 + 6, minY - 8)\n    canvas.lineTo(maxX + 8, minY - 8)\n    canvas.moveTo(maxX + 8, minY - 8)\n    canvas.lineTo(maxX + 8, minY + 8 - 6)\n    canvas.moveTo(maxX + 8, maxY - 8 + 6)\n    canvas.lineTo(maxX + 8, maxY + 8)\n    canvas.moveTo(maxX + 8, maxY + 8)\n    canvas.lineTo(maxX - 8 + 6, maxY + 8)\n    canvas.moveTo(minX + 8 - 6, maxY + 8)\n    canvas.lineTo(minX - 8, maxY + 8)\n    canvas.moveTo(minX - 8, maxY + 8)\n    canvas.lineTo(minX - 8, maxY - 8 + 6)\n    canvas.closePath()\n    canvas.strokeStyle = 'red'\n    canvas.lineWidth = 1\n    canvas.lineJoin = 'round'\n    canvas.stroke()\n    canvas.restore()\n  }\n\n  /**\n   * 绘制最近轨迹\n   * @param canvas\n   */\n  _drawTracks(canvas: CanvasRenderingContext2D) {\n    if (this._ship.tracks && this._ship.tracks.length > 1) {\n      canvas.save()\n      canvas.closePath()\n      canvas.beginPath()\n\n      const { lat, lng } = this._ship.getLatlng()\n      const currentPoint = CanvasShipUtils.GPSEncryptByMapTypeToPoint(\n        L.latLng(lat, lng + this._ship.offset),\n        this._map.mapType as string,\n        this._map\n      )\n\n      canvas.moveTo(this.pointCenterReal.x, this.pointCenterReal.y)\n      canvas.lineTo(currentPoint.x, currentPoint.y)\n      canvas.moveTo(currentPoint.x, currentPoint.y)\n\n      for (let i = this._ship.tracks.length - 1; i >= 0; i--) {\n        const trackPoint = CanvasShipUtils.GPSEncryptByMapTypeToPoint(\n          new LatLng(\n            (this._ship.tracks[i] as any).lat,\n            (this._ship.tracks[i] as any).lng + this._ship.offset\n          ),\n          this._map.mapType as string,\n          this._map\n        )\n        canvas.lineTo(trackPoint.x, trackPoint.y)\n        if (this._map.getZoom() >= 16) {\n          canvas.arc(trackPoint.x, trackPoint.y, 1, 0, 360)\n        }\n        canvas.moveTo(trackPoint.x, trackPoint.y)\n      }\n\n      canvas.fillStyle = '#8d8d8d'\n      canvas.fill()\n      canvas.strokeStyle = '#8d8d8d'\n      canvas.lineWidth = 1\n      canvas.lineJoin = 'round'\n      canvas.stroke()\n      canvas.closePath()\n      canvas.restore()\n    }\n  }\n\n  /**\n   * 绘制船舶符号\n   * @param canvas\n   * @param centerXY\n   * @param rotate\n   * @param templater\n   * @param options\n   * @returns\n   */\n  drawPolygon(\n    canvas: CanvasRenderingContext2D,\n    centerXY: Point,\n    rotate: number,\n    templater: Template,\n    options?: {\n      fillStyle?: string\n      strokeStyle?: string\n      lineWidth?: number\n    }\n  ): DrawResult | undefined {\n    if (!canvas || !centerXY || !templater) return\n\n    const defaultOptions: {\n      fillStyle: string\n      strokeStyle: string\n      lineWidth: number\n    } = {\n      fillStyle: '#ffa500',\n      strokeStyle: '#000000',\n      lineWidth: 1,\n    }\n\n    const combinedOptions = { ...defaultOptions, ...options }\n\n    canvas.save()\n    canvas.beginPath()\n\n    const offsetX = centerXY[0] - templater.centerXY[0]\n    const offsetY = centerXY[1] - templater.centerXY[1]\n\n    const result: DrawResult = {\n      area: [],\n      centerXY,\n    }\n\n    const pointRotate = CanvasShipUtils.pointRotate(\n      centerXY,\n      [templater.area[0][0] + offsetX, templater.area[0][1] + offsetY],\n      rotate\n    )\n    canvas.moveTo(pointRotate[0], pointRotate[1])\n\n    for (let i = 0; i < templater.area.length; i++) {\n      const shiftedX = templater.area[i][0] + offsetX\n      const shiftedY = templater.area[i][1] + offsetY\n      const rotatedPoint = CanvasShipUtils.pointRotate(\n        centerXY,\n        [shiftedX, shiftedY],\n        rotate\n      ) as Point\n      canvas.lineTo(rotatedPoint[0], rotatedPoint[1])\n      result.area.push(rotatedPoint)\n    }\n\n    if (combinedOptions.fillStyle) {\n      canvas.fillStyle = combinedOptions.fillStyle\n      canvas.fill()\n    }\n\n    if (combinedOptions.strokeStyle) {\n      canvas.strokeStyle = combinedOptions.strokeStyle\n      canvas.lineWidth = combinedOptions.lineWidth\n      canvas.lineJoin = 'round'\n      canvas.lineCap = 'round' // 更正了拼写错误，应该是lineCap不是lineCop\n      canvas.stroke()\n    }\n\n    canvas.closePath()\n    canvas.restore()\n\n    return result\n  }\n\n  drawArc(\n    canvas: CanvasRenderingContext2D,\n    point: Point,\n    arcTemplate: Pick<Template, 'centerXY' | 'area' | 'radius'>,\n    options?: {\n      fillStyle?: string\n      strokeStyle?: string\n      lineWidth?: number\n    }\n  ): DrawResult | undefined {\n    if (!canvas || !point || !arcTemplate.radius) return\n\n    const defaultOptions: {\n      fillStyle: string\n      strokeStyle: string\n      lineWidth: number\n    } = {\n      fillStyle: '#ffa500',\n      strokeStyle: '#000000',\n      lineWidth: 1,\n    }\n\n    const combinedOptions = { ...defaultOptions, ...options }\n\n    canvas.save()\n    canvas.beginPath()\n\n    const shiftedPoints: Point[] = []\n    const dx = point[0] - arcTemplate.centerXY[0]\n    const dy = point[1] - arcTemplate.centerXY[1]\n\n    for (let i = 0; i < arcTemplate.area.length; i++) {\n      const shiftedX = arcTemplate.area[i][0] + dx\n      const shiftedY = arcTemplate.area[i][1] + dy\n      shiftedPoints.push([shiftedX, shiftedY])\n    }\n\n    const result: DrawResult = {\n      area: shiftedPoints,\n      centerXY: point,\n    }\n\n    canvas.arc(point[0], point[1], arcTemplate.radius, 0, 360)\n\n    if (combinedOptions.fillStyle) {\n      canvas.fillStyle = combinedOptions.fillStyle\n      canvas.fill()\n    }\n\n    if (combinedOptions.strokeStyle) {\n      canvas.strokeStyle = combinedOptions.strokeStyle\n      canvas.lineWidth = combinedOptions.lineWidth\n      canvas.lineJoin = 'round'\n      canvas.lineCap = 'round'\n      canvas.stroke()\n    }\n\n    canvas.closePath()\n    canvas.restore()\n\n    return result\n  }\n}\n\nconst canvasShipSymbol = (\n  canvas: L.LatLng,\n  map: L.Map,\n  ship: CanvasShip,\n  options?: Partial<CanvasShipSymbolOptions>\n) => {\n  return new CanvasShipSymbol(canvas, map, ship, options)\n}\n\nexport { canvasShipSymbol, CanvasShipSymbol }\n"],"names":["L","u","Class","constructor","t","o","i","e","super","this","latlng","T","pointCenterGPS","Point","latlngReal","pointCenterReal","_ship","W","bodyArea","options","color","lineColor","lineWidth","heightLineColor","isSelected","maptype","sizeZoom","minSilouetteZoom","labelImages","radarOptions","iconSize","getLatlng","lng","offset","_map","s","getPanes","canvasShipsPane","ctx","getContext","shipid","mmsi","lat","n","templater","p","getShipTemplater","sizeZoomShipTemplater","l","hdg_source","hdg","rotate","getAngle","sog","cog","r","latLngToContainerPoint","name","h","meters2pixel","m","getShipRealCenterPoint","x","y","containerPointToLatLng","drawShipTemplater","is_radar","radarid","drawShipRadar","drawShip","area","centerXY","headXY","headXY2","headLength","radius","fillStyle","strokeStyle","drawArc","d","pointRotate","head_x","head_y","_drawHeading","_drawShipPos","_drawTracks","drawPolygon","drawLable","_drawLableCtx","isDraw","f","imgSize","g","imgOffset","a","C","P","imgTypes","k","length","save","translate","center","Math","PI","b","imgWidth","_","drawRectangleRadius","_drawText","S","position","_drawLabelImageMonitor","_drawIcon","_drawLine","restore","O","isHasZH_cn","beginPath","createRadialGradient","addColorStop","arc","fill","closePath","font","fillText","moveTo","lineTo","lineJoin","stroke","_drawLabelImage","Image","onload","drawImage","src","rot","getBoundingBoxArea","min","max","tracks","GPSEncryptByMapTypeToPoint","latLng","mapType","getZoom","push","lineCap","D","w","R"],"mappings":"wMAA6N,MAAMA,UAAUC,EAAEC,MAAM,WAAAC,CAAYC,EAAEC,EAAEC,EAAEC,GAA0K,GAAvKC,QAAQC,KAAKC,OAAO,IAAIC,EAAE,EAAE,GAAGF,KAAKG,eAAe,IAAIX,EAAEY,MAAM,EAAE,GAAGJ,KAAKK,WAAW,IAAIH,EAAE,EAAE,GAAGF,KAAKM,gBAAgB,IAAId,EAAEY,MAAM,EAAE,GAAGJ,KAAKO,MAAM,IAAIC,EAAER,KAAKS,SAAS,GAAOZ,IAAgDG,KAAKU,QAAQ,CAACC,MAAM,GAAGC,UAAU,GAAGC,UAAU,EAAEC,gBAAgB,UAAUC,YAAW,EAAGC,aAAQ,EAAOC,SAAS,EAAEC,iBAAiB,GAAGC,YAAY,CAAE,EAACC,aAAa,CAACT,MAAM,UAAUC,UAAU,UAAUE,gBAAgB,UAAUD,UAAU,EAAEQ,SAAS,IAAIrB,KAAKC,OAAON,GAAGE,EAAEyB,YAAatB,KAAKC,SAAuDD,KAAKC,OAAOsB,KAAK1B,EAAE2B,OAAO5B,IAAE,CAACI,KAAKyB,KAAK7B,EAAE,MAAM8B,EAAE1B,KAAKyB,KAAKE,WAAWC,gBAAgB5B,KAAK6B,IAAIH,EAAEI,WAAW,MAAM9B,KAAKU,QAAQ,IAAIV,KAAKU,WAAWZ,GAAGE,KAAKO,MAAMV,EAAEG,KAAK+B,OAAOlC,EAAEkC,OAAO/B,KAAKgC,KAAKnC,EAAEmC,KAAKhC,KAAKiC,IAAIjC,KAAKC,OAAOgC,IAAIjC,KAAKuB,IAAIvB,KAAKC,OAAOsB,IAAI,MAAMW,EAAE,CAACvB,MAAMX,KAAKU,QAAQC,OAAOd,EAAEc,OAAO,UAAUC,UAAUZ,KAAKU,QAAQE,WAAWf,EAAEe,WAAW,UAAUE,gBAAgBd,KAAKU,QAAQI,iBAAiBjB,EAAEiB,iBAAiB,UAAUD,UAAUb,KAAKU,QAAQG,WAAWhB,EAAEgB,WAAW,EAAEE,WAAWf,KAAKU,QAAQK,YAAYlB,EAAEkB,aAAY,EAAGE,SAASjB,KAAKU,QAAQO,UAAU,EAAEC,iBAAiBlB,KAAKU,QAAQQ,kBAAkB,IAAIlB,KAAKU,QAAQ,IAAIwB,KAAKlC,KAAKU,SAASV,KAAKmC,UAAUC,EAAEC,iBAAiBrC,KAAKyB,KAAKzB,KAAKO,MAAMP,KAAKU,QAAQQ,kBAAkBlB,KAAKmC,UAAUC,EAAEE,sBAAsBtC,KAAKmC,UAAUnC,KAAKU,QAAQO,UAAU,MAAMsB,EAA0B,MAAxBvC,KAAKO,MAAMiC,WAAiB,IAAIxC,KAAKO,MAAMkC,KAAK,EAAEzC,KAAK0C,OAAON,EAAEO,SAASJ,EAAEvC,KAAKO,MAAMqC,KAAK,EAAE5C,KAAKO,MAAMsC,KAAK,GAAG,MAAMC,EAAE9C,KAAKyB,KAAKsB,uBAAuB/C,KAAKC,QAAQ,GAAGD,KAAKG,eAAe2C,EAAE9C,KAAKK,WAAWV,EAAEK,KAAKM,gBAAgBwC,EAAE9C,KAAKmC,WAAiC,SAAtBnC,KAAKmC,UAAUa,KAAc,CAAC,MAAMC,EAAEb,EAAEc,aAAalD,KAAKyB,MAAM0B,EAAEf,EAAEgB,uBAAuB,IAAI5D,EAAEY,MAAM0C,EAAEO,EAAEP,EAAEQ,GAAGtD,KAAKO,MAAM0C,GAAGjD,KAAKM,gBAAgB6C,EAAEnD,KAAKK,WAAWL,KAAKyB,KAAK8B,uBAAuB,IAAI/D,EAAEY,MAAMJ,KAAKM,gBAAgB+C,EAAErD,KAAKM,gBAAgBgD,GAAG,CAACtD,KAAKqD,EAAErD,KAAKM,gBAAgB+C,GAAG,EAAErD,KAAKsD,EAAEtD,KAAKM,gBAAgBgD,GAAG,EAAEtD,KAAKwD,mBAAmB,CAAuC,CAAC,iBAAAA,GAAoBxD,KAAKO,MAAMkD,SAASzD,KAAKO,MAAMyB,MAAK,GAAIhC,KAAKO,MAAMmD,QAAQ1D,KAAK2D,eAAc,IAAK3D,KAAK4D,SAAS5D,KAAKmC,WAAWnC,KAAK2D,eAAc,IAAK3D,KAAK4D,SAAS5D,KAAKmC,UAAU,CAAC,aAAAwB,CAAchE,GAAG,MAAMC,EAAEI,KAAKU,QAAQU,aAAaN,gBAAgBjB,EAAEG,KAAK0C,QAAQ,EAAE5C,EAAE,CAACE,KAAKqD,EAAErD,KAAKsD,GAAG5B,EAAE1B,KAAKU,QAAQU,aAAaC,SAAS,EAAEa,EAAE,CAACc,KAAK,MAAMa,KAAK,CAAC,CAAC,EAAEnC,GAAG,CAACA,EAAE,GAAG,CAAC,EAAEA,EAAEA,GAAG,CAACA,EAAE,EAAEA,IAAIoC,SAAS,CAACpC,EAAEA,GAAGqC,OAAO,CAACrC,EAAE,GAAGsC,QAAQ,CAACtC,GAAG,IAAIuC,WAAW,GAAGC,OAAOxC,GAAGa,EAAE,CAAC4B,UAAUnE,KAAKU,QAAQU,aAAaT,MAAMyD,YAAYpE,KAAKU,QAAQU,aAAaR,UAAUC,UAAUb,KAAKU,QAAQU,aAAaP,WAAW,GAAGiC,EAAE9C,KAAKqE,QAAQrE,KAAK6B,IAAI/B,EAAEoC,EAAEK,GAAG,GAAGO,IAAI9C,KAAKS,SAASqC,EAAEe,MAAMlE,EAAE,CAAC,MAAMsD,EAAEnD,EAAE,GAAGoC,EAAE4B,SAAS,GAAGX,EAAErD,EAAE,GAAGoC,EAAE4B,SAAS,GAAGQ,EAAElC,EAAEmC,YAAYzE,EAAE,CAACoC,EAAE6B,OAAO,GAAGd,EAAEf,EAAE6B,OAAO,GAAGZ,GAAGtD,GAAGG,KAAKwE,OAAOF,EAAE,GAAGtE,KAAKyE,OAAOH,EAAE,GAAGtE,KAAK0E,aAAa1E,KAAK6B,IAAIK,EAAEtC,GAAGI,KAAKU,QAAQK,YAAYf,KAAK2E,aAAa3E,KAAK6B,IAAIK,EAAEpC,EAAEE,KAAKS,UAAUT,KAAK4E,YAAY5E,KAAK6B,IAAI,CAAC,OAAO7B,IAAI,CAAC,QAAA4D,CAASjE,GAAGK,KAAKS,SAAS,GAAGT,KAAKwE,OAAO,EAAExE,KAAKyE,OAAO,EAAE,MAAM7E,EAAEI,KAAK0C,QAAQ,EAAE7C,EAAE,CAACG,KAAKqD,EAAErD,KAAKsD,GAAGxD,EAAE,CAACqE,UAAUnE,KAAKU,QAAQC,MAAMyD,YAAYpE,KAAKU,QAAQE,UAAUC,UAAUb,KAAKU,QAAQG,WAAWa,EAAE1B,KAAK6E,YAAY7E,KAAK6B,IAAIhC,EAAED,EAAED,EAAEG,GAAG4B,IAAI1B,KAAKS,SAASiB,EAAEmC,MAAM,MAAM3B,EAAErC,EAAE,GAAGF,EAAEmE,SAAS,GAAGvB,EAAE1C,EAAE,GAAGF,EAAEmE,SAAS,GAAGhB,EAAEV,EAAEmC,YAAY1E,EAAE,CAACF,EAAEoE,OAAO,GAAG7B,EAAEvC,EAAEoE,OAAO,GAAGxB,GAAG3C,GAAG,OAAOI,KAAKwE,OAAO1B,EAAE,GAAG9C,KAAKyE,OAAO3B,EAAE,GAAG9C,KAAK0E,aAAa1E,KAAK6B,IAAIlC,EAAEK,KAAKU,QAAQI,iBAAiBd,KAAKU,QAAQK,YAAYf,KAAK2E,aAAa3E,KAAK6B,IAAIlC,EAAEE,EAAEG,KAAKS,UAAUT,KAAK4E,YAAY5E,KAAK6B,KAAK7B,IAAI,CAAC,SAAA8E,CAAUnF,EAAEC,EAAEC,EAAEC,EAAE4B,EAAEQ,EAAEK,EAAEO,EAAEG,GAAG,IAAItD,EAAuD,OAAO,MAAM2E,EAAEtE,KAAKyB,KAAKE,WAAWC,gBAAgBE,WAAW,MAAM9B,KAAK+E,cAAcT,EAAE1E,EAAEoF,OAAOpF,EAAED,EAAEE,EAAEC,EAAE4B,EAAEQ,EAAEK,EAAEO,EAAEG,EAAE,CAAC,aAAA8B,CAAcpF,EAAEC,EAAEC,EAAEC,EAAE4B,EAAEQ,EAAEK,EAAEO,EAAEG,EAAEE,EAAEmB,GAAG,MAAMW,EAAEpF,EAAEqF,QAAQC,EAAEF,EAAE,EAAE3B,EAAEzD,EAAEuF,UAAU,IAAIC,EAAE,EAAEhC,EAAE,EAAE,MAAMiC,EAAEL,EAAE,EAAE3B,EAAEiC,EAAE1F,EAAE2F,SAASC,EAAEF,EAAEG,OAAO,GAAG/F,EAAEgG,OAAO7C,IAAInD,EAAEiG,UAAU9F,EAAE+F,OAAOxC,EAAEvD,EAAE+F,OAAOvC,GAAG3D,EAAE+C,OAAOI,EAAEgD,KAAKC,GAAG,KAAKpG,EAAEiG,WAAW9F,EAAE+F,OAAOxC,GAAGvD,EAAE+F,OAAOvC,IAAI1D,IAAIyF,EAAEF,GAAGzD,GAAGA,EAAEgE,OAAO,EAAE,CAAC,MAAMM,EAAEpG,EAAEC,EAAEoG,SAAS,EAAEC,EAAEpG,EAAEgD,EAAEO,EAAEvD,EAAEyC,EAAEc,EAAEjB,EAAE+D,oBAAoBxG,EAAEG,EAAEyC,EAAEc,EAAEvD,EAAEyC,EAAEe,EAAE4C,EAAE,EAAE5C,EAAEgC,EAAErC,EAAEE,GAAGnD,KAAKoG,UAAUzG,EAAE,IAAIH,EAAEY,MAAMN,EAAEyC,EAAEc,EAAE2C,EAAE1C,EAAExD,EAAEyC,EAAEe,EAAE,IAAIgC,GAAG5D,EAAEQ,EAAEK,GAAG,IAAI8D,EAAE,EAAE,OAAOvG,EAAEwG,UAAU,KAAK,EAAE,KAAK,EAAE,KAAK,EAAED,GAAGf,EAAE,EAAE,MAAM,KAAK,EAAE,KAAK,EAAEe,EAAEf,EAAE,EAAQjC,EAAEgD,CAAC,CAAC,GAAGzG,EAAE,IAAI,IAAIoG,EAAE,EAAEA,EAAEP,EAAEO,IAAI,CAAC,MAAME,EAAE5C,EAAE6B,EAAEa,GAAGf,EAAE3B,GAAG,IAAI+C,EAAE,GAAG,OAAOd,EAAES,IAAI,IAAI,UAAUhG,KAAKuG,uBAAuB5G,EAAEG,EAAEyC,EAAEc,EAAE6C,EAAEpG,EAAEyC,EAAEe,EAAE,EAAE+B,EAAE,EAAEF,GAAG,MAAM,IAAI,iBAAiBnF,KAAKuG,uBAAuB5G,EAAEG,EAAEyC,EAAEc,EAAE6C,EAAEpG,EAAEyC,EAAEe,EAAE,EAAE+B,EAAE,EAAEF,GAAE,GAAI,MAAM,QAAQ,OAAOI,EAAES,IAAI,IAAI,YAAYK,EAAE,IAAI,MAAM,IAAI,QAAQA,EAAE,IAAI,MAAM,IAAI,SAASA,EAAE,IAASrG,KAAKwG,UAAU7G,EAAEG,EAAEyC,EAAEc,EAAE6C,EAAEpG,EAAEyC,EAAEe,EAAE,EAAE+B,EAAE,EAAEF,EAAEkB,GAAG,CAACrG,KAAKyG,UAAU9G,EAAE,IAAIH,EAAEY,MAAMN,EAAE+F,OAAOxC,EAAEvD,EAAE+F,OAAOvC,GAAG,IAAI9D,EAAEY,MAAMN,EAAEuD,EAAEA,EAAEvD,EAAEuD,EAAEC,EAAED,GAAGiB,GAAG3E,EAAE+G,SAAS,CAAC,SAAAF,CAAU7G,EAAEC,EAAEC,EAAEC,EAAE4B,GAAG,MAAMQ,EAAEyE,EAAEC,WAAWlF,GAAG/B,EAAEgG,OAAOhG,EAAEkH,YAAY,MAAMtE,EAAE5C,EAAEmH,qBAAqBlH,EAAEC,EAAEC,EAAE,EAAEA,EAAE,GAAGF,EAAEC,EAAEC,EAAE,EAAE,GAAGA,GAAGyC,EAAEwE,aAAa,GAAG,WAAWxE,EAAEwE,aAAa,EAAE,WAAWpH,EAAEqH,IAAIpH,EAAEC,EAAEC,EAAE,EAAE,KAAKH,EAAEwE,UAAU5B,EAAE5C,EAAEsH,OAAOtH,EAAEuH,YAAYvH,EAAE+G,UAAU/G,EAAEgG,OAAOhG,EAAEkH,YAAY,MAAM/D,EAAE,IAAIhD,EAAEH,EAAEwH,KAAK,QAAQrE,YAAYnD,EAAEwE,UAAU,OAAO,IAAIlB,EAAErD,EAAE,IAAIkD,EAAEZ,IAAIe,EAAErD,EAAE,GAAGkD,GAAGnD,EAAEyH,SAAS1F,EAAEuB,EAAEpD,EAAE,IAAIiD,GAAGnD,EAAEsH,OAAOtH,EAAEuH,YAAYvH,EAAE+G,SAAS,CAAC,sBAAAH,CAAuB5G,EAAEC,EAAEC,EAAEC,EAAE4B,GAAG/B,EAAEgG,OAAOhG,EAAEkH,YAAY,MAAM3E,EAAEvC,EAAEmH,qBAAqBlH,EAAEC,EAAEC,EAAE,EAAEA,EAAE,GAAGF,EAAEC,EAAEC,EAAE,EAAE,GAAGA,GAAGyC,EAAE,UAAUL,EAAE6E,aAAa,GAAGxE,GAAGL,EAAE6E,aAAa,EAAExE,GAAG5C,EAAEqH,IAAIpH,EAAEC,EAAEC,EAAE,EAAE,KAAKH,EAAEwE,UAAUjC,EAAEvC,EAAEsH,OAAOtH,EAAEuH,YAAYvH,EAAE+G,UAAU/G,EAAEgG,OAAOhG,EAAEkH,YAAY,MAAM/D,EAAE,CAAClD,EAAEE,EAAE,EAAED,EAAEC,EAAE,IAAImD,EAAE,CAACH,EAAE,GAAGA,EAAE,GAAGhD,EAAE,KAAKqD,EAAE,CAACL,EAAE,GAAGA,EAAE,IAAIG,EAAE,GAAGH,EAAE,IAAI,GAAGwB,EAAE,CAACnB,EAAE,GAAGrD,EAAE,EAAEqD,EAAE,IAAI8B,EAAE,CAACrF,EAAEC,GAAGsF,EAAE,CAACrC,EAAE,GAAGA,EAAE,GAAGhD,EAAE,GAAGwD,EAAE,CAACgB,EAAE,GAAGA,EAAE,GAAG,GAAGxE,GAAGuF,EAAE,CAACf,EAAE,GAAG,GAAGxE,EAAEmF,EAAE,IAAI5B,EAAE,CAACiB,EAAE,GAAGxE,EAAE,EAAEwE,EAAE,IAAI,GAAG3E,EAAE0H,OAAOvE,EAAE,GAAGA,EAAE,IAAInD,EAAE2H,OAAOxE,EAAE,GAAGA,EAAE,IAAInD,EAAE2H,OAAOrE,EAAE,GAAGA,EAAE,IAAItD,EAAE0H,OAAOlE,EAAE,GAAGA,EAAE,IAAIxD,EAAE2H,OAAOnE,EAAE,GAAGA,EAAE,IAAIxD,EAAE2H,OAAOhD,EAAE,GAAGA,EAAE,IAAI3E,EAAE2H,OAAOrC,EAAE,GAAGA,EAAE,IAAItF,EAAE0H,OAAOlC,EAAE,GAAGA,EAAE,IAAIxF,EAAE2H,OAAOnC,EAAE,GAAGA,EAAE,IAAIxF,EAAE2H,OAAOhE,EAAE,GAAGA,EAAE,IAAI3D,EAAE2H,OAAOjC,EAAE,GAAGA,EAAE,IAAI1F,EAAE2H,OAAOjE,EAAE,GAAGA,EAAE,IAAI1D,EAAE2H,OAAOnC,EAAE,GAAGA,EAAE,IAAIxF,EAAEyE,YAAY,OAAOzE,EAAEkB,UAAU,IAAIlB,EAAE4H,SAAS,QAAQ5H,EAAE6H,SAAS7H,EAAEuH,YAAYvH,EAAE+G,UAAUhF,EAAE,CAAC,MAAM4D,EAAE,CAACxC,EAAE,GAAG,EAAEA,EAAE,GAAG,GAAGyC,EAAE,CAACF,EAAE,GAAG,EAAEA,EAAE,GAAG,GAAG1F,EAAEgG,OAAOhG,EAAEkH,YAAYlH,EAAE0H,OAAO/B,EAAE,GAAGA,EAAE,IAAI3F,EAAE2H,OAAO/B,EAAE,GAAGA,EAAE,IAAI5F,EAAEyE,YAAY,OAAOzE,EAAEkB,UAAU,EAAElB,EAAE4H,SAAS,QAAQ5H,EAAE6H,SAAS7H,EAAEuH,YAAYvH,EAAE+G,SAAS,CAAC,CAAC,eAAAe,CAAgB9H,EAAEC,EAAEC,EAAEC,EAAE4B,EAAEQ,GAAG,IAAIY,EAAE,MAAMP,EAAE,IAAImF,MAAMnF,EAAEoF,OAAO,KAAKhI,EAAEgG,OAAOhG,EAAEiI,UAAUrF,EAAE1C,EAAE6B,EAAE,EAAE5B,EAAEoC,EAAE,EAAER,EAAEQ,GAAGvC,EAAE+G,WAAWnE,EAAEsF,IAAkC,OAA7B/E,EAAE9C,KAAKU,QAAQS,kBAAmB,EAAO2B,EAAElD,EAAE,CAAC,SAAAwG,CAAUzG,EAAEC,EAAEC,EAAEC,EAAE,UAAU4B,EAAE,kBAAkB/B,EAAEgG,OAAOhG,EAAEkH,YAAYlH,EAAEwH,KAAKzF,EAAE/B,EAAEwE,UAAUrE,EAAEH,EAAEyH,SAASvH,EAAED,EAAEyD,EAAEzD,EAAE0D,GAAG3D,EAAEsH,OAAOtH,EAAEuH,YAAYvH,EAAE+G,SAAS,CAAC,SAAAD,CAAU9G,EAAEC,EAAEC,EAAEC,EAAE,WAAWH,EAAEgG,OAAOhG,EAAEkH,YAAYlH,EAAE0H,OAAOzH,EAAEyD,EAAEzD,EAAE0D,GAAG3D,EAAE2H,OAAOzH,EAAEwD,EAAExD,EAAEyD,GAAG3D,EAAEyE,YAAYtE,EAAEH,EAAEkB,UAAU,EAAElB,EAAE4H,SAAS,QAAQ5H,EAAE6H,SAAS7H,EAAEuH,YAAYvH,EAAE+G,SAAS,CAAC,YAAAhC,CAAa/E,EAAEC,EAAEC,GAAG,IAAIC,EAAEF,EAAEqE,YAAY,GAAGvC,EAAE,EAAE,GAAY,SAAT9B,EAAEoD,OAAgBlD,EAAE,GAAG4B,EAAE,IAAI1B,KAAKO,MAAMqC,KAAK5C,KAAKO,MAAMqC,IAAI,EAAE,CAACjD,EAAEgG,OAAOhG,EAAEkH,YAAYlH,EAAE0H,OAAOrH,KAAKwE,OAAOxE,KAAKyE,QAAQ,MAAMvC,EAAEE,EAAEmC,YAAY,CAACvE,KAAKwE,OAAOxE,KAAKyE,QAAQ,CAACzE,KAAKwE,OAAOxE,KAAKyE,OAAO3E,GAAGE,KAAK0C,QAAQ,GAAG/C,EAAE2H,OAAOpF,EAAE,GAAGA,EAAE,IAAIlC,KAAKO,MAAMuH,KAAsB,IAAjB9H,KAAKO,MAAMuH,IAAQ,CAAC,MAAMvF,EAAEvC,KAAKO,MAAMuH,IAAI,EAAE,IAAI,GAAGnI,EAAE0H,OAAOnF,EAAE,GAAGA,EAAE,IAAI,MAAMY,EAAEV,EAAEmC,YAAY,CAACvE,KAAKwE,OAAOxE,KAAKyE,QAAQ,CAACzE,KAAKwE,OAAOxE,KAAKyE,OAAO3E,EAAE4B,GAAG1B,KAAK0C,QAAQO,EAAEb,EAAEmC,YAAYrC,EAAEY,EAAEP,GAAG5C,EAAE2H,OAAOrE,EAAE,GAAGA,EAAE,GAAG,CAACtD,EAAEyE,YAAYvE,EAAEF,EAAEkB,UAAU,EAAElB,EAAE4H,SAAS,QAAQ5H,EAAE6H,SAAS7H,EAAEuH,YAAYvH,EAAE+G,SAAS,CAAC,CAAC,YAAA/B,CAAahF,EAAEC,EAAEC,EAAEC,GAAGH,EAAEgG,OAAOhG,EAAEkH,YAAY,IAAInF,EAAE,EAAEQ,EAAE,EAAEK,EAAE,EAAEO,EAAE,EAAE,MAAMG,EAAEb,EAAE2F,mBAAmBjI,GAAGmD,GAAGA,EAAE+E,MAAMtG,EAAEuB,EAAE+E,IAAI3E,EAAEnB,EAAEe,EAAE+E,IAAI1E,GAAGL,GAAGA,EAAEgF,MAAM1F,EAAEU,EAAEgF,IAAI5E,EAAEP,EAAEG,EAAEgF,IAAI3E,GAAG1D,GAAY,UAATA,EAAEoD,OAAiBtB,EAAE7B,EAAE,GAAG,EAAEqC,EAAErC,EAAE,GAAG,EAAE0C,EAAE1C,EAAE,GAAG,EAAEiD,EAAEjD,EAAE,GAAG,GAAGF,EAAE0H,OAAO3F,EAAE,EAAEQ,EAAE,EAAE,GAAGvC,EAAE2H,OAAO5F,EAAE,EAAEQ,EAAE,GAAGvC,EAAE0H,OAAO3F,EAAE,EAAEQ,EAAE,GAAGvC,EAAE2H,OAAO5F,EAAE,EAAE,EAAEQ,EAAE,GAAGvC,EAAE0H,OAAO9E,EAAE,EAAE,EAAEL,EAAE,GAAGvC,EAAE2H,OAAO/E,EAAE,EAAEL,EAAE,GAAGvC,EAAE0H,OAAO9E,EAAE,EAAEL,EAAE,GAAGvC,EAAE2H,OAAO/E,EAAE,EAAEL,EAAE,EAAE,GAAGvC,EAAE0H,OAAO9E,EAAE,EAAEO,EAAE,EAAE,GAAGnD,EAAE2H,OAAO/E,EAAE,EAAEO,EAAE,GAAGnD,EAAE0H,OAAO9E,EAAE,EAAEO,EAAE,GAAGnD,EAAE2H,OAAO/E,EAAE,EAAE,EAAEO,EAAE,GAAGnD,EAAE0H,OAAO3F,EAAE,EAAE,EAAEoB,EAAE,GAAGnD,EAAE2H,OAAO5F,EAAE,EAAEoB,EAAE,GAAGnD,EAAE0H,OAAO3F,EAAE,EAAEoB,EAAE,GAAGnD,EAAE2H,OAAO5F,EAAE,EAAEoB,EAAE,EAAE,GAAGnD,EAAEuH,YAAYvH,EAAEyE,YAAY,MAAMzE,EAAEkB,UAAU,EAAElB,EAAE4H,SAAS,QAAQ5H,EAAE6H,SAAS7H,EAAE+G,SAAS,CAAC,WAAA9B,CAAYjF,GAAG,GAAGK,KAAKO,MAAM2H,QAAQlI,KAAKO,MAAM2H,OAAOxC,OAAO,EAAE,CAAC/F,EAAEgG,OAAOhG,EAAEuH,YAAYvH,EAAEkH,YAAY,MAAM5E,IAAIrC,EAAE2B,IAAI1B,GAAGG,KAAKO,MAAMe,YAAYxB,EAAEsC,EAAE+F,2BAA2B3I,EAAE4I,OAAOxI,EAAEC,EAAEG,KAAKO,MAAMiB,QAAQxB,KAAKyB,KAAK4G,QAAQrI,KAAKyB,MAAM9B,EAAE0H,OAAOrH,KAAKM,gBAAgB+C,EAAErD,KAAKM,gBAAgBgD,GAAG3D,EAAE2H,OAAOxH,EAAEuD,EAAEvD,EAAEwD,GAAG3D,EAAE0H,OAAOvH,EAAEuD,EAAEvD,EAAEwD,GAAG,IAAI,IAAI5B,EAAE1B,KAAKO,MAAM2H,OAAOxC,OAAO,EAAEhE,GAAG,EAAEA,IAAI,CAAC,MAAMQ,EAAEE,EAAE+F,2BAA2B,IAAIjI,EAAEF,KAAKO,MAAM2H,OAAOxG,GAAGO,IAAIjC,KAAKO,MAAM2H,OAAOxG,GAAGH,IAAIvB,KAAKO,MAAMiB,QAAQxB,KAAKyB,KAAK4G,QAAQrI,KAAKyB,MAAM9B,EAAE2H,OAAOpF,EAAEmB,EAAEnB,EAAEoB,GAAGtD,KAAKyB,KAAK6G,WAAW,IAAI3I,EAAEqH,IAAI9E,EAAEmB,EAAEnB,EAAEoB,EAAE,EAAE,EAAE,KAAK3D,EAAE0H,OAAOnF,EAAEmB,EAAEnB,EAAEoB,EAAE,CAAC3D,EAAEwE,UAAU,UAAUxE,EAAEsH,OAAOtH,EAAEyE,YAAY,UAAUzE,EAAEkB,UAAU,EAAElB,EAAE4H,SAAS,QAAQ5H,EAAE6H,SAAS7H,EAAEuH,YAAYvH,EAAE+G,SAAS,CAAC,CAAC,WAAA7B,CAAYlF,EAAEC,EAAEC,EAAEC,EAAE4B,GAAG,IAAI/B,IAAIC,IAAIE,EAAE,OAAO,MAAMyC,EAAE,CAAK4B,UAAU,UAAUC,YAAY,UAAUvD,UAAU,KAAMa,GAAG/B,EAAEgG,OAAOhG,EAAEkH,YAAY,MAAM/D,EAAElD,EAAE,GAAGE,EAAEgE,SAAS,GAAGb,EAAErD,EAAE,GAAGE,EAAEgE,SAAS,GAAGX,EAAE,CAACU,KAAK,GAAGC,SAASlE,GAAG0E,EAAElC,EAAEmC,YAAY3E,EAAE,CAACE,EAAE+D,KAAK,GAAG,GAAGf,EAAEhD,EAAE+D,KAAK,GAAG,GAAGZ,GAAGpD,GAAGF,EAAE0H,OAAO/C,EAAE,GAAGA,EAAE,IAAI,IAAI,IAAIW,EAAE,EAAEA,EAAEnF,EAAE+D,KAAK6B,OAAOT,IAAI,CAAC,MAAME,EAAErF,EAAE+D,KAAKoB,GAAG,GAAGnC,EAAEQ,EAAExD,EAAE+D,KAAKoB,GAAG,GAAGhC,EAAEoC,EAAEjD,EAAEmC,YAAY3E,EAAE,CAACuF,EAAE7B,GAAGzD,GAAGF,EAAE2H,OAAOjC,EAAE,GAAGA,EAAE,IAAIlC,EAAEU,KAAK0E,KAAKlD,EAAE,CAAC,OAAO9C,EAAE4B,YAAYxE,EAAEwE,UAAU5B,EAAE4B,UAAUxE,EAAEsH,QAAQ1E,EAAE6B,cAAczE,EAAEyE,YAAY7B,EAAE6B,YAAYzE,EAAEkB,UAAU0B,EAAE1B,UAAUlB,EAAE4H,SAAS,QAAQ5H,EAAE6I,QAAQ,QAAQ7I,EAAE6H,UAAU7H,EAAEuH,YAAYvH,EAAE+G,UAAUvD,CAAC,CAAC,OAAAkB,CAAQ1E,EAAEC,EAAEC,EAAEC,GAAG,IAAIH,IAAIC,IAAIC,EAAEqE,OAAO,OAAO,MAAMhC,EAAE,CAAKiC,UAAU,UAAUC,YAAY,UAAUvD,UAAU,KAAMf,GAAGH,EAAEgG,OAAOhG,EAAEkH,YAAY,MAAMtE,EAAE,GAAGO,EAAElD,EAAE,GAAGC,EAAEiE,SAAS,GAAGb,EAAErD,EAAE,GAAGC,EAAEiE,SAAS,GAAG,IAAI,IAAIQ,EAAE,EAAEA,EAAEzE,EAAEgE,KAAK6B,OAAOpB,IAAI,CAAC,MAAMW,EAAEpF,EAAEgE,KAAKS,GAAG,GAAGxB,EAAEqC,EAAEtF,EAAEgE,KAAKS,GAAG,GAAGrB,EAAEV,EAAEgG,KAAK,CAACtD,EAAEE,GAAG,CAAC,MAAMhC,EAAE,CAACU,KAAKtB,EAAEuB,SAASlE,GAAG,OAAOD,EAAEqH,IAAIpH,EAAE,GAAGA,EAAE,GAAGC,EAAEqE,OAAO,EAAE,KAAKhC,EAAEiC,YAAYxE,EAAEwE,UAAUjC,EAAEiC,UAAUxE,EAAEsH,QAAQ/E,EAAEkC,cAAczE,EAAEyE,YAAYlC,EAAEkC,YAAYzE,EAAEkB,UAAUqB,EAAErB,UAAUlB,EAAE4H,SAAS,QAAQ5H,EAAE6I,QAAQ,QAAQ7I,EAAE6H,UAAU7H,EAAEuH,YAAYvH,EAAE+G,UAAUvD,CAAC,EAAO,MAACsF,EAAE,CAACC,EAAEC,EAAEhJ,EAAEC,IAAI,IAAIL,EAAEmJ,EAAEC,EAAEhJ,EAAEC"}