From 0ae6585a906eb974812d3404ef54ec3a47334922 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Sun, 4 Dec 2016 00:31:27 +0100 Subject: [PATCH 01/14] Bugfix sonos hosts (#4698) --- homeassistant/components/media_player/sonos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/media_player/sonos.py b/homeassistant/components/media_player/sonos.py index b5367486e38..1fa1a39633d 100644 --- a/homeassistant/components/media_player/sonos.py +++ b/homeassistant/components/media_player/sonos.py @@ -59,7 +59,7 @@ ATTR_SLEEP_TIME = 'sleep_time' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_ADVERTISE_ADDR): cv.string, vol.Optional(CONF_INTERFACE_ADDR): cv.string, - vol.Optional(CONF_HOSTS): cv.ensure_list(cv.string), + vol.Optional(CONF_HOSTS): vol.All(cv.ensure_list, [cv.string]), }) SONOS_SCHEMA = vol.Schema({ From 9b9b625ac4d864deb5ebf85211a6835ff4c82acc Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 4 Dec 2016 09:54:49 -0800 Subject: [PATCH 02/14] Fix synology dsm doing I/O inside loop (#4699) --- .../components/sensor/synologydsm.py | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/sensor/synologydsm.py b/homeassistant/components/sensor/synologydsm.py index 31201879207..6dc23a71d9b 100644 --- a/homeassistant/components/sensor/synologydsm.py +++ b/homeassistant/components/sensor/synologydsm.py @@ -151,15 +151,9 @@ class SynoApi(): except: _LOGGER.error("Error setting up Synology DSM") - def utilisation(self): - """Return utilisation information from API.""" - if self._api is not None: - return self._api.utilisation - - def storage(self): - """Return storage information from API.""" - if self._api is not None: - return self._api.storage + # Will be updated when `update` gets called. + self.utilisation = self._api.utilisation + self.storage = self._api.storage @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): @@ -219,14 +213,14 @@ class SynoNasUtilSensor(SynoNasSensor): 'memory_total_swap', 'memory_total_real'] if self.var_id in network_sensors or self.var_id in memory_sensors: - attr = getattr(self._api.utilisation(), self.var_id)(False) + attr = getattr(self._api.utilisation, self.var_id)(False) if self.var_id in network_sensors: return round(attr / 1024.0, 1) elif self.var_id in memory_sensors: return round(attr / 1024.0 / 1024.0, 1) else: - return getattr(self._api.utilisation(), self.var_id) + return getattr(self._api.utilisation, self.var_id) class SynoNasStorageSensor(SynoNasSensor): @@ -240,7 +234,7 @@ class SynoNasStorageSensor(SynoNasSensor): if self.monitor_device is not None: if self.var_id in temp_sensors: - attr = getattr(self._api.storage(), + attr = getattr(self._api.storage, self.var_id)(self.monitor_device) if self._api.temp_unit == TEMP_CELSIUS: @@ -248,5 +242,5 @@ class SynoNasStorageSensor(SynoNasSensor): else: return round(attr * 1.8 + 32.0, 1) else: - return getattr(self._api.storage(), + return getattr(self._api.storage, self.var_id)(self.monitor_device) From 93322b02511a4616d7b4d3464c99288b127bacf1 Mon Sep 17 00:00:00 2001 From: Josh Nichols Date: Sat, 3 Dec 2016 20:55:14 -0500 Subject: [PATCH 03/14] Updated python-nest to fix a camera bug when loading images (#4701) --- homeassistant/components/nest.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/nest.py b/homeassistant/components/nest.py index 01f7d6ab287..e19011c47b8 100644 --- a/homeassistant/components/nest.py +++ b/homeassistant/components/nest.py @@ -19,7 +19,7 @@ _LOGGER = logging.getLogger(__name__) REQUIREMENTS = [ 'http://github.com/technicalpickles/python-nest' - '/archive/0be5c8a6307ee81540f21aac4fcd22cc5d98c988.zip' # nest-cam branch + '/archive/2512973b4b390d3965da43529cd20402ad374bfa.zip' # nest-cam branch '#python-nest==3.0.0'] DOMAIN = 'nest' diff --git a/requirements_all.txt b/requirements_all.txt index 56772281632..aefb21a93c9 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -164,7 +164,7 @@ hikvision==0.4 # http://github.com/adafruit/Adafruit_Python_DHT/archive/310c59b0293354d07d94375f1365f7b9b9110c7d.zip#Adafruit_DHT==1.3.0 # homeassistant.components.nest -http://github.com/technicalpickles/python-nest/archive/0be5c8a6307ee81540f21aac4fcd22cc5d98c988.zip#python-nest==3.0.0 +http://github.com/technicalpickles/python-nest/archive/2512973b4b390d3965da43529cd20402ad374bfa.zip#python-nest==3.0.0 # homeassistant.components.light.flux_led https://github.com/Danielhiversen/flux_led/archive/0.9.zip#flux_led==0.9 From 695fb412cd23a037a1a6897e0eafc7051e86fee8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 4 Dec 2016 10:57:48 -0800 Subject: [PATCH 04/14] Re-org emulated_hue and fix google home (#4708) --- homeassistant/components/emulated_hue.py | 566 ------------- .../components/emulated_hue/__init__.py | 198 +++++ .../components/emulated_hue/hue_api.py | 275 ++++++ homeassistant/components/emulated_hue/upnp.py | 166 ++++ tests/components/emulated_hue/__init__.py | 1 + .../test_hue_api.py} | 784 ++++++++---------- tests/components/emulated_hue/test_init.py | 55 ++ tests/components/emulated_hue/test_upnp.py | 120 +++ 8 files changed, 1170 insertions(+), 995 deletions(-) delete mode 100644 homeassistant/components/emulated_hue.py create mode 100644 homeassistant/components/emulated_hue/__init__.py create mode 100644 homeassistant/components/emulated_hue/hue_api.py create mode 100644 homeassistant/components/emulated_hue/upnp.py create mode 100644 tests/components/emulated_hue/__init__.py rename tests/components/{test_emulated_hue.py => emulated_hue/test_hue_api.py} (78%) mode change 100755 => 100644 create mode 100755 tests/components/emulated_hue/test_init.py create mode 100644 tests/components/emulated_hue/test_upnp.py diff --git a/homeassistant/components/emulated_hue.py b/homeassistant/components/emulated_hue.py deleted file mode 100644 index 7fd187daa4d..00000000000 --- a/homeassistant/components/emulated_hue.py +++ /dev/null @@ -1,566 +0,0 @@ -""" -Support for local control of entities by emulating the Phillips Hue bridge. - -For more details about this component, please refer to the documentation at -https://home-assistant.io/components/emulated_hue/ -""" -import asyncio -import threading -import socket -import logging -import os -import select - -from aiohttp import web -import voluptuous as vol - -from homeassistant import util, core -from homeassistant.const import ( - ATTR_ENTITY_ID, ATTR_FRIENDLY_NAME, SERVICE_TURN_OFF, SERVICE_TURN_ON, - EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, - STATE_ON, STATE_OFF, HTTP_BAD_REQUEST, HTTP_NOT_FOUND, -) -from homeassistant.components.light import ( - ATTR_BRIGHTNESS, ATTR_SUPPORTED_FEATURES, SUPPORT_BRIGHTNESS -) -from homeassistant.components.http import ( - HomeAssistantView, HomeAssistantWSGI -) -import homeassistant.helpers.config_validation as cv - -DOMAIN = 'emulated_hue' - -_LOGGER = logging.getLogger(__name__) - -CONF_HOST_IP = 'host_ip' -CONF_LISTEN_PORT = 'listen_port' -CONF_OFF_MAPS_TO_ON_DOMAINS = 'off_maps_to_on_domains' -CONF_EXPOSE_BY_DEFAULT = 'expose_by_default' -CONF_EXPOSED_DOMAINS = 'exposed_domains' - -ATTR_EMULATED_HUE = 'emulated_hue' -ATTR_EMULATED_HUE_NAME = 'emulated_hue_name' - -DEFAULT_LISTEN_PORT = 8300 -DEFAULT_OFF_MAPS_TO_ON_DOMAINS = ['script', 'scene'] -DEFAULT_EXPOSE_BY_DEFAULT = True -DEFAULT_EXPOSED_DOMAINS = [ - 'switch', 'light', 'group', 'input_boolean', 'media_player', 'fan' -] - -HUE_API_STATE_ON = 'on' -HUE_API_STATE_BRI = 'bri' - -CONFIG_SCHEMA = vol.Schema({ - DOMAIN: vol.Schema({ - vol.Optional(CONF_HOST_IP): cv.string, - vol.Optional(CONF_LISTEN_PORT, default=DEFAULT_LISTEN_PORT): - vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)), - vol.Optional(CONF_OFF_MAPS_TO_ON_DOMAINS): cv.ensure_list, - vol.Optional(CONF_EXPOSE_BY_DEFAULT): cv.boolean, - vol.Optional(CONF_EXPOSED_DOMAINS): cv.ensure_list - }) -}, extra=vol.ALLOW_EXTRA) - - -def setup(hass, yaml_config): - """Activate the emulated_hue component.""" - config = Config(yaml_config) - - server = HomeAssistantWSGI( - hass, - development=False, - server_host=config.host_ip_addr, - server_port=config.listen_port, - api_password=None, - ssl_certificate=None, - ssl_key=None, - cors_origins=None, - use_x_forwarded_for=False, - trusted_networks=[], - login_threshold=0, - is_ban_enabled=False - ) - - server.register_view(DescriptionXmlView(config)) - server.register_view(HueUsernameView) - server.register_view(HueLightsView(config)) - - upnp_listener = UPNPResponderThread( - config.host_ip_addr, config.listen_port) - - @asyncio.coroutine - def stop_emulated_hue_bridge(event): - """Stop the emulated hue bridge.""" - upnp_listener.stop() - yield from server.stop() - - @asyncio.coroutine - def start_emulated_hue_bridge(event): - """Start the emulated hue bridge.""" - upnp_listener.start() - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, - stop_emulated_hue_bridge) - yield from server.start() - - hass.bus.listen_once(EVENT_HOMEASSISTANT_START, start_emulated_hue_bridge) - - return True - - -class Config(object): - """Holds configuration variables for the emulated hue bridge.""" - - def __init__(self, yaml_config): - """Initialize the instance.""" - conf = yaml_config.get(DOMAIN, {}) - - # Get the IP address that will be passed to the Echo during discovery - self.host_ip_addr = conf.get(CONF_HOST_IP) - if self.host_ip_addr is None: - self.host_ip_addr = util.get_local_ip() - _LOGGER.warning( - "Listen IP address not specified, auto-detected address is %s", - self.host_ip_addr) - - # Get the port that the Hue bridge will listen on - self.listen_port = conf.get(CONF_LISTEN_PORT) - if not isinstance(self.listen_port, int): - self.listen_port = DEFAULT_LISTEN_PORT - _LOGGER.warning( - "Listen port not specified, defaulting to %s", - self.listen_port) - - # Get domains that cause both "on" and "off" commands to map to "on" - # This is primarily useful for things like scenes or scripts, which - # don't really have a concept of being off - self.off_maps_to_on_domains = conf.get(CONF_OFF_MAPS_TO_ON_DOMAINS) - if not isinstance(self.off_maps_to_on_domains, list): - self.off_maps_to_on_domains = DEFAULT_OFF_MAPS_TO_ON_DOMAINS - - # Get whether or not entities should be exposed by default, or if only - # explicitly marked ones will be exposed - self.expose_by_default = conf.get( - CONF_EXPOSE_BY_DEFAULT, DEFAULT_EXPOSE_BY_DEFAULT) - - # Get domains that are exposed by default when expose_by_default is - # True - self.exposed_domains = conf.get( - CONF_EXPOSED_DOMAINS, DEFAULT_EXPOSED_DOMAINS) - - -class DescriptionXmlView(HomeAssistantView): - """Handles requests for the description.xml file.""" - - url = '/description.xml' - name = 'description:xml' - requires_auth = False - - def __init__(self, config): - """Initialize the instance of the view.""" - self.config = config - - @core.callback - def get(self, request): - """Handle a GET request.""" - xml_template = """ - - -1 -0 - -http://{0}:{1}/ - -urn:schemas-upnp-org:device:Basic:1 -HASS Bridge ({0}) -Royal Philips Electronics -http://www.philips.com -Philips hue Personal Wireless Lighting -Philips hue bridge 2015 -BSB002 -http://www.meethue.com -1234 -uuid:2f402f80-da50-11e1-9b23-001788255acc - - -""" - - resp_text = xml_template.format( - self.config.host_ip_addr, self.config.listen_port) - - return web.Response(text=resp_text, content_type='text/xml') - - -class HueUsernameView(HomeAssistantView): - """Handle requests to create a username for the emulated hue bridge.""" - - url = '/api' - name = 'hue:api' - extra_urls = ['/api/'] - requires_auth = False - - @asyncio.coroutine - def post(self, request): - """Handle a POST request.""" - try: - data = yield from request.json() - except ValueError: - return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) - - if 'devicetype' not in data: - return self.json_message('devicetype not specified', - HTTP_BAD_REQUEST) - - return self.json([{'success': {'username': '12345678901234567890'}}]) - - -class HueLightsView(HomeAssistantView): - """Handle requests for getting and setting info about entities.""" - - url = '/api/{username}/lights' - name = 'api:username:lights' - extra_urls = ['/api/{username}/lights/{entity_id}', - '/api/{username}/lights/{entity_id}/state'] - requires_auth = False - - def __init__(self, config): - """Initialize the instance of the view.""" - self.config = config - self.cached_states = {} - - @core.callback - def get(self, request, username, entity_id=None): - """Handle a GET request.""" - hass = request.app['hass'] - - if entity_id is None: - return self.async_get_lights_list(hass) - - if not request.path.endswith('state'): - return self.async_get_light_state(hass, entity_id) - - return web.Response(text="Method not allowed", status=405) - - @asyncio.coroutine - def put(self, request, username, entity_id=None): - """Handle a PUT request.""" - hass = request.app['hass'] - - if not request.path.endswith('state'): - return web.Response(text="Method not allowed", status=405) - - if entity_id and hass.states.get(entity_id) is None: - return self.json_message('Entity not found', HTTP_NOT_FOUND) - - try: - json_data = yield from request.json() - except ValueError: - return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) - - result = yield from self.async_put_light_state(hass, json_data, - entity_id) - return result - - @core.callback - def async_get_lights_list(self, hass): - """Process a request to get the list of available lights.""" - json_response = {} - - for entity in hass.states.async_all(): - if self.is_entity_exposed(entity): - json_response[entity.entity_id] = entity_to_json(entity) - - return self.json(json_response) - - @core.callback - def async_get_light_state(self, hass, entity_id): - """Process a request to get the state of an individual light.""" - entity = hass.states.get(entity_id) - if entity is None or not self.is_entity_exposed(entity): - return web.Response(text="Entity not found", status=404) - - cached_state = self.cached_states.get(entity_id, None) - - if cached_state is None: - final_state = entity.state == STATE_ON - final_brightness = entity.attributes.get( - ATTR_BRIGHTNESS, 255 if final_state else 0) - else: - final_state, final_brightness = cached_state - - json_response = entity_to_json(entity, final_state, final_brightness) - - return self.json(json_response) - - @asyncio.coroutine - def async_put_light_state(self, hass, request_json, entity_id): - """Process a request to set the state of an individual light.""" - config = self.config - - # Retrieve the entity from the state machine - entity = hass.states.get(entity_id) - if entity is None: - return web.Response(text="Entity not found", status=404) - - if not self.is_entity_exposed(entity): - return web.Response(text="Entity not found", status=404) - - # Parse the request into requested "on" status and brightness - parsed = parse_hue_api_put_light_body(request_json, entity) - - if parsed is None: - return web.Response(text="Bad request", status=400) - - result, brightness = parsed - - # Convert the resulting "on" status into the service we need to call - service = SERVICE_TURN_ON if result else SERVICE_TURN_OFF - - # Construct what we need to send to the service - data = {ATTR_ENTITY_ID: entity_id} - - # If the requested entity is a script add some variables - if entity.domain.lower() == "script": - data['variables'] = { - 'requested_state': STATE_ON if result else STATE_OFF - } - - if brightness is not None: - data['variables']['requested_level'] = brightness - - elif brightness is not None: - data[ATTR_BRIGHTNESS] = brightness - - if entity.domain.lower() in config.off_maps_to_on_domains: - # Map the off command to on - service = SERVICE_TURN_ON - - # Caching is required because things like scripts and scenes won't - # report as "off" to Alexa if an "off" command is received, because - # they'll map to "on". Thus, instead of reporting its actual - # status, we report what Alexa will want to see, which is the same - # as the actual requested command. - self.cached_states[entity_id] = (result, brightness) - - # Perform the requested action - yield from hass.services.async_call(core.DOMAIN, service, data, - blocking=True) - - json_response = \ - [create_hue_success_response(entity_id, HUE_API_STATE_ON, result)] - - if brightness is not None: - json_response.append(create_hue_success_response( - entity_id, HUE_API_STATE_BRI, brightness)) - - return self.json(json_response) - - def is_entity_exposed(self, entity): - """Determine if an entity should be exposed on the emulated bridge. - - Async friendly. - """ - config = self.config - - if entity.attributes.get('view') is not None: - # Ignore entities that are views - return False - - domain = entity.domain.lower() - explicit_expose = entity.attributes.get(ATTR_EMULATED_HUE, None) - - domain_exposed_by_default = \ - config.expose_by_default and domain in config.exposed_domains - - # Expose an entity if the entity's domain is exposed by default and - # the configuration doesn't explicitly exclude it from being - # exposed, or if the entity is explicitly exposed - is_default_exposed = \ - domain_exposed_by_default and explicit_expose is not False - - return is_default_exposed or explicit_expose - - -def parse_hue_api_put_light_body(request_json, entity): - """Parse the body of a request to change the state of a light.""" - if HUE_API_STATE_ON in request_json: - if not isinstance(request_json[HUE_API_STATE_ON], bool): - return None - - if request_json['on']: - # Echo requested device be turned on - brightness = None - report_brightness = False - result = True - else: - # Echo requested device be turned off - brightness = None - report_brightness = False - result = False - - if HUE_API_STATE_BRI in request_json: - # Make sure the entity actually supports brightness - entity_features = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0) - - if (entity_features & SUPPORT_BRIGHTNESS) == SUPPORT_BRIGHTNESS: - try: - # Clamp brightness from 0 to 255 - brightness = \ - max(0, min(int(request_json[HUE_API_STATE_BRI]), 255)) - except ValueError: - return None - - report_brightness = True - result = (brightness > 0) - elif entity.domain.lower() == "script": - # Convert 0-255 to 0-100 - level = int(request_json[HUE_API_STATE_BRI]) / 255 * 100 - - brightness = round(level) - report_brightness = True - result = True - - return (result, brightness) if report_brightness else (result, None) - - -def entity_to_json(entity, is_on=None, brightness=None): - """Convert an entity to its Hue bridge JSON representation.""" - if is_on is None: - is_on = entity.state == STATE_ON - - if brightness is None: - brightness = 255 if is_on else 0 - - name = entity.attributes.get( - ATTR_EMULATED_HUE_NAME, entity.attributes[ATTR_FRIENDLY_NAME]) - - return { - 'state': - { - HUE_API_STATE_ON: is_on, - HUE_API_STATE_BRI: brightness, - 'reachable': True - }, - 'type': 'Dimmable light', - 'name': name, - 'modelid': 'HASS123', - 'uniqueid': entity.entity_id, - 'swversion': '123' - } - - -def create_hue_success_response(entity_id, attr, value): - """Create a success response for an attribute set on a light.""" - success_key = '/lights/{}/state/{}'.format(entity_id, attr) - return {'success': {success_key: value}} - - -class UPNPResponderThread(threading.Thread): - """Handle responding to UPNP/SSDP discovery requests.""" - - _interrupted = False - - def __init__(self, host_ip_addr, listen_port): - """Initialize the class.""" - threading.Thread.__init__(self) - - self.host_ip_addr = host_ip_addr - self.listen_port = listen_port - - # Note that the double newline at the end of - # this string is required per the SSDP spec - resp_template = """HTTP/1.1 200 OK -CACHE-CONTROL: max-age=60 -EXT: -LOCATION: http://{0}:{1}/description.xml -SERVER: FreeRTOS/6.0.5, UPnP/1.0, IpBridge/0.1 -ST: urn:schemas-upnp-org:device:basic:1 -USN: uuid:Socket-1_0-221438K0100073::urn:schemas-upnp-org:device:basic:1 - -""" - - self.upnp_response = resp_template.format(host_ip_addr, listen_port) \ - .replace("\n", "\r\n") \ - .encode('utf-8') - - # Set up a pipe for signaling to the receiver that it's time to - # shutdown. Essentially, we place the SSDP socket into nonblocking - # mode and use select() to wait for data to arrive on either the SSDP - # socket or the pipe. If data arrives on either one, select() returns - # and tells us which filenos have data ready to read. - # - # When we want to stop the responder, we write data to the pipe, which - # causes the select() to return and indicate that said pipe has data - # ready to be read, which indicates to us that the responder needs to - # be shutdown. - self._interrupted_read_pipe, self._interrupted_write_pipe = os.pipe() - - def run(self): - """Run the server.""" - # Listen for UDP port 1900 packets sent to SSDP multicast address - ssdp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - ssdp_socket.setblocking(False) - - # Required for receiving multicast - ssdp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - - ssdp_socket.setsockopt( - socket.SOL_IP, - socket.IP_MULTICAST_IF, - socket.inet_aton(self.host_ip_addr)) - - ssdp_socket.setsockopt( - socket.SOL_IP, - socket.IP_ADD_MEMBERSHIP, - socket.inet_aton("239.255.255.250") + - socket.inet_aton(self.host_ip_addr)) - - ssdp_socket.bind(("239.255.255.250", 1900)) - - while True: - if self._interrupted: - clean_socket_close(ssdp_socket) - return - - try: - read, _, _ = select.select( - [self._interrupted_read_pipe, ssdp_socket], [], - [ssdp_socket]) - - if self._interrupted_read_pipe in read: - # Implies self._interrupted is True - clean_socket_close(ssdp_socket) - return - elif ssdp_socket in read: - data, addr = ssdp_socket.recvfrom(1024) - else: - continue - except socket.error as ex: - if self._interrupted: - clean_socket_close(ssdp_socket) - return - - _LOGGER.error("UPNP Responder socket exception occured: %s", - ex.__str__) - - if "M-SEARCH" in data.decode('utf-8'): - # SSDP M-SEARCH method received, respond to it with our info - resp_socket = socket.socket( - socket.AF_INET, socket.SOCK_DGRAM) - - resp_socket.sendto(self.upnp_response, addr) - resp_socket.close() - - def stop(self): - """Stop the server.""" - # Request for server - self._interrupted = True - os.write(self._interrupted_write_pipe, bytes([0])) - self.join() - - -def clean_socket_close(sock): - """Close a socket connection and logs its closure.""" - _LOGGER.info("UPNP responder shutting down.") - - sock.close() diff --git a/homeassistant/components/emulated_hue/__init__.py b/homeassistant/components/emulated_hue/__init__.py new file mode 100644 index 00000000000..2efce06528d --- /dev/null +++ b/homeassistant/components/emulated_hue/__init__.py @@ -0,0 +1,198 @@ +""" +Support for local control of entities by emulating the Phillips Hue bridge. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/emulated_hue/ +""" +import asyncio +import logging + +import voluptuous as vol + +from homeassistant import util +from homeassistant.const import ( + EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, +) +from homeassistant.components.http import HomeAssistantWSGI +import homeassistant.helpers.config_validation as cv +from .hue_api import ( + HueUsernameView, HueAllLightsStateView, HueOneLightStateView, + HueOneLightChangeView) +from .upnp import DescriptionXmlView, UPNPResponderThread + +DOMAIN = 'emulated_hue' + +_LOGGER = logging.getLogger(__name__) + +CONF_HOST_IP = 'host_ip' +CONF_LISTEN_PORT = 'listen_port' +CONF_OFF_MAPS_TO_ON_DOMAINS = 'off_maps_to_on_domains' +CONF_EXPOSE_BY_DEFAULT = 'expose_by_default' +CONF_EXPOSED_DOMAINS = 'exposed_domains' +CONF_TYPE = 'type' + +TYPE_ALEXA = 'alexa' +TYPE_GOOGLE = 'google_home' + +DEFAULT_LISTEN_PORT = 8300 +DEFAULT_OFF_MAPS_TO_ON_DOMAINS = ['script', 'scene'] +DEFAULT_EXPOSE_BY_DEFAULT = True +DEFAULT_EXPOSED_DOMAINS = [ + 'switch', 'light', 'group', 'input_boolean', 'media_player', 'fan' +] +DEFAULT_TYPE = TYPE_ALEXA + +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Optional(CONF_HOST_IP): cv.string, + vol.Optional(CONF_LISTEN_PORT, default=DEFAULT_LISTEN_PORT): + vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)), + vol.Optional(CONF_OFF_MAPS_TO_ON_DOMAINS): cv.ensure_list, + vol.Optional(CONF_EXPOSE_BY_DEFAULT): cv.boolean, + vol.Optional(CONF_EXPOSED_DOMAINS): cv.ensure_list, + vol.Optional(CONF_TYPE, default=DEFAULT_TYPE): + vol.Any(TYPE_ALEXA, TYPE_GOOGLE) + }) +}, extra=vol.ALLOW_EXTRA) + +ATTR_EMULATED_HUE = 'emulated_hue' + + +def setup(hass, yaml_config): + """Activate the emulated_hue component.""" + config = Config(yaml_config.get(DOMAIN, {})) + + server = HomeAssistantWSGI( + hass, + development=False, + server_host=config.host_ip_addr, + server_port=config.listen_port, + api_password=None, + ssl_certificate=None, + ssl_key=None, + cors_origins=None, + use_x_forwarded_for=False, + trusted_networks=[], + login_threshold=0, + is_ban_enabled=False + ) + + server.register_view(DescriptionXmlView(config)) + server.register_view(HueUsernameView) + server.register_view(HueAllLightsStateView(config)) + server.register_view(HueOneLightStateView(config)) + server.register_view(HueOneLightChangeView(config)) + + upnp_listener = UPNPResponderThread( + config.host_ip_addr, config.listen_port) + + @asyncio.coroutine + def stop_emulated_hue_bridge(event): + """Stop the emulated hue bridge.""" + upnp_listener.stop() + yield from server.stop() + + @asyncio.coroutine + def start_emulated_hue_bridge(event): + """Start the emulated hue bridge.""" + upnp_listener.start() + yield from server.start() + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, + stop_emulated_hue_bridge) + + hass.bus.listen_once(EVENT_HOMEASSISTANT_START, start_emulated_hue_bridge) + + return True + + +class Config(object): + """Holds configuration variables for the emulated hue bridge.""" + + def __init__(self, conf): + """Initialize the instance.""" + self.type = conf.get(CONF_TYPE) + self.numbers = {} + self.cached_states = {} + + # Get the IP address that will be passed to the Echo during discovery + self.host_ip_addr = conf.get(CONF_HOST_IP) + if self.host_ip_addr is None: + self.host_ip_addr = util.get_local_ip() + _LOGGER.warning( + "Listen IP address not specified, auto-detected address is %s", + self.host_ip_addr) + + # Get the port that the Hue bridge will listen on + self.listen_port = conf.get(CONF_LISTEN_PORT) + if not isinstance(self.listen_port, int): + self.listen_port = DEFAULT_LISTEN_PORT + _LOGGER.warning( + "Listen port not specified, defaulting to %s", + self.listen_port) + + if self.type == TYPE_GOOGLE and self.listen_port != 80: + _LOGGER.warning('When targetting Google Home, listening port has ' + 'to be port 80') + + # Get domains that cause both "on" and "off" commands to map to "on" + # This is primarily useful for things like scenes or scripts, which + # don't really have a concept of being off + self.off_maps_to_on_domains = conf.get(CONF_OFF_MAPS_TO_ON_DOMAINS) + if not isinstance(self.off_maps_to_on_domains, list): + self.off_maps_to_on_domains = DEFAULT_OFF_MAPS_TO_ON_DOMAINS + + # Get whether or not entities should be exposed by default, or if only + # explicitly marked ones will be exposed + self.expose_by_default = conf.get( + CONF_EXPOSE_BY_DEFAULT, DEFAULT_EXPOSE_BY_DEFAULT) + + # Get domains that are exposed by default when expose_by_default is + # True + self.exposed_domains = conf.get( + CONF_EXPOSED_DOMAINS, DEFAULT_EXPOSED_DOMAINS) + + def entity_id_to_number(self, entity_id): + """Get a unique number for the entity id.""" + if self.type == TYPE_ALEXA: + return entity_id + + # Google Home + for number, ent_id in self.numbers.items(): + if entity_id == ent_id: + return number + + number = str(len(self.numbers) + 1) + self.numbers[number] = entity_id + return number + + def number_to_entity_id(self, number): + """Convert unique number to entity id.""" + if self.type == TYPE_ALEXA: + return number + + # Google Home + assert isinstance(number, str) + return self.numbers.get(number) + + def is_entity_exposed(self, entity): + """Determine if an entity should be exposed on the emulated bridge. + + Async friendly. + """ + if entity.attributes.get('view') is not None: + # Ignore entities that are views + return False + + domain = entity.domain.lower() + explicit_expose = entity.attributes.get(ATTR_EMULATED_HUE, None) + + domain_exposed_by_default = \ + self.expose_by_default and domain in self.exposed_domains + + # Expose an entity if the entity's domain is exposed by default and + # the configuration doesn't explicitly exclude it from being + # exposed, or if the entity is explicitly exposed + is_default_exposed = \ + domain_exposed_by_default and explicit_expose is not False + + return is_default_exposed or explicit_expose diff --git a/homeassistant/components/emulated_hue/hue_api.py b/homeassistant/components/emulated_hue/hue_api.py new file mode 100644 index 00000000000..ed06da9495b --- /dev/null +++ b/homeassistant/components/emulated_hue/hue_api.py @@ -0,0 +1,275 @@ +"""Provides a Hue API to control Home Assistant.""" +import asyncio +import logging + +from aiohttp import web + +from homeassistant import core +from homeassistant.const import ( + ATTR_ENTITY_ID, ATTR_FRIENDLY_NAME, SERVICE_TURN_OFF, SERVICE_TURN_ON, + STATE_ON, STATE_OFF, HTTP_BAD_REQUEST, HTTP_NOT_FOUND, +) +from homeassistant.components.light import ( + ATTR_BRIGHTNESS, ATTR_SUPPORTED_FEATURES, SUPPORT_BRIGHTNESS +) +from homeassistant.components.http import HomeAssistantView + +_LOGGER = logging.getLogger(__name__) + +ATTR_EMULATED_HUE = 'emulated_hue' +ATTR_EMULATED_HUE_NAME = 'emulated_hue_name' + +HUE_API_STATE_ON = 'on' +HUE_API_STATE_BRI = 'bri' + + +class HueUsernameView(HomeAssistantView): + """Handle requests to create a username for the emulated hue bridge.""" + + url = '/api' + name = 'emulated_hue:api:create_username' + extra_urls = ['/api/'] + requires_auth = False + + @asyncio.coroutine + def post(self, request): + """Handle a POST request.""" + try: + data = yield from request.json() + except ValueError: + return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) + + if 'devicetype' not in data: + return self.json_message('devicetype not specified', + HTTP_BAD_REQUEST) + + return self.json([{'success': {'username': '12345678901234567890'}}]) + + +class HueAllLightsStateView(HomeAssistantView): + """Handle requests for getting and setting info about entities.""" + + url = '/api/{username}/lights' + name = 'emulated_hue:lights:state' + requires_auth = False + + def __init__(self, config): + """Initialize the instance of the view.""" + self.config = config + + @core.callback + def get(self, request, username): + """Process a request to get the list of available lights.""" + hass = request.app['hass'] + json_response = {} + + for entity in hass.states.async_all(): + if self.config.is_entity_exposed(entity): + number = self.config.entity_id_to_number(entity.entity_id) + json_response[number] = entity_to_json(entity) + + return self.json(json_response) + + +class HueOneLightStateView(HomeAssistantView): + """Handle requests for getting and setting info about entities.""" + + url = '/api/{username}/lights/{entity_id}' + name = 'emulated_hue:light:state' + requires_auth = False + + def __init__(self, config): + """Initialize the instance of the view.""" + self.config = config + + @core.callback + def get(self, request, username, entity_id=None): + """Process a request to get the state of an individual light.""" + hass = request.app['hass'] + entity_id = self.config.number_to_entity_id(entity_id) + entity = hass.states.get(entity_id) + + if entity is None: + _LOGGER.error('Entity not found: %s', entity_id) + return web.Response(text="Entity not found", status=404) + + if not self.config.is_entity_exposed(entity): + _LOGGER.error('Entity not exposed: %s', entity_id) + return web.Response(text="Entity not exposed", status=404) + + cached_state = self.config.cached_states.get(entity_id, None) + + if cached_state is None: + final_state = entity.state == STATE_ON + final_brightness = entity.attributes.get( + ATTR_BRIGHTNESS, 255 if final_state else 0) + else: + final_state, final_brightness = cached_state + + json_response = entity_to_json(entity, final_state, final_brightness) + + return self.json(json_response) + + +class HueOneLightChangeView(HomeAssistantView): + """Handle requests for getting and setting info about entities.""" + + url = '/api/{username}/lights/{entity_number}/state' + name = 'emulated_hue:light:state' + requires_auth = False + + def __init__(self, config): + """Initialize the instance of the view.""" + self.config = config + + @asyncio.coroutine + def put(self, request, username, entity_number): + """Process a request to set the state of an individual light.""" + config = self.config + hass = request.app['hass'] + entity_id = config.number_to_entity_id(entity_number) + + if entity_id is None: + _LOGGER.error('Unknown entity number: %s', entity_number) + return self.json_message('Entity not found', HTTP_NOT_FOUND) + + entity = hass.states.get(entity_id) + + if entity is None: + _LOGGER.error('Entity not found: %s', entity_id) + return self.json_message('Entity not found', HTTP_NOT_FOUND) + + if not config.is_entity_exposed(entity): + _LOGGER.error('Entity not exposed: %s', entity_id) + return web.Response(text="Entity not exposed", status=404) + + try: + request_json = yield from request.json() + except ValueError: + _LOGGER.error('Received invalid json') + return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) + + # Parse the request into requested "on" status and brightness + parsed = parse_hue_api_put_light_body(request_json, entity) + + if parsed is None: + _LOGGER.error('Unable to parse data: %s', request_json) + return web.Response(text="Bad request", status=400) + + result, brightness = parsed + + # Convert the resulting "on" status into the service we need to call + service = SERVICE_TURN_ON if result else SERVICE_TURN_OFF + + # Construct what we need to send to the service + data = {ATTR_ENTITY_ID: entity_id} + + # If the requested entity is a script add some variables + if entity.domain == "script": + data['variables'] = { + 'requested_state': STATE_ON if result else STATE_OFF + } + + if brightness is not None: + data['variables']['requested_level'] = brightness + + elif brightness is not None: + data[ATTR_BRIGHTNESS] = brightness + + if entity.domain in config.off_maps_to_on_domains: + # Map the off command to on + service = SERVICE_TURN_ON + + # Caching is required because things like scripts and scenes won't + # report as "off" to Alexa if an "off" command is received, because + # they'll map to "on". Thus, instead of reporting its actual + # status, we report what Alexa will want to see, which is the same + # as the actual requested command. + config.cached_states[entity_id] = (result, brightness) + + # Perform the requested action + yield from hass.services.async_call(core.DOMAIN, service, data, + blocking=True) + + json_response = \ + [create_hue_success_response(entity_id, HUE_API_STATE_ON, result)] + + if brightness is not None: + json_response.append(create_hue_success_response( + entity_id, HUE_API_STATE_BRI, brightness)) + + return self.json(json_response) + + +def parse_hue_api_put_light_body(request_json, entity): + """Parse the body of a request to change the state of a light.""" + if HUE_API_STATE_ON in request_json: + if not isinstance(request_json[HUE_API_STATE_ON], bool): + return None + + if request_json['on']: + # Echo requested device be turned on + brightness = None + report_brightness = False + result = True + else: + # Echo requested device be turned off + brightness = None + report_brightness = False + result = False + + if HUE_API_STATE_BRI in request_json: + # Make sure the entity actually supports brightness + entity_features = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0) + + if (entity_features & SUPPORT_BRIGHTNESS) == SUPPORT_BRIGHTNESS: + try: + # Clamp brightness from 0 to 255 + brightness = \ + max(0, min(int(request_json[HUE_API_STATE_BRI]), 255)) + except ValueError: + return None + + report_brightness = True + result = (brightness > 0) + elif entity.domain.lower() == "script": + # Convert 0-255 to 0-100 + level = int(request_json[HUE_API_STATE_BRI]) / 255 * 100 + + brightness = round(level) + report_brightness = True + result = True + + return (result, brightness) if report_brightness else (result, None) + + +def entity_to_json(entity, is_on=None, brightness=None): + """Convert an entity to its Hue bridge JSON representation.""" + if is_on is None: + is_on = entity.state == STATE_ON + + if brightness is None: + brightness = 255 if is_on else 0 + + name = entity.attributes.get( + ATTR_EMULATED_HUE_NAME, entity.attributes[ATTR_FRIENDLY_NAME]) + + return { + 'state': + { + HUE_API_STATE_ON: is_on, + HUE_API_STATE_BRI: brightness, + 'reachable': True + }, + 'type': 'Dimmable light', + 'name': name, + 'modelid': 'HASS123', + 'uniqueid': entity.entity_id, + 'swversion': '123' + } + + +def create_hue_success_response(entity_id, attr, value): + """Create a success response for an attribute set on a light.""" + success_key = '/lights/{}/state/{}'.format(entity_id, attr) + return {'success': {success_key: value}} diff --git a/homeassistant/components/emulated_hue/upnp.py b/homeassistant/components/emulated_hue/upnp.py new file mode 100644 index 00000000000..f81a8c1b68d --- /dev/null +++ b/homeassistant/components/emulated_hue/upnp.py @@ -0,0 +1,166 @@ +"""Provides a UPNP discovery method that mimicks Hue hubs.""" +import threading +import socket +import logging +import os +import select + +from aiohttp import web + +from homeassistant import core +from homeassistant.components.http import HomeAssistantView + +_LOGGER = logging.getLogger(__name__) + + +class DescriptionXmlView(HomeAssistantView): + """Handles requests for the description.xml file.""" + + url = '/description.xml' + name = 'description:xml' + requires_auth = False + + def __init__(self, config): + """Initialize the instance of the view.""" + self.config = config + + @core.callback + def get(self, request): + """Handle a GET request.""" + xml_template = """ + + +1 +0 + +http://{0}:{1}/ + +urn:schemas-upnp-org:device:Basic:1 +HASS Bridge ({0}) +Royal Philips Electronics +http://www.philips.com +Philips hue Personal Wireless Lighting +Philips hue bridge 2015 +BSB002 +http://www.meethue.com +1234 +uuid:2f402f80-da50-11e1-9b23-001788255acc + + +""" + + resp_text = xml_template.format( + self.config.host_ip_addr, self.config.listen_port) + + return web.Response(text=resp_text, content_type='text/xml') + + +class UPNPResponderThread(threading.Thread): + """Handle responding to UPNP/SSDP discovery requests.""" + + _interrupted = False + + def __init__(self, host_ip_addr, listen_port): + """Initialize the class.""" + threading.Thread.__init__(self) + + self.host_ip_addr = host_ip_addr + self.listen_port = listen_port + + # Note that the double newline at the end of + # this string is required per the SSDP spec + resp_template = """HTTP/1.1 200 OK +CACHE-CONTROL: max-age=60 +EXT: +LOCATION: http://{0}:{1}/description.xml +SERVER: FreeRTOS/6.0.5, UPnP/1.0, IpBridge/0.1 +ST: urn:schemas-upnp-org:device:basic:1 +USN: uuid:Socket-1_0-221438K0100073::urn:schemas-upnp-org:device:basic:1 + +""" + + self.upnp_response = resp_template.format(host_ip_addr, listen_port) \ + .replace("\n", "\r\n") \ + .encode('utf-8') + + # Set up a pipe for signaling to the receiver that it's time to + # shutdown. Essentially, we place the SSDP socket into nonblocking + # mode and use select() to wait for data to arrive on either the SSDP + # socket or the pipe. If data arrives on either one, select() returns + # and tells us which filenos have data ready to read. + # + # When we want to stop the responder, we write data to the pipe, which + # causes the select() to return and indicate that said pipe has data + # ready to be read, which indicates to us that the responder needs to + # be shutdown. + self._interrupted_read_pipe, self._interrupted_write_pipe = os.pipe() + + def run(self): + """Run the server.""" + # Listen for UDP port 1900 packets sent to SSDP multicast address + ssdp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + ssdp_socket.setblocking(False) + + # Required for receiving multicast + ssdp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + + ssdp_socket.setsockopt( + socket.SOL_IP, + socket.IP_MULTICAST_IF, + socket.inet_aton(self.host_ip_addr)) + + ssdp_socket.setsockopt( + socket.SOL_IP, + socket.IP_ADD_MEMBERSHIP, + socket.inet_aton("239.255.255.250") + + socket.inet_aton(self.host_ip_addr)) + + ssdp_socket.bind(("239.255.255.250", 1900)) + + while True: + if self._interrupted: + clean_socket_close(ssdp_socket) + return + + try: + read, _, _ = select.select( + [self._interrupted_read_pipe, ssdp_socket], [], + [ssdp_socket]) + + if self._interrupted_read_pipe in read: + # Implies self._interrupted is True + clean_socket_close(ssdp_socket) + return + elif ssdp_socket in read: + data, addr = ssdp_socket.recvfrom(1024) + else: + continue + except socket.error as ex: + if self._interrupted: + clean_socket_close(ssdp_socket) + return + + _LOGGER.error("UPNP Responder socket exception occured: %s", + ex.__str__) + + if "M-SEARCH" in data.decode('utf-8'): + # SSDP M-SEARCH method received, respond to it with our info + resp_socket = socket.socket( + socket.AF_INET, socket.SOCK_DGRAM) + + resp_socket.sendto(self.upnp_response, addr) + resp_socket.close() + + def stop(self): + """Stop the server.""" + # Request for server + self._interrupted = True + os.write(self._interrupted_write_pipe, bytes([0])) + self.join() + + +def clean_socket_close(sock): + """Close a socket connection and logs its closure.""" + _LOGGER.info("UPNP responder shutting down.") + + sock.close() diff --git a/tests/components/emulated_hue/__init__.py b/tests/components/emulated_hue/__init__.py new file mode 100644 index 00000000000..b13b95a080a --- /dev/null +++ b/tests/components/emulated_hue/__init__.py @@ -0,0 +1 @@ +"""Tests for emulated_hue.""" diff --git a/tests/components/test_emulated_hue.py b/tests/components/emulated_hue/test_hue_api.py old mode 100755 new mode 100644 similarity index 78% rename from tests/components/test_emulated_hue.py rename to tests/components/emulated_hue/test_hue_api.py index 7bb8da09e47..9cee27f570f --- a/tests/components/test_emulated_hue.py +++ b/tests/components/emulated_hue/test_hue_api.py @@ -1,429 +1,355 @@ -"""The tests for the emulated Hue component.""" -import json - -import unittest -import requests - -from homeassistant import bootstrap, const, core -import homeassistant.components as core_components -from homeassistant.components import emulated_hue, http, light, script -from homeassistant.const import STATE_ON, STATE_OFF -from homeassistant.components.emulated_hue import ( - HUE_API_STATE_ON, HUE_API_STATE_BRI) -from homeassistant.util.async import run_coroutine_threadsafe - -from tests.common import get_test_instance_port, get_test_home_assistant - -HTTP_SERVER_PORT = get_test_instance_port() -BRIDGE_SERVER_PORT = get_test_instance_port() - -BRIDGE_URL_BASE = 'http://127.0.0.1:{}'.format(BRIDGE_SERVER_PORT) + '{}' -JSON_HEADERS = {const.HTTP_HEADER_CONTENT_TYPE: const.CONTENT_TYPE_JSON} - - -def setup_hass_instance(emulated_hue_config): - """Set up the Home Assistant instance to test.""" - hass = get_test_home_assistant() - - # We need to do this to get access to homeassistant/turn_(on,off) - run_coroutine_threadsafe( - core_components.async_setup(hass, {core.DOMAIN: {}}), hass.loop - ).result() - - bootstrap.setup_component( - hass, http.DOMAIN, - {http.DOMAIN: {http.CONF_SERVER_PORT: HTTP_SERVER_PORT}}) - - bootstrap.setup_component(hass, emulated_hue.DOMAIN, emulated_hue_config) - - return hass - - -def start_hass_instance(hass): - """Start the Home Assistant instance to test.""" - hass.start() - - -class TestEmulatedHue(unittest.TestCase): - """Test the emulated Hue component.""" - - hass = None - - @classmethod - def setUpClass(cls): - """Setup the class.""" - cls.hass = setup_hass_instance({ - emulated_hue.DOMAIN: { - emulated_hue.CONF_LISTEN_PORT: BRIDGE_SERVER_PORT - }}) - - start_hass_instance(cls.hass) - - @classmethod - def tearDownClass(cls): - """Stop the class.""" - cls.hass.stop() - - def test_description_xml(self): - """Test the description.""" - import xml.etree.ElementTree as ET - - result = requests.get( - BRIDGE_URL_BASE.format('/description.xml'), timeout=5) - - self.assertEqual(result.status_code, 200) - self.assertTrue('text/xml' in result.headers['content-type']) - - # Make sure the XML is parsable - # pylint: disable=bare-except - try: - ET.fromstring(result.text) - except: - self.fail('description.xml is not valid XML!') - - def test_create_username(self): - """Test the creation of an username.""" - request_json = {'devicetype': 'my_device'} - - result = requests.post( - BRIDGE_URL_BASE.format('/api'), data=json.dumps(request_json), - timeout=5) - - self.assertEqual(result.status_code, 200) - self.assertTrue('application/json' in result.headers['content-type']) - - resp_json = result.json() - success_json = resp_json[0] - - self.assertTrue('success' in success_json) - self.assertTrue('username' in success_json['success']) - - def test_valid_username_request(self): - """Test request with a valid username.""" - request_json = {'invalid_key': 'my_device'} - - result = requests.post( - BRIDGE_URL_BASE.format('/api'), data=json.dumps(request_json), - timeout=5) - - self.assertEqual(result.status_code, 400) - - -class TestEmulatedHueExposedByDefault(unittest.TestCase): - """Test class for emulated hue component.""" - - @classmethod - def setUpClass(cls): - """Setup the class.""" - cls.hass = setup_hass_instance({ - emulated_hue.DOMAIN: { - emulated_hue.CONF_LISTEN_PORT: BRIDGE_SERVER_PORT, - emulated_hue.CONF_EXPOSE_BY_DEFAULT: True - } - }) - - bootstrap.setup_component(cls.hass, light.DOMAIN, { - 'light': [ - { - 'platform': 'demo', - } - ] - }) - - bootstrap.setup_component(cls.hass, script.DOMAIN, { - 'script': { - 'set_kitchen_light': { - 'sequence': [ - { - 'service_template': - "light.turn_{{ requested_state }}", - 'data_template': { - 'entity_id': 'light.kitchen_lights', - 'brightness': "{{ requested_level }}" - } - } - ] - } - } - }) - - start_hass_instance(cls.hass) - - # Kitchen light is explicitly excluded from being exposed - kitchen_light_entity = cls.hass.states.get('light.kitchen_lights') - attrs = dict(kitchen_light_entity.attributes) - attrs[emulated_hue.ATTR_EMULATED_HUE] = False - cls.hass.states.set( - kitchen_light_entity.entity_id, kitchen_light_entity.state, - attributes=attrs) - - # Expose the script - script_entity = cls.hass.states.get('script.set_kitchen_light') - attrs = dict(script_entity.attributes) - attrs[emulated_hue.ATTR_EMULATED_HUE] = True - cls.hass.states.set( - script_entity.entity_id, script_entity.state, attributes=attrs - ) - - @classmethod - def tearDownClass(cls): - """Stop the class.""" - cls.hass.stop() - - def test_discover_lights(self): - """Test the discovery of lights.""" - result = requests.get( - BRIDGE_URL_BASE.format('/api/username/lights'), timeout=5) - - self.assertEqual(result.status_code, 200) - self.assertTrue('application/json' in result.headers['content-type']) - - result_json = result.json() - - # Make sure the lights we added to the config are there - self.assertTrue('light.ceiling_lights' in result_json) - self.assertTrue('light.bed_light' in result_json) - self.assertTrue('script.set_kitchen_light' in result_json) - self.assertTrue('light.kitchen_lights' not in result_json) - - def test_get_light_state(self): - """Test the getting of light state.""" - # Turn office light on and set to 127 brightness - self.hass.services.call( - light.DOMAIN, const.SERVICE_TURN_ON, - { - const.ATTR_ENTITY_ID: 'light.ceiling_lights', - light.ATTR_BRIGHTNESS: 127 - }, - blocking=True) - - office_json = self.perform_get_light_state('light.ceiling_lights', 200) - - self.assertEqual(office_json['state'][HUE_API_STATE_ON], True) - self.assertEqual(office_json['state'][HUE_API_STATE_BRI], 127) - - # Turn bedroom light off - self.hass.services.call( - light.DOMAIN, const.SERVICE_TURN_OFF, - { - const.ATTR_ENTITY_ID: 'light.bed_light' - }, - blocking=True) - - bedroom_json = self.perform_get_light_state('light.bed_light', 200) - - self.assertEqual(bedroom_json['state'][HUE_API_STATE_ON], False) - self.assertEqual(bedroom_json['state'][HUE_API_STATE_BRI], 0) - - # Make sure kitchen light isn't accessible - kitchen_url = '/api/username/lights/{}'.format('light.kitchen_lights') - kitchen_result = requests.get( - BRIDGE_URL_BASE.format(kitchen_url), timeout=5) - - self.assertEqual(kitchen_result.status_code, 404) - - def test_put_light_state(self): - """Test the seeting of light states.""" - self.perform_put_test_on_ceiling_lights() - - # Turn the bedroom light on first - self.hass.services.call( - light.DOMAIN, const.SERVICE_TURN_ON, - {const.ATTR_ENTITY_ID: 'light.bed_light', - light.ATTR_BRIGHTNESS: 153}, - blocking=True) - - bed_light = self.hass.states.get('light.bed_light') - self.assertEqual(bed_light.state, STATE_ON) - self.assertEqual(bed_light.attributes[light.ATTR_BRIGHTNESS], 153) - - # Go through the API to turn it off - bedroom_result = self.perform_put_light_state( - 'light.bed_light', False) - - bedroom_result_json = bedroom_result.json() - - self.assertEqual(bedroom_result.status_code, 200) - self.assertTrue( - 'application/json' in bedroom_result.headers['content-type']) - - self.assertEqual(len(bedroom_result_json), 1) - - # Check to make sure the state changed - bed_light = self.hass.states.get('light.bed_light') - self.assertEqual(bed_light.state, STATE_OFF) - - # Make sure we can't change the kitchen light state - kitchen_result = self.perform_put_light_state( - 'light.kitchen_light', True) - self.assertEqual(kitchen_result.status_code, 404) - - def test_put_light_state_script(self): - """Test the setting of script variables.""" - # Turn the kitchen light off first - self.hass.services.call( - light.DOMAIN, const.SERVICE_TURN_OFF, - {const.ATTR_ENTITY_ID: 'light.kitchen_lights'}, - blocking=True) - - # Emulated hue converts 0-100% to 0-255. - level = 23 - brightness = round(level * 255 / 100) - - script_result = self.perform_put_light_state( - 'script.set_kitchen_light', True, brightness) - - script_result_json = script_result.json() - - self.assertEqual(script_result.status_code, 200) - self.assertEqual(len(script_result_json), 2) - - # Wait until script is complete before continuing - self.hass.block_till_done() - - kitchen_light = self.hass.states.get('light.kitchen_lights') - self.assertEqual(kitchen_light.state, 'on') - self.assertEqual( - kitchen_light.attributes[light.ATTR_BRIGHTNESS], - level) - - # pylint: disable=invalid-name - def test_put_with_form_urlencoded_content_type(self): - """Test the form with urlencoded content.""" - # Needed for Alexa - self.perform_put_test_on_ceiling_lights( - 'application/x-www-form-urlencoded') - - # Make sure we fail gracefully when we can't parse the data - data = {'key1': 'value1', 'key2': 'value2'} - result = requests.put( - BRIDGE_URL_BASE.format( - '/api/username/lights/{}/state'.format( - 'light.ceiling_lights')), data=data) - - self.assertEqual(result.status_code, 400) - - def test_entity_not_found(self): - """Test for entity which are not found.""" - result = requests.get( - BRIDGE_URL_BASE.format( - '/api/username/lights/{}'.format("not.existant_entity")), - timeout=5) - - self.assertEqual(result.status_code, 404) - - result = requests.put( - BRIDGE_URL_BASE.format( - '/api/username/lights/{}/state'.format("non.existant_entity")), - timeout=5) - - self.assertEqual(result.status_code, 404) - - def test_allowed_methods(self): - """Test the allowed methods.""" - result = requests.get( - BRIDGE_URL_BASE.format( - '/api/username/lights/{}/state'.format( - "light.ceiling_lights"))) - - self.assertEqual(result.status_code, 405) - - result = requests.put( - BRIDGE_URL_BASE.format( - '/api/username/lights/{}'.format("light.ceiling_lights")), - data={'key1': 'value1'}) - - self.assertEqual(result.status_code, 405) - - result = requests.put( - BRIDGE_URL_BASE.format('/api/username/lights'), - data={'key1': 'value1'}) - - self.assertEqual(result.status_code, 405) - - def test_proper_put_state_request(self): - """Test the request to set the state.""" - # Test proper on value parsing - result = requests.put( - BRIDGE_URL_BASE.format( - '/api/username/lights/{}/state'.format( - 'light.ceiling_lights')), - data=json.dumps({HUE_API_STATE_ON: 1234})) - - self.assertEqual(result.status_code, 400) - - # Test proper brightness value parsing - result = requests.put( - BRIDGE_URL_BASE.format( - '/api/username/lights/{}/state'.format( - 'light.ceiling_lights')), data=json.dumps({ - HUE_API_STATE_ON: True, - HUE_API_STATE_BRI: 'Hello world!' - })) - - self.assertEqual(result.status_code, 400) - - # pylint: disable=invalid-name - def perform_put_test_on_ceiling_lights(self, - content_type='application/json'): - """Test the setting of a light.""" - # Turn the office light off first - self.hass.services.call( - light.DOMAIN, const.SERVICE_TURN_OFF, - {const.ATTR_ENTITY_ID: 'light.ceiling_lights'}, - blocking=True) - - ceiling_lights = self.hass.states.get('light.ceiling_lights') - self.assertEqual(ceiling_lights.state, STATE_OFF) - - # Go through the API to turn it on - office_result = self.perform_put_light_state( - 'light.ceiling_lights', True, 56, content_type) - - office_result_json = office_result.json() - - self.assertEqual(office_result.status_code, 200) - self.assertTrue( - 'application/json' in office_result.headers['content-type']) - - self.assertEqual(len(office_result_json), 2) - - # Check to make sure the state changed - ceiling_lights = self.hass.states.get('light.ceiling_lights') - self.assertEqual(ceiling_lights.state, STATE_ON) - self.assertEqual(ceiling_lights.attributes[light.ATTR_BRIGHTNESS], 56) - - def perform_get_light_state(self, entity_id, expected_status): - """Test the gettting of a light state.""" - result = requests.get( - BRIDGE_URL_BASE.format( - '/api/username/lights/{}'.format(entity_id)), timeout=5) - - self.assertEqual(result.status_code, expected_status) - - if expected_status == 200: - self.assertTrue( - 'application/json' in result.headers['content-type']) - - return result.json() - - return None - - # pylint: disable=no-self-use - def perform_put_light_state(self, entity_id, is_on, brightness=None, - content_type='application/json'): - """Test the setting of a light state.""" - url = BRIDGE_URL_BASE.format( - '/api/username/lights/{}/state'.format(entity_id)) - - req_headers = {'Content-Type': content_type} - - data = {HUE_API_STATE_ON: is_on} - - if brightness is not None: - data[HUE_API_STATE_BRI] = brightness - - result = requests.put( - url, data=json.dumps(data), timeout=5, headers=req_headers) - - return result +"""The tests for the emulated Hue component.""" +import json + +import unittest +from unittest.mock import patch +import requests + +from homeassistant import bootstrap, const, core +import homeassistant.components as core_components +from homeassistant.components import emulated_hue, http, light, script +from homeassistant.const import STATE_ON, STATE_OFF +from homeassistant.components.emulated_hue.hue_api import ( + HUE_API_STATE_ON, HUE_API_STATE_BRI) +from homeassistant.util.async import run_coroutine_threadsafe + +from tests.common import get_test_instance_port, get_test_home_assistant + +HTTP_SERVER_PORT = get_test_instance_port() +BRIDGE_SERVER_PORT = get_test_instance_port() + +BRIDGE_URL_BASE = 'http://127.0.0.1:{}'.format(BRIDGE_SERVER_PORT) + '{}' +JSON_HEADERS = {const.HTTP_HEADER_CONTENT_TYPE: const.CONTENT_TYPE_JSON} + + +class TestEmulatedHueExposedByDefault(unittest.TestCase): + """Test class for emulated hue component.""" + + @classmethod + def setUpClass(cls): + """Setup the class.""" + cls.hass = hass = get_test_home_assistant() + + # We need to do this to get access to homeassistant/turn_(on,off) + run_coroutine_threadsafe( + core_components.async_setup(hass, {core.DOMAIN: {}}), hass.loop + ).result() + + bootstrap.setup_component( + hass, http.DOMAIN, + {http.DOMAIN: {http.CONF_SERVER_PORT: HTTP_SERVER_PORT}}) + + with patch('homeassistant.components' + '.emulated_hue.UPNPResponderThread'): + bootstrap.setup_component(hass, emulated_hue.DOMAIN, { + emulated_hue.DOMAIN: { + emulated_hue.CONF_LISTEN_PORT: BRIDGE_SERVER_PORT, + emulated_hue.CONF_EXPOSE_BY_DEFAULT: True + } + }) + + bootstrap.setup_component(cls.hass, light.DOMAIN, { + 'light': [ + { + 'platform': 'demo', + } + ] + }) + + bootstrap.setup_component(cls.hass, script.DOMAIN, { + 'script': { + 'set_kitchen_light': { + 'sequence': [ + { + 'service_template': + "light.turn_{{ requested_state }}", + 'data_template': { + 'entity_id': 'light.kitchen_lights', + 'brightness': "{{ requested_level }}" + } + } + ] + } + } + }) + + cls.hass.start() + + # Kitchen light is explicitly excluded from being exposed + kitchen_light_entity = cls.hass.states.get('light.kitchen_lights') + attrs = dict(kitchen_light_entity.attributes) + attrs[emulated_hue.ATTR_EMULATED_HUE] = False + cls.hass.states.set( + kitchen_light_entity.entity_id, kitchen_light_entity.state, + attributes=attrs) + + # Expose the script + script_entity = cls.hass.states.get('script.set_kitchen_light') + attrs = dict(script_entity.attributes) + attrs[emulated_hue.ATTR_EMULATED_HUE] = True + cls.hass.states.set( + script_entity.entity_id, script_entity.state, attributes=attrs + ) + + @classmethod + def tearDownClass(cls): + """Stop the class.""" + cls.hass.stop() + + def test_discover_lights(self): + """Test the discovery of lights.""" + result = requests.get( + BRIDGE_URL_BASE.format('/api/username/lights'), timeout=5) + + self.assertEqual(result.status_code, 200) + self.assertTrue('application/json' in result.headers['content-type']) + + result_json = result.json() + + # Make sure the lights we added to the config are there + self.assertTrue('light.ceiling_lights' in result_json) + self.assertTrue('light.bed_light' in result_json) + self.assertTrue('script.set_kitchen_light' in result_json) + self.assertTrue('light.kitchen_lights' not in result_json) + + def test_get_light_state(self): + """Test the getting of light state.""" + # Turn office light on and set to 127 brightness + self.hass.services.call( + light.DOMAIN, const.SERVICE_TURN_ON, + { + const.ATTR_ENTITY_ID: 'light.ceiling_lights', + light.ATTR_BRIGHTNESS: 127 + }, + blocking=True) + + office_json = self.perform_get_light_state('light.ceiling_lights', 200) + + self.assertEqual(office_json['state'][HUE_API_STATE_ON], True) + self.assertEqual(office_json['state'][HUE_API_STATE_BRI], 127) + + # Turn bedroom light off + self.hass.services.call( + light.DOMAIN, const.SERVICE_TURN_OFF, + { + const.ATTR_ENTITY_ID: 'light.bed_light' + }, + blocking=True) + + bedroom_json = self.perform_get_light_state('light.bed_light', 200) + + self.assertEqual(bedroom_json['state'][HUE_API_STATE_ON], False) + self.assertEqual(bedroom_json['state'][HUE_API_STATE_BRI], 0) + + # Make sure kitchen light isn't accessible + kitchen_url = '/api/username/lights/{}'.format('light.kitchen_lights') + kitchen_result = requests.get( + BRIDGE_URL_BASE.format(kitchen_url), timeout=5) + + self.assertEqual(kitchen_result.status_code, 404) + + def test_put_light_state(self): + """Test the seeting of light states.""" + self.perform_put_test_on_ceiling_lights() + + # Turn the bedroom light on first + self.hass.services.call( + light.DOMAIN, const.SERVICE_TURN_ON, + {const.ATTR_ENTITY_ID: 'light.bed_light', + light.ATTR_BRIGHTNESS: 153}, + blocking=True) + + bed_light = self.hass.states.get('light.bed_light') + self.assertEqual(bed_light.state, STATE_ON) + self.assertEqual(bed_light.attributes[light.ATTR_BRIGHTNESS], 153) + + # Go through the API to turn it off + bedroom_result = self.perform_put_light_state( + 'light.bed_light', False) + + bedroom_result_json = bedroom_result.json() + + self.assertEqual(bedroom_result.status_code, 200) + self.assertTrue( + 'application/json' in bedroom_result.headers['content-type']) + + self.assertEqual(len(bedroom_result_json), 1) + + # Check to make sure the state changed + bed_light = self.hass.states.get('light.bed_light') + self.assertEqual(bed_light.state, STATE_OFF) + + # Make sure we can't change the kitchen light state + kitchen_result = self.perform_put_light_state( + 'light.kitchen_light', True) + self.assertEqual(kitchen_result.status_code, 404) + + def test_put_light_state_script(self): + """Test the setting of script variables.""" + # Turn the kitchen light off first + self.hass.services.call( + light.DOMAIN, const.SERVICE_TURN_OFF, + {const.ATTR_ENTITY_ID: 'light.kitchen_lights'}, + blocking=True) + + # Emulated hue converts 0-100% to 0-255. + level = 23 + brightness = round(level * 255 / 100) + + script_result = self.perform_put_light_state( + 'script.set_kitchen_light', True, brightness) + + script_result_json = script_result.json() + + self.assertEqual(script_result.status_code, 200) + self.assertEqual(len(script_result_json), 2) + + # Wait until script is complete before continuing + self.hass.block_till_done() + + kitchen_light = self.hass.states.get('light.kitchen_lights') + self.assertEqual(kitchen_light.state, 'on') + self.assertEqual( + kitchen_light.attributes[light.ATTR_BRIGHTNESS], + level) + + # pylint: disable=invalid-name + def test_put_with_form_urlencoded_content_type(self): + """Test the form with urlencoded content.""" + # Needed for Alexa + self.perform_put_test_on_ceiling_lights( + 'application/x-www-form-urlencoded') + + # Make sure we fail gracefully when we can't parse the data + data = {'key1': 'value1', 'key2': 'value2'} + result = requests.put( + BRIDGE_URL_BASE.format( + '/api/username/lights/{}/state'.format( + 'light.ceiling_lights')), data=data) + + self.assertEqual(result.status_code, 400) + + def test_entity_not_found(self): + """Test for entity which are not found.""" + result = requests.get( + BRIDGE_URL_BASE.format( + '/api/username/lights/{}'.format("not.existant_entity")), + timeout=5) + + self.assertEqual(result.status_code, 404) + + result = requests.put( + BRIDGE_URL_BASE.format( + '/api/username/lights/{}/state'.format("non.existant_entity")), + timeout=5) + + self.assertEqual(result.status_code, 404) + + def test_allowed_methods(self): + """Test the allowed methods.""" + result = requests.get( + BRIDGE_URL_BASE.format( + '/api/username/lights/{}/state'.format( + "light.ceiling_lights"))) + + self.assertEqual(result.status_code, 405) + + result = requests.put( + BRIDGE_URL_BASE.format( + '/api/username/lights/{}'.format("light.ceiling_lights")), + data={'key1': 'value1'}) + + self.assertEqual(result.status_code, 405) + + result = requests.put( + BRIDGE_URL_BASE.format('/api/username/lights'), + data={'key1': 'value1'}) + + self.assertEqual(result.status_code, 405) + + def test_proper_put_state_request(self): + """Test the request to set the state.""" + # Test proper on value parsing + result = requests.put( + BRIDGE_URL_BASE.format( + '/api/username/lights/{}/state'.format( + 'light.ceiling_lights')), + data=json.dumps({HUE_API_STATE_ON: 1234})) + + self.assertEqual(result.status_code, 400) + + # Test proper brightness value parsing + result = requests.put( + BRIDGE_URL_BASE.format( + '/api/username/lights/{}/state'.format( + 'light.ceiling_lights')), data=json.dumps({ + HUE_API_STATE_ON: True, + HUE_API_STATE_BRI: 'Hello world!' + })) + + self.assertEqual(result.status_code, 400) + + # pylint: disable=invalid-name + def perform_put_test_on_ceiling_lights(self, + content_type='application/json'): + """Test the setting of a light.""" + # Turn the office light off first + self.hass.services.call( + light.DOMAIN, const.SERVICE_TURN_OFF, + {const.ATTR_ENTITY_ID: 'light.ceiling_lights'}, + blocking=True) + + ceiling_lights = self.hass.states.get('light.ceiling_lights') + self.assertEqual(ceiling_lights.state, STATE_OFF) + + # Go through the API to turn it on + office_result = self.perform_put_light_state( + 'light.ceiling_lights', True, 56, content_type) + + office_result_json = office_result.json() + + self.assertEqual(office_result.status_code, 200) + self.assertTrue( + 'application/json' in office_result.headers['content-type']) + + self.assertEqual(len(office_result_json), 2) + + # Check to make sure the state changed + ceiling_lights = self.hass.states.get('light.ceiling_lights') + self.assertEqual(ceiling_lights.state, STATE_ON) + self.assertEqual(ceiling_lights.attributes[light.ATTR_BRIGHTNESS], 56) + + def perform_get_light_state(self, entity_id, expected_status): + """Test the gettting of a light state.""" + result = requests.get( + BRIDGE_URL_BASE.format( + '/api/username/lights/{}'.format(entity_id)), timeout=5) + + self.assertEqual(result.status_code, expected_status) + + if expected_status == 200: + self.assertTrue( + 'application/json' in result.headers['content-type']) + + return result.json() + + return None + + # pylint: disable=no-self-use + def perform_put_light_state(self, entity_id, is_on, brightness=None, + content_type='application/json'): + """Test the setting of a light state.""" + url = BRIDGE_URL_BASE.format( + '/api/username/lights/{}/state'.format(entity_id)) + + req_headers = {'Content-Type': content_type} + + data = {HUE_API_STATE_ON: is_on} + + if brightness is not None: + data[HUE_API_STATE_BRI] = brightness + + result = requests.put( + url, data=json.dumps(data), timeout=5, headers=req_headers) + + return result diff --git a/tests/components/emulated_hue/test_init.py b/tests/components/emulated_hue/test_init.py new file mode 100755 index 00000000000..ec3cc0a11cb --- /dev/null +++ b/tests/components/emulated_hue/test_init.py @@ -0,0 +1,55 @@ +from unittest.mock import patch + +from homeassistant.components.emulated_hue import Config, _LOGGER + + +def test_config_google_home_entity_id_to_number(): + """Test config adheres to the type.""" + conf = Config({ + 'type': 'google_home' + }) + + number = conf.entity_id_to_number('light.test') + assert number == '1' + + number = conf.entity_id_to_number('light.test') + assert number == '1' + + number = conf.entity_id_to_number('light.test2') + assert number == '2' + + entity_id = conf.number_to_entity_id('1') + assert entity_id == 'light.test' + + +def test_config_alexa_entity_id_to_number(): + """Test config adheres to the type.""" + conf = Config({ + 'type': 'alexa' + }) + + number = conf.entity_id_to_number('light.test') + assert number == 'light.test' + + number = conf.entity_id_to_number('light.test') + assert number == 'light.test' + + number = conf.entity_id_to_number('light.test2') + assert number == 'light.test2' + + entity_id = conf.number_to_entity_id('light.test') + assert entity_id == 'light.test' + + +def test_warning_config_google_home_listen_port(): + """Test we warn when non-default port is used for Google Home.""" + with patch.object(_LOGGER, 'warning') as mock_warn: + Config({ + 'type': 'google_home', + 'host_ip': '123.123.123.123', + 'listen_port': 8300 + }) + + assert mock_warn.called + assert mock_warn.mock_calls[0][1][0] == \ + "When targetting Google Home, listening port has to be port 80" diff --git a/tests/components/emulated_hue/test_upnp.py b/tests/components/emulated_hue/test_upnp.py new file mode 100644 index 00000000000..03b9e993a9b --- /dev/null +++ b/tests/components/emulated_hue/test_upnp.py @@ -0,0 +1,120 @@ +"""The tests for the emulated Hue component.""" +import json + +import unittest +from unittest.mock import patch +import requests + +from homeassistant import bootstrap, const, core +import homeassistant.components as core_components +from homeassistant.components import emulated_hue, http +from homeassistant.util.async import run_coroutine_threadsafe + +from tests.common import get_test_instance_port, get_test_home_assistant + +HTTP_SERVER_PORT = get_test_instance_port() +BRIDGE_SERVER_PORT = get_test_instance_port() + +BRIDGE_URL_BASE = 'http://127.0.0.1:{}'.format(BRIDGE_SERVER_PORT) + '{}' +JSON_HEADERS = {const.HTTP_HEADER_CONTENT_TYPE: const.CONTENT_TYPE_JSON} + + +def setup_hass_instance(emulated_hue_config): + """Set up the Home Assistant instance to test.""" + hass = get_test_home_assistant() + + # We need to do this to get access to homeassistant/turn_(on,off) + run_coroutine_threadsafe( + core_components.async_setup(hass, {core.DOMAIN: {}}), hass.loop + ).result() + + bootstrap.setup_component( + hass, http.DOMAIN, + {http.DOMAIN: {http.CONF_SERVER_PORT: HTTP_SERVER_PORT}}) + + bootstrap.setup_component(hass, emulated_hue.DOMAIN, emulated_hue_config) + + return hass + + +def start_hass_instance(hass): + """Start the Home Assistant instance to test.""" + hass.start() + + +class TestEmulatedHue(unittest.TestCase): + """Test the emulated Hue component.""" + + hass = None + + @classmethod + def setUpClass(cls): + """Setup the class.""" + cls.hass = hass = get_test_home_assistant() + + # We need to do this to get access to homeassistant/turn_(on,off) + run_coroutine_threadsafe( + core_components.async_setup(hass, {core.DOMAIN: {}}), hass.loop + ).result() + + bootstrap.setup_component( + hass, http.DOMAIN, + {http.DOMAIN: {http.CONF_SERVER_PORT: HTTP_SERVER_PORT}}) + + with patch('homeassistant.components' + '.emulated_hue.UPNPResponderThread'): + bootstrap.setup_component(hass, emulated_hue.DOMAIN, { + emulated_hue.DOMAIN: { + emulated_hue.CONF_LISTEN_PORT: BRIDGE_SERVER_PORT + }}) + + cls.hass.start() + + @classmethod + def tearDownClass(cls): + """Stop the class.""" + cls.hass.stop() + + def test_description_xml(self): + """Test the description.""" + import xml.etree.ElementTree as ET + + result = requests.get( + BRIDGE_URL_BASE.format('/description.xml'), timeout=5) + + self.assertEqual(result.status_code, 200) + self.assertTrue('text/xml' in result.headers['content-type']) + + # Make sure the XML is parsable + # pylint: disable=bare-except + try: + ET.fromstring(result.text) + except: + self.fail('description.xml is not valid XML!') + + def test_create_username(self): + """Test the creation of an username.""" + request_json = {'devicetype': 'my_device'} + + result = requests.post( + BRIDGE_URL_BASE.format('/api'), data=json.dumps(request_json), + timeout=5) + + self.assertEqual(result.status_code, 200) + self.assertTrue('application/json' in result.headers['content-type']) + + resp_json = result.json() + success_json = resp_json[0] + + self.assertTrue('success' in success_json) + self.assertTrue('username' in success_json['success']) + + def test_valid_username_request(self): + """Test request with a valid username.""" + request_json = {'invalid_key': 'my_device'} + + result = requests.post( + BRIDGE_URL_BASE.format('/api'), data=json.dumps(request_json), + timeout=5) + + self.assertEqual(result.status_code, 400) From d9556392bc4cf2fc4bfe047aac9d59d47d97524c Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Sun, 4 Dec 2016 15:31:24 +0100 Subject: [PATCH 05/14] Protect hm thread for hangs on events (#4717) --- homeassistant/components/homematic.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/homematic.py b/homeassistant/components/homematic.py index bf38b12237e..245e6a12cc2 100644 --- a/homeassistant/components/homematic.py +++ b/homeassistant/components/homematic.py @@ -544,19 +544,19 @@ def _hm_event_handler(hass, proxy, device, caller, attribute, value): # keypress event if attribute in HM_PRESS_EVENTS: - hass.bus.fire(EVENT_KEYPRESS, { + hass.add_job(hass.bus.async_fire(EVENT_KEYPRESS, { ATTR_NAME: hmdevice.NAME, ATTR_PARAM: attribute, ATTR_CHANNEL: channel - }) + })) return # impulse event if attribute in HM_IMPULSE_EVENTS: - hass.bus.fire(EVENT_KEYPRESS, { + hass.add_job(hass.bus.async_fire(EVENT_KEYPRESS, { ATTR_NAME: hmdevice.NAME, ATTR_CHANNEL: channel - }) + })) return _LOGGER.warning("Event is unknown and not forwarded to HA") From 1cd3cd8d770ca4207c8748d15920b38228a6e6c0 Mon Sep 17 00:00:00 2001 From: hexa- Date: Sun, 4 Dec 2016 18:50:43 +0100 Subject: [PATCH 06/14] Revert "Update reference to correct tplink switch" (#4722) --- homeassistant/components/switch/tplink.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/switch/tplink.py b/homeassistant/components/switch/tplink.py index 41c1d0462b3..bcc1b329fa8 100644 --- a/homeassistant/components/switch/tplink.py +++ b/homeassistant/components/switch/tplink.py @@ -15,7 +15,7 @@ from homeassistant.const import (CONF_HOST, CONF_NAME) import homeassistant.helpers.config_validation as cv REQUIREMENTS = ['https://github.com/GadgetReactor/pyHS100/archive/' - 'fadb76c5a0e04f4995f16055845ffedc6d658316.zip#pyHS100==0.2.1'] + '1f771b7d8090a91c6a58931532e42730b021cbde.zip#pyHS100==0.2.0'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index aefb21a93c9..6ac20e51844 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -170,7 +170,7 @@ http://github.com/technicalpickles/python-nest/archive/2512973b4b390d3965da43529 https://github.com/Danielhiversen/flux_led/archive/0.9.zip#flux_led==0.9 # homeassistant.components.switch.tplink -https://github.com/GadgetReactor/pyHS100/archive/fadb76c5a0e04f4995f16055845ffedc6d658316.zip#pyHS100==0.2.1 +https://github.com/GadgetReactor/pyHS100/archive/1f771b7d8090a91c6a58931532e42730b021cbde.zip#pyHS100==0.2.0 # homeassistant.components.switch.dlink https://github.com/LinuxChristian/pyW215/archive/v0.3.7.zip#pyW215==0.3.7 From b354a18bf399fa8011223417343be968005dc875 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 4 Dec 2016 10:57:24 -0800 Subject: [PATCH 07/14] Fix CORS when static resources registered (#4727) --- homeassistant/components/http/__init__.py | 6 ++++++ tests/components/http/test_init.py | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/http/__init__.py b/homeassistant/components/http/__init__.py index dc18dd2481d..11a9e755bb4 100644 --- a/homeassistant/components/http/__init__.py +++ b/homeassistant/components/http/__init__.py @@ -277,9 +277,15 @@ class HomeAssistantWSGI(object): @asyncio.coroutine def start(self): """Start the wsgi server.""" + cors_added = set() if self.cors is not None: for route in list(self.app.router.routes()): + if hasattr(route, 'resource'): + route = route.resource + if route in cors_added: + continue self.cors.add(route) + cors_added.add(route) if self.ssl_certificate: context = ssl.SSLContext(SSL_VERSION) diff --git a/tests/components/http/test_init.py b/tests/components/http/test_init.py index cd0d4fe1ffa..f50e1fb9dbf 100644 --- a/tests/components/http/test_init.py +++ b/tests/components/http/test_init.py @@ -44,6 +44,10 @@ def setUpModule(): bootstrap.setup_component(hass, 'api') + # Registering static path as it caused CORS to blow up + hass.http.register_static_path( + '/custom_components', hass.config.path('custom_components')) + hass.start() @@ -53,11 +57,12 @@ def tearDownModule(): hass.stop() -class TestHttp: +class TestCors: """Test HTTP component.""" def test_cors_allowed_with_password_in_url(self): """Test cross origin resource sharing with password in url.""" + req = requests.get(_url(const.URL_API), params={'api_password': API_PASSWORD}, headers={const.HTTP_HEADER_ORIGIN: HTTP_BASE_URL}) From 2009e984979cef3e1870d9f70e5d6d3a8d4fd1cf Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 4 Dec 2016 11:03:16 -0800 Subject: [PATCH 08/14] Version bump to 0.34.1 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index 8e45ec4bb43..cbbcf9b6762 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 34 -PATCH_VERSION = '0' +PATCH_VERSION = '1' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 4, 2) From 31a8537ab5815722e235fcf4883017785222bd00 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 4 Dec 2016 14:32:43 -0800 Subject: [PATCH 09/14] Update frontend --- homeassistant/components/frontend/version.py | 6 +++--- .../components/frontend/www_static/core.js | 8 ++++---- .../components/frontend/www_static/core.js.gz | Bin 33322 -> 33524 bytes .../frontend/www_static/frontend.html | 2 +- .../frontend/www_static/frontend.html.gz | Bin 130592 -> 130456 bytes .../www_static/home-assistant-polymer | 2 +- .../www_static/panels/ha-panel-dev-info.html | 2 +- .../panels/ha-panel-dev-info.html.gz | Bin 1343 -> 1343 bytes .../frontend/www_static/service_worker.js | 2 +- .../frontend/www_static/service_worker.js.gz | Bin 2322 -> 2325 bytes 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index d5686fff834..837fdd0e1fe 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -1,12 +1,12 @@ """DO NOT MODIFY. Auto-generated by script/fingerprint_frontend.""" FINGERPRINTS = { - "core.js": "526d7d704ae478c30ae20c1426c2e4f4", - "frontend.html": "5baa4dc3b109ca80d4c282fb12c6c23a", + "core.js": "5dfb2d3e567fad37af0321d4b29265ed", + "frontend.html": "6a89b74ab2b76c7d28fad2aea9444ec2", "mdi.html": "46a76f877ac9848899b8ed382427c16f", "micromarkdown-js.html": "93b5ec4016f0bba585521cf4d18dec1a", "panels/ha-panel-dev-event.html": "c2d5ec676be98d4474d19f94d0262c1e", - "panels/ha-panel-dev-info.html": "ec613406ce7e20d93754233d55625c8a", + "panels/ha-panel-dev-info.html": "a9c07bf281fe9791fb15827ec1286825", "panels/ha-panel-dev-service.html": "b3fe49532c5c03198fafb0c6ed58b76a", "panels/ha-panel-dev-state.html": "65e5f791cc467561719bf591f1386054", "panels/ha-panel-dev-template.html": "7d744ab7f7c08b6d6ad42069989de400", diff --git a/homeassistant/components/frontend/www_static/core.js b/homeassistant/components/frontend/www_static/core.js index 464e4440534..a70b70d2fd8 100644 --- a/homeassistant/components/frontend/www_static/core.js +++ b/homeassistant/components/frontend/www_static/core.js @@ -1,4 +1,4 @@ -!(function(){"use strict";function t(t){return t&&t.__esModule?t.default:t}function e(t,e){return e={exports:{}},t(e,e.exports),e.exports}function n(t,e){var n=e.authToken,r=e.host;return He({authToken:n,host:r,isValidating:!0,isInvalid:!1,errorMessage:""})}function r(){return xe.getInitialState()}function i(t,e){var n=e.errorMessage;return t.withMutations((function(t){return t.set("isValidating",!1).set("isInvalid",!0).set("errorMessage",n)}))}function o(t,e){var n=e.authToken,r=e.host;return qe({authToken:n,host:r})}function u(){return Fe.getInitialState()}function a(t,e){var n=e.rememberAuth;return n}function s(t){return t.withMutations((function(t){t.set("isStreaming",!0).set("hasError",!1)}))}function c(t){return t.withMutations((function(t){t.set("isStreaming",!1).set("hasError",!0)}))}function f(){return We.getInitialState()}function h(t){return{type:"auth",api_password:t}}function l(){return{type:"get_states"}}function p(){return{type:"get_config"}}function _(){return{type:"get_services"}}function d(){return{type:"get_panels"}}function v(t,e,n){var r={type:"call_service",domain:t,service:e};return n&&(r.service_data=n),r}function y(t){var e={type:"subscribe_events"};return t&&(e.event_type=t),e}function g(t){return{type:"unsubscribe_events",subscription:t}}function m(){return{type:"ping"}}function S(t){return t.result}function E(t,e){var n=new Ze(t,e);return n.connect()}function b(t,e,n,r){void 0===r&&(r=null);var i=t.evaluate(Do.authInfo),o=i.host+"/api/"+n;return new Promise(function(t,n){var u=new XMLHttpRequest;u.open(e,o,!0),u.setRequestHeader("X-HA-access",i.authToken),u.onload=function(){var e;try{e="application/json"===u.getResponseHeader("content-type")?JSON.parse(u.responseText):u.responseText}catch(t){e=u.responseText}u.status>199&&u.status<300?t(e):n(e)},u.onerror=function(){return n({})},r?(u.setRequestHeader("Content-Type","application/json;charset=UTF-8"),u.send(JSON.stringify(r))):u.send()})}function I(t,e){var n=e.model,r=e.result,i=e.params,o=n.entity;if(!r)return t;var u=i.replace?un({}):t.get(o),a=Array.isArray(r)?r:[r],s=n.fromJSON||un;return t.set(o,u.withMutations((function(t){for(var e=0;e6e4}function yt(t,e){var n=e.date;return n.toISOString()}function gt(){return Wr.getInitialState()}function mt(t,e){var n=e.date,r=e.stateHistory;return 0===r.length?t.set(n,Qr({})):t.withMutations((function(t){r.forEach((function(e){return t.setIn([n,e[0].entity_id],Qr(e.map(En.fromJSON)))}))}))}function St(){return Zr.getInitialState()}function Et(t,e){var n=e.stateHistory;return t.withMutations((function(t){n.forEach((function(e){return t.set(e[0].entity_id,ni(e.map(En.fromJSON)))}))}))}function bt(){return ri.getInitialState()}function It(t,e){var n=e.stateHistory,r=(new Date).getTime();return t.withMutations((function(t){n.forEach((function(e){return t.set(e[0].entity_id,r)})),history.length>1&&t.set(ui,r)}))}function Ot(){return ai.getInitialState()}function wt(t,e){t.dispatch(Yr.ENTITY_HISTORY_DATE_SELECTED,{date:e})}function Tt(t,e){void 0===e&&(e=null),t.dispatch(Yr.RECENT_ENTITY_HISTORY_FETCH_START,{});var n="history/period";return null!==e&&(n+="?filter_entity_id="+e),nn(t,"GET",n).then((function(e){return t.dispatch(Yr.RECENT_ENTITY_HISTORY_FETCH_SUCCESS,{stateHistory:e})}),(function(){return t.dispatch(Yr.RECENT_ENTITY_HISTORY_FETCH_ERROR,{})}))}function At(t,e){return t.dispatch(Yr.ENTITY_HISTORY_FETCH_START,{date:e}),nn(t,"GET","history/period/"+e).then((function(n){return t.dispatch(Yr.ENTITY_HISTORY_FETCH_SUCCESS,{date:e,stateHistory:n})}),(function(){return t.dispatch(Yr.ENTITY_HISTORY_FETCH_ERROR,{})}))}function Ct(t){var e=t.evaluate(fi);return At(t,e)}function Dt(t){t.registerStores({currentEntityHistoryDate:Wr,entityHistory:Zr,isLoadingEntityHistory:ti,recentEntityHistory:ri,recentEntityHistoryUpdated:ai})}function zt(t){t.registerStores({moreInfoEntityId:Kr})}function Rt(t,e){var n=e.model,r=e.result,i=e.params;if(null===t||"entity"!==n.entity||!i.replace)return t;for(var o=0;o0?i=setTimeout(r,e-c):(i=null,n||(s=t.apply(u,o),i||(u=o=null)))}var i,o,u,a,s;null==e&&(e=100);var c=function(){u=this,o=arguments,a=(new Date).getTime();var c=n&&!i;return i||(i=setTimeout(r,e)),c&&(s=t.apply(u,o),u=o=null),s};return c.clear=function(){i&&(clearTimeout(i),i=null)},c}function Bt(t){var e=ao[t.hassId];e&&(e.scheduleHealthCheck.clear(),e.conn.close(),ao[t.hassId]=!1)}function Yt(t,e){void 0===e&&(e={});var n=e.syncOnInitialConnect;void 0===n&&(n=!0),Bt(t);var r=t.evaluate(Do.authToken),i="https:"===document.location.protocol?"wss://":"ws://";i+=document.location.hostname,document.location.port&&(i+=":"+document.location.port),i+="/api/websocket",E(i,{authToken:r}).then((function(e){var r=Kt((function(){return e.ping()}),oo);r(),e.socket.addEventListener("message",r),ao[t.hassId]={conn:e,scheduleHealthCheck:r},uo.forEach((function(n){return e.subscribeEvents(io.bind(null,t),n)})),t.batch((function(){t.dispatch(Be.STREAM_START),n&&eo.fetchAll(t)})),e.addEventListener("disconnected",(function(){t.dispatch(Be.STREAM_ERROR)})),e.addEventListener("ready",(function(){t.batch((function(){t.dispatch(Be.STREAM_START),eo.fetchAll(t)}))}))}))}function Jt(t){t.registerStores({streamStatus:We})}function Wt(t,e,n){void 0===n&&(n={});var r=n.rememberAuth;void 0===r&&(r=!1);var i=n.host;void 0===i&&(i=""),t.dispatch(Pe.VALIDATING_AUTH_TOKEN,{authToken:e,host:i}),eo.fetchAll(t).then((function(){t.dispatch(Pe.VALID_AUTH_TOKEN,{authToken:e,host:i,rememberAuth:r}),lo.start(t,{syncOnInitialConnect:!1})}),(function(e){void 0===e&&(e={});var n=e.message;void 0===n&&(n=vo),t.dispatch(Pe.INVALID_AUTH_TOKEN,{errorMessage:n})}))}function Xt(t){t.dispatch(Pe.LOG_OUT,{})}function Qt(t){t.registerStores({authAttempt:xe,authCurrent:Fe,rememberAuth:Ke})}function Zt(){if(!("localStorage"in window))return{};var t=window.localStorage,e="___test";try{return t.setItem(e,e),t.removeItem(e),t}catch(t){return{}}}function $t(){var t=new ko({debug:!1});return t.hassId=No++,t}function te(t,e,n){Object.keys(n).forEach((function(r){var i=n[r];if("register"in i&&i.register(e),"getters"in i&&Object.defineProperty(t,r+"Getters",{value:i.getters,enumerable:!0}),"actions"in i){var o={};Object.getOwnPropertyNames(i.actions).forEach((function(t){"function"==typeof i.actions[t]&&Object.defineProperty(o,t,{value:i.actions[t].bind(null,e),enumerable:!0})})),Object.defineProperty(t,r+"Actions",{value:o,enumerable:!0})}}))}function ee(t,e){return Po(t.attributes.entity_id.map((function(t){return e.get(t)})).filter((function(t){return!!t})))}function ne(t){return nn(t,"GET","error_log")}function re(t,e){var n=e.date;return n.toISOString()}function ie(){return Ko.getInitialState()}function oe(t,e){var n=e.date,r=e.entries;return t.set(n,Zo(r.map(Xo.fromJSON)))}function ue(){return $o.getInitialState()}function ae(t,e){var n=e.date;return t.set(n,(new Date).getTime())}function se(){return nu.getInitialState()}function ce(t,e){t.dispatch(Fo.LOGBOOK_DATE_SELECTED,{date:e})}function fe(t,e){t.dispatch(Fo.LOGBOOK_ENTRIES_FETCH_START,{date:e}),nn(t,"GET","logbook/"+e).then((function(n){return t.dispatch(Fo.LOGBOOK_ENTRIES_FETCH_SUCCESS,{date:e,entries:n})}),(function(){return t.dispatch(Fo.LOGBOOK_ENTRIES_FETCH_ERROR,{})}))}function he(t){return!t||(new Date).getTime()-t>ou}function le(t){t.registerStores({currentLogbookDate:Ko,isLoadingLogbookEntries:Yo,logbookEntries:$o,logbookEntriesUpdated:nu})}function pe(t){return t.set("active",!0)}function _e(t){return t.set("active",!1)}function de(){return yu.getInitialState()}function ve(t){return navigator.serviceWorker.getRegistration().then((function(t){if(!t)throw new Error("No service worker registered.");return t.pushManager.subscribe({userVisibleOnly:!0})})).then((function(e){var n;return n=navigator.userAgent.toLowerCase().indexOf("firefox")>-1?"firefox":"chrome",nn(t,"POST","notify.html5",{subscription:e,browser:n}).then((function(){return t.dispatch(_u.PUSH_NOTIFICATIONS_SUBSCRIBE,{})})).then((function(){return!0}))})).catch((function(e){var n;return n=e.message&&e.message.indexOf("gcm_sender_id")!==-1?"Please setup the notify.html5 platform.":"Notification registration failed.",console.error(e),Hn.createNotification(t,n),!1}))}function ye(t){return navigator.serviceWorker.getRegistration().then((function(t){if(!t)throw new Error("No service worker registered");return t.pushManager.subscribe({userVisibleOnly:!0})})).then((function(e){return nn(t,"DELETE","notify.html5",{subscription:e}).then((function(){return e.unsubscribe()})).then((function(){return t.dispatch(_u.PUSH_NOTIFICATIONS_UNSUBSCRIBE,{})})).then((function(){return!0}))})).catch((function(e){var n="Failed unsubscribing for push notifications.";return console.error(e),Hn.createNotification(t,n),!1}))}function ge(t){t.registerStores({pushNotifications:yu})}function me(t,e){return nn(t,"POST","template",{template:e})}function Se(t){return t.set("isListening",!0)}function Ee(t,e){var n=e.interimTranscript,r=e.finalTranscript;return t.withMutations((function(t){return t.set("isListening",!0).set("isTransmitting",!1).set("interimTranscript",n).set("finalTranscript",r)}))}function be(t,e){var n=e.finalTranscript;return t.withMutations((function(t){return t.set("isListening",!1).set("isTransmitting",!0).set("interimTranscript","").set("finalTranscript",n)}))}function Ie(){return Lu.getInitialState()}function Oe(){return Lu.getInitialState()}function we(){return Lu.getInitialState()}function Te(t){return ju[t.hassId]}function Ae(t){var e=Te(t);if(e){var n=e.finalTranscript||e.interimTranscript;t.dispatch(zu.VOICE_TRANSMITTING,{finalTranscript:n}),Zn.callService(t,"conversation","process",{text:n}).then((function(){t.dispatch(zu.VOICE_DONE)}),(function(){t.dispatch(zu.VOICE_ERROR)}))}}function Ce(t){var e=Te(t);e&&(e.recognition.stop(),ju[t.hassId]=!1)}function De(t){Ae(t),Ce(t)}function ze(t){var e=De.bind(null,t);e();var n=new webkitSpeechRecognition;ju[t.hassId]={recognition:n,interimTranscript:"",finalTranscript:""},n.interimResults=!0,n.onstart=function(){return t.dispatch(zu.VOICE_START)},n.onerror=function(){return t.dispatch(zu.VOICE_ERROR)},n.onend=e,n.onresult=function(e){var n=Te(t);if(n){for(var r="",i="",o=e.resultIndex;o>>0;if(""+n!==e||4294967295===n)return NaN;e=n}return e<0?_(t)+e:e}function v(){return!0}function y(t,e,n){return(0===t||void 0!==n&&t<=-n)&&(void 0===e||void 0!==n&&e>=n)}function g(t,e){return S(t,e,0)}function m(t,e){return S(t,e,e)}function S(t,e,n){return void 0===t?n:t<0?Math.max(0,e+t):void 0===e?t:Math.min(e,t)}function E(t){this.next=t}function b(t,e,n,r){var i=0===t?e:1===t?n:[e,n];return r?r.value=i:r={value:i,done:!1},r}function I(){return{value:void 0,done:!0}}function O(t){return!!A(t)}function w(t){return t&&"function"==typeof t.next}function T(t){var e=A(t);return e&&e.call(t)}function A(t){var e=t&&(In&&t[In]||t[On]);if("function"==typeof e)return e}function C(t){return t&&"number"==typeof t.length}function D(t){return null===t||void 0===t?U():o(t)?t.toSeq():V(t)}function z(t){return null===t||void 0===t?U().toKeyedSeq():o(t)?u(t)?t.toSeq():t.fromEntrySeq():H(t)}function R(t){return null===t||void 0===t?U():o(t)?u(t)?t.entrySeq():t.toIndexedSeq():x(t)}function M(t){return(null===t||void 0===t?U():o(t)?u(t)?t.entrySeq():t:x(t)).toSetSeq()}function L(t){this._array=t,this.size=t.length}function j(t){var e=Object.keys(t);this._object=t,this._keys=e,this.size=e.length}function k(t){this._iterable=t,this.size=t.length||t.size}function N(t){this._iterator=t,this._iteratorCache=[]}function P(t){return!(!t||!t[Tn])}function U(){return An||(An=new L([]))}function H(t){var e=Array.isArray(t)?new L(t).fromEntrySeq():w(t)?new N(t).fromEntrySeq():O(t)?new k(t).fromEntrySeq():"object"==typeof t?new j(t):void 0;if(!e)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+t);return e}function x(t){var e=q(t);if(!e)throw new TypeError("Expected Array or iterable object of values: "+t);return e}function V(t){var e=q(t)||"object"==typeof t&&new j(t);if(!e)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+t);return e}function q(t){return C(t)?new L(t):w(t)?new N(t):O(t)?new k(t):void 0}function F(t,e,n,r){var i=t._cache;if(i){for(var o=i.length-1,u=0;u<=o;u++){var a=i[n?o-u:u];if(e(a[1],r?a[0]:u,t)===!1)return u+1}return u}return t.__iterateUncached(e,n)}function G(t,e,n,r){var i=t._cache;if(i){var o=i.length-1,u=0;return new E(function(){var t=i[n?o-u:u];return u++>o?I():b(e,r?t[0]:u-1,t[1])})}return t.__iteratorUncached(e,n)}function K(t,e){return e?B(e,t,"",{"":t}):Y(t)}function B(t,e,n,r){return Array.isArray(e)?t.call(r,n,R(e).map((function(n,r){return B(t,n,r,e)}))):J(e)?t.call(r,n,z(e).map((function(n,r){return B(t,n,r,e)}))):e}function Y(t){return Array.isArray(t)?R(t).map(Y).toList():J(t)?z(t).map(Y).toMap():t}function J(t){return t&&(t.constructor===Object||void 0===t.constructor)}function W(t,e){if(t===e||t!==t&&e!==e)return!0;if(!t||!e)return!1;if("function"==typeof t.valueOf&&"function"==typeof e.valueOf){if(t=t.valueOf(),e=e.valueOf(),t===e||t!==t&&e!==e)return!0;if(!t||!e)return!1}return!("function"!=typeof t.equals||"function"!=typeof e.equals||!t.equals(e))}function X(t,e){if(t===e)return!0;if(!o(e)||void 0!==t.size&&void 0!==e.size&&t.size!==e.size||void 0!==t.__hash&&void 0!==e.__hash&&t.__hash!==e.__hash||u(t)!==u(e)||a(t)!==a(e)||c(t)!==c(e))return!1;if(0===t.size&&0===e.size)return!0;var n=!s(t);if(c(t)){var r=t.entries();return e.every((function(t,e){var i=r.next().value;return i&&W(i[1],t)&&(n||W(i[0],e))}))&&r.next().done}var i=!1;if(void 0===t.size)if(void 0===e.size)"function"==typeof t.cacheResult&&t.cacheResult();else{i=!0;var f=t;t=e,e=f}var h=!0,l=e.__iterate((function(e,r){if(n?!t.has(e):i?!W(e,t.get(r,yn)):!W(t.get(r,yn),e))return h=!1,!1}));return h&&t.size===l}function Q(t,e){if(!(this instanceof Q))return new Q(t,e);if(this._value=t,this.size=void 0===e?1/0:Math.max(0,e),0===this.size){if(Cn)return Cn;Cn=this}}function Z(t,e){if(!t)throw new Error(e)}function $(t,e,n){if(!(this instanceof $))return new $(t,e,n);if(Z(0!==n,"Cannot step a Range by 0"),t=t||0,void 0===e&&(e=1/0),n=void 0===n?1:Math.abs(n),e>>1&1073741824|3221225471&t}function ot(t){if(t===!1||null===t||void 0===t)return 0;if("function"==typeof t.valueOf&&(t=t.valueOf(),t===!1||null===t||void 0===t))return 0;if(t===!0)return 1;var e=typeof t;if("number"===e){if(t!==t||t===1/0)return 0;var n=0|t;for(n!==t&&(n^=4294967295*t);t>4294967295;)t/=4294967295,n^=t;return it(n)}if("string"===e)return t.length>Pn?ut(t):at(t);if("function"==typeof t.hashCode)return t.hashCode();if("object"===e)return st(t);if("function"==typeof t.toString)return at(t.toString());throw new Error("Value type "+e+" cannot be hashed.")}function ut(t){var e=xn[t];return void 0===e&&(e=at(t),Hn===Un&&(Hn=0,xn={}),Hn++,xn[t]=e),e}function at(t){for(var e=0,n=0;n0)switch(t.nodeType){case 1:return t.uniqueID;case 9:return t.documentElement&&t.documentElement.uniqueID}}function ft(t){Z(t!==1/0,"Cannot perform this action with an infinite size.")}function ht(t){return null===t||void 0===t?bt():lt(t)&&!c(t)?t:bt().withMutations((function(e){var r=n(t);ft(r.size),r.forEach((function(t,n){return e.set(n,t)}))}))}function lt(t){return!(!t||!t[Vn])}function pt(t,e){this.ownerID=t,this.entries=e}function _t(t,e,n){this.ownerID=t,this.bitmap=e,this.nodes=n}function dt(t,e,n){this.ownerID=t,this.count=e,this.nodes=n}function vt(t,e,n){this.ownerID=t,this.keyHash=e,this.entries=n}function yt(t,e,n){this.ownerID=t,this.keyHash=e,this.entry=n}function gt(t,e,n){this._type=e,this._reverse=n,this._stack=t._root&&St(t._root)}function mt(t,e){return b(t,e[0],e[1])}function St(t,e){return{node:t,index:0,__prev:e}}function Et(t,e,n,r){var i=Object.create(qn);return i.size=t,i._root=e,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function bt(){return Fn||(Fn=Et(0))}function It(t,e,n){var r,i;if(t._root){var o=f(gn),u=f(mn);if(r=Ot(t._root,t.__ownerID,0,void 0,e,n,o,u),!u.value)return t;i=t.size+(o.value?n===yn?-1:1:0)}else{if(n===yn)return t;i=1,r=new pt(t.__ownerID,[[e,n]])}return t.__ownerID?(t.size=i,t._root=r,t.__hash=void 0,t.__altered=!0,t):r?Et(i,r):bt()}function Ot(t,e,n,r,i,o,u,a){return t?t.update(e,n,r,i,o,u,a):o===yn?t:(h(a),h(u),new yt(e,r,[i,o]))}function wt(t){return t.constructor===yt||t.constructor===vt}function Tt(t,e,n,r,i){if(t.keyHash===r)return new vt(e,r,[t.entry,i]);var o,u=(0===n?t.keyHash:t.keyHash>>>n)&vn,a=(0===n?r:r>>>n)&vn,s=u===a?[Tt(t,e,n+_n,r,i)]:(o=new yt(e,r,i),u>>=1)u[a]=1&n?e[o++]:void 0;return u[r]=i,new dt(t,o+1,u)}function zt(t,e,r){for(var i=[],u=0;u>1&1431655765,t=(858993459&t)+(t>>2&858993459),t=t+(t>>4)&252645135,t+=t>>8,t+=t>>16,127&t}function Nt(t,e,n,r){var i=r?t:p(t);return i[e]=n,i}function Pt(t,e,n,r){var i=t.length+1;if(r&&e+1===i)return t[e]=n,t;for(var o=new Array(i),u=0,a=0;a0&&io?0:o-n,c=u-n;return c>dn&&(c=dn),function(){if(i===c)return Xn;var t=e?--c:i++;return r&&r[t]}}function i(t,r,i){var a,s=t&&t.array,c=i>o?0:o-i>>r,f=(u-i>>r)+1;return f>dn&&(f=dn),function(){for(;;){if(a){var t=a();if(t!==Xn)return t;a=null}if(c===f)return Xn;var o=e?--f:c++;a=n(s&&s[o],r-_n,i+(o<=t.size||e<0)return t.withMutations((function(t){e<0?Wt(t,e).set(0,n):Wt(t,0,e+1).set(e,n)}));e+=t._origin;var r=t._tail,i=t._root,o=f(mn);return e>=Qt(t._capacity)?r=Bt(r,t.__ownerID,0,e,n,o):i=Bt(i,t.__ownerID,t._level,e,n,o),o.value?t.__ownerID?(t._root=i,t._tail=r,t.__hash=void 0,t.__altered=!0,t):Ft(t._origin,t._capacity,t._level,i,r):t}function Bt(t,e,n,r,i,o){var u=r>>>n&vn,a=t&&u0){var c=t&&t.array[u],f=Bt(c,e,n-_n,r,i,o);return f===c?t:(s=Yt(t,e),s.array[u]=f,s)}return a&&t.array[u]===i?t:(h(o),s=Yt(t,e),void 0===i&&u===s.array.length-1?s.array.pop():s.array[u]=i,s)}function Yt(t,e){return e&&t&&e===t.ownerID?t:new Vt(t?t.array.slice():[],e)}function Jt(t,e){if(e>=Qt(t._capacity))return t._tail;if(e<1<0;)n=n.array[e>>>r&vn],r-=_n;return n}}function Wt(t,e,n){void 0!==e&&(e|=0),void 0!==n&&(n|=0);var r=t.__ownerID||new l,i=t._origin,o=t._capacity,u=i+e,a=void 0===n?o:n<0?o+n:i+n;if(u===i&&a===o)return t;if(u>=a)return t.clear();for(var s=t._level,c=t._root,f=0;u+f<0;)c=new Vt(c&&c.array.length?[void 0,c]:[],r),s+=_n,f+=1<=1<h?new Vt([],r):_;if(_&&p>h&&u_n;y-=_n){var g=h>>>y&vn;v=v.array[g]=Yt(v.array[g],r)}v.array[h>>>_n&vn]=_}if(a=p)u-=p,a-=p,s=_n,c=null,d=d&&d.removeBefore(r,0,u);else if(u>i||p>>s&vn;if(m!==p>>>s&vn)break;m&&(f+=(1<i&&(c=c.removeBefore(r,s,u-f)),c&&pu&&(u=c.size),o(s)||(c=c.map((function(t){return K(t)}))),i.push(c)}return u>t.size&&(t=t.setSize(u)),Lt(t,e,i)}function Qt(t){return t>>_n<<_n}function Zt(t){return null===t||void 0===t?ee():$t(t)?t:ee().withMutations((function(e){var r=n(t);ft(r.size),r.forEach((function(t,n){return e.set(n,t)}))}))}function $t(t){return lt(t)&&c(t)}function te(t,e,n,r){var i=Object.create(Zt.prototype);return i.size=t?t.size:0,i._map=t,i._list=e,i.__ownerID=n,i.__hash=r,i}function ee(){return Qn||(Qn=te(bt(),Gt()))}function ne(t,e,n){var r,i,o=t._map,u=t._list,a=o.get(e),s=void 0!==a;if(n===yn){if(!s)return t;u.size>=dn&&u.size>=2*o.size?(i=u.filter((function(t,e){return void 0!==t&&a!==e})),r=i.toKeyedSeq().map((function(t){return t[0]})).flip().toMap(),t.__ownerID&&(r.__ownerID=i.__ownerID=t.__ownerID)):(r=o.remove(e),i=a===u.size-1?u.pop():u.set(a,void 0))}else if(s){if(n===u.get(a)[1])return t;r=o,i=u.set(a,[e,n])}else r=o.set(e,u.size),i=u.set(u.size,[e,n]);return t.__ownerID?(t.size=r.size,t._map=r,t._list=i,t.__hash=void 0,t):te(r,i)}function re(t,e){this._iter=t,this._useKeys=e,this.size=t.size}function ie(t){this._iter=t,this.size=t.size}function oe(t){this._iter=t,this.size=t.size}function ue(t){this._iter=t,this.size=t.size}function ae(t){var e=Ce(t);return e._iter=t,e.size=t.size,e.flip=function(){return t},e.reverse=function(){var e=t.reverse.apply(this);return e.flip=function(){return t.reverse()},e},e.has=function(e){return t.includes(e)},e.includes=function(e){return t.has(e)},e.cacheResult=De,e.__iterateUncached=function(e,n){var r=this;return t.__iterate((function(t,n){return e(n,t,r)!==!1}),n)},e.__iteratorUncached=function(e,n){if(e===bn){var r=t.__iterator(e,n);return new E(function(){var t=r.next();if(!t.done){var e=t.value[0];t.value[0]=t.value[1],t.value[1]=e}return t})}return t.__iterator(e===En?Sn:En,n)},e}function se(t,e,n){var r=Ce(t);return r.size=t.size,r.has=function(e){return t.has(e)},r.get=function(r,i){var o=t.get(r,yn);return o===yn?i:e.call(n,o,r,t)},r.__iterateUncached=function(r,i){var o=this;return t.__iterate((function(t,i,u){return r(e.call(n,t,i,u),i,o)!==!1}),i)},r.__iteratorUncached=function(r,i){var o=t.__iterator(bn,i);return new E(function(){var i=o.next();if(i.done)return i;var u=i.value,a=u[0];return b(r,a,e.call(n,u[1],a,t),i)})},r}function ce(t,e){var n=Ce(t);return n._iter=t,n.size=t.size,n.reverse=function(){return t},t.flip&&(n.flip=function(){var e=ae(t);return e.reverse=function(){return t.flip()},e}),n.get=function(n,r){return t.get(e?n:-1-n,r)},n.has=function(n){return t.has(e?n:-1-n)},n.includes=function(e){return t.includes(e)},n.cacheResult=De,n.__iterate=function(e,n){var r=this;return t.__iterate((function(t,n){return e(t,n,r)}),!n)},n.__iterator=function(e,n){return t.__iterator(e,!n)},n}function fe(t,e,n,r){var i=Ce(t);return r&&(i.has=function(r){var i=t.get(r,yn);return i!==yn&&!!e.call(n,i,r,t)},i.get=function(r,i){var o=t.get(r,yn);return o!==yn&&e.call(n,o,r,t)?o:i}),i.__iterateUncached=function(i,o){var u=this,a=0;return t.__iterate((function(t,o,s){if(e.call(n,t,o,s))return a++,i(t,r?o:a-1,u)}),o),a},i.__iteratorUncached=function(i,o){var u=t.__iterator(bn,o),a=0;return new E(function(){for(;;){var o=u.next();if(o.done)return o;var s=o.value,c=s[0],f=s[1];if(e.call(n,f,c,t))return b(i,r?c:a++,f,o)}})},i}function he(t,e,n){var r=ht().asMutable();return t.__iterate((function(i,o){r.update(e.call(n,i,o,t),0,(function(t){return t+1}))})),r.asImmutable()}function le(t,e,n){var r=u(t),i=(c(t)?Zt():ht()).asMutable();t.__iterate((function(o,u){i.update(e.call(n,o,u,t),(function(t){return t=t||[],t.push(r?[u,o]:o),t}))}));var o=Ae(t);return i.map((function(e){return Oe(t,o(e))}))}function pe(t,e,n,r){var i=t.size;if(void 0!==e&&(e|=0),void 0!==n&&(n===1/0?n=i:n|=0),y(e,n,i))return t;var o=g(e,i),u=m(n,i);if(o!==o||u!==u)return pe(t.toSeq().cacheResult(),e,n,r);var a,s=u-o;s===s&&(a=s<0?0:s);var c=Ce(t);return c.size=0===a?a:t.size&&a||void 0,!r&&P(t)&&a>=0&&(c.get=function(e,n){return e=d(this,e),e>=0&&ea)return I();var t=i.next();return r||e===En?t:e===Sn?b(e,s-1,void 0,t):b(e,s-1,t.value[1],t)})},c}function _e(t,e,n){var r=Ce(t);return r.__iterateUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterate(r,i);var u=0;return t.__iterate((function(t,i,a){return e.call(n,t,i,a)&&++u&&r(t,i,o)})),u},r.__iteratorUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterator(r,i);var u=t.__iterator(bn,i),a=!0;return new E(function(){if(!a)return I();var t=u.next();if(t.done)return t;var i=t.value,s=i[0],c=i[1];return e.call(n,c,s,o)?r===bn?t:b(r,s,c,t):(a=!1,I())})},r}function de(t,e,n,r){var i=Ce(t);return i.__iterateUncached=function(i,o){var u=this;if(o)return this.cacheResult().__iterate(i,o);var a=!0,s=0;return t.__iterate((function(t,o,c){if(!a||!(a=e.call(n,t,o,c)))return s++,i(t,r?o:s-1,u)})),s},i.__iteratorUncached=function(i,o){var u=this;if(o)return this.cacheResult().__iterator(i,o);var a=t.__iterator(bn,o),s=!0,c=0;return new E(function(){var t,o,f;do{if(t=a.next(),t.done)return r||i===En?t:i===Sn?b(i,c++,void 0,t):b(i,c++,t.value[1],t);var h=t.value;o=h[0],f=h[1],s&&(s=e.call(n,f,o,u))}while(s);return i===bn?t:b(i,o,f,t)})},i}function ve(t,e){var r=u(t),i=[t].concat(e).map((function(t){return o(t)?r&&(t=n(t)):t=r?H(t):x(Array.isArray(t)?t:[t]),t})).filter((function(t){return 0!==t.size}));if(0===i.length)return t;if(1===i.length){var s=i[0];if(s===t||r&&u(s)||a(t)&&a(s))return s}var c=new L(i);return r?c=c.toKeyedSeq():a(t)||(c=c.toSetSeq()),c=c.flatten(!0),c.size=i.reduce((function(t,e){if(void 0!==t){var n=e.size;if(void 0!==n)return t+n}}),0),c}function ye(t,e,n){var r=Ce(t);return r.__iterateUncached=function(r,i){function u(t,c){var f=this;t.__iterate((function(t,i){return(!e||c0}function Ie(t,n,r){var i=Ce(t);return i.size=new L(r).map((function(t){return t.size})).min(),i.__iterate=function(t,e){for(var n,r=this,i=this.__iterator(En,e),o=0;!(n=i.next()).done&&t(n.value,o++,r)!==!1;);return o},i.__iteratorUncached=function(t,i){var o=r.map((function(t){return t=e(t),T(i?t.reverse():t)})),u=0,a=!1;return new E(function(){var e;return a||(e=o.map((function(t){return t.next()})),a=e.some((function(t){return t.done}))),a?I():b(t,u++,n.apply(null,e.map((function(t){return t.value}))))})},i}function Oe(t,e){return P(t)?e:t.constructor(e)}function we(t){if(t!==Object(t))throw new TypeError("Expected [K, V] tuple: "+t)}function Te(t){return ft(t.size),_(t)}function Ae(t){return u(t)?n:a(t)?r:i}function Ce(t){return Object.create((u(t)?z:a(t)?R:M).prototype)}function De(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):D.prototype.cacheResult.call(this)}function ze(t,e){return t>e?1:te?-1:0}function on(t){if(t.size===1/0)return 0;var e=c(t),n=u(t),r=e?1:0,i=t.__iterate(n?e?function(t,e){r=31*r+an(ot(t),ot(e))|0}:function(t,e){r=r+an(ot(t),ot(e))|0}:e?function(t){r=31*r+ot(t)|0}:function(t){r=r+ot(t)|0});return un(i,r)}function un(t,e){return e=Rn(e,3432918353),e=Rn(e<<15|e>>>-15,461845907),e=Rn(e<<13|e>>>-13,5),e=(e+3864292196|0)^t,e=Rn(e^e>>>16,2246822507),e=Rn(e^e>>>13,3266489909),e=it(e^e>>>16)}function an(t,e){return t^e+2654435769+(t<<6)+(t>>2)|0}var sn=Array.prototype.slice;t(n,e),t(r,e),t(i,e),e.isIterable=o,e.isKeyed=u,e.isIndexed=a,e.isAssociative=s,e.isOrdered=c,e.Keyed=n,e.Indexed=r,e.Set=i;var cn="@@__IMMUTABLE_ITERABLE__@@",fn="@@__IMMUTABLE_KEYED__@@",hn="@@__IMMUTABLE_INDEXED__@@",ln="@@__IMMUTABLE_ORDERED__@@",pn="delete",_n=5,dn=1<<_n,vn=dn-1,yn={},gn={value:!1},mn={value:!1},Sn=0,En=1,bn=2,In="function"==typeof Symbol&&Symbol.iterator,On="@@iterator",wn=In||On;E.prototype.toString=function(){return"[Iterator]"},E.KEYS=Sn,E.VALUES=En,E.ENTRIES=bn,E.prototype.inspect=E.prototype.toSource=function(){return this.toString()},E.prototype[wn]=function(){return this},t(D,e),D.of=function(){return D(arguments)},D.prototype.toSeq=function(){return this},D.prototype.toString=function(){return this.__toString("Seq {","}")},D.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},D.prototype.__iterate=function(t,e){return F(this,t,e,!0)},D.prototype.__iterator=function(t,e){return G(this,t,e,!0)},t(z,D),z.prototype.toKeyedSeq=function(){return this},t(R,D),R.of=function(){return R(arguments)},R.prototype.toIndexedSeq=function(){return this},R.prototype.toString=function(){return this.__toString("Seq [","]")},R.prototype.__iterate=function(t,e){return F(this,t,e,!1)},R.prototype.__iterator=function(t,e){return G(this,t,e,!1)},t(M,D),M.of=function(){return M(arguments)},M.prototype.toSetSeq=function(){return this},D.isSeq=P,D.Keyed=z,D.Set=M,D.Indexed=R;var Tn="@@__IMMUTABLE_SEQ__@@";D.prototype[Tn]=!0,t(L,R),L.prototype.get=function(t,e){return this.has(t)?this._array[d(this,t)]:e},L.prototype.__iterate=function(t,e){for(var n=this,r=this._array,i=r.length-1,o=0;o<=i;o++)if(t(r[e?i-o:o],o,n)===!1)return o+1;return o},L.prototype.__iterator=function(t,e){var n=this._array,r=n.length-1,i=0;return new E(function(){return i>r?I():b(t,i,n[e?r-i++:i++])})},t(j,z),j.prototype.get=function(t,e){return void 0===e||this.has(t)?this._object[t]:e},j.prototype.has=function(t){return this._object.hasOwnProperty(t)},j.prototype.__iterate=function(t,e){for(var n=this,r=this._object,i=this._keys,o=i.length-1,u=0;u<=o;u++){var a=i[e?o-u:u];if(t(r[a],a,n)===!1)return u+1}return u},j.prototype.__iterator=function(t,e){var n=this._object,r=this._keys,i=r.length-1,o=0;return new E(function(){var u=r[e?i-o:o];return o++>i?I():b(t,u,n[u])})},j.prototype[ln]=!0,t(k,R),k.prototype.__iterateUncached=function(t,e){var n=this;if(e)return this.cacheResult().__iterate(t,e);var r=this._iterable,i=T(r),o=0;if(w(i))for(var u;!(u=i.next()).done&&t(u.value,o++,n)!==!1;);return o},k.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var n=this._iterable,r=T(n);if(!w(r))return new E(I);var i=0;return new E(function(){var e=r.next();return e.done?e:b(t,i++,e.value)})},t(N,R),N.prototype.__iterateUncached=function(t,e){var n=this;if(e)return this.cacheResult().__iterate(t,e);for(var r=this._iterator,i=this._iteratorCache,o=0;o=r.length){var e=n.next();if(e.done)return e;r[i]=e.value}return b(t,i,r[i++])})};var An;t(Q,R),Q.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Q.prototype.get=function(t,e){return this.has(t)?this._value:e},Q.prototype.includes=function(t){return W(this._value,t)},Q.prototype.slice=function(t,e){var n=this.size;return y(t,e,n)?this:new Q(this._value,m(e,n)-g(t,n))},Q.prototype.reverse=function(){return this},Q.prototype.indexOf=function(t){return W(this._value,t)?0:-1},Q.prototype.lastIndexOf=function(t){return W(this._value,t)?this.size:-1},Q.prototype.__iterate=function(t,e){for(var n=this,r=0;r=0&&e=0&&nn?I():b(t,o++,u)})},$.prototype.equals=function(t){return t instanceof $?this._start===t._start&&this._end===t._end&&this._step===t._step:X(this,t)};var Dn;t(tt,e),t(et,tt),t(nt,tt),t(rt,tt),tt.Keyed=et,tt.Indexed=nt,tt.Set=rt;var zn,Rn="function"==typeof Math.imul&&Math.imul(4294967295,2)===-2?Math.imul:function(t,e){t|=0,e|=0;var n=65535&t,r=65535&e;return n*r+((t>>>16)*r+n*(e>>>16)<<16>>>0)|0},Mn=Object.isExtensible,Ln=(function(){try{return Object.defineProperty({},"@",{}),!0}catch(t){return!1}})(),jn="function"==typeof WeakMap;jn&&(zn=new WeakMap);var kn=0,Nn="__immutablehash__";"function"==typeof Symbol&&(Nn=Symbol(Nn));var Pn=16,Un=255,Hn=0,xn={};t(ht,et),ht.of=function(){var t=sn.call(arguments,0);return bt().withMutations((function(e){for(var n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}}))},ht.prototype.toString=function(){return this.__toString("Map {","}")},ht.prototype.get=function(t,e){return this._root?this._root.get(0,void 0,t,e):e},ht.prototype.set=function(t,e){return It(this,t,e)},ht.prototype.setIn=function(t,e){return this.updateIn(t,yn,(function(){return e}))},ht.prototype.remove=function(t){return It(this,t,yn)},ht.prototype.deleteIn=function(t){return this.updateIn(t,(function(){return yn}))},ht.prototype.update=function(t,e,n){return 1===arguments.length?t(this):this.updateIn([t],e,n)},ht.prototype.updateIn=function(t,e,n){n||(n=e,e=void 0);var r=jt(this,Re(t),e,n);return r===yn?void 0:r},ht.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):bt()},ht.prototype.merge=function(){return zt(this,void 0,arguments)},ht.prototype.mergeWith=function(t){var e=sn.call(arguments,1);return zt(this,t,e)},ht.prototype.mergeIn=function(t){var e=sn.call(arguments,1);return this.updateIn(t,bt(),(function(t){return"function"==typeof t.merge?t.merge.apply(t,e):e[e.length-1]}))},ht.prototype.mergeDeep=function(){return zt(this,Rt,arguments)},ht.prototype.mergeDeepWith=function(t){var e=sn.call(arguments,1);return zt(this,Mt(t),e)},ht.prototype.mergeDeepIn=function(t){var e=sn.call(arguments,1);return this.updateIn(t,bt(),(function(t){return"function"==typeof t.mergeDeep?t.mergeDeep.apply(t,e):e[e.length-1]}))},ht.prototype.sort=function(t){return Zt(Se(this,t))},ht.prototype.sortBy=function(t,e){return Zt(Se(this,e,t))},ht.prototype.withMutations=function(t){var e=this.asMutable();return t(e),e.wasAltered()?e.__ensureOwner(this.__ownerID):this},ht.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new l)},ht.prototype.asImmutable=function(){return this.__ensureOwner()},ht.prototype.wasAltered=function(){return this.__altered},ht.prototype.__iterator=function(t,e){return new gt(this,t,e)},ht.prototype.__iterate=function(t,e){var n=this,r=0;return this._root&&this._root.iterate((function(e){return r++,t(e[1],e[0],n)}),e),r},ht.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Et(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},ht.isMap=lt;var Vn="@@__IMMUTABLE_MAP__@@",qn=ht.prototype;qn[Vn]=!0,qn[pn]=qn.remove,qn.removeIn=qn.deleteIn,pt.prototype.get=function(t,e,n,r){for(var i=this.entries,o=0,u=i.length;o=Gn)return At(t,s,r,i);var _=t&&t===this.ownerID,d=_?s:p(s);return l?a?c===f-1?d.pop():d[c]=d.pop():d[c]=[r,i]:d.push([r,i]),_?(this.entries=d,this):new pt(t,d)}},_t.prototype.get=function(t,e,n,r){void 0===e&&(e=ot(n));var i=1<<((0===t?e:e>>>t)&vn),o=this.bitmap;return 0===(o&i)?r:this.nodes[kt(o&i-1)].get(t+_n,e,n,r)},_t.prototype.update=function(t,e,n,r,i,o,u){void 0===n&&(n=ot(r));var a=(0===e?n:n>>>e)&vn,s=1<=Kn)return Dt(t,l,c,a,_);if(f&&!_&&2===l.length&&wt(l[1^h]))return l[1^h];if(f&&_&&1===l.length&&wt(_))return _;var d=t&&t===this.ownerID,v=f?_?c:c^s:c|s,y=f?_?Nt(l,h,_,d):Ut(l,h,d):Pt(l,h,_,d);return d?(this.bitmap=v,this.nodes=y,this):new _t(t,v,y)},dt.prototype.get=function(t,e,n,r){void 0===e&&(e=ot(n));var i=(0===t?e:e>>>t)&vn,o=this.nodes[i];return o?o.get(t+_n,e,n,r):r},dt.prototype.update=function(t,e,n,r,i,o,u){void 0===n&&(n=ot(r));var a=(0===e?n:n>>>e)&vn,s=i===yn,c=this.nodes,f=c[a];if(s&&!f)return this;var h=Ot(f,t,e+_n,n,r,i,o,u);if(h===f)return this;var l=this.count;if(f){if(!h&&(l--,l=0&&t>>e&vn;if(r>=this.array.length)return new Vt([],t);var i,o=0===r;if(e>0){var u=this.array[r];if(i=u&&u.removeBefore(t,e-_n,n),i===u&&o)return this}if(o&&!i)return this;var a=Yt(this,t);if(!o)for(var s=0;s>>e&vn;if(r>=this.array.length)return this;var i;if(e>0){var o=this.array[r];if(i=o&&o.removeAfter(t,e-_n,n),i===o&&r===this.array.length-1)return this}var u=Yt(this,t);return u.array.splice(r+1),i&&(u.array[r]=i),u};var Wn,Xn={};t(Zt,ht),Zt.of=function(){return this(arguments)},Zt.prototype.toString=function(){return this.__toString("OrderedMap {","}")},Zt.prototype.get=function(t,e){var n=this._map.get(t);return void 0!==n?this._list.get(n)[1]:e},Zt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):ee()},Zt.prototype.set=function(t,e){return ne(this,t,e)},Zt.prototype.remove=function(t){return ne(this,t,yn)},Zt.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Zt.prototype.__iterate=function(t,e){var n=this;return this._list.__iterate((function(e){return e&&t(e[1],e[0],n)}),e)},Zt.prototype.__iterator=function(t,e){return this._list.fromEntrySeq().__iterator(t,e)},Zt.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t),n=this._list.__ensureOwner(t);return t?te(e,n,t,this.__hash):(this.__ownerID=t,this._map=e,this._list=n,this)},Zt.isOrderedMap=$t,Zt.prototype[ln]=!0,Zt.prototype[pn]=Zt.prototype.remove;var Qn;t(re,z),re.prototype.get=function(t,e){return this._iter.get(t,e)},re.prototype.has=function(t){return this._iter.has(t)},re.prototype.valueSeq=function(){return this._iter.valueSeq()},re.prototype.reverse=function(){var t=this,e=ce(this,!0);return this._useKeys||(e.valueSeq=function(){return t._iter.toSeq().reverse()}),e},re.prototype.map=function(t,e){var n=this,r=se(this,t,e);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(t,e)}),r},re.prototype.__iterate=function(t,e){var n,r=this;return this._iter.__iterate(this._useKeys?function(e,n){return t(e,n,r)}:(n=e?Te(this):0,function(i){return t(i,e?--n:n++,r)}),e)},re.prototype.__iterator=function(t,e){if(this._useKeys)return this._iter.__iterator(t,e);var n=this._iter.__iterator(En,e),r=e?Te(this):0;return new E(function(){var i=n.next();return i.done?i:b(t,e?--r:r++,i.value,i)})},re.prototype[ln]=!0,t(ie,R),ie.prototype.includes=function(t){return this._iter.includes(t)},ie.prototype.__iterate=function(t,e){var n=this,r=0;return this._iter.__iterate((function(e){return t(e,r++,n)}),e)},ie.prototype.__iterator=function(t,e){var n=this._iter.__iterator(En,e),r=0;return new E(function(){var e=n.next();return e.done?e:b(t,r++,e.value,e)})},t(oe,M),oe.prototype.has=function(t){return this._iter.includes(t)},oe.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){return t(e,e,n)}),e)},oe.prototype.__iterator=function(t,e){var n=this._iter.__iterator(En,e);return new E(function(){var e=n.next();return e.done?e:b(t,e.value,e.value,e)})},t(ue,z),ue.prototype.entrySeq=function(){return this._iter.toSeq()},ue.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){if(e){we(e);var r=o(e);return t(r?e.get(1):e[1],r?e.get(0):e[0],n)}}),e)},ue.prototype.__iterator=function(t,e){var n=this._iter.__iterator(En,e);return new E(function(){for(;;){var e=n.next();if(e.done)return e;var r=e.value;if(r){we(r);var i=o(r);return b(t,i?r.get(0):r[0],i?r.get(1):r[1],e)}}})},ie.prototype.cacheResult=re.prototype.cacheResult=oe.prototype.cacheResult=ue.prototype.cacheResult=De,t(Me,et),Me.prototype.toString=function(){return this.__toString(je(this)+" {","}")},Me.prototype.has=function(t){return this._defaultValues.hasOwnProperty(t)},Me.prototype.get=function(t,e){if(!this.has(t))return e;var n=this._defaultValues[t];return this._map?this._map.get(t,n):n},Me.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var t=this.constructor;return t._empty||(t._empty=Le(this,bt()))},Me.prototype.set=function(t,e){if(!this.has(t))throw new Error('Cannot set unknown key "'+t+'" on '+je(this));if(this._map&&!this._map.has(t)){var n=this._defaultValues[t];if(e===n)return this}var r=this._map&&this._map.set(t,e);return this.__ownerID||r===this._map?this:Le(this,r)},Me.prototype.remove=function(t){if(!this.has(t))return this;var e=this._map&&this._map.remove(t);return this.__ownerID||e===this._map?this:Le(this,e)},Me.prototype.wasAltered=function(){return this._map.wasAltered()},Me.prototype.__iterator=function(t,e){var r=this;return n(this._defaultValues).map((function(t,e){return r.get(e)})).__iterator(t,e)},Me.prototype.__iterate=function(t,e){var r=this;return n(this._defaultValues).map((function(t,e){return r.get(e)})).__iterate(t,e)},Me.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map&&this._map.__ensureOwner(t);return t?Le(this,e,t):(this.__ownerID=t,this._map=e,this)};var Zn=Me.prototype;Zn[pn]=Zn.remove,Zn.deleteIn=Zn.removeIn=qn.removeIn,Zn.merge=qn.merge,Zn.mergeWith=qn.mergeWith,Zn.mergeIn=qn.mergeIn,Zn.mergeDeep=qn.mergeDeep,Zn.mergeDeepWith=qn.mergeDeepWith,Zn.mergeDeepIn=qn.mergeDeepIn,Zn.setIn=qn.setIn,Zn.update=qn.update,Zn.updateIn=qn.updateIn,Zn.withMutations=qn.withMutations,Zn.asMutable=qn.asMutable,Zn.asImmutable=qn.asImmutable,t(Pe,rt),Pe.of=function(){return this(arguments)},Pe.fromKeys=function(t){return this(n(t).keySeq())},Pe.prototype.toString=function(){return this.__toString("Set {","}")},Pe.prototype.has=function(t){return this._map.has(t)},Pe.prototype.add=function(t){ -return He(this,this._map.set(t,!0))},Pe.prototype.remove=function(t){return He(this,this._map.remove(t))},Pe.prototype.clear=function(){return He(this,this._map.clear())},Pe.prototype.union=function(){var t=sn.call(arguments,0);return t=t.filter((function(t){return 0!==t.size})),0===t.length?this:0!==this.size||this.__ownerID||1!==t.length?this.withMutations((function(e){for(var n=0;n=0;r--)n={value:t[r],next:n};return this.__ownerID?(this.size=e,this._head=n,this.__hash=void 0,this.__altered=!0,this):Je(e,n)},Be.prototype.pushAll=function(t){if(t=r(t),0===t.size)return this;ft(t.size);var e=this.size,n=this._head;return t.reverse().forEach((function(t){e++,n={value:t,next:n}})),this.__ownerID?(this.size=e,this._head=n,this.__hash=void 0,this.__altered=!0,this):Je(e,n)},Be.prototype.pop=function(){return this.slice(1)},Be.prototype.unshift=function(){return this.push.apply(this,arguments)},Be.prototype.unshiftAll=function(t){return this.pushAll(t)},Be.prototype.shift=function(){return this.pop.apply(this,arguments)},Be.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):We()},Be.prototype.slice=function(t,e){if(y(t,e,this.size))return this;var n=g(t,this.size),r=m(e,this.size);if(r!==this.size)return nt.prototype.slice.call(this,t,e);for(var i=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=i,this._head=o,this.__hash=void 0,this.__altered=!0,this):Je(i,o)},Be.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Je(this.size,this._head,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Be.prototype.__iterate=function(t,e){var n=this;if(e)return this.reverse().__iterate(t);for(var r=0,i=this._head;i&&t(i.value,r++,n)!==!1;)i=i.next;return r},Be.prototype.__iterator=function(t,e){if(e)return this.reverse().__iterator(t);var n=0,r=this._head;return new E(function(){if(r){var e=r.value;return r=r.next,b(t,n++,e)}return I()})},Be.isStack=Ye;var ir="@@__IMMUTABLE_STACK__@@",or=Be.prototype;or[ir]=!0,or.withMutations=qn.withMutations,or.asMutable=qn.asMutable,or.asImmutable=qn.asImmutable,or.wasAltered=qn.wasAltered;var ur;e.Iterator=E,Xe(e,{toArray:function(){ft(this.size);var t=new Array(this.size||0);return this.valueSeq().__iterate((function(e,n){t[n]=e})),t},toIndexedSeq:function(){return new ie(this)},toJS:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJS?t.toJS():t})).__toJS()},toJSON:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJSON?t.toJSON():t})).__toJS()},toKeyedSeq:function(){return new re(this,!0)},toMap:function(){return ht(this.toKeyedSeq())},toObject:function(){ft(this.size);var t={};return this.__iterate((function(e,n){t[n]=e})),t},toOrderedMap:function(){return Zt(this.toKeyedSeq())},toOrderedSet:function(){return qe(u(this)?this.valueSeq():this)},toSet:function(){return Pe(u(this)?this.valueSeq():this)},toSetSeq:function(){return new oe(this)},toSeq:function(){return a(this)?this.toIndexedSeq():u(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Be(u(this)?this.valueSeq():this)},toList:function(){return Ht(u(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(t,e){return 0===this.size?t+e:t+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+e},concat:function(){var t=sn.call(arguments,0);return Oe(this,ve(this,t))},includes:function(t){return this.some((function(e){return W(e,t)}))},entries:function(){return this.__iterator(bn)},every:function(t,e){ft(this.size);var n=!0;return this.__iterate((function(r,i,o){if(!t.call(e,r,i,o))return n=!1,!1})),n},filter:function(t,e){return Oe(this,fe(this,t,e,!0))},find:function(t,e,n){var r=this.findEntry(t,e);return r?r[1]:n},forEach:function(t,e){return ft(this.size),this.__iterate(e?t.bind(e):t)},join:function(t){ft(this.size),t=void 0!==t?""+t:",";var e="",n=!0;return this.__iterate((function(r){n?n=!1:e+=t,e+=null!==r&&void 0!==r?r.toString():""})),e},keys:function(){return this.__iterator(Sn)},map:function(t,e){return Oe(this,se(this,t,e))},reduce:function(t,e,n){ft(this.size);var r,i;return arguments.length<2?i=!0:r=e,this.__iterate((function(e,o,u){i?(i=!1,r=e):r=t.call(n,r,e,o,u)})),r},reduceRight:function(t,e,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Oe(this,ce(this,!0))},slice:function(t,e){return Oe(this,pe(this,t,e,!0))},some:function(t,e){return!this.every($e(t),e)},sort:function(t){return Oe(this,Se(this,t))},values:function(){return this.__iterator(En)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(t,e){return _(t?this.toSeq().filter(t,e):this)},countBy:function(t,e){return he(this,t,e)},equals:function(t){return X(this,t)},entrySeq:function(){var t=this;if(t._cache)return new L(t._cache);var e=t.toSeq().map(Ze).toIndexedSeq();return e.fromEntrySeq=function(){return t.toSeq()},e},filterNot:function(t,e){return this.filter($e(t),e)},findEntry:function(t,e,n){var r=n;return this.__iterate((function(n,i,o){if(t.call(e,n,i,o))return r=[i,n],!1})),r},findKey:function(t,e){var n=this.findEntry(t,e);return n&&n[0]},findLast:function(t,e,n){return this.toKeyedSeq().reverse().find(t,e,n)},findLastEntry:function(t,e,n){return this.toKeyedSeq().reverse().findEntry(t,e,n)},findLastKey:function(t,e){return this.toKeyedSeq().reverse().findKey(t,e)},first:function(){return this.find(v)},flatMap:function(t,e){return Oe(this,ge(this,t,e))},flatten:function(t){return Oe(this,ye(this,t,!0))},fromEntrySeq:function(){return new ue(this)},get:function(t,e){return this.find((function(e,n){return W(n,t)}),void 0,e)},getIn:function(t,e){for(var n,r=this,i=Re(t);!(n=i.next()).done;){var o=n.value;if(r=r&&r.get?r.get(o,yn):yn,r===yn)return e}return r},groupBy:function(t,e){return le(this,t,e)},has:function(t){return this.get(t,yn)!==yn},hasIn:function(t){return this.getIn(t,yn)!==yn},isSubset:function(t){return t="function"==typeof t.includes?t:e(t),this.every((function(e){return t.includes(e)}))},isSuperset:function(t){return t="function"==typeof t.isSubset?t:e(t),t.isSubset(this)},keyOf:function(t){return this.findKey((function(e){return W(e,t)}))},keySeq:function(){return this.toSeq().map(Qe).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(t){return this.toKeyedSeq().reverse().keyOf(t)},max:function(t){return Ee(this,t)},maxBy:function(t,e){return Ee(this,e,t)},min:function(t){return Ee(this,t?tn(t):rn)},minBy:function(t,e){return Ee(this,e?tn(e):rn,t)},rest:function(){return this.slice(1)},skip:function(t){return this.slice(Math.max(0,t))},skipLast:function(t){return Oe(this,this.toSeq().reverse().skip(t).reverse())},skipWhile:function(t,e){return Oe(this,de(this,t,e,!0))},skipUntil:function(t,e){return this.skipWhile($e(t),e)},sortBy:function(t,e){return Oe(this,Se(this,e,t))},take:function(t){return this.slice(0,Math.max(0,t))},takeLast:function(t){return Oe(this,this.toSeq().reverse().take(t).reverse())},takeWhile:function(t,e){return Oe(this,_e(this,t,e))},takeUntil:function(t,e){return this.takeWhile($e(t),e)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=on(this))}});var ar=e.prototype;ar[cn]=!0,ar[wn]=ar.values,ar.__toJS=ar.toArray,ar.__toStringMapper=en,ar.inspect=ar.toSource=function(){return this.toString()},ar.chain=ar.flatMap,ar.contains=ar.includes,Xe(n,{flip:function(){return Oe(this,ae(this))},mapEntries:function(t,e){var n=this,r=0;return Oe(this,this.toSeq().map((function(i,o){return t.call(e,[o,i],r++,n)})).fromEntrySeq())},mapKeys:function(t,e){var n=this;return Oe(this,this.toSeq().flip().map((function(r,i){return t.call(e,r,i,n)})).flip())}});var sr=n.prototype;sr[fn]=!0,sr[wn]=ar.entries,sr.__toJS=ar.toObject,sr.__toStringMapper=function(t,e){return JSON.stringify(e)+": "+en(t)},Xe(r,{toKeyedSeq:function(){return new re(this,!1)},filter:function(t,e){return Oe(this,fe(this,t,e,!1))},findIndex:function(t,e){var n=this.findEntry(t,e);return n?n[0]:-1},indexOf:function(t){var e=this.keyOf(t);return void 0===e?-1:e},lastIndexOf:function(t){var e=this.lastKeyOf(t);return void 0===e?-1:e},reverse:function(){return Oe(this,ce(this,!1))},slice:function(t,e){return Oe(this,pe(this,t,e,!1))},splice:function(t,e){var n=arguments.length;if(e=Math.max(0|e,0),0===n||2===n&&!e)return this;t=g(t,t<0?this.count():this.size);var r=this.slice(0,t);return Oe(this,1===n?r:r.concat(p(arguments,2),this.slice(t+e)))},findLastIndex:function(t,e){var n=this.findLastEntry(t,e);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(t){return Oe(this,ye(this,t,!1))},get:function(t,e){return t=d(this,t),t<0||this.size===1/0||void 0!==this.size&&t>this.size?e:this.find((function(e,n){return n===t}),void 0,e)},has:function(t){return t=d(this,t),t>=0&&(void 0!==this.size?this.size===1/0||t-1&&t%1===0&&t<=Number.MAX_VALUE}var i=Function.prototype.bind;e.isString=function(t){return"string"==typeof t||"[object String]"===n(t)},e.isArray=Array.isArray||function(t){return"[object Array]"===n(t)},"function"!=typeof/./&&"object"!=typeof Int8Array?e.isFunction=function(t){return"function"==typeof t||!1}:e.isFunction=function(t){return"[object Function]"===toString.call(t)},e.isObject=function(t){var e=typeof t;return"function"===e||"object"===e&&!!t},e.extend=function(t){var e=arguments,n=arguments.length;if(!t||n<2)return t||{};for(var r=1;r0)){var e=this.reactorState.get("dirtyStores");if(0!==e.size){var n=c.default.Set().withMutations((function(n){n.union(t.observerState.get("any")),e.forEach((function(e){var r=t.observerState.getIn(["stores",e]);r&&n.union(r)}))}));n.forEach((function(e){var n=t.observerState.getIn(["observersMap",e]);if(n){var r=n.get("getter"),i=n.get("handler"),o=p.evaluate(t.prevReactorState,r),u=p.evaluate(t.reactorState,r);t.prevReactorState=o.reactorState,t.reactorState=u.reactorState;var a=o.result,s=u.result;c.default.is(a,s)||i.call(null,s)}}));var r=p.resetDirtyStores(this.reactorState);this.prevReactorState=r,this.reactorState=r}}}},{key:"batchStart",value:function(){this.__batchDepth++}},{key:"batchEnd",value:function(){if(this.__batchDepth--,this.__batchDepth<=0){this.__isDispatching=!0;try{this.__notify()}catch(t){throw this.__isDispatching=!1,t}this.__isDispatching=!1}}}]),t})();e.default=(0,m.toFactory)(E),t.exports=e.default},function(t,e,n){function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){var n={};return(0,o.each)(e,(function(e,r){n[r]=t.evaluate(e)})),n}Object.defineProperty(e,"__esModule",{value:!0});var o=n(4);e.default=function(t){return{getInitialState:function(){return i(t,this.getDataBindings())},componentDidMount:function(){var e=this;this.__unwatchFns=[],(0,o.each)(this.getDataBindings(),(function(n,i){var o=t.observe(n,(function(t){e.setState(r({},i,t))}));e.__unwatchFns.push(o)}))},componentWillUnmount:function(){for(var t=this;this.__unwatchFns.length;)t.__unwatchFns.shift()()}}},t.exports=e.default},function(t,e,n){function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){return new C({result:t,reactorState:e})}function o(t,e){return t.withMutations((function(t){(0,A.each)(e,(function(e,n){t.getIn(["stores",n])&&console.warn("Store already defined for id = "+n);var r=e.getInitialState();if(void 0===r&&f(t,"throwOnUndefinedStoreReturnValue"))throw new Error("Store getInitialState() must return a value, did you forget a return statement");if(f(t,"throwOnNonImmutableStore")&&!(0,O.isImmutableValue)(r))throw new Error("Store getInitialState() must return an immutable value, did you forget to call toImmutable");t.update("stores",(function(t){return t.set(n,e)})).update("state",(function(t){return t.set(n,r)})).update("dirtyStores",(function(t){return t.add(n)})).update("storeStates",(function(t){return S(t,[n])}))})),m(t)}))}function u(t,e){return t.withMutations((function(t){(0,A.each)(e,(function(e,n){t.update("stores",(function(t){return t.set(n,e)}))}))}))}function a(t,e,n){var r=t.get("logger");if(void 0===e&&f(t,"throwOnUndefinedActionType"))throw new Error("`dispatch` cannot be called with an `undefined` action type.");var i=t.get("state"),o=t.get("dirtyStores"),u=i.withMutations((function(u){r.dispatchStart(t,e,n),t.get("stores").forEach((function(i,a){var s=u.get(a),c=void 0;try{c=i.handle(s,e,n)}catch(e){throw r.dispatchError(t,e.message),e}if(void 0===c&&f(t,"throwOnUndefinedStoreReturnValue")){var h="Store handler must return a value, did you forget a return statement";throw r.dispatchError(t,h),new Error(h)}u.set(a,c),s!==c&&(o=o.add(a))})),r.dispatchEnd(t,u,o,i)})),a=t.set("state",u).set("dirtyStores",o).update("storeStates",(function(t){return S(t,o)}));return m(a)}function s(t,e){var n=[],r=(0,O.toImmutable)({}).withMutations((function(r){(0,A.each)(e,(function(e,i){var o=t.getIn(["stores",i]);if(o){var u=o.deserialize(e);void 0!==u&&(r.set(i,u),n.push(i))}}))})),i=b.default.Set(n);return t.update("state",(function(t){return t.merge(r)})).update("dirtyStores",(function(t){return t.union(i)})).update("storeStates",(function(t){return S(t,n)}))}function c(t,e,n){var r=e;(0,T.isKeyPath)(e)&&(e=(0,w.fromKeyPath)(e));var i=t.get("nextId"),o=(0,w.getStoreDeps)(e),u=b.default.Map({id:i,storeDeps:o,getterKey:r,getter:e,handler:n}),a=void 0;return a=0===o.size?t.update("any",(function(t){return t.add(i)})):t.withMutations((function(t){o.forEach((function(e){var n=["stores",e];t.hasIn(n)||t.setIn(n,b.default.Set()),t.updateIn(["stores",e],(function(t){return t.add(i)}))}))})),a=a.set("nextId",i+1).setIn(["observersMap",i],u),{observerState:a,entry:u}}function f(t,e){var n=t.getIn(["options",e]);if(void 0===n)throw new Error("Invalid option: "+e);return n}function h(t,e,n){var r=t.get("observersMap").filter((function(t){var r=t.get("getterKey"),i=!n||t.get("handler")===n;return!!i&&((0,T.isKeyPath)(e)&&(0,T.isKeyPath)(r)?(0,T.isEqual)(e,r):e===r)}));return t.withMutations((function(t){r.forEach((function(e){return l(t,e)}))}))}function l(t,e){return t.withMutations((function(t){var n=e.get("id"),r=e.get("storeDeps");0===r.size?t.update("any",(function(t){return t.remove(n)})):r.forEach((function(e){t.updateIn(["stores",e],(function(t){return t?t.remove(n):t}))})),t.removeIn(["observersMap",n])}))}function p(t){var e=t.get("state");return t.withMutations((function(t){var n=t.get("stores"),r=n.keySeq().toJS();n.forEach((function(n,r){var i=e.get(r),o=n.handleReset(i);if(void 0===o&&f(t,"throwOnUndefinedStoreReturnValue"))throw new Error("Store handleReset() must return a value, did you forget a return statement");if(f(t,"throwOnNonImmutableStore")&&!(0,O.isImmutableValue)(o))throw new Error("Store reset state must be an immutable value, did you forget to call toImmutable");t.setIn(["state",r],o)})),t.update("storeStates",(function(t){return S(t,r)})),v(t)}))}function _(t,e){var n=t.get("state");if((0,T.isKeyPath)(e))return i(n.getIn(e),t);if(!(0,w.isGetter)(e))throw new Error("evaluate must be passed a keyPath or Getter");var r=t.get("cache"),o=r.lookup(e),u=!o||y(t,o);return u&&(o=g(t,e)),i(o.get("value"),t.update("cache",(function(t){return u?t.miss(e,o):t.hit(e)})))}function d(t){var e={};return t.get("stores").forEach((function(n,r){var i=t.getIn(["state",r]),o=n.serialize(i);void 0!==o&&(e[r]=o)})),e}function v(t){return t.set("dirtyStores",b.default.Set())}function y(t,e){var n=e.get("storeStates");return!n.size||n.some((function(e,n){return t.getIn(["storeStates",n])!==e}))}function g(t,e){var n=(0,w.getDeps)(e).map((function(e){return _(t,e).result})),r=(0,w.getComputeFn)(e).apply(null,n),i=(0,w.getStoreDeps)(e),o=(0,O.toImmutable)({}).withMutations((function(e){i.forEach((function(n){var r=t.getIn(["storeStates",n]);e.set(n,r)}))}));return(0,I.CacheEntry)({value:r,storeStates:o,dispatchId:t.get("dispatchId")})}function m(t){return t.update("dispatchId",(function(t){return t+1}))}function S(t,e){return t.withMutations((function(t){e.forEach((function(e){var n=t.has(e)?t.get(e)+1:1;t.set(e,n)}))}))}Object.defineProperty(e,"__esModule",{value:!0}),e.registerStores=o,e.replaceStores=u,e.dispatch=a,e.loadState=s,e.addObserver=c,e.getOption=f,e.removeObserver=h,e.removeObserverByEntry=l,e.reset=p,e.evaluate=_,e.serialize=d,e.resetDirtyStores=v;var E=n(3),b=r(E),I=n(9),O=n(5),w=n(10),T=n(11),A=n(4),C=b.default.Record({result:null,reactorState:null})},function(t,e,n){function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(){return new s}Object.defineProperty(e,"__esModule",{value:!0});var o=(function(){function t(t,e){for(var n=0;nn.dispatchId)throw new Error("Refusing to cache older value");return n})))}},{key:"evict",value:function(e){return new t(this.cache.remove(e))}}]),t})();e.BasicCache=s;var c=1e3,f=1,h=(function(){function t(){var e=arguments.length<=0||void 0===arguments[0]?c:arguments[0],n=arguments.length<=1||void 0===arguments[1]?f:arguments[1],i=arguments.length<=2||void 0===arguments[2]?new s:arguments[2],o=arguments.length<=3||void 0===arguments[3]?(0,u.OrderedSet)():arguments[3];r(this,t),console.log("using LRU"),this.limit=e,this.evictCount=n,this.cache=i,this.lru=o}return o(t,[{key:"lookup",value:function(t,e){return this.cache.lookup(t,e)}},{key:"has",value:function(t){return this.cache.has(t)}},{key:"asMap",value:function(){return this.cache.asMap()}},{key:"hit",value:function(e){return this.cache.has(e)?new t(this.limit,this.evictCount,this.cache,this.lru.remove(e).add(e)):this}},{key:"miss",value:function(e,n){var r;if(this.lru.size>=this.limit){if(this.has(e))return new t(this.limit,this.evictCount,this.cache.miss(e,n),this.lru.remove(e).add(e));var i=this.lru.take(this.evictCount).reduce((function(t,e){return t.evict(e)}),this.cache).miss(e,n);r=new t(this.limit,this.evictCount,i,this.lru.skip(this.evictCount).add(e))}else r=new t(this.limit,this.evictCount,this.cache.miss(e,n),this.lru.add(e));return r}},{key:"evict",value:function(e){return this.cache.has(e)?new t(this.limit,this.evictCount,this.cache.evict(e),this.lru.remove(e)):this}}]),t})();e.LRUCache=h},function(t,e,n){function r(t){return t&&t.__esModule?t:{default:t}}function i(t){return(0,l.isArray)(t)&&(0,l.isFunction)(t[t.length-1])}function o(t){return t[t.length-1]}function u(t){return t.slice(0,t.length-1)}function a(t,e){e||(e=h.default.Set());var n=h.default.Set().withMutations((function(e){if(!i(t))throw new Error("getFlattenedDeps must be passed a Getter");u(t).forEach((function(t){if((0,p.isKeyPath)(t))e.add((0,f.List)(t));else{if(!i(t))throw new Error("Invalid getter, each dependency must be a KeyPath or Getter");e.union(a(t))}}))}));return e.union(n)}function s(t){if(!(0,p.isKeyPath)(t))throw new Error("Cannot create Getter from KeyPath: "+t);return[t,_]}function c(t){if(t.hasOwnProperty("__storeDeps"))return t.__storeDeps;var e=a(t).map((function(t){return t.first()})).filter((function(t){return!!t}));return Object.defineProperty(t,"__storeDeps",{enumerable:!1,configurable:!1,writable:!1,value:e}),e}Object.defineProperty(e,"__esModule",{value:!0});var f=n(3),h=r(f),l=n(4),p=n(11),_=function(t){return t};e.default={isGetter:i,getComputeFn:o,getFlattenedDeps:a,getStoreDeps:c,getDeps:u,fromKeyPath:s},t.exports=e.default},function(t,e,n){function r(t){return t&&t.__esModule?t:{default:t}}function i(t){return(0,s.isArray)(t)&&!(0,s.isFunction)(t[t.length-1])}function o(t,e){var n=a.default.List(t),r=a.default.List(e);return a.default.is(n,r)}Object.defineProperty(e,"__esModule",{value:!0}),e.isKeyPath=i,e.isEqual=o;var u=n(3),a=r(u),s=n(4)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var r=n(8),i={dispatchStart:function(t,e,n){(0,r.getOption)(t,"logDispatches")&&console.group&&(console.groupCollapsed("Dispatch: %s",e),console.group("payload"),console.debug(n),console.groupEnd())},dispatchError:function(t,e){(0,r.getOption)(t,"logDispatches")&&console.group&&(console.debug("Dispatch error: "+e),console.groupEnd())},dispatchEnd:function(t,e,n,i){(0,r.getOption)(t,"logDispatches")&&console.group&&((0,r.getOption)(t,"logDirtyStores")&&console.log("Stores updated:",n.toList().toJS()),(0,r.getOption)(t,"logAppState")&&console.debug("Dispatch done, new state: ",e.toJS()),console.groupEnd())}};e.ConsoleGroupLogger=i;var o={dispatchStart:function(t,e,n){},dispatchError:function(t,e){},dispatchEnd:function(t,e,n){}};e.NoopLogger=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var r=n(3),i=n(9),o=n(12),u=(0,r.Map)({logDispatches:!1,logAppState:!1,logDirtyStores:!1,throwOnUndefinedActionType:!1,throwOnUndefinedStoreReturnValue:!1,throwOnNonImmutableStore:!1,throwOnDispatchInDispatch:!1});e.PROD_OPTIONS=u;var a=(0,r.Map)({logDispatches:!0,logAppState:!0,logDirtyStores:!0,throwOnUndefinedActionType:!0,throwOnUndefinedStoreReturnValue:!0,throwOnNonImmutableStore:!0,throwOnDispatchInDispatch:!0});e.DEBUG_OPTIONS=a;var s=(0,r.Record)({dispatchId:0,state:(0,r.Map)(),stores:(0,r.Map)(),cache:(0,i.DefaultCache)(),logger:o.NoopLogger,storeStates:(0,r.Map)(),dirtyStores:(0,r.Set)(),debug:!1,options:u});e.ReactorState=s;var c=(0,r.Record)({any:(0,r.Set)(),stores:(0,r.Map)({}),observersMap:(0,r.Map)({}),nextId:1});e.ObserverState=c}])}))})),je=t(Le),ke=function(t){var e,n={};if(!(t instanceof Object)||Array.isArray(t))throw new Error("keyMirror(...): Argument must be an object.");for(e in t)t.hasOwnProperty(e)&&(n[e]=e);return n},Ne=ke,Pe=Ne({VALIDATING_AUTH_TOKEN:null,VALID_AUTH_TOKEN:null,INVALID_AUTH_TOKEN:null,LOG_OUT:null}),Ue=je.Store,He=je.toImmutable,xe=new Ue({getInitialState:function(){return He({isValidating:!1,authToken:!1,host:null,isInvalid:!1,errorMessage:""})},initialize:function(){this.on(Pe.VALIDATING_AUTH_TOKEN,n),this.on(Pe.VALID_AUTH_TOKEN,r),this.on(Pe.INVALID_AUTH_TOKEN,i)}}),Ve=je.Store,qe=je.toImmutable,Fe=new Ve({getInitialState:function(){return qe({authToken:null,host:""})},initialize:function(){this.on(Pe.VALID_AUTH_TOKEN,o),this.on(Pe.LOG_OUT,u)}}),Ge=je.Store,Ke=new Ge({getInitialState:function(){return!0},initialize:function(){this.on(Pe.VALID_AUTH_TOKEN,a)}}),Be=Ne({STREAM_START:null,STREAM_STOP:null,STREAM_ERROR:null}),Ye=je.Store,Je=je.toImmutable,We=new Ye({getInitialState:function(){return Je({isStreaming:!1,hasError:!1})},initialize:function(){this.on(Be.STREAM_START,s),this.on(Be.STREAM_ERROR,c),this.on(Be.LOG_OUT,f)}}),Xe=1,Qe=2,Ze=function(t,e){this.url=t,this.options=e||{},this.commandId=1,this.commands={},this.connectionTries=0,this.eventListeners={},this.closeRequested=!1};Ze.prototype.addEventListener=function(t,e){var n=this.eventListeners[t];n||(n=this.eventListeners[t]=[]),n.push(e)},Ze.prototype.fireEvent=function(t){var e=this;(this.eventListeners[t]||[]).forEach((function(t){return t(e)}))},Ze.prototype.connect=function(){var t=this;return new Promise(function(e,n){var r=t.commands;Object.keys(r).forEach((function(t){var e=r[t];e.reject&&e.reject()}));var i=!1;t.connectionTries+=1,t.socket=new WebSocket(t.url),t.socket.addEventListener("open",(function(){t.connectionTries=0})),t.socket.addEventListener("message",(function(o){var u=JSON.parse(o.data);switch(u.type){case"event":t.commands[u.id].eventCallback(u.event);break;case"result":u.success?t.commands[u.id].resolve(u):t.commands[u.id].reject(u.error), -delete t.commands[u.id];break;case"pong":break;case"auth_required":t.sendMessage(h(t.options.authToken));break;case"auth_invalid":n({code:Qe}),i=!0;break;case"auth_ok":e(t),t.fireEvent("ready"),t.commandId=1,t.commands={},Object.keys(r).forEach((function(e){var n=r[e];n.eventType&&t.subscribeEvents(n.eventCallback,n.eventType).then((function(t){n.unsubscribe=t}))}))}})),t.socket.addEventListener("close",(function(){if(!i&&!t.closeRequested){0===t.connectionTries?t.fireEvent("disconnected"):n(Xe);var e=1e3*Math.min(t.connectionTries,5);setTimeout((function(){return t.connect()}),e)}}))})},Ze.prototype.close=function(){this.closeRequested=!0,this.socket.close()},Ze.prototype.getStates=function(){return this.sendMessagePromise(l()).then(S)},Ze.prototype.getServices=function(){return this.sendMessagePromise(_()).then(S)},Ze.prototype.getPanels=function(){return this.sendMessagePromise(d()).then(S)},Ze.prototype.getConfig=function(){return this.sendMessagePromise(p()).then(S)},Ze.prototype.callService=function(t,e,n){return this.sendMessagePromise(v(t,e,n))},Ze.prototype.subscribeEvents=function(t,e){var n=this;return this.sendMessagePromise(y(e)).then((function(r){var i={eventCallback:t,eventType:e,unsubscribe:function(){return n.sendMessagePromise(g(r.id)).then((function(){delete n.commands[r.id]}))}};return n.commands[r.id]=i,function(){return i.unsubscribe()}}))},Ze.prototype.ping=function(){return this.sendMessagePromise(m())},Ze.prototype.sendMessage=function(t){this.socket.send(JSON.stringify(t))},Ze.prototype.sendMessagePromise=function(t){var e=this;return new Promise(function(n,r){e.commandId+=1;var i=e.commandId;t.id=i,e.commands[i]={resolve:n,reject:r},e.sendMessage(t)})};var $e=Ne({API_FETCH_ALL_START:null,API_FETCH_ALL_SUCCESS:null,API_FETCH_ALL_FAIL:null,SYNC_SCHEDULED:null,SYNC_SCHEDULE_CANCELLED:null}),tn=je.Store,en=new tn({getInitialState:function(){return!0},initialize:function(){this.on($e.API_FETCH_ALL_START,(function(){return!0})),this.on($e.API_FETCH_ALL_SUCCESS,(function(){return!1})),this.on($e.API_FETCH_ALL_FAIL,(function(){return!1})),this.on($e.LOG_OUT,(function(){return!1}))}}),nn=b,rn=Ne({API_FETCH_SUCCESS:null,API_FETCH_START:null,API_FETCH_FAIL:null,API_SAVE_SUCCESS:null,API_SAVE_START:null,API_SAVE_FAIL:null,API_DELETE_SUCCESS:null,API_DELETE_START:null,API_DELETE_FAIL:null,LOG_OUT:null}),on=je.Store,un=je.toImmutable,an=new on({getInitialState:function(){return un({})},initialize:function(){var t=this;this.on(rn.API_FETCH_SUCCESS,I),this.on(rn.API_SAVE_SUCCESS,I),this.on(rn.API_DELETE_SUCCESS,O),this.on(rn.LOG_OUT,(function(){return t.getInitialState()}))}}),sn=Object.prototype.hasOwnProperty,cn=Object.prototype.propertyIsEnumerable,fn=T()?Object.assign:function(t,e){for(var n,r,i=arguments,o=w(t),u=1;u199&&u.status<300?t(e):n(e)},u.onerror=function(){return n({})},r?(u.setRequestHeader("Content-Type","application/json;charset=UTF-8"),u.send(JSON.stringify(r))):u.send()})}function O(t,e){var n=e.model,r=e.result,i=e.params,o=n.entity;if(!r)return t;var u=i.replace?sn({}):t.get(o),a=Array.isArray(r)?r:[r],s=n.fromJSON||sn;return t.set(o,u.withMutations((function(t){for(var e=0;e6e4}function gt(t,e){var n=e.date;return n.toISOString()}function mt(){return Qr.getInitialState()}function St(t,e){var n=e.date,r=e.stateHistory;return 0===r.length?t.set(n,$r({})):t.withMutations((function(t){r.forEach((function(e){return t.setIn([n,e[0].entity_id],$r(e.map(In.fromJSON)))}))}))}function Et(){return ti.getInitialState()}function bt(t,e){var n=e.stateHistory;return t.withMutations((function(t){n.forEach((function(e){return t.set(e[0].entity_id,ii(e.map(In.fromJSON)))}))}))}function It(){return oi.getInitialState()}function Ot(t,e){var n=e.stateHistory,r=(new Date).getTime();return t.withMutations((function(t){n.forEach((function(e){return t.set(e[0].entity_id,r)})),history.length>1&&t.set(si,r)}))}function wt(){return ci.getInitialState()}function Tt(t,e){t.dispatch(Wr.ENTITY_HISTORY_DATE_SELECTED,{date:e})}function At(t,e){void 0===e&&(e=null),t.dispatch(Wr.RECENT_ENTITY_HISTORY_FETCH_START,{});var n="history/period";return null!==e&&(n+="?filter_entity_id="+e),on(t,"GET",n).then((function(e){return t.dispatch(Wr.RECENT_ENTITY_HISTORY_FETCH_SUCCESS,{stateHistory:e})}),(function(){return t.dispatch(Wr.RECENT_ENTITY_HISTORY_FETCH_ERROR,{})}))}function Ct(t,e){return t.dispatch(Wr.ENTITY_HISTORY_FETCH_START,{date:e}),on(t,"GET","history/period/"+e).then((function(n){return t.dispatch(Wr.ENTITY_HISTORY_FETCH_SUCCESS,{date:e,stateHistory:n})}),(function(){return t.dispatch(Wr.ENTITY_HISTORY_FETCH_ERROR,{})}))}function Dt(t){var e=t.evaluate(li);return Ct(t,e)}function zt(t){t.registerStores({currentEntityHistoryDate:Qr,entityHistory:ti,isLoadingEntityHistory:ni,recentEntityHistory:oi,recentEntityHistoryUpdated:ci})}function Rt(t){t.registerStores({moreInfoEntityId:Yr})}function Mt(t,e){var n=e.model,r=e.result,i=e.params;if(null===t||"entity"!==n.entity||!i.replace)return t;for(var o=0;o0?i=setTimeout(r,e-c):(i=null,n||(s=t.apply(u,o),i||(u=o=null)))}var i,o,u,a,s;null==e&&(e=100);var c=function(){u=this,o=arguments,a=(new Date).getTime();var c=n&&!i;return i||(i=setTimeout(r,e)),c&&(s=t.apply(u,o),u=o=null),s};return c.clear=function(){i&&(clearTimeout(i),i=null)},c}function Yt(t){var e=fo[t.hassId];e&&(e.scheduleHealthCheck.clear(),e.conn.close(),fo[t.hassId]=!1)}function Jt(t,e){void 0===e&&(e={});var n=e.syncOnInitialConnect;void 0===n&&(n=!0),Yt(t);var r=t.evaluate(Mo.authToken),i="https:"===document.location.protocol?"wss://":"ws://";i+=document.location.hostname,document.location.port&&(i+=":"+document.location.port),i+="/api/websocket",b(i,{authToken:r}).then((function(e){var r=Bt((function(){return e.ping()}),so);r(),e.socket.addEventListener("message",r),fo[t.hassId]={conn:e,scheduleHealthCheck:r},co.forEach((function(n){return e.subscribeEvents(ao.bind(null,t),n)})),t.batch((function(){t.dispatch(Ye.STREAM_START),n&&io.fetchAll(t)})),e.addEventListener("disconnected",(function(){t.dispatch(Ye.STREAM_ERROR)})),e.addEventListener("ready",(function(){t.batch((function(){t.dispatch(Ye.STREAM_START),io.fetchAll(t)}))}))}))}function Wt(t){t.registerStores({streamStatus:Xe})}function Xt(t,e,n){void 0===n&&(n={});var r=n.rememberAuth;void 0===r&&(r=!1);var i=n.host;void 0===i&&(i=""),t.dispatch(Ue.VALIDATING_AUTH_TOKEN,{authToken:e,host:i}),io.fetchAll(t).then((function(){t.dispatch(Ue.VALID_AUTH_TOKEN,{authToken:e,host:i,rememberAuth:r}),vo.start(t,{syncOnInitialConnect:!1})}),(function(e){void 0===e&&(e={});var n=e.message;void 0===n&&(n=mo),t.dispatch(Ue.INVALID_AUTH_TOKEN,{errorMessage:n})}))}function Qt(t){t.dispatch(Ue.LOG_OUT,{})}function Zt(t){t.registerStores({authAttempt:Ve,authCurrent:Ge,rememberAuth:Be})}function $t(){if(!("localStorage"in window))return{};var t=window.localStorage,e="___test";try{return t.setItem(e,e),t.removeItem(e),t}catch(t){return{}}}function te(){var t=new Uo({debug:!1});return t.hassId=Ho++,t}function ee(t,e,n){Object.keys(n).forEach((function(r){var i=n[r];if("register"in i&&i.register(e),"getters"in i&&Object.defineProperty(t,r+"Getters",{value:i.getters,enumerable:!0}),"actions"in i){var o={};Object.getOwnPropertyNames(i.actions).forEach((function(t){"function"==typeof i.actions[t]&&Object.defineProperty(o,t,{value:i.actions[t].bind(null,e),enumerable:!0})})),Object.defineProperty(t,r+"Actions",{value:o,enumerable:!0})}}))}function ne(t,e){return xo(t.attributes.entity_id.map((function(t){return e.get(t)})).filter((function(t){return!!t})))}function re(t){return on(t,"GET","error_log")}function ie(t,e){var n=e.date;return n.toISOString()}function oe(){return Jo.getInitialState()}function ue(t,e){var n=e.date,r=e.entries;return t.set(n,eu(r.map($o.fromJSON)))}function ae(){return nu.getInitialState()}function se(t,e){var n=e.date;return t.set(n,(new Date).getTime())}function ce(){return ou.getInitialState()}function fe(t,e){t.dispatch(Bo.LOGBOOK_DATE_SELECTED,{date:e})}function he(t,e){t.dispatch(Bo.LOGBOOK_ENTRIES_FETCH_START,{date:e}),on(t,"GET","logbook/"+e).then((function(n){return t.dispatch(Bo.LOGBOOK_ENTRIES_FETCH_SUCCESS,{date:e,entries:n})}),(function(){return t.dispatch(Bo.LOGBOOK_ENTRIES_FETCH_ERROR,{})}))}function le(t){return!t||(new Date).getTime()-t>su}function pe(t){t.registerStores({currentLogbookDate:Jo,isLoadingLogbookEntries:Xo,logbookEntries:nu,logbookEntriesUpdated:ou})}function _e(t){return t.set("active",!0)}function de(t){return t.set("active",!1)}function ve(){return Su.getInitialState()}function ye(t){return navigator.serviceWorker.getRegistration().then((function(t){if(!t)throw new Error("No service worker registered.");return t.pushManager.subscribe({userVisibleOnly:!0})})).then((function(e){var n;return n=navigator.userAgent.toLowerCase().indexOf("firefox")>-1?"firefox":"chrome",on(t,"POST","notify.html5",{subscription:e,browser:n}).then((function(){return t.dispatch(yu.PUSH_NOTIFICATIONS_SUBSCRIBE,{})})).then((function(){return!0}))})).catch((function(e){var n;return n=e.message&&e.message.indexOf("gcm_sender_id")!==-1?"Please setup the notify.html5 platform.":"Notification registration failed.",console.error(e),Vn.createNotification(t,n),!1}))}function ge(t){return navigator.serviceWorker.getRegistration().then((function(t){if(!t)throw new Error("No service worker registered");return t.pushManager.subscribe({userVisibleOnly:!0})})).then((function(e){return on(t,"DELETE","notify.html5",{subscription:e}).then((function(){return e.unsubscribe()})).then((function(){return t.dispatch(yu.PUSH_NOTIFICATIONS_UNSUBSCRIBE,{})})).then((function(){return!0}))})).catch((function(e){var n="Failed unsubscribing for push notifications.";return console.error(e),Vn.createNotification(t,n),!1}))}function me(t){t.registerStores({pushNotifications:Su})}function Se(t,e){return on(t,"POST","template",{template:e})}function Ee(t){return t.set("isListening",!0)}function be(t,e){var n=e.interimTranscript,r=e.finalTranscript;return t.withMutations((function(t){return t.set("isListening",!0).set("isTransmitting",!1).set("interimTranscript",n).set("finalTranscript",r)}))}function Ie(t,e){var n=e.finalTranscript;return t.withMutations((function(t){return t.set("isListening",!1).set("isTransmitting",!0).set("interimTranscript","").set("finalTranscript",n)}))}function Oe(){return Nu.getInitialState()}function we(){return Nu.getInitialState()}function Te(){return Nu.getInitialState()}function Ae(t){return Pu[t.hassId]}function Ce(t){var e=Ae(t);if(e){var n=e.finalTranscript||e.interimTranscript;t.dispatch(Lu.VOICE_TRANSMITTING,{finalTranscript:n}),tr.callService(t,"conversation","process",{text:n}).then((function(){t.dispatch(Lu.VOICE_DONE)}),(function(){t.dispatch(Lu.VOICE_ERROR)}))}}function De(t){var e=Ae(t);e&&(e.recognition.stop(),Pu[t.hassId]=!1)}function ze(t){Ce(t),De(t)}function Re(t){var e=ze.bind(null,t);e();var n=new webkitSpeechRecognition;Pu[t.hassId]={recognition:n,interimTranscript:"",finalTranscript:""},n.interimResults=!0,n.onstart=function(){return t.dispatch(Lu.VOICE_START)},n.onerror=function(){return t.dispatch(Lu.VOICE_ERROR)},n.onend=e,n.onresult=function(e){var n=Ae(t);if(n){for(var r="",i="",o=e.resultIndex;o>>0;if(""+n!==e||4294967295===n)return NaN;e=n}return e<0?_(t)+e:e}function v(){return!0}function y(t,e,n){return(0===t||void 0!==n&&t<=-n)&&(void 0===e||void 0!==n&&e>=n)}function g(t,e){return S(t,e,0)}function m(t,e){return S(t,e,e)}function S(t,e,n){return void 0===t?n:t<0?Math.max(0,e+t):void 0===e?t:Math.min(e,t)}function E(t){this.next=t}function b(t,e,n,r){var i=0===t?e:1===t?n:[e,n];return r?r.value=i:r={value:i,done:!1},r}function I(){return{value:void 0,done:!0}}function O(t){return!!A(t)}function w(t){return t&&"function"==typeof t.next}function T(t){var e=A(t);return e&&e.call(t)}function A(t){var e=t&&(In&&t[In]||t[On]);if("function"==typeof e)return e}function C(t){return t&&"number"==typeof t.length}function D(t){return null===t||void 0===t?U():o(t)?t.toSeq():V(t)}function z(t){return null===t||void 0===t?U().toKeyedSeq():o(t)?u(t)?t.toSeq():t.fromEntrySeq():H(t)}function R(t){return null===t||void 0===t?U():o(t)?u(t)?t.entrySeq():t.toIndexedSeq():x(t)}function M(t){return(null===t||void 0===t?U():o(t)?u(t)?t.entrySeq():t:x(t)).toSetSeq()}function L(t){this._array=t,this.size=t.length}function j(t){var e=Object.keys(t);this._object=t,this._keys=e,this.size=e.length}function k(t){this._iterable=t,this.size=t.length||t.size}function N(t){this._iterator=t,this._iteratorCache=[]}function P(t){return!(!t||!t[Tn])}function U(){return An||(An=new L([]))}function H(t){var e=Array.isArray(t)?new L(t).fromEntrySeq():w(t)?new N(t).fromEntrySeq():O(t)?new k(t).fromEntrySeq():"object"==typeof t?new j(t):void 0;if(!e)throw new TypeError("Expected Array or iterable object of [k, v] entries, or keyed object: "+t);return e}function x(t){var e=q(t);if(!e)throw new TypeError("Expected Array or iterable object of values: "+t);return e}function V(t){var e=q(t)||"object"==typeof t&&new j(t);if(!e)throw new TypeError("Expected Array or iterable object of values, or keyed object: "+t);return e}function q(t){return C(t)?new L(t):w(t)?new N(t):O(t)?new k(t):void 0}function F(t,e,n,r){var i=t._cache;if(i){for(var o=i.length-1,u=0;u<=o;u++){var a=i[n?o-u:u];if(e(a[1],r?a[0]:u,t)===!1)return u+1}return u}return t.__iterateUncached(e,n)}function G(t,e,n,r){var i=t._cache;if(i){var o=i.length-1,u=0;return new E(function(){var t=i[n?o-u:u];return u++>o?I():b(e,r?t[0]:u-1,t[1])})}return t.__iteratorUncached(e,n)}function K(t,e){return e?B(e,t,"",{"":t}):Y(t)}function B(t,e,n,r){return Array.isArray(e)?t.call(r,n,R(e).map((function(n,r){return B(t,n,r,e)}))):J(e)?t.call(r,n,z(e).map((function(n,r){return B(t,n,r,e)}))):e}function Y(t){return Array.isArray(t)?R(t).map(Y).toList():J(t)?z(t).map(Y).toMap():t}function J(t){return t&&(t.constructor===Object||void 0===t.constructor)}function W(t,e){if(t===e||t!==t&&e!==e)return!0;if(!t||!e)return!1;if("function"==typeof t.valueOf&&"function"==typeof e.valueOf){if(t=t.valueOf(),e=e.valueOf(),t===e||t!==t&&e!==e)return!0;if(!t||!e)return!1}return!("function"!=typeof t.equals||"function"!=typeof e.equals||!t.equals(e))}function X(t,e){if(t===e)return!0;if(!o(e)||void 0!==t.size&&void 0!==e.size&&t.size!==e.size||void 0!==t.__hash&&void 0!==e.__hash&&t.__hash!==e.__hash||u(t)!==u(e)||a(t)!==a(e)||c(t)!==c(e))return!1;if(0===t.size&&0===e.size)return!0;var n=!s(t);if(c(t)){var r=t.entries();return e.every((function(t,e){var i=r.next().value;return i&&W(i[1],t)&&(n||W(i[0],e))}))&&r.next().done}var i=!1;if(void 0===t.size)if(void 0===e.size)"function"==typeof t.cacheResult&&t.cacheResult();else{i=!0;var f=t;t=e,e=f}var h=!0,l=e.__iterate((function(e,r){if(n?!t.has(e):i?!W(e,t.get(r,yn)):!W(t.get(r,yn),e))return h=!1,!1}));return h&&t.size===l}function Q(t,e){if(!(this instanceof Q))return new Q(t,e);if(this._value=t,this.size=void 0===e?1/0:Math.max(0,e),0===this.size){if(Cn)return Cn;Cn=this}}function Z(t,e){if(!t)throw new Error(e)}function $(t,e,n){if(!(this instanceof $))return new $(t,e,n);if(Z(0!==n,"Cannot step a Range by 0"),t=t||0,void 0===e&&(e=1/0),n=void 0===n?1:Math.abs(n),e>>1&1073741824|3221225471&t}function ot(t){if(t===!1||null===t||void 0===t)return 0;if("function"==typeof t.valueOf&&(t=t.valueOf(),t===!1||null===t||void 0===t))return 0;if(t===!0)return 1;var e=typeof t;if("number"===e){if(t!==t||t===1/0)return 0;var n=0|t;for(n!==t&&(n^=4294967295*t);t>4294967295;)t/=4294967295,n^=t;return it(n)}if("string"===e)return t.length>Pn?ut(t):at(t);if("function"==typeof t.hashCode)return t.hashCode();if("object"===e)return st(t);if("function"==typeof t.toString)return at(t.toString());throw new Error("Value type "+e+" cannot be hashed.")}function ut(t){var e=xn[t];return void 0===e&&(e=at(t),Hn===Un&&(Hn=0,xn={}),Hn++,xn[t]=e),e}function at(t){for(var e=0,n=0;n0)switch(t.nodeType){case 1:return t.uniqueID;case 9:return t.documentElement&&t.documentElement.uniqueID}}function ft(t){Z(t!==1/0,"Cannot perform this action with an infinite size.")}function ht(t){return null===t||void 0===t?bt():lt(t)&&!c(t)?t:bt().withMutations((function(e){var r=n(t);ft(r.size),r.forEach((function(t,n){return e.set(n,t)}))}))}function lt(t){return!(!t||!t[Vn])}function pt(t,e){this.ownerID=t,this.entries=e}function _t(t,e,n){this.ownerID=t,this.bitmap=e,this.nodes=n}function dt(t,e,n){this.ownerID=t,this.count=e,this.nodes=n}function vt(t,e,n){this.ownerID=t,this.keyHash=e,this.entries=n}function yt(t,e,n){this.ownerID=t,this.keyHash=e,this.entry=n}function gt(t,e,n){this._type=e,this._reverse=n,this._stack=t._root&&St(t._root)}function mt(t,e){return b(t,e[0],e[1])}function St(t,e){return{node:t,index:0,__prev:e}}function Et(t,e,n,r){var i=Object.create(qn);return i.size=t,i._root=e,i.__ownerID=n,i.__hash=r,i.__altered=!1,i}function bt(){return Fn||(Fn=Et(0))}function It(t,e,n){var r,i;if(t._root){var o=f(gn),u=f(mn);if(r=Ot(t._root,t.__ownerID,0,void 0,e,n,o,u),!u.value)return t;i=t.size+(o.value?n===yn?-1:1:0)}else{if(n===yn)return t;i=1,r=new pt(t.__ownerID,[[e,n]])}return t.__ownerID?(t.size=i,t._root=r,t.__hash=void 0,t.__altered=!0,t):r?Et(i,r):bt()}function Ot(t,e,n,r,i,o,u,a){return t?t.update(e,n,r,i,o,u,a):o===yn?t:(h(a),h(u),new yt(e,r,[i,o]))}function wt(t){return t.constructor===yt||t.constructor===vt}function Tt(t,e,n,r,i){if(t.keyHash===r)return new vt(e,r,[t.entry,i]);var o,u=(0===n?t.keyHash:t.keyHash>>>n)&vn,a=(0===n?r:r>>>n)&vn,s=u===a?[Tt(t,e,n+_n,r,i)]:(o=new yt(e,r,i),u>>=1)u[a]=1&n?e[o++]:void 0;return u[r]=i,new dt(t,o+1,u)}function zt(t,e,r){for(var i=[],u=0;u>1&1431655765,t=(858993459&t)+(t>>2&858993459),t=t+(t>>4)&252645135,t+=t>>8,t+=t>>16,127&t}function Nt(t,e,n,r){var i=r?t:p(t);return i[e]=n,i}function Pt(t,e,n,r){var i=t.length+1;if(r&&e+1===i)return t[e]=n,t;for(var o=new Array(i),u=0,a=0;a0&&io?0:o-n,c=u-n;return c>dn&&(c=dn),function(){if(i===c)return Xn;var t=e?--c:i++;return r&&r[t]}}function i(t,r,i){var a,s=t&&t.array,c=i>o?0:o-i>>r,f=(u-i>>r)+1;return f>dn&&(f=dn),function(){for(;;){if(a){var t=a();if(t!==Xn)return t;a=null}if(c===f)return Xn;var o=e?--f:c++;a=n(s&&s[o],r-_n,i+(o<=t.size||e<0)return t.withMutations((function(t){e<0?Wt(t,e).set(0,n):Wt(t,0,e+1).set(e,n)}));e+=t._origin;var r=t._tail,i=t._root,o=f(mn);return e>=Qt(t._capacity)?r=Bt(r,t.__ownerID,0,e,n,o):i=Bt(i,t.__ownerID,t._level,e,n,o),o.value?t.__ownerID?(t._root=i,t._tail=r,t.__hash=void 0,t.__altered=!0,t):Ft(t._origin,t._capacity,t._level,i,r):t}function Bt(t,e,n,r,i,o){var u=r>>>n&vn,a=t&&u0){var c=t&&t.array[u],f=Bt(c,e,n-_n,r,i,o);return f===c?t:(s=Yt(t,e),s.array[u]=f,s)}return a&&t.array[u]===i?t:(h(o),s=Yt(t,e),void 0===i&&u===s.array.length-1?s.array.pop():s.array[u]=i,s)}function Yt(t,e){return e&&t&&e===t.ownerID?t:new Vt(t?t.array.slice():[],e)}function Jt(t,e){if(e>=Qt(t._capacity))return t._tail;if(e<1<0;)n=n.array[e>>>r&vn],r-=_n;return n}}function Wt(t,e,n){void 0!==e&&(e|=0),void 0!==n&&(n|=0);var r=t.__ownerID||new l,i=t._origin,o=t._capacity,u=i+e,a=void 0===n?o:n<0?o+n:i+n;if(u===i&&a===o)return t;if(u>=a)return t.clear();for(var s=t._level,c=t._root,f=0;u+f<0;)c=new Vt(c&&c.array.length?[void 0,c]:[],r),s+=_n,f+=1<=1<h?new Vt([],r):_;if(_&&p>h&&u_n;y-=_n){var g=h>>>y&vn;v=v.array[g]=Yt(v.array[g],r)}v.array[h>>>_n&vn]=_}if(a=p)u-=p,a-=p,s=_n,c=null,d=d&&d.removeBefore(r,0,u);else if(u>i||p>>s&vn;if(m!==p>>>s&vn)break;m&&(f+=(1<i&&(c=c.removeBefore(r,s,u-f)),c&&pu&&(u=c.size),o(s)||(c=c.map((function(t){return K(t)}))),i.push(c)}return u>t.size&&(t=t.setSize(u)),Lt(t,e,i)}function Qt(t){return t>>_n<<_n}function Zt(t){return null===t||void 0===t?ee():$t(t)?t:ee().withMutations((function(e){var r=n(t);ft(r.size),r.forEach((function(t,n){return e.set(n,t)}))}))}function $t(t){return lt(t)&&c(t)}function te(t,e,n,r){var i=Object.create(Zt.prototype);return i.size=t?t.size:0,i._map=t,i._list=e,i.__ownerID=n,i.__hash=r,i}function ee(){return Qn||(Qn=te(bt(),Gt()))}function ne(t,e,n){var r,i,o=t._map,u=t._list,a=o.get(e),s=void 0!==a;if(n===yn){if(!s)return t;u.size>=dn&&u.size>=2*o.size?(i=u.filter((function(t,e){return void 0!==t&&a!==e})),r=i.toKeyedSeq().map((function(t){return t[0]})).flip().toMap(),t.__ownerID&&(r.__ownerID=i.__ownerID=t.__ownerID)):(r=o.remove(e),i=a===u.size-1?u.pop():u.set(a,void 0))}else if(s){if(n===u.get(a)[1])return t;r=o,i=u.set(a,[e,n])}else r=o.set(e,u.size),i=u.set(u.size,[e,n]);return t.__ownerID?(t.size=r.size,t._map=r,t._list=i,t.__hash=void 0,t):te(r,i)}function re(t,e){this._iter=t,this._useKeys=e,this.size=t.size}function ie(t){this._iter=t,this.size=t.size}function oe(t){this._iter=t,this.size=t.size}function ue(t){this._iter=t,this.size=t.size}function ae(t){var e=Ce(t);return e._iter=t,e.size=t.size,e.flip=function(){return t},e.reverse=function(){var e=t.reverse.apply(this);return e.flip=function(){return t.reverse()},e},e.has=function(e){return t.includes(e)},e.includes=function(e){return t.has(e)},e.cacheResult=De,e.__iterateUncached=function(e,n){var r=this;return t.__iterate((function(t,n){return e(n,t,r)!==!1}),n)},e.__iteratorUncached=function(e,n){if(e===bn){var r=t.__iterator(e,n);return new E(function(){var t=r.next();if(!t.done){var e=t.value[0];t.value[0]=t.value[1],t.value[1]=e}return t})}return t.__iterator(e===En?Sn:En,n)},e}function se(t,e,n){var r=Ce(t);return r.size=t.size,r.has=function(e){return t.has(e)},r.get=function(r,i){var o=t.get(r,yn);return o===yn?i:e.call(n,o,r,t)},r.__iterateUncached=function(r,i){var o=this;return t.__iterate((function(t,i,u){return r(e.call(n,t,i,u),i,o)!==!1}),i)},r.__iteratorUncached=function(r,i){var o=t.__iterator(bn,i);return new E(function(){var i=o.next();if(i.done)return i;var u=i.value,a=u[0];return b(r,a,e.call(n,u[1],a,t),i)})},r}function ce(t,e){var n=Ce(t);return n._iter=t,n.size=t.size,n.reverse=function(){return t},t.flip&&(n.flip=function(){var e=ae(t);return e.reverse=function(){return t.flip()},e}),n.get=function(n,r){return t.get(e?n:-1-n,r)},n.has=function(n){return t.has(e?n:-1-n)},n.includes=function(e){return t.includes(e)},n.cacheResult=De,n.__iterate=function(e,n){var r=this;return t.__iterate((function(t,n){return e(t,n,r)}),!n)},n.__iterator=function(e,n){return t.__iterator(e,!n)},n}function fe(t,e,n,r){var i=Ce(t);return r&&(i.has=function(r){var i=t.get(r,yn);return i!==yn&&!!e.call(n,i,r,t)},i.get=function(r,i){var o=t.get(r,yn);return o!==yn&&e.call(n,o,r,t)?o:i}),i.__iterateUncached=function(i,o){var u=this,a=0;return t.__iterate((function(t,o,s){if(e.call(n,t,o,s))return a++,i(t,r?o:a-1,u)}),o),a},i.__iteratorUncached=function(i,o){var u=t.__iterator(bn,o),a=0;return new E(function(){for(;;){var o=u.next();if(o.done)return o;var s=o.value,c=s[0],f=s[1];if(e.call(n,f,c,t))return b(i,r?c:a++,f,o)}})},i}function he(t,e,n){var r=ht().asMutable();return t.__iterate((function(i,o){r.update(e.call(n,i,o,t),0,(function(t){return t+1}))})),r.asImmutable()}function le(t,e,n){var r=u(t),i=(c(t)?Zt():ht()).asMutable();t.__iterate((function(o,u){i.update(e.call(n,o,u,t),(function(t){return t=t||[],t.push(r?[u,o]:o),t}))}));var o=Ae(t);return i.map((function(e){return Oe(t,o(e))}))}function pe(t,e,n,r){var i=t.size;if(void 0!==e&&(e|=0),void 0!==n&&(n===1/0?n=i:n|=0),y(e,n,i))return t;var o=g(e,i),u=m(n,i);if(o!==o||u!==u)return pe(t.toSeq().cacheResult(),e,n,r);var a,s=u-o;s===s&&(a=s<0?0:s);var c=Ce(t);return c.size=0===a?a:t.size&&a||void 0,!r&&P(t)&&a>=0&&(c.get=function(e,n){return e=d(this,e),e>=0&&ea)return I();var t=i.next();return r||e===En?t:e===Sn?b(e,s-1,void 0,t):b(e,s-1,t.value[1],t)})},c}function _e(t,e,n){var r=Ce(t);return r.__iterateUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterate(r,i);var u=0;return t.__iterate((function(t,i,a){return e.call(n,t,i,a)&&++u&&r(t,i,o)})),u},r.__iteratorUncached=function(r,i){var o=this;if(i)return this.cacheResult().__iterator(r,i);var u=t.__iterator(bn,i),a=!0;return new E(function(){if(!a)return I();var t=u.next();if(t.done)return t;var i=t.value,s=i[0],c=i[1];return e.call(n,c,s,o)?r===bn?t:b(r,s,c,t):(a=!1,I())})},r}function de(t,e,n,r){var i=Ce(t);return i.__iterateUncached=function(i,o){var u=this;if(o)return this.cacheResult().__iterate(i,o);var a=!0,s=0;return t.__iterate((function(t,o,c){if(!a||!(a=e.call(n,t,o,c)))return s++,i(t,r?o:s-1,u)})),s},i.__iteratorUncached=function(i,o){var u=this;if(o)return this.cacheResult().__iterator(i,o);var a=t.__iterator(bn,o),s=!0,c=0;return new E(function(){var t,o,f;do{if(t=a.next(),t.done)return r||i===En?t:i===Sn?b(i,c++,void 0,t):b(i,c++,t.value[1],t);var h=t.value;o=h[0],f=h[1],s&&(s=e.call(n,f,o,u))}while(s);return i===bn?t:b(i,o,f,t)})},i}function ve(t,e){var r=u(t),i=[t].concat(e).map((function(t){return o(t)?r&&(t=n(t)):t=r?H(t):x(Array.isArray(t)?t:[t]),t})).filter((function(t){return 0!==t.size}));if(0===i.length)return t;if(1===i.length){var s=i[0];if(s===t||r&&u(s)||a(t)&&a(s))return s}var c=new L(i);return r?c=c.toKeyedSeq():a(t)||(c=c.toSetSeq()),c=c.flatten(!0),c.size=i.reduce((function(t,e){if(void 0!==t){var n=e.size;if(void 0!==n)return t+n}}),0),c}function ye(t,e,n){var r=Ce(t);return r.__iterateUncached=function(r,i){function u(t,c){var f=this;t.__iterate((function(t,i){return(!e||c0}function Ie(t,n,r){var i=Ce(t);return i.size=new L(r).map((function(t){return t.size})).min(),i.__iterate=function(t,e){for(var n,r=this,i=this.__iterator(En,e),o=0;!(n=i.next()).done&&t(n.value,o++,r)!==!1;);return o},i.__iteratorUncached=function(t,i){var o=r.map((function(t){return t=e(t),T(i?t.reverse():t)})),u=0,a=!1;return new E(function(){var e;return a||(e=o.map((function(t){return t.next()})),a=e.some((function(t){return t.done}))),a?I():b(t,u++,n.apply(null,e.map((function(t){return t.value}))))})},i}function Oe(t,e){return P(t)?e:t.constructor(e)}function we(t){if(t!==Object(t))throw new TypeError("Expected [K, V] tuple: "+t)}function Te(t){return ft(t.size),_(t)}function Ae(t){return u(t)?n:a(t)?r:i}function Ce(t){return Object.create((u(t)?z:a(t)?R:M).prototype)}function De(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):D.prototype.cacheResult.call(this)}function ze(t,e){return t>e?1:te?-1:0}function on(t){if(t.size===1/0)return 0;var e=c(t),n=u(t),r=e?1:0,i=t.__iterate(n?e?function(t,e){r=31*r+an(ot(t),ot(e))|0}:function(t,e){r=r+an(ot(t),ot(e))|0}:e?function(t){r=31*r+ot(t)|0}:function(t){r=r+ot(t)|0});return un(i,r)}function un(t,e){return e=Rn(e,3432918353),e=Rn(e<<15|e>>>-15,461845907),e=Rn(e<<13|e>>>-13,5),e=(e+3864292196|0)^t,e=Rn(e^e>>>16,2246822507),e=Rn(e^e>>>13,3266489909),e=it(e^e>>>16)}function an(t,e){return t^e+2654435769+(t<<6)+(t>>2)|0}var sn=Array.prototype.slice;t(n,e),t(r,e),t(i,e),e.isIterable=o,e.isKeyed=u,e.isIndexed=a,e.isAssociative=s,e.isOrdered=c,e.Keyed=n,e.Indexed=r,e.Set=i;var cn="@@__IMMUTABLE_ITERABLE__@@",fn="@@__IMMUTABLE_KEYED__@@",hn="@@__IMMUTABLE_INDEXED__@@",ln="@@__IMMUTABLE_ORDERED__@@",pn="delete",_n=5,dn=1<<_n,vn=dn-1,yn={},gn={value:!1},mn={value:!1},Sn=0,En=1,bn=2,In="function"==typeof Symbol&&Symbol.iterator,On="@@iterator",wn=In||On;E.prototype.toString=function(){return"[Iterator]"},E.KEYS=Sn,E.VALUES=En,E.ENTRIES=bn,E.prototype.inspect=E.prototype.toSource=function(){return this.toString()},E.prototype[wn]=function(){return this},t(D,e),D.of=function(){return D(arguments)},D.prototype.toSeq=function(){return this},D.prototype.toString=function(){return this.__toString("Seq {","}")},D.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},D.prototype.__iterate=function(t,e){return F(this,t,e,!0)},D.prototype.__iterator=function(t,e){return G(this,t,e,!0)},t(z,D),z.prototype.toKeyedSeq=function(){return this},t(R,D),R.of=function(){return R(arguments)},R.prototype.toIndexedSeq=function(){return this},R.prototype.toString=function(){return this.__toString("Seq [","]")},R.prototype.__iterate=function(t,e){return F(this,t,e,!1)},R.prototype.__iterator=function(t,e){return G(this,t,e,!1)},t(M,D),M.of=function(){return M(arguments)},M.prototype.toSetSeq=function(){return this},D.isSeq=P,D.Keyed=z,D.Set=M,D.Indexed=R;var Tn="@@__IMMUTABLE_SEQ__@@";D.prototype[Tn]=!0,t(L,R),L.prototype.get=function(t,e){return this.has(t)?this._array[d(this,t)]:e},L.prototype.__iterate=function(t,e){for(var n=this,r=this._array,i=r.length-1,o=0;o<=i;o++)if(t(r[e?i-o:o],o,n)===!1)return o+1;return o},L.prototype.__iterator=function(t,e){var n=this._array,r=n.length-1,i=0;return new E(function(){return i>r?I():b(t,i,n[e?r-i++:i++])})},t(j,z),j.prototype.get=function(t,e){return void 0===e||this.has(t)?this._object[t]:e},j.prototype.has=function(t){return this._object.hasOwnProperty(t)},j.prototype.__iterate=function(t,e){for(var n=this,r=this._object,i=this._keys,o=i.length-1,u=0;u<=o;u++){var a=i[e?o-u:u];if(t(r[a],a,n)===!1)return u+1}return u},j.prototype.__iterator=function(t,e){var n=this._object,r=this._keys,i=r.length-1,o=0;return new E(function(){var u=r[e?i-o:o];return o++>i?I():b(t,u,n[u])})},j.prototype[ln]=!0,t(k,R),k.prototype.__iterateUncached=function(t,e){var n=this;if(e)return this.cacheResult().__iterate(t,e);var r=this._iterable,i=T(r),o=0;if(w(i))for(var u;!(u=i.next()).done&&t(u.value,o++,n)!==!1;);return o},k.prototype.__iteratorUncached=function(t,e){if(e)return this.cacheResult().__iterator(t,e);var n=this._iterable,r=T(n);if(!w(r))return new E(I);var i=0;return new E(function(){var e=r.next();return e.done?e:b(t,i++,e.value)})},t(N,R),N.prototype.__iterateUncached=function(t,e){var n=this;if(e)return this.cacheResult().__iterate(t,e);for(var r=this._iterator,i=this._iteratorCache,o=0;o=r.length){var e=n.next();if(e.done)return e;r[i]=e.value}return b(t,i,r[i++])})};var An;t(Q,R),Q.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},Q.prototype.get=function(t,e){return this.has(t)?this._value:e},Q.prototype.includes=function(t){return W(this._value,t)},Q.prototype.slice=function(t,e){var n=this.size;return y(t,e,n)?this:new Q(this._value,m(e,n)-g(t,n))},Q.prototype.reverse=function(){return this},Q.prototype.indexOf=function(t){return W(this._value,t)?0:-1},Q.prototype.lastIndexOf=function(t){return W(this._value,t)?this.size:-1},Q.prototype.__iterate=function(t,e){for(var n=this,r=0;r=0&&e=0&&nn?I():b(t,o++,u)})},$.prototype.equals=function(t){return t instanceof $?this._start===t._start&&this._end===t._end&&this._step===t._step:X(this,t)};var Dn;t(tt,e),t(et,tt),t(nt,tt),t(rt,tt),tt.Keyed=et,tt.Indexed=nt,tt.Set=rt;var zn,Rn="function"==typeof Math.imul&&Math.imul(4294967295,2)===-2?Math.imul:function(t,e){t|=0,e|=0;var n=65535&t,r=65535&e;return n*r+((t>>>16)*r+n*(e>>>16)<<16>>>0)|0},Mn=Object.isExtensible,Ln=(function(){try{return Object.defineProperty({},"@",{}),!0}catch(t){return!1}})(),jn="function"==typeof WeakMap;jn&&(zn=new WeakMap);var kn=0,Nn="__immutablehash__";"function"==typeof Symbol&&(Nn=Symbol(Nn));var Pn=16,Un=255,Hn=0,xn={};t(ht,et),ht.of=function(){var t=sn.call(arguments,0);return bt().withMutations((function(e){for(var n=0;n=t.length)throw new Error("Missing value for key: "+t[n]);e.set(t[n],t[n+1])}}))},ht.prototype.toString=function(){return this.__toString("Map {","}")},ht.prototype.get=function(t,e){return this._root?this._root.get(0,void 0,t,e):e},ht.prototype.set=function(t,e){return It(this,t,e)},ht.prototype.setIn=function(t,e){return this.updateIn(t,yn,(function(){return e}))},ht.prototype.remove=function(t){return It(this,t,yn)},ht.prototype.deleteIn=function(t){return this.updateIn(t,(function(){return yn}))},ht.prototype.update=function(t,e,n){return 1===arguments.length?t(this):this.updateIn([t],e,n)},ht.prototype.updateIn=function(t,e,n){n||(n=e,e=void 0);var r=jt(this,Re(t),e,n);return r===yn?void 0:r},ht.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):bt()},ht.prototype.merge=function(){return zt(this,void 0,arguments)},ht.prototype.mergeWith=function(t){var e=sn.call(arguments,1);return zt(this,t,e)},ht.prototype.mergeIn=function(t){var e=sn.call(arguments,1);return this.updateIn(t,bt(),(function(t){return"function"==typeof t.merge?t.merge.apply(t,e):e[e.length-1]}))},ht.prototype.mergeDeep=function(){return zt(this,Rt,arguments)},ht.prototype.mergeDeepWith=function(t){var e=sn.call(arguments,1);return zt(this,Mt(t),e)},ht.prototype.mergeDeepIn=function(t){var e=sn.call(arguments,1);return this.updateIn(t,bt(),(function(t){return"function"==typeof t.mergeDeep?t.mergeDeep.apply(t,e):e[e.length-1]}))},ht.prototype.sort=function(t){return Zt(Se(this,t))},ht.prototype.sortBy=function(t,e){return Zt(Se(this,e,t))},ht.prototype.withMutations=function(t){var e=this.asMutable();return t(e),e.wasAltered()?e.__ensureOwner(this.__ownerID):this},ht.prototype.asMutable=function(){return this.__ownerID?this:this.__ensureOwner(new l)},ht.prototype.asImmutable=function(){return this.__ensureOwner()},ht.prototype.wasAltered=function(){return this.__altered},ht.prototype.__iterator=function(t,e){return new gt(this,t,e)},ht.prototype.__iterate=function(t,e){var n=this,r=0;return this._root&&this._root.iterate((function(e){return r++,t(e[1],e[0],n)}),e),r},ht.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Et(this.size,this._root,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},ht.isMap=lt;var Vn="@@__IMMUTABLE_MAP__@@",qn=ht.prototype;qn[Vn]=!0,qn[pn]=qn.remove,qn.removeIn=qn.deleteIn,pt.prototype.get=function(t,e,n,r){for(var i=this.entries,o=0,u=i.length;o=Gn)return At(t,s,r,i);var _=t&&t===this.ownerID,d=_?s:p(s);return l?a?c===f-1?d.pop():d[c]=d.pop():d[c]=[r,i]:d.push([r,i]),_?(this.entries=d,this):new pt(t,d)}},_t.prototype.get=function(t,e,n,r){void 0===e&&(e=ot(n));var i=1<<((0===t?e:e>>>t)&vn),o=this.bitmap;return 0===(o&i)?r:this.nodes[kt(o&i-1)].get(t+_n,e,n,r)},_t.prototype.update=function(t,e,n,r,i,o,u){void 0===n&&(n=ot(r));var a=(0===e?n:n>>>e)&vn,s=1<=Kn)return Dt(t,l,c,a,_);if(f&&!_&&2===l.length&&wt(l[1^h]))return l[1^h];if(f&&_&&1===l.length&&wt(_))return _;var d=t&&t===this.ownerID,v=f?_?c:c^s:c|s,y=f?_?Nt(l,h,_,d):Ut(l,h,d):Pt(l,h,_,d);return d?(this.bitmap=v,this.nodes=y,this):new _t(t,v,y)},dt.prototype.get=function(t,e,n,r){void 0===e&&(e=ot(n));var i=(0===t?e:e>>>t)&vn,o=this.nodes[i];return o?o.get(t+_n,e,n,r):r},dt.prototype.update=function(t,e,n,r,i,o,u){void 0===n&&(n=ot(r));var a=(0===e?n:n>>>e)&vn,s=i===yn,c=this.nodes,f=c[a];if(s&&!f)return this;var h=Ot(f,t,e+_n,n,r,i,o,u);if(h===f)return this;var l=this.count;if(f){if(!h&&(l--,l=0&&t>>e&vn;if(r>=this.array.length)return new Vt([],t);var i,o=0===r;if(e>0){var u=this.array[r];if(i=u&&u.removeBefore(t,e-_n,n),i===u&&o)return this}if(o&&!i)return this;var a=Yt(this,t);if(!o)for(var s=0;s>>e&vn;if(r>=this.array.length)return this;var i;if(e>0){var o=this.array[r];if(i=o&&o.removeAfter(t,e-_n,n),i===o&&r===this.array.length-1)return this}var u=Yt(this,t);return u.array.splice(r+1),i&&(u.array[r]=i),u};var Wn,Xn={};t(Zt,ht),Zt.of=function(){return this(arguments)},Zt.prototype.toString=function(){return this.__toString("OrderedMap {","}")},Zt.prototype.get=function(t,e){var n=this._map.get(t);return void 0!==n?this._list.get(n)[1]:e},Zt.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):ee()},Zt.prototype.set=function(t,e){return ne(this,t,e)},Zt.prototype.remove=function(t){return ne(this,t,yn)},Zt.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},Zt.prototype.__iterate=function(t,e){var n=this;return this._list.__iterate((function(e){return e&&t(e[1],e[0],n)}),e)},Zt.prototype.__iterator=function(t,e){return this._list.fromEntrySeq().__iterator(t,e)},Zt.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map.__ensureOwner(t),n=this._list.__ensureOwner(t);return t?te(e,n,t,this.__hash):(this.__ownerID=t,this._map=e,this._list=n,this)},Zt.isOrderedMap=$t,Zt.prototype[ln]=!0,Zt.prototype[pn]=Zt.prototype.remove;var Qn;t(re,z),re.prototype.get=function(t,e){return this._iter.get(t,e)},re.prototype.has=function(t){return this._iter.has(t)},re.prototype.valueSeq=function(){return this._iter.valueSeq()},re.prototype.reverse=function(){var t=this,e=ce(this,!0);return this._useKeys||(e.valueSeq=function(){return t._iter.toSeq().reverse()}),e},re.prototype.map=function(t,e){var n=this,r=se(this,t,e);return this._useKeys||(r.valueSeq=function(){return n._iter.toSeq().map(t,e)}),r},re.prototype.__iterate=function(t,e){var n,r=this;return this._iter.__iterate(this._useKeys?function(e,n){return t(e,n,r)}:(n=e?Te(this):0,function(i){return t(i,e?--n:n++,r)}),e)},re.prototype.__iterator=function(t,e){if(this._useKeys)return this._iter.__iterator(t,e);var n=this._iter.__iterator(En,e),r=e?Te(this):0;return new E(function(){var i=n.next();return i.done?i:b(t,e?--r:r++,i.value,i)})},re.prototype[ln]=!0,t(ie,R),ie.prototype.includes=function(t){return this._iter.includes(t)},ie.prototype.__iterate=function(t,e){var n=this,r=0;return this._iter.__iterate((function(e){return t(e,r++,n)}),e)},ie.prototype.__iterator=function(t,e){var n=this._iter.__iterator(En,e),r=0;return new E(function(){var e=n.next();return e.done?e:b(t,r++,e.value,e)})},t(oe,M),oe.prototype.has=function(t){return this._iter.includes(t)},oe.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){return t(e,e,n)}),e)},oe.prototype.__iterator=function(t,e){var n=this._iter.__iterator(En,e);return new E(function(){var e=n.next();return e.done?e:b(t,e.value,e.value,e)})},t(ue,z),ue.prototype.entrySeq=function(){return this._iter.toSeq()},ue.prototype.__iterate=function(t,e){var n=this;return this._iter.__iterate((function(e){if(e){we(e);var r=o(e);return t(r?e.get(1):e[1],r?e.get(0):e[0],n)}}),e)},ue.prototype.__iterator=function(t,e){var n=this._iter.__iterator(En,e);return new E(function(){for(;;){var e=n.next();if(e.done)return e;var r=e.value;if(r){we(r);var i=o(r);return b(t,i?r.get(0):r[0],i?r.get(1):r[1],e)}}})},ie.prototype.cacheResult=re.prototype.cacheResult=oe.prototype.cacheResult=ue.prototype.cacheResult=De,t(Me,et),Me.prototype.toString=function(){return this.__toString(je(this)+" {","}")},Me.prototype.has=function(t){return this._defaultValues.hasOwnProperty(t)},Me.prototype.get=function(t,e){if(!this.has(t))return e;var n=this._defaultValues[t];return this._map?this._map.get(t,n):n},Me.prototype.clear=function(){if(this.__ownerID)return this._map&&this._map.clear(),this;var t=this.constructor;return t._empty||(t._empty=Le(this,bt()))},Me.prototype.set=function(t,e){if(!this.has(t))throw new Error('Cannot set unknown key "'+t+'" on '+je(this));if(this._map&&!this._map.has(t)){var n=this._defaultValues[t];if(e===n)return this}var r=this._map&&this._map.set(t,e);return this.__ownerID||r===this._map?this:Le(this,r)},Me.prototype.remove=function(t){if(!this.has(t))return this;var e=this._map&&this._map.remove(t);return this.__ownerID||e===this._map?this:Le(this,e)},Me.prototype.wasAltered=function(){return this._map.wasAltered()},Me.prototype.__iterator=function(t,e){var r=this;return n(this._defaultValues).map((function(t,e){return r.get(e)})).__iterator(t,e)},Me.prototype.__iterate=function(t,e){var r=this;return n(this._defaultValues).map((function(t,e){return r.get(e)})).__iterate(t,e)},Me.prototype.__ensureOwner=function(t){if(t===this.__ownerID)return this;var e=this._map&&this._map.__ensureOwner(t);return t?Le(this,e,t):(this.__ownerID=t,this._map=e,this)};var Zn=Me.prototype;Zn[pn]=Zn.remove,Zn.deleteIn=Zn.removeIn=qn.removeIn,Zn.merge=qn.merge,Zn.mergeWith=qn.mergeWith,Zn.mergeIn=qn.mergeIn,Zn.mergeDeep=qn.mergeDeep,Zn.mergeDeepWith=qn.mergeDeepWith,Zn.mergeDeepIn=qn.mergeDeepIn,Zn.setIn=qn.setIn,Zn.update=qn.update,Zn.updateIn=qn.updateIn,Zn.withMutations=qn.withMutations,Zn.asMutable=qn.asMutable,Zn.asImmutable=qn.asImmutable,t(Pe,rt),Pe.of=function(){return this(arguments)},Pe.fromKeys=function(t){return this(n(t).keySeq())},Pe.prototype.toString=function(){return this.__toString("Set {","}")},Pe.prototype.has=function(t){return this._map.has(t)},Pe.prototype.add=function(t){ +return He(this,this._map.set(t,!0))},Pe.prototype.remove=function(t){return He(this,this._map.remove(t))},Pe.prototype.clear=function(){return He(this,this._map.clear())},Pe.prototype.union=function(){var t=sn.call(arguments,0);return t=t.filter((function(t){return 0!==t.size})),0===t.length?this:0!==this.size||this.__ownerID||1!==t.length?this.withMutations((function(e){for(var n=0;n=0;r--)n={value:t[r],next:n};return this.__ownerID?(this.size=e,this._head=n,this.__hash=void 0,this.__altered=!0,this):Je(e,n)},Be.prototype.pushAll=function(t){if(t=r(t),0===t.size)return this;ft(t.size);var e=this.size,n=this._head;return t.reverse().forEach((function(t){e++,n={value:t,next:n}})),this.__ownerID?(this.size=e,this._head=n,this.__hash=void 0,this.__altered=!0,this):Je(e,n)},Be.prototype.pop=function(){return this.slice(1)},Be.prototype.unshift=function(){return this.push.apply(this,arguments)},Be.prototype.unshiftAll=function(t){return this.pushAll(t)},Be.prototype.shift=function(){return this.pop.apply(this,arguments)},Be.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):We()},Be.prototype.slice=function(t,e){if(y(t,e,this.size))return this;var n=g(t,this.size),r=m(e,this.size);if(r!==this.size)return nt.prototype.slice.call(this,t,e);for(var i=this.size-n,o=this._head;n--;)o=o.next;return this.__ownerID?(this.size=i,this._head=o,this.__hash=void 0,this.__altered=!0,this):Je(i,o)},Be.prototype.__ensureOwner=function(t){return t===this.__ownerID?this:t?Je(this.size,this._head,t,this.__hash):(this.__ownerID=t,this.__altered=!1,this)},Be.prototype.__iterate=function(t,e){var n=this;if(e)return this.reverse().__iterate(t);for(var r=0,i=this._head;i&&t(i.value,r++,n)!==!1;)i=i.next;return r},Be.prototype.__iterator=function(t,e){if(e)return this.reverse().__iterator(t);var n=0,r=this._head;return new E(function(){if(r){var e=r.value;return r=r.next,b(t,n++,e)}return I()})},Be.isStack=Ye;var ir="@@__IMMUTABLE_STACK__@@",or=Be.prototype;or[ir]=!0,or.withMutations=qn.withMutations,or.asMutable=qn.asMutable,or.asImmutable=qn.asImmutable,or.wasAltered=qn.wasAltered;var ur;e.Iterator=E,Xe(e,{toArray:function(){ft(this.size);var t=new Array(this.size||0);return this.valueSeq().__iterate((function(e,n){t[n]=e})),t},toIndexedSeq:function(){return new ie(this)},toJS:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJS?t.toJS():t})).__toJS()},toJSON:function(){return this.toSeq().map((function(t){return t&&"function"==typeof t.toJSON?t.toJSON():t})).__toJS()},toKeyedSeq:function(){return new re(this,!0)},toMap:function(){return ht(this.toKeyedSeq())},toObject:function(){ft(this.size);var t={};return this.__iterate((function(e,n){t[n]=e})),t},toOrderedMap:function(){return Zt(this.toKeyedSeq())},toOrderedSet:function(){return qe(u(this)?this.valueSeq():this)},toSet:function(){return Pe(u(this)?this.valueSeq():this)},toSetSeq:function(){return new oe(this)},toSeq:function(){return a(this)?this.toIndexedSeq():u(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return Be(u(this)?this.valueSeq():this)},toList:function(){return Ht(u(this)?this.valueSeq():this)},toString:function(){return"[Iterable]"},__toString:function(t,e){return 0===this.size?t+e:t+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+e},concat:function(){var t=sn.call(arguments,0);return Oe(this,ve(this,t))},includes:function(t){return this.some((function(e){return W(e,t)}))},entries:function(){return this.__iterator(bn)},every:function(t,e){ft(this.size);var n=!0;return this.__iterate((function(r,i,o){if(!t.call(e,r,i,o))return n=!1,!1})),n},filter:function(t,e){return Oe(this,fe(this,t,e,!0))},find:function(t,e,n){var r=this.findEntry(t,e);return r?r[1]:n},forEach:function(t,e){return ft(this.size),this.__iterate(e?t.bind(e):t)},join:function(t){ft(this.size),t=void 0!==t?""+t:",";var e="",n=!0;return this.__iterate((function(r){n?n=!1:e+=t,e+=null!==r&&void 0!==r?r.toString():""})),e},keys:function(){return this.__iterator(Sn)},map:function(t,e){return Oe(this,se(this,t,e))},reduce:function(t,e,n){ft(this.size);var r,i;return arguments.length<2?i=!0:r=e,this.__iterate((function(e,o,u){i?(i=!1,r=e):r=t.call(n,r,e,o,u)})),r},reduceRight:function(t,e,n){var r=this.toKeyedSeq().reverse();return r.reduce.apply(r,arguments)},reverse:function(){return Oe(this,ce(this,!0))},slice:function(t,e){return Oe(this,pe(this,t,e,!0))},some:function(t,e){return!this.every($e(t),e)},sort:function(t){return Oe(this,Se(this,t))},values:function(){return this.__iterator(En)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(t,e){return _(t?this.toSeq().filter(t,e):this)},countBy:function(t,e){return he(this,t,e)},equals:function(t){return X(this,t)},entrySeq:function(){var t=this;if(t._cache)return new L(t._cache);var e=t.toSeq().map(Ze).toIndexedSeq();return e.fromEntrySeq=function(){return t.toSeq()},e},filterNot:function(t,e){return this.filter($e(t),e)},findEntry:function(t,e,n){var r=n;return this.__iterate((function(n,i,o){if(t.call(e,n,i,o))return r=[i,n],!1})),r},findKey:function(t,e){var n=this.findEntry(t,e);return n&&n[0]},findLast:function(t,e,n){return this.toKeyedSeq().reverse().find(t,e,n)},findLastEntry:function(t,e,n){return this.toKeyedSeq().reverse().findEntry(t,e,n)},findLastKey:function(t,e){return this.toKeyedSeq().reverse().findKey(t,e)},first:function(){return this.find(v)},flatMap:function(t,e){return Oe(this,ge(this,t,e))},flatten:function(t){return Oe(this,ye(this,t,!0))},fromEntrySeq:function(){return new ue(this)},get:function(t,e){return this.find((function(e,n){return W(n,t)}),void 0,e)},getIn:function(t,e){for(var n,r=this,i=Re(t);!(n=i.next()).done;){var o=n.value;if(r=r&&r.get?r.get(o,yn):yn,r===yn)return e}return r},groupBy:function(t,e){return le(this,t,e)},has:function(t){return this.get(t,yn)!==yn},hasIn:function(t){return this.getIn(t,yn)!==yn},isSubset:function(t){return t="function"==typeof t.includes?t:e(t),this.every((function(e){return t.includes(e)}))},isSuperset:function(t){return t="function"==typeof t.isSubset?t:e(t),t.isSubset(this)},keyOf:function(t){return this.findKey((function(e){return W(e,t)}))},keySeq:function(){return this.toSeq().map(Qe).toIndexedSeq()},last:function(){return this.toSeq().reverse().first()},lastKeyOf:function(t){return this.toKeyedSeq().reverse().keyOf(t)},max:function(t){return Ee(this,t)},maxBy:function(t,e){return Ee(this,e,t)},min:function(t){return Ee(this,t?tn(t):rn)},minBy:function(t,e){return Ee(this,e?tn(e):rn,t)},rest:function(){return this.slice(1)},skip:function(t){return this.slice(Math.max(0,t))},skipLast:function(t){return Oe(this,this.toSeq().reverse().skip(t).reverse())},skipWhile:function(t,e){return Oe(this,de(this,t,e,!0))},skipUntil:function(t,e){return this.skipWhile($e(t),e)},sortBy:function(t,e){return Oe(this,Se(this,e,t))},take:function(t){return this.slice(0,Math.max(0,t))},takeLast:function(t){return Oe(this,this.toSeq().reverse().take(t).reverse())},takeWhile:function(t,e){return Oe(this,_e(this,t,e))},takeUntil:function(t,e){return this.takeWhile($e(t),e)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=on(this))}});var ar=e.prototype;ar[cn]=!0,ar[wn]=ar.values,ar.__toJS=ar.toArray,ar.__toStringMapper=en,ar.inspect=ar.toSource=function(){return this.toString()},ar.chain=ar.flatMap,ar.contains=ar.includes,Xe(n,{flip:function(){return Oe(this,ae(this))},mapEntries:function(t,e){var n=this,r=0;return Oe(this,this.toSeq().map((function(i,o){return t.call(e,[o,i],r++,n)})).fromEntrySeq())},mapKeys:function(t,e){var n=this;return Oe(this,this.toSeq().flip().map((function(r,i){return t.call(e,r,i,n)})).flip())}});var sr=n.prototype;sr[fn]=!0,sr[wn]=ar.entries,sr.__toJS=ar.toObject,sr.__toStringMapper=function(t,e){return JSON.stringify(e)+": "+en(t)},Xe(r,{toKeyedSeq:function(){return new re(this,!1)},filter:function(t,e){return Oe(this,fe(this,t,e,!1))},findIndex:function(t,e){var n=this.findEntry(t,e);return n?n[0]:-1},indexOf:function(t){var e=this.keyOf(t);return void 0===e?-1:e},lastIndexOf:function(t){var e=this.lastKeyOf(t);return void 0===e?-1:e},reverse:function(){return Oe(this,ce(this,!1))},slice:function(t,e){return Oe(this,pe(this,t,e,!1))},splice:function(t,e){var n=arguments.length;if(e=Math.max(0|e,0),0===n||2===n&&!e)return this;t=g(t,t<0?this.count():this.size);var r=this.slice(0,t);return Oe(this,1===n?r:r.concat(p(arguments,2),this.slice(t+e)))},findLastIndex:function(t,e){var n=this.findLastEntry(t,e);return n?n[0]:-1},first:function(){return this.get(0)},flatten:function(t){return Oe(this,ye(this,t,!1))},get:function(t,e){return t=d(this,t),t<0||this.size===1/0||void 0!==this.size&&t>this.size?e:this.find((function(e,n){return n===t}),void 0,e)},has:function(t){return t=d(this,t),t>=0&&(void 0!==this.size?this.size===1/0||t-1&&t%1===0&&t<=Number.MAX_VALUE}var i=Function.prototype.bind;e.isString=function(t){return"string"==typeof t||"[object String]"===n(t)},e.isArray=Array.isArray||function(t){return"[object Array]"===n(t)},"function"!=typeof/./&&"object"!=typeof Int8Array?e.isFunction=function(t){return"function"==typeof t||!1}:e.isFunction=function(t){return"[object Function]"===toString.call(t)},e.isObject=function(t){var e=typeof t;return"function"===e||"object"===e&&!!t},e.extend=function(t){var e=arguments,n=arguments.length;if(!t||n<2)return t||{};for(var r=1;r0)){var e=this.reactorState.get("dirtyStores");if(0!==e.size){var n=c.default.Set().withMutations((function(n){n.union(t.observerState.get("any")),e.forEach((function(e){var r=t.observerState.getIn(["stores",e]);r&&n.union(r)}))}));n.forEach((function(e){var n=t.observerState.getIn(["observersMap",e]);if(n){var r=n.get("getter"),i=n.get("handler"),o=p.evaluate(t.prevReactorState,r),u=p.evaluate(t.reactorState,r);t.prevReactorState=o.reactorState,t.reactorState=u.reactorState;var a=o.result,s=u.result;c.default.is(a,s)||i.call(null,s)}}));var r=p.resetDirtyStores(this.reactorState);this.prevReactorState=r,this.reactorState=r}}}},{key:"batchStart",value:function(){this.__batchDepth++}},{key:"batchEnd",value:function(){if(this.__batchDepth--,this.__batchDepth<=0){this.__isDispatching=!0;try{this.__notify()}catch(t){throw this.__isDispatching=!1,t}this.__isDispatching=!1}}}]),t})();e.default=(0,m.toFactory)(E),t.exports=e.default},function(t,e,n){function r(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}function i(t,e){var n={};return(0,o.each)(e,(function(e,r){n[r]=t.evaluate(e)})),n}Object.defineProperty(e,"__esModule",{value:!0});var o=n(4);e.default=function(t){return{getInitialState:function(){return i(t,this.getDataBindings())},componentDidMount:function(){var e=this;this.__unwatchFns=[],(0,o.each)(this.getDataBindings(),(function(n,i){var o=t.observe(n,(function(t){e.setState(r({},i,t))}));e.__unwatchFns.push(o)}))},componentWillUnmount:function(){for(var t=this;this.__unwatchFns.length;)t.__unwatchFns.shift()()}}},t.exports=e.default},function(t,e,n){function r(t){return t&&t.__esModule?t:{default:t}}function i(t,e){return new C({result:t,reactorState:e})}function o(t,e){return t.withMutations((function(t){(0,A.each)(e,(function(e,n){t.getIn(["stores",n])&&console.warn("Store already defined for id = "+n);var r=e.getInitialState();if(void 0===r&&f(t,"throwOnUndefinedStoreReturnValue"))throw new Error("Store getInitialState() must return a value, did you forget a return statement");if(f(t,"throwOnNonImmutableStore")&&!(0,O.isImmutableValue)(r))throw new Error("Store getInitialState() must return an immutable value, did you forget to call toImmutable");t.update("stores",(function(t){return t.set(n,e)})).update("state",(function(t){return t.set(n,r)})).update("dirtyStores",(function(t){return t.add(n)})).update("storeStates",(function(t){return S(t,[n])}))})),m(t)}))}function u(t,e){return t.withMutations((function(t){(0,A.each)(e,(function(e,n){t.update("stores",(function(t){return t.set(n,e)}))}))}))}function a(t,e,n){var r=t.get("logger");if(void 0===e&&f(t,"throwOnUndefinedActionType"))throw new Error("`dispatch` cannot be called with an `undefined` action type.");var i=t.get("state"),o=t.get("dirtyStores"),u=i.withMutations((function(u){r.dispatchStart(t,e,n),t.get("stores").forEach((function(i,a){var s=u.get(a),c=void 0;try{c=i.handle(s,e,n)}catch(e){throw r.dispatchError(t,e.message),e}if(void 0===c&&f(t,"throwOnUndefinedStoreReturnValue")){var h="Store handler must return a value, did you forget a return statement";throw r.dispatchError(t,h),new Error(h)}u.set(a,c),s!==c&&(o=o.add(a))})),r.dispatchEnd(t,u,o,i)})),a=t.set("state",u).set("dirtyStores",o).update("storeStates",(function(t){return S(t,o)}));return m(a)}function s(t,e){var n=[],r=(0,O.toImmutable)({}).withMutations((function(r){(0,A.each)(e,(function(e,i){var o=t.getIn(["stores",i]);if(o){var u=o.deserialize(e);void 0!==u&&(r.set(i,u),n.push(i))}}))})),i=b.default.Set(n);return t.update("state",(function(t){return t.merge(r)})).update("dirtyStores",(function(t){return t.union(i)})).update("storeStates",(function(t){return S(t,n)}))}function c(t,e,n){var r=e;(0,T.isKeyPath)(e)&&(e=(0,w.fromKeyPath)(e));var i=t.get("nextId"),o=(0,w.getStoreDeps)(e),u=b.default.Map({id:i,storeDeps:o,getterKey:r,getter:e,handler:n}),a=void 0;return a=0===o.size?t.update("any",(function(t){return t.add(i)})):t.withMutations((function(t){o.forEach((function(e){var n=["stores",e];t.hasIn(n)||t.setIn(n,b.default.Set()),t.updateIn(["stores",e],(function(t){return t.add(i)}))}))})),a=a.set("nextId",i+1).setIn(["observersMap",i],u),{observerState:a,entry:u}}function f(t,e){var n=t.getIn(["options",e]);if(void 0===n)throw new Error("Invalid option: "+e);return n}function h(t,e,n){var r=t.get("observersMap").filter((function(t){var r=t.get("getterKey"),i=!n||t.get("handler")===n;return!!i&&((0,T.isKeyPath)(e)&&(0,T.isKeyPath)(r)?(0,T.isEqual)(e,r):e===r)}));return t.withMutations((function(t){r.forEach((function(e){return l(t,e)}))}))}function l(t,e){return t.withMutations((function(t){var n=e.get("id"),r=e.get("storeDeps");0===r.size?t.update("any",(function(t){return t.remove(n)})):r.forEach((function(e){t.updateIn(["stores",e],(function(t){return t?t.remove(n):t}))})),t.removeIn(["observersMap",n])}))}function p(t){var e=t.get("state");return t.withMutations((function(t){var n=t.get("stores"),r=n.keySeq().toJS();n.forEach((function(n,r){var i=e.get(r),o=n.handleReset(i);if(void 0===o&&f(t,"throwOnUndefinedStoreReturnValue"))throw new Error("Store handleReset() must return a value, did you forget a return statement");if(f(t,"throwOnNonImmutableStore")&&!(0,O.isImmutableValue)(o))throw new Error("Store reset state must be an immutable value, did you forget to call toImmutable");t.setIn(["state",r],o)})),t.update("storeStates",(function(t){return S(t,r)})),v(t)}))}function _(t,e){var n=t.get("state");if((0,T.isKeyPath)(e))return i(n.getIn(e),t);if(!(0,w.isGetter)(e))throw new Error("evaluate must be passed a keyPath or Getter");var r=t.get("cache"),o=r.lookup(e),u=!o||y(t,o);return u&&(o=g(t,e)),i(o.get("value"),t.update("cache",(function(t){return u?t.miss(e,o):t.hit(e)})))}function d(t){var e={};return t.get("stores").forEach((function(n,r){var i=t.getIn(["state",r]),o=n.serialize(i);void 0!==o&&(e[r]=o)})),e}function v(t){return t.set("dirtyStores",b.default.Set())}function y(t,e){var n=e.get("storeStates");return!n.size||n.some((function(e,n){return t.getIn(["storeStates",n])!==e}))}function g(t,e){var n=(0,w.getDeps)(e).map((function(e){return _(t,e).result})),r=(0,w.getComputeFn)(e).apply(null,n),i=(0,w.getStoreDeps)(e),o=(0,O.toImmutable)({}).withMutations((function(e){i.forEach((function(n){var r=t.getIn(["storeStates",n]);e.set(n,r)}))}));return(0,I.CacheEntry)({value:r,storeStates:o,dispatchId:t.get("dispatchId")})}function m(t){return t.update("dispatchId",(function(t){return t+1}))}function S(t,e){return t.withMutations((function(t){e.forEach((function(e){var n=t.has(e)?t.get(e)+1:1;t.set(e,n)}))}))}Object.defineProperty(e,"__esModule",{value:!0}),e.registerStores=o,e.replaceStores=u,e.dispatch=a,e.loadState=s,e.addObserver=c,e.getOption=f,e.removeObserver=h,e.removeObserverByEntry=l,e.reset=p,e.evaluate=_,e.serialize=d,e.resetDirtyStores=v;var E=n(3),b=r(E),I=n(9),O=n(5),w=n(10),T=n(11),A=n(4),C=b.default.Record({result:null,reactorState:null})},function(t,e,n){function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(){return new s}Object.defineProperty(e,"__esModule",{value:!0});var o=(function(){function t(t,e){for(var n=0;nn.dispatchId)throw new Error("Refusing to cache older value");return n})))}},{key:"evict",value:function(e){return new t(this.cache.remove(e))}}]),t})();e.BasicCache=s;var c=1e3,f=1,h=(function(){function t(){var e=arguments.length<=0||void 0===arguments[0]?c:arguments[0],n=arguments.length<=1||void 0===arguments[1]?f:arguments[1],i=arguments.length<=2||void 0===arguments[2]?new s:arguments[2],o=arguments.length<=3||void 0===arguments[3]?(0,u.OrderedSet)():arguments[3];r(this,t),console.log("using LRU"),this.limit=e,this.evictCount=n,this.cache=i,this.lru=o}return o(t,[{key:"lookup",value:function(t,e){return this.cache.lookup(t,e)}},{key:"has",value:function(t){return this.cache.has(t)}},{key:"asMap",value:function(){return this.cache.asMap()}},{key:"hit",value:function(e){return this.cache.has(e)?new t(this.limit,this.evictCount,this.cache,this.lru.remove(e).add(e)):this}},{key:"miss",value:function(e,n){var r;if(this.lru.size>=this.limit){if(this.has(e))return new t(this.limit,this.evictCount,this.cache.miss(e,n),this.lru.remove(e).add(e));var i=this.lru.take(this.evictCount).reduce((function(t,e){return t.evict(e)}),this.cache).miss(e,n);r=new t(this.limit,this.evictCount,i,this.lru.skip(this.evictCount).add(e))}else r=new t(this.limit,this.evictCount,this.cache.miss(e,n),this.lru.add(e));return r}},{key:"evict",value:function(e){return this.cache.has(e)?new t(this.limit,this.evictCount,this.cache.evict(e),this.lru.remove(e)):this}}]),t})();e.LRUCache=h},function(t,e,n){function r(t){return t&&t.__esModule?t:{default:t}}function i(t){return(0,l.isArray)(t)&&(0,l.isFunction)(t[t.length-1])}function o(t){return t[t.length-1]}function u(t){return t.slice(0,t.length-1)}function a(t,e){e||(e=h.default.Set());var n=h.default.Set().withMutations((function(e){if(!i(t))throw new Error("getFlattenedDeps must be passed a Getter");u(t).forEach((function(t){if((0,p.isKeyPath)(t))e.add((0,f.List)(t));else{if(!i(t))throw new Error("Invalid getter, each dependency must be a KeyPath or Getter");e.union(a(t))}}))}));return e.union(n)}function s(t){if(!(0,p.isKeyPath)(t))throw new Error("Cannot create Getter from KeyPath: "+t);return[t,_]}function c(t){if(t.hasOwnProperty("__storeDeps"))return t.__storeDeps;var e=a(t).map((function(t){return t.first()})).filter((function(t){return!!t}));return Object.defineProperty(t,"__storeDeps",{enumerable:!1,configurable:!1,writable:!1,value:e}),e}Object.defineProperty(e,"__esModule",{value:!0});var f=n(3),h=r(f),l=n(4),p=n(11),_=function(t){return t};e.default={isGetter:i,getComputeFn:o,getFlattenedDeps:a,getStoreDeps:c,getDeps:u,fromKeyPath:s},t.exports=e.default},function(t,e,n){function r(t){return t&&t.__esModule?t:{default:t}}function i(t){return(0,s.isArray)(t)&&!(0,s.isFunction)(t[t.length-1])}function o(t,e){var n=a.default.List(t),r=a.default.List(e);return a.default.is(n,r)}Object.defineProperty(e,"__esModule",{value:!0}),e.isKeyPath=i,e.isEqual=o;var u=n(3),a=r(u),s=n(4)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var r=n(8),i={dispatchStart:function(t,e,n){(0,r.getOption)(t,"logDispatches")&&console.group&&(console.groupCollapsed("Dispatch: %s",e),console.group("payload"),console.debug(n),console.groupEnd())},dispatchError:function(t,e){(0,r.getOption)(t,"logDispatches")&&console.group&&(console.debug("Dispatch error: "+e),console.groupEnd())},dispatchEnd:function(t,e,n,i){(0,r.getOption)(t,"logDispatches")&&console.group&&((0,r.getOption)(t,"logDirtyStores")&&console.log("Stores updated:",n.toList().toJS()),(0,r.getOption)(t,"logAppState")&&console.debug("Dispatch done, new state: ",e.toJS()),console.groupEnd())}};e.ConsoleGroupLogger=i;var o={dispatchStart:function(t,e,n){},dispatchError:function(t,e){},dispatchEnd:function(t,e,n){}};e.NoopLogger=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var r=n(3),i=n(9),o=n(12),u=(0,r.Map)({logDispatches:!1,logAppState:!1,logDirtyStores:!1,throwOnUndefinedActionType:!1,throwOnUndefinedStoreReturnValue:!1,throwOnNonImmutableStore:!1,throwOnDispatchInDispatch:!1});e.PROD_OPTIONS=u;var a=(0,r.Map)({logDispatches:!0,logAppState:!0,logDirtyStores:!0,throwOnUndefinedActionType:!0,throwOnUndefinedStoreReturnValue:!0,throwOnNonImmutableStore:!0,throwOnDispatchInDispatch:!0});e.DEBUG_OPTIONS=a;var s=(0,r.Record)({dispatchId:0,state:(0,r.Map)(),stores:(0,r.Map)(),cache:(0,i.DefaultCache)(),logger:o.NoopLogger,storeStates:(0,r.Map)(),dirtyStores:(0,r.Set)(),debug:!1,options:u});e.ReactorState=s;var c=(0,r.Record)({any:(0,r.Set)(),stores:(0,r.Map)({}),observersMap:(0,r.Map)({}),nextId:1});e.ObserverState=c}])}))})),ke=t(je),Ne=function(t){var e,n={};if(!(t instanceof Object)||Array.isArray(t))throw new Error("keyMirror(...): Argument must be an object.");for(e in t)t.hasOwnProperty(e)&&(n[e]=e);return n},Pe=Ne,Ue=Pe({VALIDATING_AUTH_TOKEN:null,VALID_AUTH_TOKEN:null,INVALID_AUTH_TOKEN:null,LOG_OUT:null}),He=ke.Store,xe=ke.toImmutable,Ve=new He({getInitialState:function(){return xe({isValidating:!1,authToken:!1,host:null,isInvalid:!1,errorMessage:""})},initialize:function(){this.on(Ue.VALIDATING_AUTH_TOKEN,n),this.on(Ue.VALID_AUTH_TOKEN,r),this.on(Ue.INVALID_AUTH_TOKEN,i)}}),qe=ke.Store,Fe=ke.toImmutable,Ge=new qe({getInitialState:function(){return Fe({authToken:null,host:""})},initialize:function(){this.on(Ue.VALID_AUTH_TOKEN,o),this.on(Ue.LOG_OUT,u)}}),Ke=ke.Store,Be=new Ke({getInitialState:function(){return!0},initialize:function(){this.on(Ue.VALID_AUTH_TOKEN,a)}}),Ye=Pe({STREAM_START:null,STREAM_STOP:null,STREAM_ERROR:null}),Je=ke.Store,We=ke.toImmutable,Xe=new Je({getInitialState:function(){return We({isStreaming:!1,hasError:!1})},initialize:function(){this.on(Ye.STREAM_START,s),this.on(Ye.STREAM_ERROR,c),this.on(Ye.LOG_OUT,f)}}),Qe=1,Ze=2,$e=3,tn=function(t,e){this.url=t,this.options=e||{},this.commandId=1,this.commands={},this.connectionTries=0,this.eventListeners={},this.closeRequested=!1};tn.prototype.addEventListener=function(t,e){var n=this.eventListeners[t];n||(n=this.eventListeners[t]=[]),n.push(e)},tn.prototype.fireEvent=function(t){var e=this;(this.eventListeners[t]||[]).forEach((function(t){return t(e)}))},tn.prototype.connect=function(){var t=this;return new Promise(function(e,n){var r=t.commands;Object.keys(r).forEach((function(t){var e=r[t];e.reject&&e.reject(S($e,"Connection lost"))}));var i=!1;t.connectionTries+=1,t.socket=new WebSocket(t.url),t.socket.addEventListener("open",(function(){t.connectionTries=0})),t.socket.addEventListener("message",(function(o){var u=JSON.parse(o.data);switch(u.type){case"event":t.commands[u.id].eventCallback(u.event);break;case"result":u.success?t.commands[u.id].resolve(u):t.commands[u.id].reject(u.error), +delete t.commands[u.id];break;case"pong":break;case"auth_required":t.sendMessage(h(t.options.authToken));break;case"auth_invalid":n(Ze),i=!0;break;case"auth_ok":e(t),t.fireEvent("ready"),t.commandId=1,t.commands={},Object.keys(r).forEach((function(e){var n=r[e];n.eventType&&t.subscribeEvents(n.eventCallback,n.eventType).then((function(t){n.unsubscribe=t}))}))}})),t.socket.addEventListener("close",(function(){if(!i&&!t.closeRequested){0===t.connectionTries?t.fireEvent("disconnected"):n(Qe);var e=1e3*Math.min(t.connectionTries,5);setTimeout((function(){return t.connect()}),e)}}))})},tn.prototype.close=function(){this.closeRequested=!0,this.socket.close()},tn.prototype.getStates=function(){return this.sendMessagePromise(l()).then(E)},tn.prototype.getServices=function(){return this.sendMessagePromise(_()).then(E)},tn.prototype.getPanels=function(){return this.sendMessagePromise(d()).then(E)},tn.prototype.getConfig=function(){return this.sendMessagePromise(p()).then(E)},tn.prototype.callService=function(t,e,n){return this.sendMessagePromise(v(t,e,n))},tn.prototype.subscribeEvents=function(t,e){var n=this;return this.sendMessagePromise(y(e)).then((function(r){var i={eventCallback:t,eventType:e,unsubscribe:function(){return n.sendMessagePromise(g(r.id)).then((function(){delete n.commands[r.id]}))}};return n.commands[r.id]=i,function(){return i.unsubscribe()}}))},tn.prototype.ping=function(){return this.sendMessagePromise(m())},tn.prototype.sendMessage=function(t){this.socket.send(JSON.stringify(t))},tn.prototype.sendMessagePromise=function(t){var e=this;return new Promise(function(n,r){e.commandId+=1;var i=e.commandId;t.id=i,e.commands[i]={resolve:n,reject:r},e.sendMessage(t)})};var en=Pe({API_FETCH_ALL_START:null,API_FETCH_ALL_SUCCESS:null,API_FETCH_ALL_FAIL:null,SYNC_SCHEDULED:null,SYNC_SCHEDULE_CANCELLED:null}),nn=ke.Store,rn=new nn({getInitialState:function(){return!0},initialize:function(){this.on(en.API_FETCH_ALL_START,(function(){return!0})),this.on(en.API_FETCH_ALL_SUCCESS,(function(){return!1})),this.on(en.API_FETCH_ALL_FAIL,(function(){return!1})),this.on(en.LOG_OUT,(function(){return!1}))}}),on=I,un=Pe({API_FETCH_SUCCESS:null,API_FETCH_START:null,API_FETCH_FAIL:null,API_SAVE_SUCCESS:null,API_SAVE_START:null,API_SAVE_FAIL:null,API_DELETE_SUCCESS:null,API_DELETE_START:null,API_DELETE_FAIL:null,LOG_OUT:null}),an=ke.Store,sn=ke.toImmutable,cn=new an({getInitialState:function(){return sn({})},initialize:function(){var t=this;this.on(un.API_FETCH_SUCCESS,O),this.on(un.API_SAVE_SUCCESS,O),this.on(un.API_DELETE_SUCCESS,w),this.on(un.LOG_OUT,(function(){return t.getInitialState()}))}}),fn=Object.prototype.hasOwnProperty,hn=Object.prototype.propertyIsEnumerable,ln=A()?Object.assign:function(t,e){for(var n,r,i=arguments,o=T(t),u=1;uk=>_a?Oc=7E9v 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 KKef#n*8u=n`R5)0 diff --git a/homeassistant/components/frontend/www_static/frontend.html b/homeassistant/components/frontend/www_static/frontend.html index 83d01bb470f..d0a3e75d8db 100644 --- a/homeassistant/components/frontend/www_static/frontend.html +++ b/homeassistant/components/frontend/www_static/frontend.html @@ -2,4 +2,4 @@ },_distributeDirtyRoots:function(){for(var e,t=this.shadyRoot._dirtyRoots,o=0,i=t.length;o0?~setTimeout(e,t):(this._twiddle.textContent=this._twiddleContent++,this._callbacks.push(e),this._currVal++)},cancel:function(e){if(e<0)clearTimeout(~e);else{var t=e-this._lastVal;if(t>=0){if(!this._callbacks[t])throw"invalid async handle: "+e;this._callbacks[t]=null}}},_atEndOfMicrotask:function(){for(var e=this._callbacks.length,t=0;t \ No newline at end of file +this.currentTarget=t,this.defaultPrevented=!1,this.eventPhase=Event.AT_TARGET,this.timeStamp=Date.now()},i=window.Element.prototype.animate;window.Element.prototype.animate=function(n,r){var o=i.call(this,n,r);o._cancelHandlers=[],o.oncancel=null;var a=o.cancel;o.cancel=function(){a.call(this);var i=new e(this,null,t()),n=this._cancelHandlers.concat(this.oncancel?[this.oncancel]:[]);setTimeout(function(){n.forEach(function(t){t.call(i.target,i)})},0)};var s=o.addEventListener;o.addEventListener=function(t,e){"function"==typeof e&&"cancel"==t?this._cancelHandlers.push(e):s.call(this,t,e)};var u=o.removeEventListener;return o.removeEventListener=function(t,e){if("cancel"==t){var i=this._cancelHandlers.indexOf(e);i>=0&&this._cancelHandlers.splice(i,1)}else u.call(this,t,e)},o}}}(),function(t){var e=document.documentElement,i=null,n=!1;try{var r=getComputedStyle(e).getPropertyValue("opacity"),o="0"==r?"1":"0";i=e.animate({opacity:[o,o]},{duration:1}),i.currentTime=0,n=getComputedStyle(e).getPropertyValue("opacity")==o}catch(t){}finally{i&&i.cancel()}if(!n){var a=window.Element.prototype.animate;window.Element.prototype.animate=function(e,i){return window.Symbol&&Symbol.iterator&&Array.prototype.from&&e[Symbol.iterator]&&(e=Array.from(e)),Array.isArray(e)||null===e||(e=t.convertToArrayForm(e)),a.call(this,e,i)}}}(c),!function(t,e,i){function n(t){var i=e.timeline;i.currentTime=t,i._discardAnimations(),0==i._animations.length?o=!1:requestAnimationFrame(n)}var r=window.requestAnimationFrame;window.requestAnimationFrame=function(t){return r(function(i){e.timeline._updateAnimationsPromises(),t(i),e.timeline._updateAnimationsPromises()})},e.AnimationTimeline=function(){this._animations=[],this.currentTime=void 0},e.AnimationTimeline.prototype={getAnimations:function(){return this._discardAnimations(),this._animations.slice()},_updateAnimationsPromises:function(){e.animationsWithPromises=e.animationsWithPromises.filter(function(t){return t._updatePromises()})},_discardAnimations:function(){this._updateAnimationsPromises(),this._animations=this._animations.filter(function(t){return"finished"!=t.playState&&"idle"!=t.playState})},_play:function(t){var i=new e.Animation(t,this);return this._animations.push(i),e.restartWebAnimationsNextTick(),i._updatePromises(),i._animation.play(),i._updatePromises(),i},play:function(t){return t&&t.remove(),this._play(t)}};var o=!1;e.restartWebAnimationsNextTick=function(){o||(o=!0,requestAnimationFrame(n))};var a=new e.AnimationTimeline;e.timeline=a;try{Object.defineProperty(window.document,"timeline",{configurable:!0,get:function(){return a}})}catch(t){}try{window.document.timeline=a}catch(t){}}(c,e,f),function(t,e,i){e.animationsWithPromises=[],e.Animation=function(e,i){if(this.id="",e&&e._id&&(this.id=e._id),this.effect=e,e&&(e._animation=this),!i)throw new Error("Animation with null timeline is not supported");this._timeline=i,this._sequenceNumber=t.sequenceNumber++,this._holdTime=0,this._paused=!1,this._isGroup=!1,this._animation=null,this._childAnimations=[],this._callback=null,this._oldPlayState="idle",this._rebuildUnderlyingAnimation(),this._animation.cancel(),this._updatePromises()},e.Animation.prototype={_updatePromises:function(){var t=this._oldPlayState,e=this.playState;return this._readyPromise&&e!==t&&("idle"==e?(this._rejectReadyPromise(),this._readyPromise=void 0):"pending"==t?this._resolveReadyPromise():"pending"==e&&(this._readyPromise=void 0)),this._finishedPromise&&e!==t&&("idle"==e?(this._rejectFinishedPromise(),this._finishedPromise=void 0):"finished"==e?this._resolveFinishedPromise():"finished"==t&&(this._finishedPromise=void 0)),this._oldPlayState=this.playState,this._readyPromise||this._finishedPromise},_rebuildUnderlyingAnimation:function(){this._updatePromises();var t,i,n,r,o=!!this._animation;o&&(t=this.playbackRate,i=this._paused,n=this.startTime,r=this.currentTime,this._animation.cancel(),this._animation._wrapper=null,this._animation=null),(!this.effect||this.effect instanceof window.KeyframeEffect)&&(this._animation=e.newUnderlyingAnimationForKeyframeEffect(this.effect),e.bindAnimationForKeyframeEffect(this)),(this.effect instanceof window.SequenceEffect||this.effect instanceof window.GroupEffect)&&(this._animation=e.newUnderlyingAnimationForGroup(this.effect),e.bindAnimationForGroup(this)),this.effect&&this.effect._onsample&&e.bindAnimationForCustomEffect(this),o&&(1!=t&&(this.playbackRate=t),null!==n?this.startTime=n:null!==r?this.currentTime=r:null!==this._holdTime&&(this.currentTime=this._holdTime),i&&this.pause()),this._updatePromises()},_updateChildren:function(){if(this.effect&&"idle"!=this.playState){var t=this.effect._timing.delay;this._childAnimations.forEach(function(i){this._arrangeChildren(i,t),this.effect instanceof window.SequenceEffect&&(t+=e.groupChildDuration(i.effect))}.bind(this))}},_setExternalAnimation:function(t){if(this.effect&&this._isGroup)for(var e=0;e \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/frontend.html.gz b/homeassistant/components/frontend/www_static/frontend.html.gz index 5a1e6faa46691b278f6c57c63febf3dba4607044..2e509569ab2ffe7c98d3aa9a446f426cc3d9bf52 100644 GIT binary patch delta 33124 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 Urq{R)p^v@)3)=x9m{uDI00&0>+W-In delta 33259 zcmV((K;XZa`v;)>2L~UE2nZ$4JAnta2LT5~fBW|Swv8mg|L;>!Na6!5kRoNvaX`ad z$95*ZjUQ(#naR-{{U8#Q5K{mb0BtD}zx!2HzZ(sbQj(k5+w53Gzq`7-x~jS!MI+r+ zQ?!b1P)~iUKmwa0T*aTUcj+V_k|o~DY(myw1?1c5ORP@Djo9NixVvwN2q&v!!1gyl ze>5IT*xtxBx@oSKUgc%%a$&a~=DPO>)M|X4B1Y5|`ZLBcjJ*?YKLu7#(BnjAN!bGX z?42-5n}VW@8>K}y(lNqf=2%r|Zz?dGVe$&$VkIW~r0EL%4?Qz-oDEuSDXD^ZOKxP~ z3*zZ2Tg-mOcf`dNG$QFndQU|CYaPMce>&cJ9`V2(+QhzYJ<0$N*Lg|;%sLS6EJ&rp zY>yIILjr?4+Y*_oIa%ClQKYj*@w7P`BsyO%z$__hl)>8PMMHtJOk^a^ZA2udq7Esf&e+F(% z(9GqlDfgSfcH!yRdA_0zIa6bv7@`RpwI=GAlw{=84iba2HxW~=*4-=Kuor|im+>Hc7Wa<f$Qpy zK7O3-fBe|PzxQwOvxg}G=6c~0f;Rk@;a{%Rw_%Qq-elV2ZEOf0_fk0vGYkO&S?uKqaW)`j$l838n*egI;mTjF+gVY>L{^ zETL3Gv4}32Lo%*pYEIavpt{kk1w9}J*DED#O-+BHg%F(Li*q=SMae1fU+_JUF{ID}EzV_)bYj>R_{pgU}tJc#7avzk$3)saB5QO{FVV!3y@!nAJD;niR9LL3LC9V;zL4E(SBV zrBM5n4~C3z&&PFle=y-KAj_bCBZpBx9o)Mo%Jz+t@+G%hep zLL(;+4NKoPhRXCO1A5*`rQd9Pzd-_q?@@relq3+4NVkLwO@Pzc%c>u;90m#>?u+$5 z(<^dJ&|xiV*DEzr^*p9XfC9EM=)oTl}cGzCt(ljO6`pyvr}fOAl%Kup6+W;2iY zZZDZmR~Lkae=&h|%bw+4ynX#rJOlLJygfeo@bkNOZ{Hukd~x#f{riyAr@S{s{b9Al zV9)7{2I++tEJ$XAopeOs^yt83VwEWGtqH_sN+D0ZJ<+{AYw>m==h4B4tw4Vi`yS4e zCR)S-A0SiRxJqDMA`fZ|OP`{5$kWZ97BJM5JXGQ*e>VvY%bDii&gQI!7D*CK_M;xgaqsgMsag7$9$;VdjtD;5)W{~H#dOP!hFpn z*4N7ae{VGQ)W@p}*bf;0L8b`f3?uOaS{UmI@6%Phb%mL;{6gGAmJ%S&fp+iY&a9S(BxiRau%@7h?~Z zH8I7khbgR8E zuvC2+X^d7f8)SQq){^Xw++&a1*ST#sn4?DH{&CwLbL~R2Itzz4-ndC!E8PUI*fR4) zdI=5UpT7YLf-?B?!+DwIpZLf3fcFp(b9B@RMd8m6$wjt6O*8!9XPAES;p6XL(7=_> ze=L6eJ>{WV5PR}iFcT4$4`Yz<_;64{i*+Wyz87I+RCqL~&MkPMKK~{59sd-=;h$p8 zOSq*_qh##yU#wsLAv)%tvSA`{dw4Hgpr>j0IONsn z8>$VCSb|D9#PaJFu;0fJmx~#62S3-LzDO`qbQSgCJOLsS>%byoe^8c= z_#ZJ{%w;xI#Xv``MH|J}$Ql^t7WX!J@Ec-(w_GXC?lHCR^w=xwE*<#^&m9| z{stLLAan*O@I}u6%_*ntQzl}^8(17{46aM^~grEh85A)gJ`I> zU^M(mHx;i{+sgUl3Hs?dMYAyG7S=yS+gZ}axZ$>j7;5)snXIbxMm$C6e?smXrnz^+ zlm>4|Uc;&g-BtZ{qN%=u8;sMRaRPv6W9SEKV14#ZIg7P6l&A2W!jx|)wh-8Erm|Y= zDyybGBI=)Ltj`|$p%t_>`%nzUUYyGyC!BA``hx4^+Ip14ese89OaT^aJtTE9{0DtO zhWJCW--fohT(opt5NFoke*<_({`Tf(fZvI-+Tt01Dns)Q7B5Q{olgx~T;plh&4>L` z>C9`wmy#3;1EuMj0YfgtB+3(RqCAx)aM2|DgAfHll?3t}z9c^pF5+o;9?yrcVG@ej z$GH*sMi(io7(KHm!0L$}4k7g%A1%W{98XE1WCcZXt|88>$bj39e-e!q<4{1rsq>LLUOYdDv@PKVLFz@f~f_ebtTJsrKkI4NcCxVh154Q zQdvtzFW)G}(I(VQ^{+LuH>tQIm`W8Bf7%8SMeMpW(6=*Sc@z>e8WLM*ze34iMM{5wq3{Pg8Dq$w7#fgbe?W%nde-nbn7}~?9L73e zpwcCVnXXWg4G+2py*jOGAGHzpY+b(}ua@U&PFJ~Diw@#3UA6P@kgNDjA!C6vHI+D- z5*oB0po`87F&r#F2@9gWP(wq0GXKG4yc#DHtqyD&)E8mNO8Pd9OWaQ5NmMcEb$~5uQ`&3zjj9)1HAR z_}-;wn+wNL)K!q`QHet6dQ?O+v_D-d)NVHF15E(*kV|v|b<1@i#3O4wJhPcH#QG8F zuSHtM#gHlLU0c$M$kU0{uqi(Q>h_xs650)h8&%|qe?Z}Ekej8ASm@stPS}ylD00S` zSlqa~N5z!rl@vGZuB9<9dbJN2JO&{1ZSv8_X$SA7Gj#kHy&~jr(C-50ACQ8>d)Y@^@WpQx+;lif0yFm(CUQ zc__}*=f>1GvF$^I{suZKmjRQY<`AD0Sc>7l|)*xhSr&m8}dVg$NW4ND~at3#~|l)S&Xo z8hM|Ye^`$Py5vm&i#2O3DRbb%iy)G4(m0I!f82Hl%D0VnU7!?I)^r*{_tf0-VoN3| zKu$@8&)!L0)X73V_@-PLGTTq3G9^(?f)Zk+lSVb+Jr^dNwgt)-X5&_dDgqRcxM(oE zDCWB1*A$wq)F|h@lhqR4RJfGBfX+qxFGhC7)jFJ`9W78Cc7yZ`K-uR>^#P{BLgu>K ze?&(jH5KI%xH9@}Kx$XKa|~X~rp8FPo8~esiwrQ2;U9tcVci zEe1^Jx7kXQI?7~bkO%weeWr1K%G|%2wHt}Ddj6z$G^(SNNn0496-$55rsw3)VPnZ1 zAjA0412*#9I9KTfc}-lk_d2VXyZc$kApe0aJ|lrj#pF(rx1X+SlW2+!9F{kYe+5dl zZT*a^PY@sA#DKuTp<9uBnzBb(m=as*MnQ^G!*)6Mg{Mh!;*e=g9PtVl|BI~-?iyKf@rrFvC6TT{$az#Z> zGxu7GHa6MQK8LDt*+p`}wKbEf%UX*KO-0nOyJ_1UJVvse%hWOTR#E#i-mgQYkcpx4 z(uyhA8fWL`hAGlmhfI0if0f6M&r__6)?c?iXhJ5~w8@)!Onp~D!T8V)I6v?bz}6;! zwZ}XzK6;TM13XjO<0AAWt%IDJy$UjeK~|M(!qo(&zKBiuwT#%`1X#0;;C|z}y#nPzs2AHz_gx5le-OGhi*fk2z=>1n zndm@2_8E6p)6sB*qFEh#*2EA3?`cgwjU8A+?j{SDH)^BRCm)c}Kto$w7-Hy!)P^8{ zx-ig)!9H?g2I;botsD!uYwyYpILuqJA6}$4GZGsivXSvfxn_yHa+Ra2RgYZmB2Dgc zL~4Q`VC5hxmjl)Hyz*mIY-*7Qx_dJhK@8F5FK|)v}%?YR|h>- z0`WR0<-Lxw84yZmv=ZzcNGQ8EuN`w0nWvYguVFco2YfyIJg6BjmG1 zNILx0krzA0qOqWT4pu?>IpZNwH+7*LPePNMN77y|i$O%RTe~?G|p&;^bQ;L-8ieyRh6Cij58B92hkwO1v2uTH{(d+BkfFg8(=zU(r{55 z_G{9LyO4xI=wx3S{@|9;sAeGb#m6zTugu5)&0HWPyDzN4#RcoYEETi%h6OFX>ZI2OsU^yIQ%eZp< z7CTwxcWFCBvk;^8VY(;U=SMfCqr2mKG&`Hq;gsYPPfmIk&l{hZton(;Rg=a-X{E*$ zu~KGYe}Mjs)8=8spd|P(ivDxM1SYtM+3TtG(ycuLShApQYNzOL-qI(XzS>Q(8W++o z(-NOg@UpviPy0YY*2wzygQ%~+iwD;;H?F~V`*0?NoPFJAOwHub6zt_9R^bYz3}aZD zBtm#DN)1)**S3vX*T1)*II z*conhIvppp#KlkzEe3hLNx@`oo6n|ksV%HT@kHb_KAMOZS6S+=`T2^77fB+xbBYv4zq^>8n_xj`>Ym}*pH z1=o$+Pjl!R=75WG8HpUu{NBOG>L%oRSmYt~=BAITdc&OisP)nF4rXM4l%(NZz*Es; ztlLEu%<=@2FP;Hm{>4Bf^>t1p+&uyKi!6Yra=GG5aog)i0fiv%3w+Aq8L9C;+ zQ62%J&h%wj`GziC&capqhoy=TubHxv4u7?}NRP|x;sRC5QI$4hJEve*Av4bTj*LNdQc|Xe+g|N`@>49Kvu$|bAxTq#?^!ka24Zkza~@cak9S;FyQO6 zVn`gp)F%5MO3r8C*^R71U7n8?cgy@X3So!P}jHZ?l8G#-pQ%G7?)m65dh z!_|=GRazgwMP%M!s7H*Jw?Ir}L#ygf1n0NqyR@8=`*pi2TL^wEGIp5lMo1w|M`9x% zeSAY=%xKw(NUxWd z5k>>0ma{+9a^`NCg+8DifXX;I*<rHaLo6Hn!Elc~7{Wmu z(eO?E0tm3YVt&maXTjL7mzkN{5hPgB`uRU5mOd(_>DaJ)A1s&<8ck2QrGaw_TzF~Agbz5 zFaQIZTFDC;e{c4ERLH|w;l*xJOzQG8+>3C3-R#8F{FIE*5l?fv+M(+Y_T#uv zbwm1_o0Xc0WmJE2Q}`tsf6y54x-EHXu2RJA3ft@TQH2;NY?Hv& zJ=RKZm1(HL%|pIv>Oia(5$xmc{$%8ToZbJ}3r6V9sJj0(r+jPS1GvK-U(`W^{N($S z#xOCcN-j;uH%aNY6lh(1&tuMN+_WP#<qnvwmJIW*ZwxLT2jSJyW*curbNldsDp%`z@E}3A*_5VCcn{ zYGZ{dRQSEiV&+mgGXLV5W~C%im>(43i0Ty8fAE>@X`DHf{+jNdkg^m?*W|%T`;yLR z&{deujYt>Eaeq`t=$d$xD&1|O+?=ywBLloJ_LS21F6S9N96{X+9|=+P5lD9FvG)}n zWj#r_BG%Fv->cV}&*xUHFpc#p!8QAMPX-IzRT`&?3N$Gu=NvDRI+3}(8GH>3rk>lZ zf0qNL^k8yucyu(>cz<-+47UaSImAD?esXf%eK+!Y24mvHcoJLnLy5znPdepzwZa&b z;VNtZRBrlwN`nNGLbES(nob)2QsY1b+5*v-&r7iuPX5k?)wxqbL4kc5Vl z=^J*$X?)60mMQcKy*^-oQy`m{mtL=eJv}}5lK|CEIK@Jw$B=Ho@jv~^{jYESe~Fe5 z{MtJWf@^GB%C#`>qknLQv6a}7z>pS0y-eb|vZfRsj&!Sj_V(+wl6lQy?`PO#Nv|qa zz}(;tgJZ09Y2V7&`5RAB0=j3xH{Sj%^v*D*!V9g)!N+R6-<^D{u`*C)&i407x%~xUXi3DPLQZEYSjY5pvhYuxGX*G~^O?F~A>eSok5S=J zlp_6fWip__bbLO6D@H8RdTlxp*P;&4dy*0MA~n1<6DvZC$}H)H8hsw9e?+*6r2IG! zP>Dr1lv)XkdjJ#1oG*Wi_v<-w#wwC*WGh;hJLX!amxL z+gLLV_Di(o=TalDv)@tf?L}ix2O|&94Wd%q-cia?=sbpFd6Qn;q?b3-^P3WWeg1Ou z`TXWHAbj{If#i#ui;Elhe_GZz%c%!@$BI=%qVp*OV4h~ zWOj3g|KQjU&WKe&T7`)o;a+Z8fz}3z&6mb0VVU2y zH+F{3LK9nnzzXm;o!?M6f$zYZi+v)Q144k8LMz61Nmh~!hdOUGon-`2ZQ`aWOEXF&l zrTjUJYi!-AUkqnT7CEn9v{o9sXstxNXhjlH~ zrWW7q@1|L%jakwRe@fFkmdIl>u`_Wh&RUq!sKUJ}VFmhwhOga2Yi0qGrtl2kP z(UIpr(H{B$y;tv07HFp+Xo|aaB9I}U-C7HvwF#HD=J)PBai!{+1 zvpOe}I$%Nge*@_T!Mz5jA}pn(iY}Y)i%XJJP;K}??^bOrd`_|gG<@G-M{asPRFRO{ zXcr9fF(0MlY=3`(F`(9Kw|@^~Es6X`Lerr81)I&x*A0iXQd|nR(E<6?{<0qcQ9J%; zFu6};Z73}xGjx^0AKQ6kK%(E!U8x9(74x+HOzpg(fAIA&Kr!Y8#tKFPw32U-{ITnB zA{;=4#F2j>}HJ%}LK7~Kn;4(fLT|bMO zR3-68DF@f+T=?f9a)i`m-$aJYCOj737ODwm)i4^JtFp?K)bl zktvWqf3B8tmW(Q160^@q zhR;u<@pupRAz-zM+fNB?+*y>;AHYh?vot}ye~;d=#Rp0qjaO0aiSNHwNlo>}4<=Lv z|EA+3q&1|sZ9aTIC51&i94QTE}OewL;-Ou>)YI0yM z<;q>szr4A+`Tgd>EEs(aH6G0LI#bE?xEHb>PO+xPUQ>5o>Z&3R*8Pef*fZd ze}^y4Ye+-{sv7NE#GK93l3H;yMa9!29LgA@cqtE2j z34UCO#rnchX5ld)|I-aqjGh~p;sf6rPq>Do zJ$9xC!31LQ=U^J2N`<6jC~)uIOZvC+PlGtFd>9DaIq(4^$9(@PfT3d<|4X23f3c3C zPuSNl>CXy^@5L*>brQD$HILdojaOn2138ER4nn>NUgEMp!++l4Kfl4M{PyHZtjcd< zRo=&qeSS6mZ89?78Jct#T$S&AEE#@*e}ds9{2Sv8!e{Ik;Hr0G1@M8Fug#@gm}hEL zrr|p%L3bA$)th(*5Lp5+-iSxse_6P6B4dYwjzFQGTh z)Os2`!bf&RdnkQ3UL;nB4<^Ra_C26KGonAGyvGZqEQe^#Ma2-RW%V9PR}MvLbz=Q%VLo-?2v_Hz>O0#~xYfLCQdWr5$d0(!a_7EQ4F zlzzcMCtk>;SuBZ7k|j~U=TseXuFRZs)-bs)S};%@*K$G&HX)gd%^vgI1?94zMiW=E z(1JI?ej0^-Cn&NUJC7!Ke|-ECPH;Wk_-NA zL)PqKYb&pNNU_`}{Yk!H*z|Vt1@k}tUpa#T;&Piuq~Y!^lQbvJ8MEmlLjz167QGWT zN8JTWAy++?K`4{B;LsR~ANq17s$uakP38~0D^d?f>z7=34KX^k3>aCaG+<<(n+zE9 zO$LmaFksBM0VCTv9hT&+^Ni7TDZl|A$jBL(>`Kk99G8N(UT^@q$>U0!i%9KDcVELU)B zNZSEJz(bk{3;zrH0QRMp48ACku%jG#122M~LsXa(IO|%te=r;uVKG^UDi}G&I>~yb zg>-(~&f~aPPtjc#&UQV|a)8OzHTfT70Q5;Ru$K$lhd=Qg>l$JIZ=*5s(6lMVWper2 zr+OL=Ak@5Oe%<%B8&_t!HD6{~^JN%>5ooG%W*B)=FdyAshf%(x0ybCVHe$*HuJEzR zNNsluHX*3;e|23X-L(=ku2-XmO?8n~DUKdZC&JyzBGS^#$fOlu!_UAL^G&W2?P^Om zd}}o(w!&gISEOON#tpO3khf)adi$x0)?WQRtItK5xGiI2xFg=B3C8BIo8B5WEt(DH z#*AA>q`a)`#kJE9k4mJGn&yY{oY*#njQmh9^-kl#e@rtT{Cj$;=JqDNteGu3o-!L^ zp?oiv{@Q=5&Q&ndlszzSYr*b~-B* zFQHqAg~&t_4$=hT7gVme!a`5f^1|yWdQ~`siv4*m}i;kFBGhUqV zz$2%g-O_s@>ckojPMYpg{#F*NrAknf&^(|_&$GqsSrcWR;3bCo1bSiU@|`%IF*~xM zaE;R*OWW>Vk_e%WYBUtp>YLCk+2#sCA7z+Yf3Ceu6aj4C?25MsJ7SO7MYEZ~ML&{` zfADC$*9yzQ>n#ZD!AN?aQj{

|*gbHQUe&>TZUbP1^28b{+E%W_iD*9W`=^ps^`q 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 diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index b76ad67d4ab..a767765c5ba 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit b76ad67d4abbc0cc492fc11842c9d163b4917ead +Subproject commit a767765c5ba8583e5af32c8d9990dec93653e5ec diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-info.html b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-info.html index 83a2738e422..1a01891f25f 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-info.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-info.html @@ -1,2 +1,2 @@ \ No newline at end of file + clear: both;white-space:pre-wrap}

About


Home Assistant
[[hassVersion]]

Path to configuration.yaml: [[hassConfigDir]]

Developed by a bunch of awesome people.

Published under the MIT license
Source: serverfrontend-uifrontend-core

Built using Python 3, Polymer [[polymerVersion]], NuclearJS [[nuclearVersion]]
Icons by Google and MaterialDesignIcons.com.

The following errors have been logged this session:

[[errorLog]]
\ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-info.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-info.html.gz index 280bf68a9a11358a47d0d524cb763e2d5a0a5f03..a7ff46fcb8a79d0f1df724933fb404b7a3592677 100644 GIT binary patch delta 629 zcmV-*0*d{=3cm^nABzYGn3zOZkq9aRWW|v*%YWzQz70j98(bsYV<40)>Nq6~*fS+- z2uhGeiSa2^ZMXpIDEjqx!Wgw01(d!aFFCOWzE0j?+=f&RP}&@YxhC<*@!*w-b)W1) zSOR9k-UY_WO4wCj1pAX0+4(gI`at#|w%O(@kFoQywX!(XaE*q9|6%d=%E5dvpK z3bC;eEUhr@H0n-$J|(WMXhfvM%GaV4E^w*UO8M|C6jbXO=etmr%X`SSi>S3qge3`! zpn|#?;%Bv>n3pqtbJKs_-g4$jz3f1K*?<3dP2aTPHNIy}I+qJp314H03cR;-e^}Fq zHVD4wIeG}LH%ygqZpH_xQNYOeHo9}CC9_!=ROM4*rG=at3(>eZib`EUKp5#z)EG+N zV6rNhv+0ae9R|(+uU}p>C8@a`__VKdV@a9pAW+CcV%a1#EUHKGKKgkWC(Rr>O&&rE|- zttzmG9&+31DhnFDS9E$meEqLB(&pt0q zumsG6y$g($m9VS63IqgewGEUmsK#jZnl=kr2dGVa^0m1?OSH|1zWZ(NnbS&Utmjic z_J2o&XG8K^g0>G&QgMQ$L8Jt8r3J>;TkrTknoz1UI2nJ&hQCySurW(CmS@XSA_UHe z6k=l`SXyD)Y1Ezid`eth(TGTim9Ir9T;NixmGa?PD5%ym&Uc|Km-mou7g1}K2ul(c zK?QX)#LsF$F)wHQ=BEF;z2(f6df9>evVZ^an!ahnYkbd|bS@XH628U~6?kvw{;;MI zZ4i9VbMz2gZ8%Wqkxg`ZFJ{OOJ=h$sLH3rN((tP7NT)+6qUMyfH2abs47Txma`uc=GM(J^hEKE;#G8JL9zA(-hRlcK#EQvhxk8Uw^r| zp~}18`Y>*9r;(xP=5Ga-3^gOxTo#QLzH!5qs8q~)i|@OgOKCSYn~a7A_$L`f1D2de zsfA3Ui#S7)xSvA5CrZ?Je118AGM22EU`bP_CDS<*OK?6N1KKDEyA+4$n?y-hk_8PE z(hZitUcbC%N>Xz>@M&M^#*#AGK~Ru|#Ii|fSX7VVef0A%PMSG%nm!En>Ej>&o|y)v zT2){VJ><62RTebze{l28{f&oITiB`SMI#lm#`)QO;BmQJhGvB&DMZ_X&);_6?76c` P1MC3^k`Wx8$qN7g4vI6g diff --git a/homeassistant/components/frontend/www_static/service_worker.js b/homeassistant/components/frontend/www_static/service_worker.js index 4a503160469..25535a72081 100644 --- a/homeassistant/components/frontend/www_static/service_worker.js +++ b/homeassistant/components/frontend/www_static/service_worker.js @@ -1 +1 @@ -"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}function notificationEventCallback(e,t){firePushCallback({action:t.action,data:t.notification.data,tag:t.notification.tag,type:e},t.notification.data.jwt)}function firePushCallback(e,t){delete e.data.jwt,0===Object.keys(e.data).length&&e.data.constructor===Object&&delete e.data,fetch("/api/notify.html5/callback",{method:"POST",headers:new Headers({"Content-Type":"application/json",Authorization:"Bearer "+t}),body:JSON.stringify(e)})}var precacheConfig=[["/","acb0dcc5cd5f9d265f2904ea8dd21669"],["/frontend/panels/dev-event-c2d5ec676be98d4474d19f94d0262c1e.html","6c55fc819751923ab00c62ae3fbb7222"],["/frontend/panels/dev-info-ec613406ce7e20d93754233d55625c8a.html","8e28a4c617fd6963b45103d5e5c80617"],["/frontend/panels/dev-service-b3fe49532c5c03198fafb0c6ed58b76a.html","4194cb43b74108dc6d10354da2fd81fd"],["/frontend/panels/dev-state-65e5f791cc467561719bf591f1386054.html","78158786a6597ef86c3fd6f4985cde92"],["/frontend/panels/dev-template-7d744ab7f7c08b6d6ad42069989de400.html","8a6ee994b1cdb45b081299b8609915ed"],["/frontend/panels/map-1bf6965b24d76db71a1871865cd4a3a2.html","a74c01c2ee68c83c9938af067ec33b81"],["/static/core-526d7d704ae478c30ae20c1426c2e4f4.js","a94658a37687b843ba3d4c2f86c1ae03"],["/static/frontend-5baa4dc3b109ca80d4c282fb12c6c23a.html","501b84a8c8acd6818ce4f404f2adb0e8"],["/static/mdi-46a76f877ac9848899b8ed382427c16f.html","a846c4082dd5cffd88ac72cbe943e691"],["static/fonts/roboto/Roboto-Bold.ttf","d329cc8b34667f114a95422aaad1b063"],["static/fonts/roboto/Roboto-Light.ttf","7b5fb88f12bec8143f00e21bc3222124"],["static/fonts/roboto/Roboto-Medium.ttf","fe13e4170719c2fc586501e777bde143"],["static/fonts/roboto/Roboto-Regular.ttf","ac3f799d5bbaf5196fab15ab8de8431c"],["static/icons/favicon-192x192.png","419903b8422586a7e28021bbe9011175"],["static/icons/favicon.ico","04235bda7843ec2fceb1cbe2bc696cf4"],["static/images/card_media_player_bg.png","a34281d1c1835d338a642e90930e61aa"],["static/webcomponents-lite.min.js","b0f32ad3c7749c40d486603f31c9d8b1"]],cacheName="sw-precache-v2--"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var a=new URL(e);return"/"===a.pathname.slice(-1)&&(a.pathname+=t),a.toString()},createCacheKey=function(e,t,a,n){var c=new URL(e);return n&&c.toString().match(n)||(c.search+=(c.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(a)),c.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var a=new URL(t).pathname;return e.some(function(e){return a.match(e)})},stripIgnoredUrlParameters=function(e,t){var a=new URL(e);return a.search=a.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),a.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],a=e[1],n=new URL(t,self.location),c=createCacheKey(n,hashParamName,a,!1);return[n.toString(),c]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(a){if(!t.has(a))return e.add(new Request(a,{credentials:"same-origin"}))}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(a){return Promise.all(a.map(function(a){if(!t.has(a.url))return e.delete(a)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,a=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);t=urlsToCacheKeys.has(a);var n="index.html";!t&&n&&(a=addDirectoryIndex(a,n),t=urlsToCacheKeys.has(a));var c="/";!t&&c&&"navigate"===e.request.mode&&isPathWhitelisted(["^((?!(static|api|local|service_worker.js|manifest.json)).)*$"],e.request.url)&&(a=new URL(c,self.location).toString(),t=urlsToCacheKeys.has(a)),t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(a)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}),self.addEventListener("push",function(e){var t;e.data&&(t=e.data.json(),e.waitUntil(self.registration.showNotification(t.title,t).then(function(e){firePushCallback({type:"received",tag:t.tag,data:t.data},t.data.jwt)})))}),self.addEventListener("notificationclick",function(e){var t;notificationEventCallback("clicked",e),e.notification.close(),e.notification.data&&e.notification.data.url&&(t=e.notification.data.url,t&&e.waitUntil(clients.matchAll({type:"window"}).then(function(e){var a,n;for(a=0;a<^|Gf{SBukd%>`rHrhyjUreDC-k z;H+90w5BPfaVC0INmJC-pat_zzuT^@JE_l}sm{n7M4IuaqSFP&>W)79R*|7J) zf-fI_v1-a&@AmlC3N8m9!QcvhwzZ|IO`!|P?SEcgKxJO=vJ_l?cfmK_wJsWXziQ{( z)ob4EJ2gT7;45x8{%==KVAp)ZXZP1}$v0O^IE7pPfi1zeOS5Czf$q*C1tl0je>Xe) za5|m76W>68njXFWl^2vy&CGl_Tz@L-3L~+Srf#+yhQmE^z6K-bt~2J#V%(W`70k_| zOvZ9;gX3Q>z|3oP>b!sV@ss1vfh%a*Q;Y6D`e*mrc~Mseu^fFuXPr}rFPG)o(ebyo zt{ngQ3WYSqf4j9)=U3njGy~_v+9Y}Dit(RqX~qLe9-kx)ye6P?kJYML;1TulqjMIm7% zA`Nk#L{ug+j7ZKj*8*(?l`xT|e4{BQc`QX7i7X}|Q!-T~jFMP!sufzP9?@jDfl-DsF#E!g(>>`6RgB`4XQ^gc z#%0c8#w>`SB1U7HNs{U<94t;{95SkZR3bIz4dXJS5=$wLAkBL?Hddq2?YOB$ZR+ud z?q~FCU8=wsZEcKbE+rFDoFY<$#5_-8N;&6>h%k+QChB!Do13+)OeDH@Q~;K29O*Cw zN`#ECPzjBHChHBTVzpQc(|{3)Nfu&)OR8mpSrHP*vP>vI**_EZ0cNX`H*0Bs9J4>m zbCn3eHFlCzbL<3MFa<1*h}@M{*uFj1{K7truuo z+1eT&#n{;tk%UEwim)cqn4&3vc@#oQINz0a2}0J3WnE$SZAWEckl2f=F9Q+kh+>ss z;>S5AmWo-LhLJ{Ka>WGZ)4AVqz+1k6sncGLHl#4Rpres<;x)LM|rMy z>&phP?R8_)zu;<5o6r5K*C-D)4yxf$?nuIk$&z~I-Q2h`Xpw2<{A9X)eC7-t3&ROi zvR3fbpYz_`Xcai-3HLvOg}`Et+PqJ59Pe3@e?OGFveJ$wr7+Cc@@V~N)r`y`y~ z182M~CX?-G*VYSoXr$w7-@56*x6{J%RToUP7tKEwDU{YDGTl6^V@156#reg!h?IAH z{#<`Eb?gwTixM?I^q~oGAojP%R9G2Tp^(ML64vjacZGXHvFu+1*rq)28;}1FatGmegU6GY_Kj>k8 zO!rgRt@drgEPg^Z=$}+-;)@IDRlVJdWJ^bQ_a;1|5HkAn&RG!;CQ43fhJfeRM61AK*VLn*rRv zM(7lJUGTC!by~E4gyZt8s2l{Q`*U#8+3^QqYrhxEFNjE=40eNm1WtR7xxg^(EjplN2E1~SSd$4lY6%ZU3iR%yos6Kk3yeDT?4JASQbc1{Y*A_f+xGm63p~~ zwp_~{{xM;_G&x1u>V(MQ(5Y}{nArr`_Yo;!I6Ub3?wRwu>ppwp_C$Y!C&?Sz63UzP z(d6r8-F$}zss3ict3q2@_DqPy;{AX1FE}IYLDI40w#CSMEoQf69QDXI_6XcSi`1pQ z6lVVC^R#D~`|@Yd@!;V;%n8_L-dv4O6^xx_Y6 zUpf!nlXY{EUrjJqu;#)E|J!C*oA8qp53{;L&gaPaRv|V6RO#qiu3GFpgKCrURnV=u t-UN4S%&@igrBl86?C_2I=fZ*b?T6#hK;YM19B#eI{{Wyt|B;mx007lEe!2hv delta 2320 zcmV+r3Geom5|R>sABzYGCC)oo0t0hpa&~EBWnXu1a%*LBE^2cCrC9rO+qe<_R}@Z9 zA!~{vNRR}rYBIT8rcImIA)?&90W zw}7*1VbGeUkj9zlRV7VPSA!PJJN<&oIjGM~*}C9eH(*wOO*MevJ6yG{7nnIz?q zgauzd{9)CUx8CjXr4?KbK7zp!oVK;4s!gE_$?ZQcFQ76ncv%WAzq{ZY?^+iPykE8R z?dUb{)}5N5fAJMJ9RJ&u6WB4|@Y(%w9P-W85>DaPe_%=Q?b7U+cA&enNI?k(aKD=s zemI>@--&O3AWe^6|H%tVsAgt99ImIzx>IdmGrusb*+J@3afv43-T@8#$;! z7qjWvnKO2Lhf5JEDHEv@ovSEKbd-k_I8!PjX_`CdK2Fq4XO+_L} zR01;1QUN(rlx9?sT<27UQ5s1C9SW!?l}Vx{BYBpPJc_vpLzzY#Vl6}#MbU9RMWyQz zsvt3c4O0mjM4`&#ETK^xt0YOIL^8fn!ysau;^a)LG*4qe6B6Pyz)2yF9#_*sb5Teb ziC6>8lQ=?5!kFYtb1l$TPze)Ry46HUPNkr+$S4V!lBq&P2~|AOiV>|I(PX%RQHnO{ zEGJUZG)vGlk_(;WM3b1MVL~^0GDZ@Xv6QEONuGgbsf=-Jn&u3B2Kghv8CWb!t143& zrCek>lOYqSO1Yv@nC3al70@u;g2z*UJg0(4g}{lBktojvnv>@wfg@YOvN9qG)hql)in6lTDdt*6UO5#Wtm{;6do%oBa0T{5XO6QHyaowf^({5 zEJ&D3&O*C{MOu(ZqV#y{>Les6l%vI5s+18Xt>%#Gh$|5S+mpUf#fYXnOEt?fE^|g1 zvmkhXu}G5WPG zRbY%pQ7VpdDVd0Anr501%5%(+h;y!p2-EmyqFxuXxmnA~M4|;_nnVIHWofL#5F#RE zjEPDj`ZHN?KozUST9^hB10`9A0gfJ#2}VUoAj>kL0A>G7*aw)cO5Uucag6?dEYDRU z1lL$eQq2WPxL^vg54Hi(g=uz#5|CC529khXV4-MH0tXDq2XUKEw7;YDrReI zcuXTk6p@6*iHb2NQW~Ktc^pE2N;uz@b_qh(i)CG5^=(IGVUXC1s!szE>KJ1(mRUw~ z3@k-inuf7PU~oF`Z zTXN!4OM{<3yhgs7^lb;y6S6H2mfXxMlpeImgy4>dHypZm!zWYY`8+W7$Byz`@79+M zVA<>1q<_KHo;IKRRj*MVY8+I{Ln-bV9U{5-F-5fPfxINL5mIQS$OVst?W@<-|C`&+NkQ^(X@NHY=d`$O4 z*sb<$!YF=1Ht3&KJI4F+{MPd(ojlCDt}lOWgQ`MIodWwpzv!ZeknC|D`q_eXhgsuHvEWaQkeK6Ps{t-CsIpzZ0w2x=+>CKtx z=msbM2ku7>d;CGP`D0Mpv)>M!{h0>m{1KpJSy&FjCodL1fvP(m?c;=2IDdbC`N`=@ zThse5=#NNi5HVAZRwnmu4Q}BvCh{g`dfy9u7Punf ze?Crombou~1|1I`uEUssZ8T2Iys0k-FPo;u2>LXKL8np;dW%{Zm^n9tOWqFP#}XZd zpNe*Xf#2fB0;i8)*;(*FMY3I8UD_;cD);G&dR40G-%riJq78RCbd9Hf>t9-DVCz+H z!Rg?acTe}xMs{3Z0c?l6ggBlN%T+snpm0q3`vi0zvc>wQqP3~#@79Y4nzDI)`F7`8 z#6?OhOlfKR5az?XneJ}I!Dxr#0uOrYD;Rt0vc9FU4}0};ciZAUmhZbaG*~C>^~d2> zkKZ6U-5P5M*p2Vq_sFt;Zoxem?ooSS(7I<0=Y!w+DBr2Y>$28`?sF`lYj7^HOw^ao zL-%A|U*uO4j1|neaKit#Y1StEAl7asQk<5WjtQJn9IX-TC3xoBR(o{5DdR6aWC4@pd}^ From 840e27adec06cbab0e079165a1f0540132a92b97 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 4 Dec 2016 13:49:46 -0800 Subject: [PATCH 10/14] Fix Nest interpreting Celsius temperature as Fahrenheit (#4729) --- homeassistant/components/climate/nest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/climate/nest.py b/homeassistant/components/climate/nest.py index 01c3b3782b1..06ec500f9e2 100644 --- a/homeassistant/components/climate/nest.py +++ b/homeassistant/components/climate/nest.py @@ -229,7 +229,7 @@ class NestThermostat(ClimateDevice): self._eco_temperature = self.device.eco_temperature self._locked_temperature = self.device.locked_temperature self._is_locked = self.device.is_locked - if self.device.temperature == 'C': + if self.device.temperature_scale == 'C': self._temperature_scale = TEMP_CELSIUS else: self._temperature_scale = TEMP_FAHRENHEIT From d89bfcdaa5940ec255628ba47600e93a225d682b Mon Sep 17 00:00:00 2001 From: Josh Nichols Date: Sun, 4 Dec 2016 17:33:50 -0500 Subject: [PATCH 11/14] Make sure all nest platforms require discovery info (#4734) --- homeassistant/components/binary_sensor/nest.py | 3 +++ homeassistant/components/camera/nest.py | 1 + homeassistant/components/climate/nest.py | 3 ++- homeassistant/components/sensor/nest.py | 3 +++ 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/binary_sensor/nest.py b/homeassistant/components/binary_sensor/nest.py index d78e33c9f95..070703df32a 100644 --- a/homeassistant/components/binary_sensor/nest.py +++ b/homeassistant/components/binary_sensor/nest.py @@ -60,6 +60,9 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_devices, discovery_info=None): """Setup Nest binary sensors.""" + if discovery_info is None: + return + nest = hass.data[DATA_NEST] conf = config.get(CONF_MONITORED_CONDITIONS, _VALID_BINARY_SENSOR_TYPES) diff --git a/homeassistant/components/camera/nest.py b/homeassistant/components/camera/nest.py index 8bda0e8eb9c..aa2041e07a6 100644 --- a/homeassistant/components/camera/nest.py +++ b/homeassistant/components/camera/nest.py @@ -26,6 +26,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): """Set up a Nest Cam.""" if discovery_info is None: return + camera_devices = hass.data[nest.DATA_NEST].camera_devices() cameras = [NestCamera(structure, device) for structure, device in camera_devices] diff --git a/homeassistant/components/climate/nest.py b/homeassistant/components/climate/nest.py index 06ec500f9e2..dbc68162579 100644 --- a/homeassistant/components/climate/nest.py +++ b/homeassistant/components/climate/nest.py @@ -31,10 +31,11 @@ STATE_HEAT_COOL = 'heat-cool' def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Nest thermostat.""" - _LOGGER.debug("Setting up nest thermostat") if discovery_info is None: return + _LOGGER.debug("Setting up nest thermostat") + temp_unit = hass.config.units.temperature_unit add_devices( diff --git a/homeassistant/components/sensor/nest.py b/homeassistant/components/sensor/nest.py index b4909aebae3..53f767ab494 100644 --- a/homeassistant/components/sensor/nest.py +++ b/homeassistant/components/sensor/nest.py @@ -68,6 +68,9 @@ _LOGGER = logging.getLogger(__name__) def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Nest Sensor.""" + if discovery_info is None: + return + nest = hass.data[DATA_NEST] conf = config.get(CONF_MONITORED_CONDITIONS, _VALID_SENSOR_TYPES) From db6a6fa4cb739746ebbfc02a3824b544ba86ab6e Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 4 Dec 2016 14:45:25 -0800 Subject: [PATCH 12/14] Lint --- .../components/frontend/www_static/home-assistant-polymer | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index a767765c5ba..2652823d35b 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit a767765c5ba8583e5af32c8d9990dec93653e5ec +Subproject commit 2652823d35b77411988751cc74820dcfc3a0e2ac From 58509f8bba11e05d742ec72b52db61a3299e37df Mon Sep 17 00:00:00 2001 From: Lukas Date: Mon, 5 Dec 2016 00:08:14 +0100 Subject: [PATCH 13/14] [0.34] bugfix influxdb node_id (#4712) * Bugfix for #4709 - do not convert node_id to float * Update influxdb.py --- homeassistant/components/influxdb.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/influxdb.py b/homeassistant/components/influxdb.py index 167767bc00e..08296ad65c7 100644 --- a/homeassistant/components/influxdb.py +++ b/homeassistant/components/influxdb.py @@ -120,7 +120,8 @@ def setup(hass, config): for key, value in state.attributes.items(): if key != 'unit_of_measurement': - if isinstance(value, (str, float, bool)): + if isinstance(value, (str, float, bool)) or \ + key.endswith('_id'): json_body[0]['fields'][key] = value elif isinstance(value, int): # Prevent column data errors in influxDB. From 60bcb12a48676d23caba0ee385e54cbe73d558ec Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 4 Dec 2016 15:08:38 -0800 Subject: [PATCH 14/14] Version bump to 0.34.2 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index cbbcf9b6762..88b3d4a0e40 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 34 -PATCH_VERSION = '1' +PATCH_VERSION = '2' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 4, 2)