{"version":3,"sources":["../src/index.ts","../src/HueIntegration.ts","../src/methods/connectBridge.ts","../src/methods/getBridgeInfo.ts","../src/methods/eventStream.ts","../src/methods/getTemperature.ts","../src/methods/getLightLevel.ts","../src/methods/getLights.ts","../src/methods/getLight.ts","../src/methods/getScenes.ts","../src/methods/setScene.ts","../src/methods/setLight.ts","../src/methods/setLightPower.ts","../src/methods/setLightColor.ts","../src/methods/setGradient.ts","../src/methods/setLightColorGradient.ts","../src/methods/getGroups.ts","../src/methods/setGroup.ts","../src/methods/setGroups.ts","../src/methods/getRooms.ts","../src/methods/turnoffAllLights.ts","../src/methods/turnOffAllLightsExceptPlugs.ts","../src/methods/getEntertainmentAreas.ts","../src/HueIntegrationV1.ts"],"sourcesContent":["export { HueIntegration } from \"./HueIntegration.js\";\r\nexport { HueIntegrationV1 } from \"./HueIntegrationV1.js\";","import axios from \"axios\";\r\nimport https from \"https\";\r\n\r\nimport { connectBridge } from \"./methods/connectBridge.js\";\r\nimport { getBridgeInfo } from \"./methods/getBridgeInfo.js\";\r\nimport { startEventStream } from \"./methods/eventStream.js\";\r\nimport { getTemperature } from \"./methods/getTemperature.js\";\r\nimport { getMLightLevel } from \"./methods/getLightLevel.js\";\r\nimport { getLights } from \"./methods/getLights.js\";\r\nimport { getLight } from \"./methods/getLight.js\";\r\nimport { getScenes } from \"./methods/getScenes.js\";\r\nimport { setScene } from \"./methods/setScene.js\";\r\nimport { setLight } from \"./methods/setLight.js\";\r\nimport { setLightPower } from \"./methods/setLightPower.js\";\r\nimport { setLightColor } from \"./methods/setLightColor.js\";\r\nimport { setGradient } from \"./methods/setGradient.js\";\r\nimport { setLightColorGradient } from \"./methods/setLightColorGradient.js\";\r\nimport { getGroups } from \"./methods/getGroups.js\";\r\nimport { setGroup } from \"./methods/setGroup.js\";\r\nimport { setGroups } from \"./methods/setGroups.js\";\r\nimport { getRooms } from \"./methods/getRooms.js\";\r\nimport { turnOffAllLights } from \"./methods/turnoffAllLights.js\";\r\nimport { turnOffAllLightsExceptPlugs } from \"./methods/turnOffAllLightsExceptPlugs.js\";\r\nimport { getEntertainmentAreas, EntertainmentArea } from \"./methods/getEntertainmentAreas.js\";\r\n\r\n// https://developers.meethue.com/develop/application-design-guidance/using-https/\r\nconst certificate = `-----BEGIN CERTIFICATE-----\r\nMIICMjCCAdigAwIBAgIUO7FSLbaxikuXAljzVaurLXWmFw4wCgYIKoZIzj0EAwIw\r\nOTELMAkGA1UEBhMCTkwxFDASBgNVBAoMC1BoaWxpcHMgSHVlMRQwEgYDVQQDDAty\r\nb290LWJyaWRnZTAiGA8yMDE3MDEwMTAwMDAwMFoYDzIwMzgwMTE5MDMxNDA3WjA5\r\nMQswCQYDVQQGEwJOTDEUMBIGA1UECgwLUGhpbGlwcyBIdWUxFDASBgNVBAMMC3Jv\r\nb3QtYnJpZGdlMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEjNw2tx2AplOf9x86\r\naTdvEcL1FU65QDxziKvBpW9XXSIcibAeQiKxegpq8Exbr9v6LBnYbna2VcaK0G22\r\njOKkTqOBuTCBtjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNV\r\nHQ4EFgQUZ2ONTFrDT6o8ItRnKfqWKnHFGmQwdAYDVR0jBG0wa4AUZ2ONTFrDT6o8\r\nItRnKfqWKnHFGmShPaQ7MDkxCzAJBgNVBAYTAk5MMRQwEgYDVQQKDAtQaGlsaXBz\r\nIEh1ZTEUMBIGA1UEAwwLcm9vdC1icmlkZ2WCFDuxUi22sYpLlwJY81Wrqy11phcO\r\nMAoGCCqGSM49BAMCA0gAMEUCIEBYYEOsa07TH7E5MJnGw557lVkORgit2Rm1h3B2\r\nsFgDAiEA1Fj/C3AN5psFMjo0//mrQebo0eKd3aWRx+pQY08mk48=\r\n-----END CERTIFICATE-----`;\r\n\r\nexport class HueIntegration {\r\n  private apiKey: string;\r\n  private bridgeIp: string;\r\n  private axiosInstance: any;\r\n  private eventSource?: { close: () => void };\r\n\r\n  constructor(apiKey: string, bridgeIp: string = \"192.168.1.105\") {\r\n    this.apiKey = apiKey;\r\n    this.bridgeIp = bridgeIp;\r\n\r\n    // Create an Axios instance with the provided certificate for secure communication\r\n    this.axiosInstance = axios.create({\r\n      baseURL: `https://${this.bridgeIp}/clip/v2/resource`,\r\n      httpsAgent: new https.Agent({\r\n        ca: certificate,\r\n        rejectUnauthorized: false,\r\n      }),\r\n      headers: {\r\n        \"hue-application-key\": this.apiKey,\r\n        \"Content-Type\": \"application/json\",\r\n      },\r\n    });\r\n  }\r\n\r\n  connectBridge(appName: string): Promise<any> {\r\n    return connectBridge(appName, this.bridgeIp);\r\n  }\r\n\r\n  async getBridgeInfo(): Promise<any> {\r\n    return await getBridgeInfo(this.axiosInstance);\r\n  }\r\n\r\n  async getTemperature(): Promise<any> {\r\n    return await getTemperature(this.axiosInstance);\r\n  }\r\n\r\n  async getMLightLevel(): Promise<any> {\r\n    return await getMLightLevel(this.axiosInstance);\r\n  }\r\n\r\n  // New getLight method\r\n  async getLight(lightId: string): Promise<any> {\r\n    return await getLight(this.axiosInstance, lightId);\r\n  }\r\n  \r\n  async getLights(): Promise<any> {\r\n    return await getLights(this.axiosInstance);\r\n  }\r\n\r\n  async getRooms(): Promise<any[]> {\r\n    return await getRooms(this.axiosInstance);\r\n  }\r\n\r\n  async getScenes(): Promise<any[]> {\r\n    return await getScenes(this.axiosInstance);\r\n  }\r\n\r\n  async setScene(sceneId: string): Promise<boolean> {\r\n    return await setScene(this.axiosInstance, sceneId);\r\n  }\r\n\r\n  async setLight(\r\n    lightId: string,\r\n    xyColor?: { x: number; y: number },\r\n    isOn?: boolean,\r\n    brightness?: number,\r\n    transition?: number\r\n  ): Promise<boolean> {\r\n    return await setLight(\r\n      this.axiosInstance,\r\n      lightId,\r\n      xyColor,\r\n      isOn,\r\n      brightness,\r\n      transition\r\n    );\r\n  }\r\n\r\n  async setGradient(\r\n    lightId: string,\r\n    gradientColors: { x: number; y: number }[],\r\n    isOn: boolean,\r\n    brightness: number,\r\n    transition: number\r\n  ): Promise<boolean> {\r\n    return await setGradient(\r\n      this.axiosInstance,\r\n      lightId,\r\n      gradientColors,\r\n      isOn,\r\n      brightness,\r\n      transition\r\n    );\r\n  }\r\n\r\n  async setLightPower(lightId: string, isOn: boolean): Promise<boolean> {\r\n    return await setLightPower(this.axiosInstance, lightId, isOn);\r\n  }\r\n\r\n  async setLightColorGradient(\r\n    lightId: string,\r\n    gradientColors: { x: number; y: number }[],\r\n    brightness: number,\r\n    transition: number\r\n  ): Promise<boolean> {\r\n    return await setLightColorGradient(\r\n      this.axiosInstance,\r\n      lightId,\r\n      gradientColors,\r\n      brightness,\r\n      transition\r\n    );\r\n  }\r\n\r\n  async setLightColor(\r\n    lightId: string,\r\n    xyColor?: { x: number; y: number },\r\n    brightness?: number,\r\n    transition?: number\r\n  ): Promise<boolean> {\r\n    return await setLightColor(this.axiosInstance, lightId, xyColor, brightness, transition);\r\n  }\r\n\r\n  async getGroups(): Promise<any[]> {\r\n    return await getGroups(this.axiosInstance);\r\n  }\r\n\r\n  async setGroups(\r\n    groupIds: string[],\r\n    brightness?: number,\r\n    xyColor?: { x: number; y: number },\r\n    isOn?: boolean\r\n  ): Promise<boolean> {\r\n    return await setGroups(\r\n      this.axiosInstance,\r\n      groupIds,\r\n      brightness,\r\n      xyColor,\r\n      isOn\r\n    );\r\n  }\r\n\r\n  async setGroup(\r\n    groupId: string,\r\n    brightness?: number,\r\n    xyColor?: { x: number; y: number },\r\n    isOn?: boolean\r\n  ): Promise<boolean> {\r\n    return await setGroup(\r\n      this.axiosInstance,\r\n      groupId,\r\n      brightness,\r\n      xyColor,\r\n      isOn\r\n    );\r\n  }\r\n\r\n  async turnOffAllLights(): Promise<boolean> {\r\n    return await turnOffAllLights(this.axiosInstance);\r\n  }\r\n  async turnOffAllLightsExceptPlugs(): Promise<boolean> {\r\n    return await turnOffAllLightsExceptPlugs(this.axiosInstance);\r\n  }\r\n\r\n  startEventStream(\r\n    onMessage: (data: any) => void,\r\n    onError?: (error: any) => void\r\n  ): void {\r\n    if (this.eventSource) {\r\n      console.warn(\"Event stream is already running.\");\r\n      return;\r\n    }\r\n\r\n    this.eventSource = startEventStream(\r\n      this.bridgeIp,\r\n      this.apiKey,\r\n      onMessage,\r\n      onError\r\n    );\r\n  }\r\n\r\n  stopEventStream(): void {\r\n    if (this.eventSource) {\r\n      this.eventSource.close();\r\n      this.eventSource = undefined;\r\n      console.log(\"🔌 Event stream stopped.\");\r\n    } else {\r\n      console.warn(\"No event stream to stop.\");\r\n    }\r\n  }\r\n\r\n\r\n  /**\r\n   * Retrieve all entertainment-area configurations.\r\n   */\r\n  async getEntertainmentAreas(): Promise<EntertainmentArea[]> {\r\n    return await getEntertainmentAreas(this.axiosInstance);\r\n  }\r\n}\r\n","import axios from \"axios\";\r\nimport https from \"https\";\r\n\r\nexport interface BridgeCredentials {\r\n  username: string;\r\n  clientkey: string;\r\n}\r\n\r\n/**\r\n * Register with the Hue Bridge and retrieve both the CLIP API username\r\n * and the Entertainment clientkey in one request.\r\n *\r\n * @param appName – your app identifier, e.g. \"my-hue-app\"\r\n * @param bridgeIp – the Hue Bridge’s LAN IP\r\n * @returns an object containing { username, clientkey }\r\n */\r\nexport async function connectBridge(\r\n  appName: string,\r\n  bridgeIp: string\r\n): Promise<BridgeCredentials> {\r\n  console.log(`Press the button on your Hue Bridge to proceed...`);\r\n\r\n  const maxRetries = 30;\r\n  let retries = 0;\r\n\r\n  while (retries < maxRetries) {\r\n    try {\r\n      const response = await axios.post(\r\n        `https://${bridgeIp}/api`,\r\n        {\r\n          devicetype: appName || \"my-hue-app\",\r\n          generateclientkey: true\r\n        },\r\n        {\r\n          httpsAgent: new https.Agent({ rejectUnauthorized: false })\r\n        }\r\n      );\r\n\r\n      console.log(\"🔍 Full response from Hue Bridge:\", response.data);\r\n      const entry = response.data[0];\r\n\r\n      if (entry?.success) {\r\n        const { username, clientkey } = entry.success;\r\n        console.log(`✅ Registered username: ${username}`);\r\n        console.log(`✅ Received clientkey: ${clientkey}`);\r\n        return { username, clientkey };\r\n      }\r\n\r\n      if (entry?.error?.type === 101) {\r\n        console.log(` Waiting for button press... (${retries + 1}/${maxRetries})`);\r\n        retries++;\r\n        await new Promise((res) => setTimeout(res, 2000));\r\n        continue;\r\n      }\r\n\r\n      throw new Error(`Unexpected response: ${JSON.stringify(entry)}`);\r\n    } catch (err: any) {\r\n      console.error(\"Request failed:\", err.message);\r\n      throw err;\r\n    }\r\n  }\r\n\r\n  throw new Error(\"❌ Failed to register after 30 attempts.\");\r\n}","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function getBridgeInfo(axiosInstance: AxiosInstance): Promise<any> {\r\n  try {\r\n    // Fetch Bridge Info\r\n    const response = await axiosInstance.get(\"/bridge\");\r\n    const bridgeData = response.data.data[0];\r\n\r\n    if (!bridgeData) {\r\n      console.log(\" No bridge information found.\");\r\n      return null;\r\n    }\r\n\r\n    // Structure the bridge info\r\n    const bridgeInfo = {\r\n      bridgeId: bridgeData?.bridge_id || \"N/A\",\r\n      modelId: bridgeData?.model_id || \"N/A\",\r\n      apiVersion: bridgeData?.apiversion || \"N/A\",\r\n    };\r\n\r\n    console.log(\" Successfully connected to Hue Bridge!\");\r\n    console.log(\" Bridge ID:\", bridgeInfo.bridgeId);\r\n    console.log(\" Model:\", bridgeInfo.modelId);\r\n    console.log(\" Firmware Version:\", bridgeInfo.apiVersion);\r\n\r\n    return bridgeInfo;\r\n  } catch (err: any) {\r\n    console.error(\" Failed to retrieve bridge info:\", err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", err.response.data);\r\n    }\r\n    return null;\r\n  }\r\n}\r\n","import https from \"https\";\r\n\r\nexport const startEventStream = (\r\n  bridgeIp: string,\r\n  apiKey: string,\r\n  onMessage: (data: any) => void,\r\n  onError?: (error: any) => void\r\n): { close: () => void } => {\r\n  const url = `/eventstream/clip/v2`;\r\n\r\n  console.log(`Connecting to EventStream at https://${bridgeIp}${url}...`);\r\n\r\n  let isClosed = false;\r\n  let buffer = \"\";\r\n\r\n  // HTTPS request options\r\n  const options = {\r\n    hostname: bridgeIp,\r\n    path: url,\r\n    method: \"GET\",\r\n    headers: {\r\n      \"hue-application-key\": apiKey,\r\n      \"Accept\": \"text/event-stream\",\r\n      \"Cache-Control\": \"no-cache\",\r\n      \"Connection\": \"keep-alive\",\r\n    },\r\n    rejectUnauthorized: false, // Ignore self-signed certificates\r\n  };\r\n\r\n  const req = https.request(options, (res) => {\r\n    console.log(\"EventStream connected successfully.\");\r\n\r\n    res.on(\"data\", (chunk: Buffer) => {\r\n      if (isClosed) return;\r\n\r\n      // Append incoming data to buffer\r\n      buffer += chunk.toString();\r\n\r\n      // Split buffer by newline (SSE messages are newline-separated)\r\n      const lines = buffer.split(\"\\n\");\r\n\r\n      let eventType = \"unknown\"; // Store `event:` value\r\n      let eventId = \"unknown\"; // Store `id:` value\r\n\r\n      for (const line of lines) {\r\n        const trimmedLine = line.trim();\r\n\r\n        if (trimmedLine.startsWith(\"event:\")) {\r\n          eventType = trimmedLine.replace(\"event:\", \"\").trim();\r\n        }\r\n\r\n        if (trimmedLine.startsWith(\"id:\")) {\r\n          eventId = trimmedLine.replace(\"id:\", \"\").trim();\r\n        }\r\n\r\n        if (trimmedLine.startsWith(\"data:\")) {\r\n          const jsonString = trimmedLine.replace(\"data:\", \"\").trim();\r\n\r\n          try {\r\n            const parsedData = JSON.parse(jsonString);\r\n\r\n            // Handle **multiple** events in a single batch properly\r\n            if (Array.isArray(parsedData)) {\r\n              parsedData.forEach((event) => {\r\n                onMessage({ eventType, eventId, event });\r\n              });\r\n            } else {\r\n              onMessage({ eventType, eventId, parsedData });\r\n            }\r\n          } catch (err) {\r\n            console.error(\"Error parsing event data:\", err);\r\n          }\r\n        }\r\n      }\r\n\r\n      // Keep last partial event in buffer\r\n      buffer = lines[lines.length - 1];\r\n    });\r\n\r\n    res.on(\"end\", () => {\r\n      console.log(\"🔌 EventStream ended. Reconnecting...\");\r\n      if (!isClosed) {\r\n        setTimeout(() => startEventStream(bridgeIp, apiKey, onMessage, onError), 2000);\r\n      }\r\n    });\r\n\r\n    res.on(\"error\", (error: any) => {\r\n      console.error(\" Error in EventStream:\", error);\r\n      if (onError) onError(error);\r\n    });\r\n  });\r\n\r\n  req.on(\"error\", (error) => {\r\n    console.error(\"Failed to connect to EventStream:\", error);\r\n    if (onError) onError(error);\r\n\r\n    // Retry connection\r\n    if (!isClosed) {\r\n      setTimeout(() => startEventStream(bridgeIp, apiKey, onMessage, onError), 2000);\r\n    }\r\n  });\r\n\r\n  req.end();\r\n\r\n  // Return object with a `close` method\r\n  return {\r\n    close: () => {\r\n      isClosed = true;\r\n      req.destroy();\r\n      console.log(\"🔌 EventStream connection closed.\");\r\n    },\r\n  };\r\n};\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function getTemperature(axiosInstance: AxiosInstance): Promise<any[]> {\r\n  try {\r\n    // Step 1: Fetch all devices to get their names\r\n    const devicesResponse = await axiosInstance.get(\"/device\");\r\n    const devices = devicesResponse.data.data;\r\n\r\n    // Create a mapping of device IDs to their names\r\n    const deviceMap: Record<string, string> = {};\r\n    devices.forEach((device: any) => {\r\n      deviceMap[device.id] = device.metadata?.name || \"Unnamed Device\";\r\n    });\r\n\r\n    // Step 2: Fetch all temperature sensors\r\n    const response = await axiosInstance.get(\"/temperature\");\r\n    const sensors = response.data.data;\r\n\r\n    if (!sensors || sensors.length === 0) {\r\n      console.log(\" No temperature sensors found on the Hue Bridge.\");\r\n      return [];\r\n    }\r\n\r\n    console.log(` Found ${sensors.length} temperature sensor(s):`);\r\n\r\n    // Build and return structured data\r\n    const sensorData = sensors.map((sensor: any, index: number) => {\r\n      const deviceName = deviceMap[sensor.owner?.rid] || \"Unknown Device\";\r\n\r\n      const sensorObj = {\r\n        id: sensor.id || \"N/A\",\r\n        deviceName,\r\n        temperature: sensor.temperature?.temperature ?? \"N/A\",\r\n      };\r\n\r\n      console.log(` Sensor ${index + 1}:`);\r\n      console.log(\"ID:\", sensorObj.id);\r\n      console.log(\"Device Name:\", sensorObj.deviceName);\r\n      console.log(\" Temperature:\", sensorObj.temperature, \"°C\");\r\n      console.log(\"---------------------------------------------------\");\r\n\r\n      return sensorObj;\r\n    });\r\n\r\n    return sensorData;\r\n  } catch (err: any) {\r\n    console.error(\"Failed to retrieve temperature sensors:\", err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", err.response.data);\r\n    }\r\n    return [];\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function getMLightLevel(axiosInstance: AxiosInstance): Promise<any[]> {\r\n  try {\r\n    // Step 1: Fetch all devices to get their names\r\n    const devicesResponse = await axiosInstance.get(\"/device\");\r\n    const devices = devicesResponse.data.data;\r\n\r\n    // Create a mapping of device IDs to their names\r\n    const deviceMap: Record<string, string> = {};\r\n    devices.forEach((device: any) => {\r\n      deviceMap[device.id] = device.metadata?.name || \"Unnamed Device\";\r\n    });\r\n\r\n    // Step 2: Fetch all light level sensors\r\n    const response = await axiosInstance.get(\"/light_level\");\r\n    const sensors = response.data.data;\r\n\r\n    if (!sensors || sensors.length === 0) {\r\n      console.log(\"No light level sensors found on the Hue Bridge.\");\r\n      return [];\r\n    }\r\n\r\n    console.log(`🔆 Found ${sensors.length} light level sensor(s):`);\r\n\r\n    // Build and return structured data\r\n    const sensorData = sensors.map((sensor: any, index: number) => {\r\n      const deviceName = deviceMap[sensor.owner?.rid] || \"Unknown Device\";\r\n\r\n      const sensorObj = {\r\n        id: sensor.id || \"N/A\",\r\n        deviceName,\r\n        lightLevel: sensor.light?.light_level ?? \"N/A\",\r\n      };\r\n\r\n      console.log(`Sensor ${index + 1}:`);\r\n      console.log(\"ID:\", sensorObj.id);\r\n      console.log(\"Device Name:\", sensorObj.deviceName);\r\n      console.log(\"Light Level:\", sensorObj.lightLevel, \"lx\");\r\n      console.log(\"---------------------------------------------------\");\r\n\r\n      return sensorObj;\r\n    });\r\n\r\n    return sensorData;\r\n  } catch (err: any) {\r\n    console.error(\" Failed to retrieve light level sensors:\", err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", err.response.data);\r\n    }\r\n    return [];\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function getLights(axiosInstance: AxiosInstance): Promise<any[]> {\r\n  try {\r\n    // Fetch all lights\r\n    const response = await axiosInstance.get(\"/light\");\r\n    const lights = response.data.data;\r\n\r\n    if (!lights || lights.length === 0) {\r\n      console.log(\"No lights found on the Hue Bridge.\");\r\n      return [];\r\n    }\r\n\r\n    //console.log(`Found ${lights.length} light(s) on the Hue Bridge:`);\r\n\r\n    // Build structured data\r\n    const lightData = lights.map((light: any, index: number) => {\r\n      const lightObj = {\r\n        id: light.id || \"N/A\",\r\n        name: light.metadata?.name || \"Unnamed Light\",\r\n        type: light.type || \"Unknown Type\",\r\n        isOn: light?.on?.on ? true : false,\r\n        brightness: light?.dimming?.brightness || \"N/A\",\r\n        xyColor: light.color?.xy ? { x: light.color.xy.x, y: light.color.xy.y } : null,\r\n      };\r\n\r\n/*       console.log(`Light ${index + 1}:`);\r\n      console.log(\"ID:\", lightObj.id);\r\n      console.log(\"Name:\", lightObj.name);\r\n      console.log(\"Type:\", lightObj.type);\r\n      console.log(\"On:\", lightObj.isOn ? \"Yes\" : \"No\");\r\n      console.log(\"Brightness:\", lightObj.brightness); */\r\n\r\n/*       if (lightObj.xyColor) {\r\n        console.log(\"XY Color:\", `(${lightObj.xyColor.x}, ${lightObj.xyColor.y})`);\r\n      } */\r\n\r\n      //ANCHOR - console.log(\"---------------------------------------------------\");\r\n\r\n      return lightObj;\r\n    });\r\n\r\n    return lightData;\r\n  } catch (err: any) {\r\n    console.error(\"Failed to retrieve lights:\", err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", err.response.data);\r\n    }\r\n    return [];\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function getLight(axiosInstance: AxiosInstance, lightId: string): Promise<any | null> {\r\n  try {\r\n    // Fetch a specific light by its ID.\r\n    const response = await axiosInstance.get(`/light/${lightId}`);\r\n    const light = response.data.data;\r\n    if (!light) {\r\n      console.log(`Light ${lightId} not found on the Hue Bridge.`);\r\n      return null;\r\n    }\r\n    // Build structured data for the specific light.\r\n    const lightObj = {\r\n      id: light.id || \"N/A\",\r\n      name: light.metadata?.name || \"Unnamed Light\",\r\n      type: light.type || \"Unknown Type\",\r\n      isOn: light?.on?.on ? true : false,\r\n      brightness: light?.dimming?.brightness || \"N/A\",\r\n      xyColor: light.color?.xy ? { x: light.color.xy.x, y: light.color.xy.y } : null,\r\n    };\r\n    return lightObj;\r\n  } catch (err: any) {\r\n    console.error(`Failed to retrieve light ${lightId}:`, err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", err.response.data);\r\n    }\r\n    return null;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function getScenes(axiosInstance: AxiosInstance): Promise<any[]> {\r\n  try {\r\n    // Fetch all scenes\r\n    const response = await axiosInstance.get(\"/scene\");\r\n    const scenes = response.data.data;\r\n\r\n    if (!scenes || scenes.length === 0) {\r\n      console.log(\" No scenes found on the Hue Bridge.\");\r\n      return [];\r\n    }\r\n\r\n    console.log(` Found ${scenes.length} scene(s) on the Hue Bridge:`);\r\n\r\n    // Build structured data\r\n    const sceneData = scenes.map((scene: any, index: number) => {\r\n      const sceneObj = {\r\n        id: scene.id || \"N/A\",\r\n        name: scene.metadata?.name || \"Unnamed Scene\",\r\n        type: scene.type || \"Unknown Type\",\r\n        group: scene.group?.rid || \"N/A\",\r\n      };\r\n\r\n      console.log(`Scene ${index + 1}:`);\r\n      console.log(\" ID:\", sceneObj.id);\r\n      console.log(\" Name:\", sceneObj.name);\r\n      console.log(\" Type:\", sceneObj.type);\r\n      console.log(\" Group ID:\", sceneObj.group);\r\n      console.log(\"---------------------------------------------------\");\r\n\r\n      return sceneObj;\r\n    });\r\n\r\n    return sceneData;\r\n  } catch (err: any) {\r\n    console.error(\" Failed to retrieve scenes:\", err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", err.response.data);\r\n    }\r\n    return [];\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function setScene(axiosInstance: AxiosInstance, sceneId: string): Promise<boolean> {\r\n  try {\r\n    console.log(` Attempting to activate Scene: ${sceneId}`);\r\n    console.log(` Checking if Scene exists...`);\r\n\r\n    // Step 1: Verify the Scene Exists\r\n    const sceneResponse = await axiosInstance.get(\"/scene\");\r\n    const scenes = sceneResponse.data.data;\r\n\r\n    if (!scenes || scenes.length === 0) {\r\n      console.error(\"❌ No scenes found on the Hue Bridge.\");\r\n      return false;\r\n    }\r\n\r\n    const scene = scenes.find((s: any) => s.id === sceneId);\r\n\r\n    if (!scene) {\r\n      console.error(` Scene ID ${sceneId} not found.`);\r\n      console.log(\" Available Scenes:\");\r\n      scenes.forEach((s: any) => console.log(`  - ${s.id}: ${s.metadata?.name}`));\r\n      return false;\r\n    }\r\n\r\n    console.log(` Scene Found: ${scene.metadata?.name}`);\r\n\r\n    // Step 2: Activate the Scene (Correct API Call from cURL Example)\r\n    console.log(` Sending request to activate Scene: ${sceneId} using PUT /scene/{sceneId}...`);\r\n    \r\n    const response = await axiosInstance.put(`/scene/${sceneId}`, {\r\n      recall: { action: \"active\" }\r\n    });\r\n\r\n    if (response.status === 200) {\r\n      console.log(` Scene Activated: ${sceneId} `);\r\n      return true;\r\n    } else {\r\n      console.warn(` Unexpected response status: ${response.status}`);\r\n      return false;\r\n    }\r\n  } catch (err: any) {\r\n    console.error(` Failed to activate scene (${sceneId}):`, err.message);\r\n    if (err.response) {\r\n      console.error(\"📜 Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n  return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\n\r\n/**\r\n * @deprecated Use `setLightPower` and `setLightColor` instead.\r\n * \r\n * Warning: Setting color and on/off state together while the light is off might not always work.\r\n * Turning on the light first and then changing its color is recommended.\r\n */\r\nexport async function setLight(\r\n  axiosInstance: AxiosInstance,\r\n  lightId: string,\r\n  xyColor?: { x: number; y: number }, // Optional XY color\r\n  isOn?: boolean,                    // Optional On/Off state\r\n  brightness?: number,               // Optional brightness (0-100)\r\n  transition?: number                // Optional transition time (verify if in ms or seconds)\r\n): Promise<boolean> {\r\n  try {\r\n    const requestBody: any = {};\r\n\r\n    // If isOn is defined, handle it separately\r\n    if (isOn !== undefined) {\r\n      requestBody.on = { on: isOn };\r\n\r\n      if (isOn) {\r\n        // When turning on, include brightness, color, and dynamics if provided\r\n        if (brightness !== undefined) {\r\n          // Optionally, ensure brightness is an integer if required by the API\r\n          requestBody.dimming = { brightness };\r\n        }\r\n        if (xyColor) {\r\n          requestBody.color = { xy: { x: xyColor.x, y: xyColor.y } };\r\n        }\r\n        if (transition && transition > 0) {\r\n          // If the API expects seconds, convert to the proper unit here\r\n          requestBody.dynamics = { duration: transition };\r\n        }\r\n      }\r\n      // When turning off, we intentionally omit brightness/color/dynamics to avoid conflicts\r\n    } else {\r\n      // If isOn is not specified, update other parameters if provided\r\n      if (brightness !== undefined) {\r\n        requestBody.dimming = { brightness };\r\n      }\r\n      if (xyColor) {\r\n        requestBody.color = { xy: { x: xyColor.x, y: xyColor.y } };\r\n      }\r\n      if (transition && transition > 0) {\r\n        requestBody.dynamics = { duration: transition };\r\n      }\r\n    }\r\n\r\n    if (Object.keys(requestBody).length === 0) {\r\n      console.error(\"No values provided for update!\");\r\n      return false;\r\n    }\r\n\r\n    const response = await axiosInstance.put(`/light/${lightId}`, requestBody);\r\n\r\n    if (response.status === 200) {\r\n      return true;\r\n    } else {\r\n      console.warn(`Unexpected response status: ${response.status}`);\r\n      return false;\r\n    }\r\n  } catch (err: any) {\r\n    console.error(`Failed to update light (${lightId}):`, err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function setLightPower(\r\n  axiosInstance: AxiosInstance,\r\n  lightId: string,\r\n  isOn: boolean\r\n): Promise<boolean> {\r\n  try {\r\n    const requestBody = {\r\n      on: { on: isOn }\r\n    };\r\n\r\n    const response = await axiosInstance.put(`/light/${lightId}`, requestBody);\r\n\r\n    if (response.status === 200) {\r\n      return true;\r\n    } else {\r\n      console.warn(`Unexpected response status: ${response.status}`);\r\n      return false;\r\n    }\r\n  } catch (err: any) {\r\n    console.error(`Failed to update light power (${lightId}):`, err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function setLightColor(\r\n  axiosInstance: AxiosInstance,\r\n  lightId: string,\r\n  xyColor?: { x: number; y: number },\r\n  brightness?: number,\r\n  transition?: number\r\n): Promise<boolean> {\r\n  try {\r\n    const requestBody: any = {};\r\n\r\n    if (brightness !== undefined) {\r\n      requestBody.dimming = { brightness };\r\n    }\r\n    if (xyColor) {\r\n      requestBody.color = { xy: { x: xyColor.x, y: xyColor.y } };\r\n    }\r\n    if (transition && transition > 0) {\r\n      requestBody.dynamics = { duration: transition };\r\n    }\r\n\r\n    if (Object.keys(requestBody).length === 0) {\r\n      console.error(\"No color values provided for update!\");\r\n      return false;\r\n    }\r\n\r\n    const response = await axiosInstance.put(`/light/${lightId}`, requestBody);\r\n\r\n    if (response.status === 200) {\r\n      return true;\r\n    } else {\r\n      console.warn(`Unexpected response status: ${response.status}`);\r\n      return false;\r\n    }\r\n  } catch (err: any) {\r\n    console.error(`Failed to update light color (${lightId}):`, err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\n\r\n/**\r\n * @deprecated Use `setLightColorGradient` instead.\r\n *\r\n * Sets the gradient on a light.\r\n * Note: The current implementation sends the on/off command along with the gradient settings.\r\n * It's recommended to separate power state updates from color/gradient updates.\r\n *\r\n * @param axiosInstance - Axios instance to use for HTTP requests.\r\n * @param lightId - ID of the light to update.\r\n * @param gradientColors - Array of XY color points (requires between 2 and 5 points).\r\n * @param isOn - The power state of the light.\r\n * @param brightness - The brightness value.\r\n * @param transition - Transition time.\r\n * @returns A promise that resolves to a boolean indicating success.\r\n */\r\nexport async function setGradient(\r\n  axiosInstance: AxiosInstance,\r\n  lightId: string,\r\n  gradientColors: { x: number; y: number }[], // Array of XY color points\r\n  isOn: boolean, // Default ON\r\n  brightness: number, // Default brightness\r\n  transition: number\r\n): Promise<boolean> {\r\n  try {\r\n\r\n    if (!gradientColors || gradientColors.length < 2 || gradientColors.length > 7) {\r\n      console.error(\"Gradient requires between 2 and 7 color points.\");\r\n      return false;\r\n    }\r\n\r\n    //console.log(`Gradient Points: ${gradientColors.length}`);\r\n    gradientColors.forEach((color, index) => {\r\n      console.log(`🎨 Point ${index + 1}: (${color.x}, ${color.y})`);\r\n    });\r\n\r\n    \r\n    // Convert transition time from seconds to milliseconds if provided and greater than 0.\r\n    let duration: number | undefined;\r\n    if (transition && transition > 0) {\r\n      duration = transition;\r\n    }\r\n\r\n    // Build request payload with dynamics.duration instead of a top-level transition property.\r\n    const requestBody: any = {\r\n      gradient: {\r\n        points: gradientColors.map((xy) => ({\r\n          color: { xy }\r\n        }))\r\n      },\r\n      on: { on: isOn },\r\n      dimming: { brightness },\r\n      dynamics: duration ? { duration } : {}\r\n    };\r\n\r\n    const response = await axiosInstance.put(`/light/${lightId}`, requestBody);\r\n\r\n    if (response.status === 200) {\r\n      console.log(`Gradient Applied to Light: ${lightId}`);\r\n      return true;\r\n    } else {\r\n      console.warn(`Unexpected response status: ${response.status}`);\r\n      return false;\r\n    }\r\n  } catch (err: any) {\r\n    console.error(`Failed to set gradient on light (${lightId}):`, err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function setLightColorGradient(\r\n  axiosInstance: AxiosInstance,\r\n  lightId: string,\r\n  gradientColors: { x: number; y: number }[], // Array of XY color points\r\n  brightness: number, // Brightness value\r\n  transition: number  // Transition time\r\n): Promise<boolean> {\r\n  try {\r\n    if (!gradientColors || gradientColors.length < 2 || gradientColors.length > 5) {\r\n      console.error(\"Gradient requires between 2 and 5 color points.\");\r\n      return false;\r\n    }\r\n\r\n    gradientColors.forEach((color, index) => {\r\n      console.log(`🎨 Point ${index + 1}: (${color.x}, ${color.y})`);\r\n    });\r\n\r\n    // Use transition time if provided and greater than 0.\r\n    let duration: number | undefined;\r\n    if (transition && transition > 0) {\r\n      duration = transition;\r\n    }\r\n\r\n    // Build request payload without the power state.\r\n    const requestBody: any = {\r\n      gradient: {\r\n        points: gradientColors.map((xy) => ({\r\n          color: { xy }\r\n        }))\r\n      },\r\n      dimming: { brightness },\r\n      dynamics: duration ? { duration } : {}\r\n    };\r\n\r\n    const response = await axiosInstance.put(`/light/${lightId}`, requestBody);\r\n\r\n    if (response.status === 200) {\r\n      console.log(`Gradient Applied to Light: ${lightId}`);\r\n      return true;\r\n    } else {\r\n      console.warn(`Unexpected response status: ${response.status}`);\r\n      return false;\r\n    }\r\n  } catch (err: any) {\r\n    console.error(`Failed to set gradient on light (${lightId}):`, err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function getGroups(axiosInstance: AxiosInstance): Promise<any[]> {\r\n  try {\r\n    console.log(\" Fetching all `grouped_light` groups...\");\r\n    \r\n    // Fetch grouped lights\r\n    const groupResponse = await axiosInstance.get(\"/grouped_light\");\r\n    const groups = groupResponse.data.data;\r\n\r\n    if (!groups || groups.length === 0) {\r\n      console.log(\" No groups (`grouped_light`) found on the Hue Bridge.\");\r\n      return [];\r\n    }\r\n\r\n    console.log(\"🔎 Fetching all rooms...\");\r\n    \r\n    // Fetch rooms to map groups to their parent rooms\r\n    const roomResponse = await axiosInstance.get(\"/room\");\r\n    const rooms = roomResponse.data.data;\r\n\r\n    // Create a mapping of grouped_light IDs to room names\r\n    const groupToRoomMap: Record<string, string> = {};\r\n    rooms.forEach((room: any) => {\r\n      const groupedLightService = room.services.find((s: any) => s.rtype === \"grouped_light\");\r\n      if (groupedLightService) {\r\n        groupToRoomMap[groupedLightService.rid] = room.metadata?.name || \"Unnamed Room\";\r\n      }\r\n    });\r\n\r\n    console.log(`Found ${groups.length} \\`grouped_light\\` group(s):`);\r\n\r\n    // Build structured data\r\n    const groupData = groups.map((group: any, index: number) => {\r\n      const roomName = groupToRoomMap[group.id] || \"No Linked Room\";\r\n      const groupObj = {\r\n        id: group.id || \"N/A\",\r\n        name: group.metadata?.name || roomName || \"Unnamed Group\",\r\n        type: group.type || \"Unknown Type\",\r\n        services: group.services?.map((s: any) => s.rtype).join(\", \") || \"N/A\",\r\n        linkedRoom: roomName,\r\n      };\r\n\r\n      console.log(`Group ${index + 1}:`);\r\n      console.log(\" ID:\", groupObj.id);\r\n      console.log(\"Name:\", groupObj.name);\r\n      console.log(\"Type:\", groupObj.type);\r\n      console.log(\" Linked Room:\", groupObj.linkedRoom);\r\n      console.log(\" Services:\", groupObj.services);\r\n      console.log(\"---------------------------------------------------\");\r\n\r\n      return groupObj;\r\n    });\r\n\r\n    return groupData;\r\n  } catch (err: any) {\r\n    console.error(\" Failed to retrieve groups:\", err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", err.response.data);\r\n    }\r\n    return [];\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function setGroup(\r\n  axiosInstance: AxiosInstance,\r\n  groupId: string,\r\n  brightness?: number,  // Optional brightness (0-100)\r\n  xyColor?: { x: number; y: number },  // Optional XY color\r\n  isOn?: boolean // Optional On/Off state\r\n): Promise<boolean> {\r\n  try {\r\n    console.log(`Setting Grouped Light: ${groupId}`);\r\n    \r\n    // Build request payload dynamically based on provided values\r\n    const requestBody: any = {};\r\n\r\n    if (brightness !== undefined) {\r\n      requestBody.dimming = { brightness };\r\n      console.log(`Brightness: ${brightness}%`);\r\n    }\r\n\r\n    if (xyColor) {\r\n      requestBody.color = { xy: { x: xyColor.x, y: xyColor.y } };\r\n      console.log(`Color XY: (${xyColor.x}, ${xyColor.y})`);\r\n    }\r\n\r\n    if (isOn !== undefined) {\r\n      requestBody.on = { on: isOn };\r\n      console.log(`Group Light State: ${isOn ? \"ON\" : \"OFF\"}`);\r\n    }\r\n\r\n    if (Object.keys(requestBody).length === 0) {\r\n      console.error(\" No values provided for update!\");\r\n      return false;\r\n    }\r\n\r\n    console.log(\"Sending request to update grouped light...\");\r\n    const response = await axiosInstance.put(`/grouped_light/${groupId}`, requestBody);\r\n\r\n    if (response.status === 200) {\r\n      console.log(`Grouped Light Updated: ${groupId}`);\r\n      return true;\r\n    } else {\r\n      console.warn(` Unexpected response status: ${response.status}`);\r\n      return false;\r\n    }\r\n  } catch (err: any) {\r\n    console.error(`Failed to update grouped light (${groupId}):`, err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\nimport { setGroup } from \"./setGroup.js\";\r\n\r\nexport async function setGroups(\r\n  axiosInstance: AxiosInstance,\r\n  groupIds: string[], // Array of group IDs\r\n  brightness?: number, // Optional brightness (0-100)\r\n  xyColor?: { x: number; y: number }, // Optional XY color\r\n  isOn?: boolean // Optional On/Off state\r\n): Promise<boolean> {\r\n  try {\r\n    console.log(`Setting multiple groups (${groupIds.length} groups)...`);\r\n\r\n    // Track the status of all updates\r\n    const results = await Promise.all(\r\n      groupIds.map(async (groupId) => {\r\n        console.log(`🔧 Updating Group: ${groupId}`);\r\n        const success = await setGroup(axiosInstance, groupId, brightness, xyColor, isOn);\r\n        return { groupId, success };\r\n      })\r\n    );\r\n\r\n    // Log results\r\n    results.forEach(({ groupId, success }) => {\r\n      if (success) {\r\n        console.log(`Group ${groupId} updated successfully!`);\r\n      } else {\r\n        console.log(`❌ Failed to update Group ${groupId}.`);\r\n      }\r\n    });\r\n\r\n    // Return overall success (true if all groups updated successfully)\r\n    return results.every((result) => result.success);\r\n  } catch (err: any) {\r\n    console.error(\"❌ Failed to update multiple groups:\", err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport async function getRooms(axiosInstance: AxiosInstance): Promise<any[]> {\r\n  try {\r\n    // Fetch all rooms\r\n    const response = await axiosInstance.get(\"/room\");\r\n    const rooms = response.data.data;\r\n\r\n    if (!rooms || rooms.length === 0) {\r\n      console.log(\"🚪 No rooms found on the Hue Bridge.\");\r\n      return [];\r\n    }\r\n\r\n    console.log(`🚪 Found ${rooms.length} room(s) on the Hue Bridge:`);\r\n\r\n    // Build structured data\r\n    const roomData = rooms.map((room: any, index: number) => {\r\n      const roomObj = {\r\n        id: room.id || \"N/A\",\r\n        name: room.metadata?.name || \"Unnamed Room\",\r\n        type: room.type || \"Unknown Type\",\r\n        services: room.services?.map((s: any) => s.rtype).join(\", \") || \"N/A\",\r\n      };\r\n\r\n      console.log(` Room ${index + 1}:`);\r\n      console.log(\" ID:\", roomObj.id);\r\n      console.log(\" Name:\", roomObj.name);\r\n      console.log(\" Type:\", roomObj.type);\r\n      console.log(\" Services:\", roomObj.services);\r\n      console.log(\"---------------------------------------------------\");\r\n\r\n      return roomObj;\r\n    });\r\n\r\n    return roomData;\r\n  } catch (err: any) {\r\n    console.error(\"❌ Failed to retrieve rooms:\", err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", err.response.data);\r\n    }\r\n    return [];\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\n/**\r\n * Turns off all lights by checking if a grouped_light with id_v1 \"/groups/0\" exists.\r\n * If it exists, it uses that endpoint to turn off all lights.\r\n * @param {AxiosInstance} axiosInstance - Your configured Axios instance for the Hue API.\r\n * @returns {Promise<boolean>} - Returns true if the process was successful, false otherwise.\r\n */\r\nexport async function turnOffAllLights(axiosInstance: AxiosInstance): Promise<boolean> {\r\n  try {\r\n    // Fetch grouped lights using the Hue API v2 endpoint\r\n    const groupedResponse = await axiosInstance.get(\"/grouped_light\");\r\n    const groups = groupedResponse.data.data; // assuming grouped lights are in data.data\r\n    console.log(\"Grouped lights:\", groups);\r\n    \r\n    // Look for a group where id_v1 is \"/groups/0\"\r\n    const groupZero = groups.find((group: any) => group.id_v1 === \"/groups/0\");\r\n\r\n    if (groupZero) {\r\n      console.log(\"Group 0 exists. Turning off all lights using grouped_light endpoint.\");\r\n      const offPayload = { on: { on: false } };\r\n      const offResponse = await axiosInstance.put(`/grouped_light/${groupZero.id}`, offPayload);\r\n      if (offResponse.status === 200) {\r\n        console.log(\"All lights turned off successfully using grouped_light group 0.\");\r\n        return true;\r\n      } else {\r\n        console.warn(`Unexpected response status: ${offResponse.status}`);\r\n        return false;\r\n      }\r\n    } else {\r\n      console.log(\"Group 0 not found. Cannot turn off all lights using this method.\");\r\n      return false;\r\n    }\r\n  } catch (error: any) {\r\n    console.error(\"Error in turning off all lights:\", error.message);\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\n/**\r\n * Turns off all lights except those whose metadata.archetype is \"plug\".\r\n * Logs the full lights response for debugging.\r\n * Applies a 250 ms rate limit for every 2 requests.\r\n * @param {AxiosInstance} axiosInstance - Your configured Axios instance for the Hue API.\r\n * @returns {Promise<boolean>} - Returns true if the process was successful.\r\n */\r\nexport async function turnOffAllLightsExceptPlugs(axiosInstance: AxiosInstance): Promise<boolean> {\r\n  try {\r\n    // Fetch all lights using the Hue API v2 endpoint for individual light resources\r\n    const lightsResponse = await axiosInstance.get(\"/light\");\r\n\r\n    // Try to extract the array of lights:\r\n    let lightsArray: any[] = [];\r\n    if (Array.isArray(lightsResponse.data.data)) {\r\n      lightsArray = lightsResponse.data.data;\r\n    } else if (Array.isArray(lightsResponse.data)) {\r\n      lightsArray = lightsResponse.data;\r\n    } else {\r\n      console.error(\"Unexpected lights response structure:\", lightsResponse.data);\r\n      return false;\r\n    }\r\n    \r\n    console.log(\"Full lights array:\", JSON.stringify(lightsArray, null, 2));\r\n\r\n    // Arrays to keep track of non-plug lights and plugs filtered out\r\n    const nonPlugLightIds: string[] = [];\r\n    const filteredOutPlugIds: string[] = [];\r\n\r\n    // Filter out lights based on metadata.archetype being \"plug\"\r\n    lightsArray.forEach((light: any) => {\r\n      const archetype = (light.metadata?.archetype || \"\").toLowerCase();\r\n      if (archetype === \"plug\") {\r\n        filteredOutPlugIds.push(light.id);\r\n      } else {\r\n        nonPlugLightIds.push(light.id);\r\n      }\r\n    });\r\n\r\n    // Log the IDs of lights that are filtered out as plugs\r\n/*     console.log(\"Filtered out plugs (not turning off):\", filteredOutPlugIds);\r\n    console.log(\"Non-plug lights to turn off:\", nonPlugLightIds); */\r\n\r\n    if (!nonPlugLightIds.length) {\r\n      //console.warn(\"No non-plug lights found.\");\r\n      return false;\r\n    }\r\n\r\n    // Turn off non-plug lights in batches of 2 with a 250 ms delay between batches\r\n    for (let i = 0; i < nonPlugLightIds.length; i += 2) {\r\n      const batch = nonPlugLightIds.slice(i, i + 2);\r\n      await Promise.all(\r\n        batch.map(async (lightId) => {\r\n          const offPayload = { on: { on: false } };\r\n          try {\r\n            const offResponse = await axiosInstance.put(`/light/${lightId}`, offPayload);\r\n            if (offResponse.status === 200) {\r\n              console.log(`Light ${lightId} turned off successfully.`);\r\n            } else {\r\n              console.warn(`Failed to turn off light ${lightId}. Status: ${offResponse.status}`);\r\n            }\r\n          } catch (error: any) {\r\n            console.error(`Error turning off light ${lightId}:`, error.message);\r\n          }\r\n        })\r\n      );\r\n      if (i + 2 < nonPlugLightIds.length) {\r\n        await new Promise(resolve => setTimeout(resolve, 250));\r\n      }\r\n    }\r\n\r\n    return true;\r\n  } catch (error: any) {\r\n    console.error(\"Error turning off lights except plugs:\", error.message);\r\n    return false;\r\n  }\r\n}\r\n","import { AxiosInstance } from \"axios\";\r\n\r\nexport interface EntertainmentArea {\r\n  id: string;\r\n  id_v1?: string;\r\n  metadata: {\r\n    name: string;\r\n  };\r\n  configuration_type: \"screen\" | \"monitor\" | \"music\" | \"3dspace\" | \"other\";\r\n  status: \"active\" | \"inactive\";\r\n  active_streamer?: { rid: string; rtype: string };\r\n  stream_proxy: {\r\n    mode: \"auto\" | \"manual\";\r\n    node: { rid: string; rtype: string };\r\n  };\r\n  channels: Array<{\r\n    channel_id: number;\r\n    position: { x: number; y: number; z: number };\r\n    members: Array<{ rid: string; rtype: string; index: number }>;\r\n  }>;\r\n  service_locations: Array<{\r\n    service: { rid: string; rtype: string };\r\n    positions: Array<{ x: number; y: number; z: number }>;\r\n    equalization_factor: number;\r\n  }>;\r\n}\r\n\r\nexport async function getEntertainmentAreas(\r\n  axiosInstance: AxiosInstance\r\n): Promise<EntertainmentArea[]> {\r\n  try {\r\n    const response = await axiosInstance.get(\"/entertainment_configuration\");\r\n    const areas: EntertainmentArea[] = response.data.data;\r\n    return areas;\r\n  } catch (err: any) {\r\n    console.error(\"Failed to retrieve entertainment areas:\", err.message);\r\n    return [];\r\n  }\r\n}\r\n","import axios, { AxiosInstance } from \"axios\";\r\n\r\n/**\r\n * V1 version of setLight.\r\n * \r\n * - Converts brightness from a 0–100 scale to Hue API v1 brightness (1–254).\r\n * - Converts transition time from milliseconds to deciseconds (1 decisecond = 100 ms).\r\n * - Expects color as an XY array.\r\n * - Uses the /lights/{lightId}/state endpoint.\r\n */\r\nexport async function setLightV1(\r\n  axiosInstance: AxiosInstance,\r\n  lightId: string,\r\n  xyColor?: { x: number; y: number },\r\n  isOn?: boolean,\r\n  brightness?: number, // expected value in 0–100 scale\r\n  transition?: number  // transition in milliseconds\r\n): Promise<boolean> {\r\n  try {\r\n    const requestBody: any = {};\r\n\r\n    // Handle on/off state\r\n    if (isOn !== undefined) {\r\n      requestBody.on = isOn;\r\n      if (isOn) {\r\n        if (brightness !== undefined) {\r\n          // Convert brightness from 0–100 to 1–254\r\n          const bri = Math.max(1, Math.round((brightness / 100) * 254));\r\n          requestBody.bri = bri;\r\n        }\r\n        if (xyColor) {\r\n          // V1 expects an array for XY color.\r\n          requestBody.xy = [xyColor.x, xyColor.y];\r\n        }\r\n        if (transition && transition > 0) {\r\n          // Convert transition from ms to deciseconds.\r\n          requestBody.transitiontime = Math.round(transition / 100);\r\n        }\r\n      }\r\n    } else {\r\n      // If isOn isn't provided, update other parameters if given.\r\n      if (brightness !== undefined) {\r\n        const bri = Math.max(1, Math.round((brightness / 100) * 254));\r\n        requestBody.bri = bri;\r\n      }\r\n      if (xyColor) {\r\n        requestBody.xy = [xyColor.x, xyColor.y];\r\n      }\r\n      if (transition && transition > 0) {\r\n        requestBody.transitiontime = Math.round(transition / 100);\r\n      }\r\n    }\r\n\r\n    if (Object.keys(requestBody).length === 0) {\r\n      console.error(\"No values provided for update!\");\r\n      return false;\r\n    }\r\n\r\n    const response = await axiosInstance.put(`/lights/${lightId}/state`, requestBody);\r\n\r\n    if (response.status === 200) {\r\n      // V1 API typically returns an array of success objects.\r\n      const data = response.data;\r\n      if (Array.isArray(data) && data.every(item => item.success)) {\r\n        return true;\r\n      }\r\n      return true; // Fallback.\r\n    } else {\r\n      console.warn(`Unexpected response status: ${response.status}`);\r\n      return false;\r\n    }\r\n  } catch (err: any) {\r\n    console.error(`Failed to update light (${lightId}):`, err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n\r\nexport async function setGradientV1(\r\n  axiosInstance: AxiosInstance,\r\n  lightId: string,\r\n  gradientColors: { x: number; y: number }[], // Array of XY color points\r\n  isOn: boolean, // Desired power state\r\n  brightness: number, // Brightness on 0–100 scale\r\n  transition: number  // Transition time in milliseconds\r\n): Promise<boolean> {\r\n  try {\r\n    if (!gradientColors || gradientColors.length < 2 || gradientColors.length > 5) {\r\n      console.error(\"Gradient requires between 2 and 5 color points.\");\r\n      return false;\r\n    }\r\n\r\n    gradientColors.forEach((color, index) => {\r\n      console.log(`🎨 Point ${index + 1}: (${color.x}, ${color.y})`);\r\n    });\r\n\r\n    // Convert brightness from 0–100 to 1–254\r\n    const bri = Math.max(1, Math.round((brightness / 100) * 254));\r\n\r\n    // Convert transition from milliseconds to deciseconds\r\n    const transitiontime = transition && transition > 0 ? Math.round(transition / 100) : undefined;\r\n\r\n    // Build the request payload for V1.\r\n    const requestBody: any = {\r\n      on: isOn,\r\n      bri,\r\n      gradient: {\r\n        points: gradientColors.map((xy) => ({ xy: [xy.x, xy.y] }))\r\n      }\r\n    };\r\n\r\n    if (transitiontime !== undefined) {\r\n      requestBody.transitiontime = transitiontime;\r\n    }\r\n\r\n    const response = await axiosInstance.put(`/lights/${lightId}/state`, requestBody);\r\n\r\n    if (response.status === 200) {\r\n      console.log(`Gradient applied to light: ${lightId}`);\r\n      const data = response.data;\r\n      if (Array.isArray(data) && data.every((item: any) => item.success)) {\r\n        return true;\r\n      }\r\n      return true;\r\n    } else {\r\n      console.warn(`Unexpected response status: ${response.status}`);\r\n      return false;\r\n    }\r\n  } catch (err: any) {\r\n    console.error(`Failed to set gradient on light (${lightId}):`, err.message);\r\n    if (err.response) {\r\n      console.error(\"Response Data:\", JSON.stringify(err.response.data, null, 2));\r\n    }\r\n    return false;\r\n  }\r\n}\r\n\r\n/**\r\n * HueIntegrationV1 class for Hue API v1.\r\n * \r\n * This class creates an Axios instance pointed to the V1 endpoint\r\n * (http://<bridge_ip>/api/<username>) and exposes methods like connectBridge,\r\n * getLights, getLight, setLight, and setLightPower.\r\n */\r\nexport class HueIntegrationV1 {\r\n  private apiKey: string;\r\n  private bridgeIp: string;\r\n  private axiosInstance: AxiosInstance;\r\n\r\n  constructor(apiKey: string, bridgeIp: string = \"192.168.1.105\") {\r\n    this.apiKey = apiKey;\r\n    this.bridgeIp = bridgeIp;\r\n    // Create an Axios instance for v1 endpoints.\r\n    this.axiosInstance = axios.create({\r\n      baseURL: `http://${this.bridgeIp}/api/${this.apiKey}`,\r\n      headers: {\r\n        \"Content-Type\": \"application/json\",\r\n      },\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Connects to the Hue Bridge by registering the application.\r\n   * This will POST to /api and return the generated username.\r\n   */\r\n  async connectBridge(appName: string): Promise<string> {\r\n    try {\r\n      const response = await axios.post(`http://${this.bridgeIp}/api`, { devicetype: appName });\r\n      if (response.data && Array.isArray(response.data) && response.data[0].success) {\r\n        const username = response.data[0].success.username;\r\n        this.apiKey = username;\r\n        // Reinitialize axiosInstance with the new API key.\r\n        this.axiosInstance = axios.create({\r\n          baseURL: `http://${this.bridgeIp}/api/${this.apiKey}`,\r\n          headers: {\r\n            \"Content-Type\": \"application/json\",\r\n          },\r\n        });\r\n        return username;\r\n      } else {\r\n        throw new Error(\"Failed to register with the Hue Bridge.\");\r\n      }\r\n    } catch (err: any) {\r\n      console.error(\"Error registering with the Hue Bridge:\", err.message);\r\n      throw err;\r\n    }\r\n  }\r\n\r\n  async getBridgeInfo(): Promise<any> {\r\n    return await this.axiosInstance.get(\"/config\");\r\n  }\r\n\r\n  async getLights(): Promise<any> {\r\n    return await this.axiosInstance.get(\"/lights\");\r\n  }\r\n\r\n  async getLight(lightId: string): Promise<any> {\r\n    return await this.axiosInstance.get(`/lights/${lightId}`);\r\n  }\r\n\r\n  /**\r\n   * Sets the light state using the V1 API.\r\n   * Transforms values as needed for Hue API v1.\r\n   */\r\n  async setLight(\r\n    lightId: string,\r\n    xyColor?: { x: number; y: number },\r\n    isOn?: boolean,\r\n    brightness?: number,\r\n    transition?: number\r\n  ): Promise<boolean> {\r\n    return await setLightV1(this.axiosInstance, lightId, xyColor, isOn, brightness, transition);\r\n  }\r\n\r\n    /**\r\n   * Sets the gradient on a light using the V1 API.\r\n   * Transforms values as needed.\r\n   */\r\n    async setGradient(\r\n      lightId: string,\r\n      gradientColors: { x: number; y: number }[],\r\n      isOn: boolean,\r\n      brightness: number,\r\n      transition: number\r\n    ): Promise<boolean> {\r\n      return await setGradientV1(this.axiosInstance, lightId, gradientColors, isOn, brightness, transition);\r\n    }\r\n  \r\n\r\n  /**\r\n   * Sets the power (on/off) state of a light.\r\n   */\r\n  async setLightPower(lightId: string, isOn: boolean): Promise<boolean> {\r\n    try {\r\n      const response = await this.axiosInstance.put(`/lights/${lightId}/state`, { on: isOn });\r\n      if (response.status === 200) {\r\n        const data = response.data;\r\n        if (Array.isArray(data) && data.every((item: any) => item.success)) {\r\n          return true;\r\n        }\r\n        return true;\r\n      } else {\r\n        console.warn(`Unexpected response status: ${response.status}`);\r\n        return false;\r\n      }\r\n    } catch (err: any) {\r\n      console.error(`Failed to update light power (${lightId}):`, err.message);\r\n      return false;\r\n    }\r\n  }\r\n\r\n  // Additional methods (setLightColor, setGradient, etc.) can be added as needed.\r\n}\r\n"],"mappings":"gkBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,oBAAAE,EAAA,qBAAAC,IAAA,eAAAC,GAAAJ,ICAA,IAAAK,EAAkB,sBAClBC,EAAkB,sBCDlB,IAAAC,EAAkB,sBAClBC,EAAkB,sBAelB,eAAsBC,EACpBC,EACAC,EAC4B,CAC5B,QAAQ,IAAI,mDAAmD,EAE/D,IAAMC,EAAa,GACfC,EAAU,EAEd,KAAOA,EAAUD,GACf,GAAI,CACF,IAAME,EAAW,MAAM,EAAAC,QAAM,KAC3B,WAAWJ,QACX,CACE,WAAYD,GAAW,aACvB,kBAAmB,EACrB,EACA,CACE,WAAY,IAAI,EAAAM,QAAM,MAAM,CAAE,mBAAoB,EAAM,CAAC,CAC3D,CACF,EAEA,QAAQ,IAAI,2CAAqCF,EAAS,IAAI,EAC9D,IAAMG,EAAQH,EAAS,KAAK,CAAC,EAE7B,GAAIG,GAAO,QAAS,CAClB,GAAM,CAAE,SAAAC,EAAU,UAAAC,CAAU,EAAIF,EAAM,QACtC,eAAQ,IAAI,+BAA0BC,GAAU,EAChD,QAAQ,IAAI,8BAAyBC,GAAW,EACzC,CAAE,SAAAD,EAAU,UAAAC,CAAU,EAG/B,GAAIF,GAAO,OAAO,OAAS,IAAK,CAC9B,QAAQ,IAAI,iCAAiCJ,EAAU,KAAKD,IAAa,EACzEC,IACA,MAAM,IAAI,QAASO,GAAQ,WAAWA,EAAK,GAAI,CAAC,EAChD,SAGF,MAAM,IAAI,MAAM,wBAAwB,KAAK,UAAUH,CAAK,GAAG,CACjE,OAASI,EAAP,CACA,cAAQ,MAAM,kBAAmBA,EAAI,OAAO,EACtCA,CACR,CAGF,MAAM,IAAI,MAAM,8CAAyC,CAC3D,CC7DA,eAAsBC,EAAcC,EAA4C,CAC9E,GAAI,CAGF,IAAMC,GADW,MAAMD,EAAc,IAAI,SAAS,GACtB,KAAK,KAAK,CAAC,EAEvC,GAAI,CAACC,EACH,eAAQ,IAAI,+BAA+B,EACpC,KAIT,IAAMC,EAAa,CACjB,SAAUD,GAAY,WAAa,MACnC,QAASA,GAAY,UAAY,MACjC,WAAYA,GAAY,YAAc,KACxC,EAEA,eAAQ,IAAI,wCAAwC,EACpD,QAAQ,IAAI,cAAeC,EAAW,QAAQ,EAC9C,QAAQ,IAAI,UAAWA,EAAW,OAAO,EACzC,QAAQ,IAAI,qBAAsBA,EAAW,UAAU,EAEhDA,CACT,OAASC,EAAP,CACA,eAAQ,MAAM,mCAAoCA,EAAI,OAAO,EACzDA,EAAI,UACN,QAAQ,MAAM,iBAAkBA,EAAI,SAAS,IAAI,EAE5C,IACT,CACF,CCjCA,IAAAC,EAAkB,sBAELC,EAAmB,CAC9BC,EACAC,EACAC,EACAC,IAC0B,CAC1B,IAAMC,EAAM,uBAEZ,QAAQ,IAAI,wCAAwCJ,IAAWI,MAAQ,EAEvE,IAAIC,EAAW,GACXC,EAAS,GAGPC,EAAU,CACd,SAAUP,EACV,KAAMI,EACN,OAAQ,MACR,QAAS,CACP,sBAAuBH,EACvB,OAAU,oBACV,gBAAiB,WACjB,WAAc,YAChB,EACA,mBAAoB,EACtB,EAEMO,EAAM,EAAAC,QAAM,QAAQF,EAAUG,GAAQ,CAC1C,QAAQ,IAAI,qCAAqC,EAEjDA,EAAI,GAAG,OAASC,GAAkB,CAChC,GAAIN,EAAU,OAGdC,GAAUK,EAAM,SAAS,EAGzB,IAAMC,EAAQN,EAAO,MAAM;AAAA,CAAI,EAE3BO,EAAY,UACZC,EAAU,UAEd,QAAWC,KAAQH,EAAO,CACxB,IAAMI,EAAcD,EAAK,KAAK,EAU9B,GARIC,EAAY,WAAW,QAAQ,IACjCH,EAAYG,EAAY,QAAQ,SAAU,EAAE,EAAE,KAAK,GAGjDA,EAAY,WAAW,KAAK,IAC9BF,EAAUE,EAAY,QAAQ,MAAO,EAAE,EAAE,KAAK,GAG5CA,EAAY,WAAW,OAAO,EAAG,CACnC,IAAMC,EAAaD,EAAY,QAAQ,QAAS,EAAE,EAAE,KAAK,EAEzD,GAAI,CACF,IAAME,EAAa,KAAK,MAAMD,CAAU,EAGpC,MAAM,QAAQC,CAAU,EAC1BA,EAAW,QAASC,GAAU,CAC5BjB,EAAU,CAAE,UAAAW,EAAW,QAAAC,EAAS,MAAAK,CAAM,CAAC,CACzC,CAAC,EAEDjB,EAAU,CAAE,UAAAW,EAAW,QAAAC,EAAS,WAAAI,CAAW,CAAC,CAEhD,OAASE,EAAP,CACA,QAAQ,MAAM,4BAA6BA,CAAG,CAChD,GAKJd,EAASM,EAAMA,EAAM,OAAS,CAAC,CACjC,CAAC,EAEDF,EAAI,GAAG,MAAO,IAAM,CAClB,QAAQ,IAAI,8CAAuC,EAC9CL,GACH,WAAW,IAAMN,EAAiBC,EAAUC,EAAQC,EAAWC,CAAO,EAAG,GAAI,CAEjF,CAAC,EAEDO,EAAI,GAAG,QAAUW,GAAe,CAC9B,QAAQ,MAAM,yBAA0BA,CAAK,EACzClB,GAASA,EAAQkB,CAAK,CAC5B,CAAC,CACH,CAAC,EAED,OAAAb,EAAI,GAAG,QAAUa,GAAU,CACzB,QAAQ,MAAM,oCAAqCA,CAAK,EACpDlB,GAASA,EAAQkB,CAAK,EAGrBhB,GACH,WAAW,IAAMN,EAAiBC,EAAUC,EAAQC,EAAWC,CAAO,EAAG,GAAI,CAEjF,CAAC,EAEDK,EAAI,IAAI,EAGD,CACL,MAAO,IAAM,CACXH,EAAW,GACXG,EAAI,QAAQ,EACZ,QAAQ,IAAI,0CAAmC,CACjD,CACF,CACF,EC9GA,eAAsBc,EAAeC,EAA8C,CACjF,GAAI,CAGF,IAAMC,GADkB,MAAMD,EAAc,IAAI,SAAS,GACzB,KAAK,KAG/BE,EAAoC,CAAC,EAC3CD,EAAQ,QAASE,GAAgB,CAC/BD,EAAUC,EAAO,EAAE,EAAIA,EAAO,UAAU,MAAQ,gBAClD,CAAC,EAID,IAAMC,GADW,MAAMJ,EAAc,IAAI,cAAc,GAC9B,KAAK,KAE9B,MAAI,CAACI,GAAWA,EAAQ,SAAW,GACjC,QAAQ,IAAI,kDAAkD,EACvD,CAAC,IAGV,QAAQ,IAAI,UAAUA,EAAQ,+BAA+B,EAG1CA,EAAQ,IAAI,CAACC,EAAaC,IAAkB,CAC7D,IAAMC,EAAaL,EAAUG,EAAO,OAAO,GAAG,GAAK,iBAE7CG,EAAY,CAChB,GAAIH,EAAO,IAAM,MACjB,WAAAE,EACA,YAAaF,EAAO,aAAa,aAAe,KAClD,EAEA,eAAQ,IAAI,WAAWC,EAAQ,IAAI,EACnC,QAAQ,IAAI,MAAOE,EAAU,EAAE,EAC/B,QAAQ,IAAI,eAAgBA,EAAU,UAAU,EAChD,QAAQ,IAAI,gBAAiBA,EAAU,YAAa,OAAI,EACxD,QAAQ,IAAI,qDAAqD,EAE1DA,CACT,CAAC,EAGH,OAASC,EAAP,CACA,eAAQ,MAAM,0CAA2CA,EAAI,OAAO,EAChEA,EAAI,UACN,QAAQ,MAAM,iBAAkBA,EAAI,SAAS,IAAI,EAE5C,CAAC,CACV,CACF,CClDA,eAAsBC,EAAeC,EAA8C,CACjF,GAAI,CAGF,IAAMC,GADkB,MAAMD,EAAc,IAAI,SAAS,GACzB,KAAK,KAG/BE,EAAoC,CAAC,EAC3CD,EAAQ,QAASE,GAAgB,CAC/BD,EAAUC,EAAO,EAAE,EAAIA,EAAO,UAAU,MAAQ,gBAClD,CAAC,EAID,IAAMC,GADW,MAAMJ,EAAc,IAAI,cAAc,GAC9B,KAAK,KAE9B,MAAI,CAACI,GAAWA,EAAQ,SAAW,GACjC,QAAQ,IAAI,iDAAiD,EACtD,CAAC,IAGV,QAAQ,IAAI,mBAAYA,EAAQ,+BAA+B,EAG5CA,EAAQ,IAAI,CAACC,EAAaC,IAAkB,CAC7D,IAAMC,EAAaL,EAAUG,EAAO,OAAO,GAAG,GAAK,iBAE7CG,EAAY,CAChB,GAAIH,EAAO,IAAM,MACjB,WAAAE,EACA,WAAYF,EAAO,OAAO,aAAe,KAC3C,EAEA,eAAQ,IAAI,UAAUC,EAAQ,IAAI,EAClC,QAAQ,IAAI,MAAOE,EAAU,EAAE,EAC/B,QAAQ,IAAI,eAAgBA,EAAU,UAAU,EAChD,QAAQ,IAAI,eAAgBA,EAAU,WAAY,IAAI,EACtD,QAAQ,IAAI,qDAAqD,EAE1DA,CACT,CAAC,EAGH,OAASC,EAAP,CACA,eAAQ,MAAM,2CAA4CA,EAAI,OAAO,EACjEA,EAAI,UACN,QAAQ,MAAM,iBAAkBA,EAAI,SAAS,IAAI,EAE5C,CAAC,CACV,CACF,CClDA,eAAsBC,EAAUC,EAA8C,CAC5E,GAAI,CAGF,IAAMC,GADW,MAAMD,EAAc,IAAI,QAAQ,GACzB,KAAK,KAE7B,MAAI,CAACC,GAAUA,EAAO,SAAW,GAC/B,QAAQ,IAAI,oCAAoC,EACzC,CAAC,GAMQA,EAAO,IAAI,CAACC,EAAYC,KACvB,CACf,GAAID,EAAM,IAAM,MAChB,KAAMA,EAAM,UAAU,MAAQ,gBAC9B,KAAMA,EAAM,MAAQ,eACpB,KAAM,EAAAA,GAAO,IAAI,GACjB,WAAYA,GAAO,SAAS,YAAc,MAC1C,QAASA,EAAM,OAAO,GAAK,CAAE,EAAGA,EAAM,MAAM,GAAG,EAAG,EAAGA,EAAM,MAAM,GAAG,CAAE,EAAI,IAC5E,EAgBD,CAGH,OAASE,EAAP,CACA,eAAQ,MAAM,6BAA8BA,EAAI,OAAO,EACnDA,EAAI,UACN,QAAQ,MAAM,iBAAkBA,EAAI,SAAS,IAAI,EAE5C,CAAC,CACV,CACF,CChDA,eAAsBC,EAASC,EAA8BC,EAAsC,CACjG,GAAI,CAGF,IAAMC,GADW,MAAMF,EAAc,IAAI,UAAUC,GAAS,GACrC,KAAK,KAC5B,OAAKC,EAKY,CACf,GAAIA,EAAM,IAAM,MAChB,KAAMA,EAAM,UAAU,MAAQ,gBAC9B,KAAMA,EAAM,MAAQ,eACpB,KAAM,EAAAA,GAAO,IAAI,GACjB,WAAYA,GAAO,SAAS,YAAc,MAC1C,QAASA,EAAM,OAAO,GAAK,CAAE,EAAGA,EAAM,MAAM,GAAG,EAAG,EAAGA,EAAM,MAAM,GAAG,CAAE,EAAI,IAC5E,GAXE,QAAQ,IAAI,SAASD,gCAAsC,EACpD,KAYX,OAASE,EAAP,CACA,eAAQ,MAAM,4BAA4BF,KAAYE,EAAI,OAAO,EAC7DA,EAAI,UACN,QAAQ,MAAM,iBAAkBA,EAAI,SAAS,IAAI,EAE5C,IACT,CACF,CC1BA,eAAsBC,EAAUC,EAA8C,CAC5E,GAAI,CAGF,IAAMC,GADW,MAAMD,EAAc,IAAI,QAAQ,GACzB,KAAK,KAE7B,MAAI,CAACC,GAAUA,EAAO,SAAW,GAC/B,QAAQ,IAAI,qCAAqC,EAC1C,CAAC,IAGV,QAAQ,IAAI,UAAUA,EAAO,oCAAoC,EAG/CA,EAAO,IAAI,CAACC,EAAYC,IAAkB,CAC1D,IAAMC,EAAW,CACf,GAAIF,EAAM,IAAM,MAChB,KAAMA,EAAM,UAAU,MAAQ,gBAC9B,KAAMA,EAAM,MAAQ,eACpB,MAAOA,EAAM,OAAO,KAAO,KAC7B,EAEA,eAAQ,IAAI,SAASC,EAAQ,IAAI,EACjC,QAAQ,IAAI,OAAQC,EAAS,EAAE,EAC/B,QAAQ,IAAI,SAAUA,EAAS,IAAI,EACnC,QAAQ,IAAI,SAAUA,EAAS,IAAI,EACnC,QAAQ,IAAI,aAAcA,EAAS,KAAK,EACxC,QAAQ,IAAI,qDAAqD,EAE1DA,CACT,CAAC,EAGH,OAASC,EAAP,CACA,eAAQ,MAAM,8BAA+BA,EAAI,OAAO,EACpDA,EAAI,UACN,QAAQ,MAAM,iBAAkBA,EAAI,SAAS,IAAI,EAE5C,CAAC,CACV,CACF,CCxCA,eAAsBC,EAASC,EAA8BC,EAAmC,CAC9F,GAAI,CACF,QAAQ,IAAI,kCAAkCA,GAAS,EACvD,QAAQ,IAAI,8BAA8B,EAI1C,IAAMC,GADgB,MAAMF,EAAc,IAAI,QAAQ,GACzB,KAAK,KAElC,GAAI,CAACE,GAAUA,EAAO,SAAW,EAC/B,eAAQ,MAAM,2CAAsC,EAC7C,GAGT,IAAMC,EAAQD,EAAO,KAAM,GAAW,EAAE,KAAOD,CAAO,EAEtD,GAAI,CAACE,EACH,eAAQ,MAAM,aAAaF,cAAoB,EAC/C,QAAQ,IAAI,oBAAoB,EAChCC,EAAO,QAAS,GAAW,QAAQ,IAAI,OAAO,EAAE,OAAO,EAAE,UAAU,MAAM,CAAC,EACnE,GAGT,QAAQ,IAAI,iBAAiBC,EAAM,UAAU,MAAM,EAGnD,QAAQ,IAAI,uCAAuCF,iCAAuC,EAE1F,IAAMG,EAAW,MAAMJ,EAAc,IAAI,UAAUC,IAAW,CAC5D,OAAQ,CAAE,OAAQ,QAAS,CAC7B,CAAC,EAED,OAAIG,EAAS,SAAW,KACtB,QAAQ,IAAI,qBAAqBH,IAAU,EACpC,KAEP,QAAQ,KAAK,gCAAgCG,EAAS,QAAQ,EACvD,GAEX,OAASC,EAAP,CACA,eAAQ,MAAM,8BAA8BJ,MAAaI,EAAI,OAAO,EAChEA,EAAI,UACN,QAAQ,MAAM,2BAAqB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAExE,EACT,CACF,CCnCA,eAAsBC,EACpBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,GAAI,CACF,IAAMC,EAAmB,CAAC,EAkC1B,GA/BIH,IAAS,QACXG,EAAY,GAAK,CAAE,GAAIH,CAAK,EAExBA,IAEEC,IAAe,SAEjBE,EAAY,QAAU,CAAE,WAAAF,CAAW,GAEjCF,IACFI,EAAY,MAAQ,CAAE,GAAI,CAAE,EAAGJ,EAAQ,EAAG,EAAGA,EAAQ,CAAE,CAAE,GAEvDG,GAAcA,EAAa,IAE7BC,EAAY,SAAW,CAAE,SAAUD,CAAW,MAM9CD,IAAe,SACjBE,EAAY,QAAU,CAAE,WAAAF,CAAW,GAEjCF,IACFI,EAAY,MAAQ,CAAE,GAAI,CAAE,EAAGJ,EAAQ,EAAG,EAAGA,EAAQ,CAAE,CAAE,GAEvDG,GAAcA,EAAa,IAC7BC,EAAY,SAAW,CAAE,SAAUD,CAAW,IAI9C,OAAO,KAAKC,CAAW,EAAE,SAAW,EACtC,eAAQ,MAAM,gCAAgC,EACvC,GAGT,IAAMC,EAAW,MAAMP,EAAc,IAAI,UAAUC,IAAWK,CAAW,EAEzE,OAAIC,EAAS,SAAW,IACf,IAEP,QAAQ,KAAK,+BAA+BA,EAAS,QAAQ,EACtD,GAEX,OAASC,EAAP,CACA,eAAQ,MAAM,2BAA2BP,MAAaO,EAAI,OAAO,EAC7DA,EAAI,UACN,QAAQ,MAAM,iBAAkB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAErE,EACT,CACF,CC1EA,eAAsBC,EACpBC,EACAC,EACAC,EACkB,CAClB,GAAI,CACF,IAAMC,EAAc,CAClB,GAAI,CAAE,GAAID,CAAK,CACjB,EAEME,EAAW,MAAMJ,EAAc,IAAI,UAAUC,IAAWE,CAAW,EAEzE,OAAIC,EAAS,SAAW,IACf,IAEP,QAAQ,KAAK,+BAA+BA,EAAS,QAAQ,EACtD,GAEX,OAASC,EAAP,CACA,eAAQ,MAAM,iCAAiCJ,MAAaI,EAAI,OAAO,EACnEA,EAAI,UACN,QAAQ,MAAM,iBAAkB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAErE,EACT,CACF,CCzBA,eAAsBC,EACpBC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,GAAI,CACF,IAAMC,EAAmB,CAAC,EAY1B,GAVIF,IAAe,SACjBE,EAAY,QAAU,CAAE,WAAAF,CAAW,GAEjCD,IACFG,EAAY,MAAQ,CAAE,GAAI,CAAE,EAAGH,EAAQ,EAAG,EAAGA,EAAQ,CAAE,CAAE,GAEvDE,GAAcA,EAAa,IAC7BC,EAAY,SAAW,CAAE,SAAUD,CAAW,GAG5C,OAAO,KAAKC,CAAW,EAAE,SAAW,EACtC,eAAQ,MAAM,sCAAsC,EAC7C,GAGT,IAAMC,EAAW,MAAMN,EAAc,IAAI,UAAUC,IAAWI,CAAW,EAEzE,OAAIC,EAAS,SAAW,IACf,IAEP,QAAQ,KAAK,+BAA+BA,EAAS,QAAQ,EACtD,GAEX,OAASC,EAAP,CACA,eAAQ,MAAM,iCAAiCN,MAAaM,EAAI,OAAO,EACnEA,EAAI,UACN,QAAQ,MAAM,iBAAkB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAErE,EACT,CACF,CCxBA,eAAsBC,EACpBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,GAAI,CAEF,GAAI,CAACH,GAAkBA,EAAe,OAAS,GAAKA,EAAe,OAAS,EAC1E,eAAQ,MAAM,iDAAiD,EACxD,GAITA,EAAe,QAAQ,CAACI,EAAOC,IAAU,CACvC,QAAQ,IAAI,mBAAYA,EAAQ,OAAOD,EAAM,MAAMA,EAAM,IAAI,CAC/D,CAAC,EAID,IAAIE,EACAH,GAAcA,EAAa,IAC7BG,EAAWH,GAIb,IAAMI,EAAmB,CACvB,SAAU,CACR,OAAQP,EAAe,IAAKQ,IAAQ,CAClC,MAAO,CAAE,GAAAA,CAAG,CACd,EAAE,CACJ,EACA,GAAI,CAAE,GAAIP,CAAK,EACf,QAAS,CAAE,WAAAC,CAAW,EACtB,SAAUI,EAAW,CAAE,SAAAA,CAAS,EAAI,CAAC,CACvC,EAEMG,EAAW,MAAMX,EAAc,IAAI,UAAUC,IAAWQ,CAAW,EAEzE,OAAIE,EAAS,SAAW,KACtB,QAAQ,IAAI,8BAA8BV,GAAS,EAC5C,KAEP,QAAQ,KAAK,+BAA+BU,EAAS,QAAQ,EACtD,GAEX,OAASC,EAAP,CACA,eAAQ,MAAM,oCAAoCX,MAAaW,EAAI,OAAO,EACtEA,EAAI,UACN,QAAQ,MAAM,iBAAkB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAErE,EACT,CACF,CCvEA,eAAsBC,EACpBC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,GAAI,CACF,GAAI,CAACF,GAAkBA,EAAe,OAAS,GAAKA,EAAe,OAAS,EAC1E,eAAQ,MAAM,iDAAiD,EACxD,GAGTA,EAAe,QAAQ,CAACG,EAAOC,IAAU,CACvC,QAAQ,IAAI,mBAAYA,EAAQ,OAAOD,EAAM,MAAMA,EAAM,IAAI,CAC/D,CAAC,EAGD,IAAIE,EACAH,GAAcA,EAAa,IAC7BG,EAAWH,GAIb,IAAMI,EAAmB,CACvB,SAAU,CACR,OAAQN,EAAe,IAAKO,IAAQ,CAClC,MAAO,CAAE,GAAAA,CAAG,CACd,EAAE,CACJ,EACA,QAAS,CAAE,WAAAN,CAAW,EACtB,SAAUI,EAAW,CAAE,SAAAA,CAAS,EAAI,CAAC,CACvC,EAEMG,EAAW,MAAMV,EAAc,IAAI,UAAUC,IAAWO,CAAW,EAEzE,OAAIE,EAAS,SAAW,KACtB,QAAQ,IAAI,8BAA8BT,GAAS,EAC5C,KAEP,QAAQ,KAAK,+BAA+BS,EAAS,QAAQ,EACtD,GAEX,OAASC,EAAP,CACA,eAAQ,MAAM,oCAAoCV,MAAaU,EAAI,OAAO,EACtEA,EAAI,UACN,QAAQ,MAAM,iBAAkB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAErE,EACT,CACF,CClDA,eAAsBC,EAAUC,EAA8C,CAC5E,GAAI,CACF,QAAQ,IAAI,yCAAyC,EAIrD,IAAMC,GADgB,MAAMD,EAAc,IAAI,gBAAgB,GACjC,KAAK,KAElC,GAAI,CAACC,GAAUA,EAAO,SAAW,EAC/B,eAAQ,IAAI,uDAAuD,EAC5D,CAAC,EAGV,QAAQ,IAAI,iCAA0B,EAItC,IAAMC,GADe,MAAMF,EAAc,IAAI,OAAO,GACzB,KAAK,KAG1BG,EAAyC,CAAC,EAChD,OAAAD,EAAM,QAASE,GAAc,CAC3B,IAAMC,EAAsBD,EAAK,SAAS,KAAME,GAAWA,EAAE,QAAU,eAAe,EAClFD,IACFF,EAAeE,EAAoB,GAAG,EAAID,EAAK,UAAU,MAAQ,eAErE,CAAC,EAED,QAAQ,IAAI,SAASH,EAAO,oCAAoC,EAG9CA,EAAO,IAAI,CAACM,EAAYC,IAAkB,CAC1D,IAAMC,EAAWN,EAAeI,EAAM,EAAE,GAAK,iBACvCG,EAAW,CACf,GAAIH,EAAM,IAAM,MAChB,KAAMA,EAAM,UAAU,MAAQE,GAAY,gBAC1C,KAAMF,EAAM,MAAQ,eACpB,SAAUA,EAAM,UAAU,IAAKD,GAAWA,EAAE,KAAK,EAAE,KAAK,IAAI,GAAK,MACjE,WAAYG,CACd,EAEA,eAAQ,IAAI,SAASD,EAAQ,IAAI,EACjC,QAAQ,IAAI,OAAQE,EAAS,EAAE,EAC/B,QAAQ,IAAI,QAASA,EAAS,IAAI,EAClC,QAAQ,IAAI,QAASA,EAAS,IAAI,EAClC,QAAQ,IAAI,gBAAiBA,EAAS,UAAU,EAChD,QAAQ,IAAI,aAAcA,EAAS,QAAQ,EAC3C,QAAQ,IAAI,qDAAqD,EAE1DA,CACT,CAAC,CAGH,OAASC,EAAP,CACA,eAAQ,MAAM,8BAA+BA,EAAI,OAAO,EACpDA,EAAI,UACN,QAAQ,MAAM,iBAAkBA,EAAI,SAAS,IAAI,EAE5C,CAAC,CACV,CACF,CC5DA,eAAsBC,EACpBC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,GAAI,CACF,QAAQ,IAAI,0BAA0BH,GAAS,EAG/C,IAAMI,EAAmB,CAAC,EAiB1B,GAfIH,IAAe,SACjBG,EAAY,QAAU,CAAE,WAAAH,CAAW,EACnC,QAAQ,IAAI,eAAeA,IAAa,GAGtCC,IACFE,EAAY,MAAQ,CAAE,GAAI,CAAE,EAAGF,EAAQ,EAAG,EAAGA,EAAQ,CAAE,CAAE,EACzD,QAAQ,IAAI,cAAcA,EAAQ,MAAMA,EAAQ,IAAI,GAGlDC,IAAS,SACXC,EAAY,GAAK,CAAE,GAAID,CAAK,EAC5B,QAAQ,IAAI,sBAAsBA,EAAO,KAAO,OAAO,GAGrD,OAAO,KAAKC,CAAW,EAAE,SAAW,EACtC,eAAQ,MAAM,iCAAiC,EACxC,GAGT,QAAQ,IAAI,4CAA4C,EACxD,IAAMC,EAAW,MAAMN,EAAc,IAAI,kBAAkBC,IAAWI,CAAW,EAEjF,OAAIC,EAAS,SAAW,KACtB,QAAQ,IAAI,0BAA0BL,GAAS,EACxC,KAEP,QAAQ,KAAK,gCAAgCK,EAAS,QAAQ,EACvD,GAEX,OAASC,EAAP,CACA,eAAQ,MAAM,mCAAmCN,MAAaM,EAAI,OAAO,EACrEA,EAAI,UACN,QAAQ,MAAM,iBAAkB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAErE,EACT,CACF,CCjDA,eAAsBC,EACpBC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,GAAI,CACF,QAAQ,IAAI,4BAA4BH,EAAS,mBAAmB,EAGpE,IAAMI,EAAU,MAAM,QAAQ,IAC5BJ,EAAS,IAAI,MAAOK,GAAY,CAC9B,QAAQ,IAAI,6BAAsBA,GAAS,EAC3C,IAAMC,EAAU,MAAMC,EAASR,EAAeM,EAASJ,EAAYC,EAASC,CAAI,EAChF,MAAO,CAAE,QAAAE,EAAS,QAAAC,CAAQ,CAC5B,CAAC,CACH,EAGA,OAAAF,EAAQ,QAAQ,CAAC,CAAE,QAAAC,EAAS,QAAAC,CAAQ,IAAM,CAEtC,QAAQ,IADNA,EACU,SAASD,0BAET,iCAA4BA,IAFY,CAIxD,CAAC,EAGMD,EAAQ,MAAOI,GAAWA,EAAO,OAAO,CACjD,OAASC,EAAP,CACA,eAAQ,MAAM,2CAAuCA,EAAI,OAAO,EAC5DA,EAAI,UACN,QAAQ,MAAM,iBAAkB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAErE,EACT,CACF,CCtCA,eAAsBC,EAASC,EAA8C,CAC3E,GAAI,CAGF,IAAMC,GADW,MAAMD,EAAc,IAAI,OAAO,GACzB,KAAK,KAE5B,MAAI,CAACC,GAASA,EAAM,SAAW,GAC7B,QAAQ,IAAI,6CAAsC,EAC3C,CAAC,IAGV,QAAQ,IAAI,mBAAYA,EAAM,mCAAmC,EAGhDA,EAAM,IAAI,CAACC,EAAWC,IAAkB,CACvD,IAAMC,EAAU,CACd,GAAIF,EAAK,IAAM,MACf,KAAMA,EAAK,UAAU,MAAQ,eAC7B,KAAMA,EAAK,MAAQ,eACnB,SAAUA,EAAK,UAAU,IAAKG,GAAWA,EAAE,KAAK,EAAE,KAAK,IAAI,GAAK,KAClE,EAEA,eAAQ,IAAI,SAASF,EAAQ,IAAI,EACjC,QAAQ,IAAI,OAAQC,EAAQ,EAAE,EAC9B,QAAQ,IAAI,SAAUA,EAAQ,IAAI,EAClC,QAAQ,IAAI,SAAUA,EAAQ,IAAI,EAClC,QAAQ,IAAI,aAAcA,EAAQ,QAAQ,EAC1C,QAAQ,IAAI,qDAAqD,EAE1DA,CACT,CAAC,EAGH,OAASE,EAAP,CACA,eAAQ,MAAM,mCAA+BA,EAAI,OAAO,EACpDA,EAAI,UACN,QAAQ,MAAM,iBAAkBA,EAAI,SAAS,IAAI,EAE5C,CAAC,CACV,CACF,CClCA,eAAsBC,EAAiBC,EAAgD,CACrF,GAAI,CAGF,IAAMC,GADkB,MAAMD,EAAc,IAAI,gBAAgB,GACjC,KAAK,KACpC,QAAQ,IAAI,kBAAmBC,CAAM,EAGrC,IAAMC,EAAYD,EAAO,KAAME,GAAeA,EAAM,QAAU,WAAW,EAEzE,GAAID,EAAW,CACb,QAAQ,IAAI,sEAAsE,EAClF,IAAME,EAAa,CAAE,GAAI,CAAE,GAAI,EAAM,CAAE,EACjCC,EAAc,MAAML,EAAc,IAAI,kBAAkBE,EAAU,KAAME,CAAU,EACxF,OAAIC,EAAY,SAAW,KACzB,QAAQ,IAAI,iEAAiE,EACtE,KAEP,QAAQ,KAAK,+BAA+BA,EAAY,QAAQ,EACzD,QAGT,gBAAQ,IAAI,kEAAkE,EACvE,EAEX,OAASC,EAAP,CACA,eAAQ,MAAM,mCAAoCA,EAAM,OAAO,EACxD,EACT,CACF,CC5BA,eAAsBC,EAA4BC,EAAgD,CAChG,GAAI,CAEF,IAAMC,EAAiB,MAAMD,EAAc,IAAI,QAAQ,EAGnDE,EAAqB,CAAC,EAC1B,GAAI,MAAM,QAAQD,EAAe,KAAK,IAAI,EACxCC,EAAcD,EAAe,KAAK,aACzB,MAAM,QAAQA,EAAe,IAAI,EAC1CC,EAAcD,EAAe,SAE7B,gBAAQ,MAAM,wCAAyCA,EAAe,IAAI,EACnE,GAGT,QAAQ,IAAI,qBAAsB,KAAK,UAAUC,EAAa,KAAM,CAAC,CAAC,EAGtE,IAAMC,EAA4B,CAAC,EAC7BC,EAA+B,CAAC,EAgBtC,GAbAF,EAAY,QAASG,GAAe,EACfA,EAAM,UAAU,WAAa,IAAI,YAAY,IAC9C,OAChBD,EAAmB,KAAKC,EAAM,EAAE,EAEhCF,EAAgB,KAAKE,EAAM,EAAE,CAEjC,CAAC,EAMG,CAACF,EAAgB,OAEnB,MAAO,GAIT,QAASG,EAAI,EAAGA,EAAIH,EAAgB,OAAQG,GAAK,EAAG,CAClD,IAAMC,EAAQJ,EAAgB,MAAMG,EAAGA,EAAI,CAAC,EAC5C,MAAM,QAAQ,IACZC,EAAM,IAAI,MAAOC,GAAY,CAC3B,IAAMC,EAAa,CAAE,GAAI,CAAE,GAAI,EAAM,CAAE,EACvC,GAAI,CACF,IAAMC,EAAc,MAAMV,EAAc,IAAI,UAAUQ,IAAWC,CAAU,EACvEC,EAAY,SAAW,IACzB,QAAQ,IAAI,SAASF,4BAAkC,EAEvD,QAAQ,KAAK,4BAA4BA,cAAoBE,EAAY,QAAQ,CAErF,OAASC,EAAP,CACA,QAAQ,MAAM,2BAA2BH,KAAYG,EAAM,OAAO,CACpE,CACF,CAAC,CACH,EACIL,EAAI,EAAIH,EAAgB,QAC1B,MAAM,IAAI,QAAQS,GAAW,WAAWA,EAAS,GAAG,CAAC,EAIzD,MAAO,EACT,OAASD,EAAP,CACA,eAAQ,MAAM,yCAA0CA,EAAM,OAAO,EAC9D,EACT,CACF,CCnDA,eAAsBE,EACpBC,EAC8B,CAC9B,GAAI,CAGF,OAFiB,MAAMA,EAAc,IAAI,8BAA8B,GAC3B,KAAK,IAEnD,OAASC,EAAP,CACA,eAAQ,MAAM,0CAA2CA,EAAI,OAAO,EAC7D,CAAC,CACV,CACF,CrBZA,IAAMC,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAePC,EAAN,KAAqB,CAM1B,YAAYC,EAAgBC,EAAmB,gBAAiB,CAC9D,KAAK,OAASD,EACd,KAAK,SAAWC,EAGhB,KAAK,cAAgB,EAAAC,QAAM,OAAO,CAChC,QAAS,WAAW,KAAK,4BACzB,WAAY,IAAI,EAAAC,QAAM,MAAM,CAC1B,GAAIL,GACJ,mBAAoB,EACtB,CAAC,EACD,QAAS,CACP,sBAAuB,KAAK,OAC5B,eAAgB,kBAClB,CACF,CAAC,CACH,CAEA,cAAcM,EAA+B,CAC3C,OAAOC,EAAcD,EAAS,KAAK,QAAQ,CAC7C,CAEA,MAAM,eAA8B,CAClC,OAAO,MAAME,EAAc,KAAK,aAAa,CAC/C,CAEA,MAAM,gBAA+B,CACnC,OAAO,MAAMC,EAAe,KAAK,aAAa,CAChD,CAEA,MAAM,gBAA+B,CACnC,OAAO,MAAMC,EAAe,KAAK,aAAa,CAChD,CAGA,MAAM,SAASC,EAA+B,CAC5C,OAAO,MAAMC,EAAS,KAAK,cAAeD,CAAO,CACnD,CAEA,MAAM,WAA0B,CAC9B,OAAO,MAAME,EAAU,KAAK,aAAa,CAC3C,CAEA,MAAM,UAA2B,CAC/B,OAAO,MAAMC,EAAS,KAAK,aAAa,CAC1C,CAEA,MAAM,WAA4B,CAChC,OAAO,MAAMC,EAAU,KAAK,aAAa,CAC3C,CAEA,MAAM,SAASC,EAAmC,CAChD,OAAO,MAAMC,EAAS,KAAK,cAAeD,CAAO,CACnD,CAEA,MAAM,SACJL,EACAO,EACAC,EACAC,EACAC,EACkB,CAClB,OAAO,MAAMC,EACX,KAAK,cACLX,EACAO,EACAC,EACAC,EACAC,CACF,CACF,CAEA,MAAM,YACJV,EACAY,EACAJ,EACAC,EACAC,EACkB,CAClB,OAAO,MAAMG,EACX,KAAK,cACLb,EACAY,EACAJ,EACAC,EACAC,CACF,CACF,CAEA,MAAM,cAAcV,EAAiBQ,EAAiC,CACpE,OAAO,MAAMM,EAAc,KAAK,cAAed,EAASQ,CAAI,CAC9D,CAEA,MAAM,sBACJR,EACAY,EACAH,EACAC,EACkB,CAClB,OAAO,MAAMK,EACX,KAAK,cACLf,EACAY,EACAH,EACAC,CACF,CACF,CAEA,MAAM,cACJV,EACAO,EACAE,EACAC,EACkB,CAClB,OAAO,MAAMM,EAAc,KAAK,cAAehB,EAASO,EAASE,EAAYC,CAAU,CACzF,CAEA,MAAM,WAA4B,CAChC,OAAO,MAAMO,EAAU,KAAK,aAAa,CAC3C,CAEA,MAAM,UACJC,EACAT,EACAF,EACAC,EACkB,CAClB,OAAO,MAAMW,EACX,KAAK,cACLD,EACAT,EACAF,EACAC,CACF,CACF,CAEA,MAAM,SACJY,EACAX,EACAF,EACAC,EACkB,CAClB,OAAO,MAAMa,EACX,KAAK,cACLD,EACAX,EACAF,EACAC,CACF,CACF,CAEA,MAAM,kBAAqC,CACzC,OAAO,MAAMc,EAAiB,KAAK,aAAa,CAClD,CACA,MAAM,6BAAgD,CACpD,OAAO,MAAMC,EAA4B,KAAK,aAAa,CAC7D,CAEA,iBACEC,EACAC,EACM,CACN,GAAI,KAAK,YAAa,CACpB,QAAQ,KAAK,kCAAkC,EAC/C,OAGF,KAAK,YAAcC,EACjB,KAAK,SACL,KAAK,OACLF,EACAC,CACF,CACF,CAEA,iBAAwB,CAClB,KAAK,aACP,KAAK,YAAY,MAAM,EACvB,KAAK,YAAc,OACnB,QAAQ,IAAI,iCAA0B,GAEtC,QAAQ,KAAK,0BAA0B,CAE3C,CAMA,MAAM,uBAAsD,CAC1D,OAAO,MAAME,EAAsB,KAAK,aAAa,CACvD,CACF,EsB/OA,IAAAC,EAAqC,sBAUrC,eAAsBC,GACpBC,EACAC,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,GAAI,CACF,IAAMC,EAAmB,CAAC,EAG1B,GAAIH,IAAS,QAEX,GADAG,EAAY,GAAKH,EACbA,EAAM,CACR,GAAIC,IAAe,OAAW,CAE5B,IAAMG,EAAM,KAAK,IAAI,EAAG,KAAK,MAAOH,EAAa,IAAO,GAAG,CAAC,EAC5DE,EAAY,IAAMC,EAEhBL,IAEFI,EAAY,GAAK,CAACJ,EAAQ,EAAGA,EAAQ,CAAC,GAEpCG,GAAcA,EAAa,IAE7BC,EAAY,eAAiB,KAAK,MAAMD,EAAa,GAAG,QAGvD,CAEL,GAAID,IAAe,OAAW,CAC5B,IAAMG,EAAM,KAAK,IAAI,EAAG,KAAK,MAAOH,EAAa,IAAO,GAAG,CAAC,EAC5DE,EAAY,IAAMC,EAEhBL,IACFI,EAAY,GAAK,CAACJ,EAAQ,EAAGA,EAAQ,CAAC,GAEpCG,GAAcA,EAAa,IAC7BC,EAAY,eAAiB,KAAK,MAAMD,EAAa,GAAG,GAI5D,GAAI,OAAO,KAAKC,CAAW,EAAE,SAAW,EACtC,eAAQ,MAAM,gCAAgC,EACvC,GAGT,IAAME,EAAW,MAAMR,EAAc,IAAI,WAAWC,UAAiBK,CAAW,EAEhF,GAAIE,EAAS,SAAW,IAAK,CAE3B,IAAMC,EAAOD,EAAS,KACtB,OAAI,MAAM,QAAQC,CAAI,GAAKA,EAAK,MAAMC,GAAQA,EAAK,OAAO,EACjD,OAIT,gBAAQ,KAAK,+BAA+BF,EAAS,QAAQ,EACtD,EAEX,OAASG,EAAP,CACA,eAAQ,MAAM,2BAA2BV,MAAaU,EAAI,OAAO,EAC7DA,EAAI,UACN,QAAQ,MAAM,iBAAkB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAErE,EACT,CACF,CAEA,eAAsBC,GACpBZ,EACAC,EACAY,EACAV,EACAC,EACAC,EACkB,CAClB,GAAI,CACF,GAAI,CAACQ,GAAkBA,EAAe,OAAS,GAAKA,EAAe,OAAS,EAC1E,eAAQ,MAAM,iDAAiD,EACxD,GAGTA,EAAe,QAAQ,CAACC,EAAOC,IAAU,CACvC,QAAQ,IAAI,mBAAYA,EAAQ,OAAOD,EAAM,MAAMA,EAAM,IAAI,CAC/D,CAAC,EAGD,IAAMP,EAAM,KAAK,IAAI,EAAG,KAAK,MAAOH,EAAa,IAAO,GAAG,CAAC,EAGtDY,EAAiBX,GAAcA,EAAa,EAAI,KAAK,MAAMA,EAAa,GAAG,EAAI,OAG/EC,EAAmB,CACvB,GAAIH,EACJ,IAAAI,EACA,SAAU,CACR,OAAQM,EAAe,IAAKI,IAAQ,CAAE,GAAI,CAACA,EAAG,EAAGA,EAAG,CAAC,CAAE,EAAE,CAC3D,CACF,EAEID,IAAmB,SACrBV,EAAY,eAAiBU,GAG/B,IAAMR,EAAW,MAAMR,EAAc,IAAI,WAAWC,UAAiBK,CAAW,EAEhF,GAAIE,EAAS,SAAW,IAAK,CAC3B,QAAQ,IAAI,8BAA8BP,GAAS,EACnD,IAAMQ,EAAOD,EAAS,KACtB,OAAI,MAAM,QAAQC,CAAI,GAAKA,EAAK,MAAOC,GAAcA,EAAK,OAAO,EACxD,OAIT,gBAAQ,KAAK,+BAA+BF,EAAS,QAAQ,EACtD,EAEX,OAASG,EAAP,CACA,eAAQ,MAAM,oCAAoCV,MAAaU,EAAI,OAAO,EACtEA,EAAI,UACN,QAAQ,MAAM,iBAAkB,KAAK,UAAUA,EAAI,SAAS,KAAM,KAAM,CAAC,CAAC,EAErE,EACT,CACF,CASO,IAAMO,EAAN,KAAuB,CAK5B,YAAYC,EAAgBC,EAAmB,gBAAiB,CAC9D,KAAK,OAASD,EACd,KAAK,SAAWC,EAEhB,KAAK,cAAgB,EAAAC,QAAM,OAAO,CAChC,QAAS,UAAU,KAAK,gBAAgB,KAAK,SAC7C,QAAS,CACP,eAAgB,kBAClB,CACF,CAAC,CACH,CAMA,MAAM,cAAcC,EAAkC,CACpD,GAAI,CACF,IAAMd,EAAW,MAAM,EAAAa,QAAM,KAAK,UAAU,KAAK,eAAgB,CAAE,WAAYC,CAAQ,CAAC,EACxF,GAAId,EAAS,MAAQ,MAAM,QAAQA,EAAS,IAAI,GAAKA,EAAS,KAAK,CAAC,EAAE,QAAS,CAC7E,IAAMe,EAAWf,EAAS,KAAK,CAAC,EAAE,QAAQ,SAC1C,YAAK,OAASe,EAEd,KAAK,cAAgB,EAAAF,QAAM,OAAO,CAChC,QAAS,UAAU,KAAK,gBAAgB,KAAK,SAC7C,QAAS,CACP,eAAgB,kBAClB,CACF,CAAC,EACME,MAEP,OAAM,IAAI,MAAM,yCAAyC,CAE7D,OAASZ,EAAP,CACA,cAAQ,MAAM,yCAA0CA,EAAI,OAAO,EAC7DA,CACR,CACF,CAEA,MAAM,eAA8B,CAClC,OAAO,MAAM,KAAK,cAAc,IAAI,SAAS,CAC/C,CAEA,MAAM,WAA0B,CAC9B,OAAO,MAAM,KAAK,cAAc,IAAI,SAAS,CAC/C,CAEA,MAAM,SAASV,EAA+B,CAC5C,OAAO,MAAM,KAAK,cAAc,IAAI,WAAWA,GAAS,CAC1D,CAMA,MAAM,SACJA,EACAC,EACAC,EACAC,EACAC,EACkB,CAClB,OAAO,MAAMN,GAAW,KAAK,cAAeE,EAASC,EAASC,EAAMC,EAAYC,CAAU,CAC5F,CAME,MAAM,YACJJ,EACAY,EACAV,EACAC,EACAC,EACkB,CAClB,OAAO,MAAMO,GAAc,KAAK,cAAeX,EAASY,EAAgBV,EAAMC,EAAYC,CAAU,CACtG,CAMF,MAAM,cAAcJ,EAAiBE,EAAiC,CACpE,GAAI,CACF,IAAMK,EAAW,MAAM,KAAK,cAAc,IAAI,WAAWP,UAAiB,CAAE,GAAIE,CAAK,CAAC,EACtF,GAAIK,EAAS,SAAW,IAAK,CAC3B,IAAMC,EAAOD,EAAS,KACtB,OAAI,MAAM,QAAQC,CAAI,GAAKA,EAAK,MAAOC,GAAcA,EAAK,OAAO,EACxD,OAIT,gBAAQ,KAAK,+BAA+BF,EAAS,QAAQ,EACtD,EAEX,OAASG,EAAP,CACA,eAAQ,MAAM,iCAAiCV,MAAaU,EAAI,OAAO,EAChE,EACT,CACF,CAGF","names":["src_exports","__export","HueIntegration","HueIntegrationV1","__toCommonJS","import_axios","import_https","import_axios","import_https","connectBridge","appName","bridgeIp","maxRetries","retries","response","axios","https","entry","username","clientkey","res","err","getBridgeInfo","axiosInstance","bridgeData","bridgeInfo","err","import_https","startEventStream","bridgeIp","apiKey","onMessage","onError","url","isClosed","buffer","options","req","https","res","chunk","lines","eventType","eventId","line","trimmedLine","jsonString","parsedData","event","err","error","getTemperature","axiosInstance","devices","deviceMap","device","sensors","sensor","index","deviceName","sensorObj","err","getMLightLevel","axiosInstance","devices","deviceMap","device","sensors","sensor","index","deviceName","sensorObj","err","getLights","axiosInstance","lights","light","index","err","getLight","axiosInstance","lightId","light","err","getScenes","axiosInstance","scenes","scene","index","sceneObj","err","setScene","axiosInstance","sceneId","scenes","scene","response","err","setLight","axiosInstance","lightId","xyColor","isOn","brightness","transition","requestBody","response","err","setLightPower","axiosInstance","lightId","isOn","requestBody","response","err","setLightColor","axiosInstance","lightId","xyColor","brightness","transition","requestBody","response","err","setGradient","axiosInstance","lightId","gradientColors","isOn","brightness","transition","color","index","duration","requestBody","xy","response","err","setLightColorGradient","axiosInstance","lightId","gradientColors","brightness","transition","color","index","duration","requestBody","xy","response","err","getGroups","axiosInstance","groups","rooms","groupToRoomMap","room","groupedLightService","s","group","index","roomName","groupObj","err","setGroup","axiosInstance","groupId","brightness","xyColor","isOn","requestBody","response","err","setGroups","axiosInstance","groupIds","brightness","xyColor","isOn","results","groupId","success","setGroup","result","err","getRooms","axiosInstance","rooms","room","index","roomObj","s","err","turnOffAllLights","axiosInstance","groups","groupZero","group","offPayload","offResponse","error","turnOffAllLightsExceptPlugs","axiosInstance","lightsResponse","lightsArray","nonPlugLightIds","filteredOutPlugIds","light","i","batch","lightId","offPayload","offResponse","error","resolve","getEntertainmentAreas","axiosInstance","err","certificate","HueIntegration","apiKey","bridgeIp","axios","https","appName","connectBridge","getBridgeInfo","getTemperature","getMLightLevel","lightId","getLight","getLights","getRooms","getScenes","sceneId","setScene","xyColor","isOn","brightness","transition","setLight","gradientColors","setGradient","setLightPower","setLightColorGradient","setLightColor","getGroups","groupIds","setGroups","groupId","setGroup","turnOffAllLights","turnOffAllLightsExceptPlugs","onMessage","onError","startEventStream","getEntertainmentAreas","import_axios","setLightV1","axiosInstance","lightId","xyColor","isOn","brightness","transition","requestBody","bri","response","data","item","err","setGradientV1","gradientColors","color","index","transitiontime","xy","HueIntegrationV1","apiKey","bridgeIp","axios","appName","username"]}