{"version":3,"file":"3.9bf747bd.js","mappings":"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","sources":["webpack://mucklet-client/./cfg/client/module.config.js","webpack://mucklet-client/./src/common/classes/Err.js","webpack://mucklet-client/./src/common/components/ConfirmScreenDialog.js","webpack://mucklet-client/./src/common/components/FAIcon.js","webpack://mucklet-client/./src/common/components/Fader.js","webpack://mucklet-client/./src/common/components/ScreenDialog.js","webpack://mucklet-client/./src/common/modules/api/Api.js","webpack://mucklet-client/./src/common/modules/auth/Auth.js","webpack://mucklet-client/./src/common/modules/screen/Screen.js","webpack://mucklet-client/./src/common/utils/isComponent.js","webpack://mucklet-client/../../modapp/modapp-resource/src/JoinedCollection.js","webpack://mucklet-client/../../modapp/modapp-resource/src/Model.js","webpack://mucklet-client/../../modapp/modapp-resource/src/SortedMap.js","webpack://mucklet-client/../../modapp/modapp-resource/src/utils.js"],"sourcesContent":["const config = {};\n\nexport default config;\n","import l10n from 'modapp-l10n';\n\n/**\n * Err represents a local error.\n */\nclass Err {\n\n\tconstructor(code, message, data) {\n\t\tthis._code = code || 'unknown';\n\t\tthis._message = message || `Unknown error`;\n\t\tthis._data = data;\n\t}\n\n\t/**\n\t * Error code\n\t * @type {string}\n\t */\n\tget code() {\n\t\treturn this._code;\n\t}\n\n\t/**\n\t * Error message\n\t * @type {string}\n\t */\n\tget message() {\n\t\treturn this._message;\n\t}\n\n\t/**\n\t * Error data object\n\t * @type {*}\n\t */\n\tget data() {\n\t\treturn this._data;\n\t}\n\n\t/**\n\t * Returns the error as a LocaleString.\n\t * @returns {LocaleString}\n\t */\n\tlocaleString() {\n\t\treturn l10n.l(this._code, this._message, this._data);\n\t}\n}\n\nexport default Err;\n","import { Elem, Txt } from 'modapp-base-component';\nimport l10n from 'modapp-l10n';\nimport ScreenDialog from './ScreenDialog';\nimport isComponent from 'utils/isComponent';\nimport './confirmScreenDialog.scss';\n\n/**\n * Draws an error screen dialog with a button that redirects to a given URL.\n */\nclass ConfirmScreenDialog {\n\n\t/**\n\t * Creates a new ConfirmScreenDialog instance.\n\t * @param {function} [opt] Optional parameters\n\t * @param {string} [opt.className] Class name to use instead of 'confirm'.\n\t * @param {string|LocaleString} [opt.title] Title text or component.\n\t * @param {string|LocaleString|Component} [opt.body] Body text or component.\n\t * @param {string|LocaleString} [opt.confirm] Confirm button text or component.\n\t * @param {boolean} [opt.onClose] Callback function called when the confirmed is closed.\n\t * @param {boolean} [opt.onConfirm] Callback function called when the confirmed is closed.\n\t */\n\tconstructor(opt) {\n\t\tthis.opt = opt || {};\n\t}\n\n\trender(el) {\n\t\tlet opt = this.opt;\n\t\tthis.elem = new ScreenDialog(new Elem(n => n.elem('div', { className: 'confirmscreendialog' }, [\n\t\t\tn.elem('div', { className: 'confirmscreendialog--body' }, [\n\t\t\t\tn.component(isComponent(opt.body)\n\t\t\t\t\t? opt.body\n\t\t\t\t\t: new Txt(opt.body || l10n.l('confirm.body', \"Are you sure?\"), { className: 'confirmscreendialog--content' }),\n\t\t\t\t),\n\t\t\t]),\n\t\t\tn.elem('button', {\n\t\t\t\tevents: { click: () => this._confirm() },\n\t\t\t\tclassName: 'btn large primary confirmscreendialog--btn pad-top-xl',\n\t\t\t}, [\n\t\t\t\tn.component(new Txt(opt.confirm || l10n.l('confirmScreenDialog.okay', \"Okay\"))),\n\t\t\t]),\n\t\t])), {\n\t\t\ttitle: opt.title || l10n.l('confirmScreenDialog.confirm', \"Confirm\"),\n\t\t\tclose: opt.onClose || null,\n\t\t});\n\t\tthis.elem.render(el);\n\t}\n\n\tunrender() {\n\t\tif (this.elem) {\n\t\t\tthis.elem.unrender();\n\t\t\tthis.elem = null;\n\t\t}\n\t}\n\n\t_confirm() {\n\t\tif (this.opt.onConfirm) {\n\t\t\tthis.opt.onConfirm();\n\t\t}\n\t}\n}\n\nexport default ConfirmScreenDialog;\n","import { RootElem } from 'modapp-base-component';\n\nconst customIcons = {\n\tupstairs: true,\n\tdownstairs: true,\n\ticosahedron: true,\n};\n\n/**\n * FAIcon is a font-awesome icon.\n */\nclass FAIcon extends RootElem {\n\n\t/**\n\t * Creates an instance of FAIcon\n\t * @param {string} icon Font-awesome icon name (eg. 'envelope').\n\t * @param {object} [opt] Optional parameters.\n\t * @param {string} [opt.className] Additional class names to append to font-awesome class names.\n\t * @param {object} [opt.attributes] Key/value attributes object\n\t * @param {object} [opt.events] Key/value events object, where the key is the event name, and value is the callback.\n\t */\n\tconstructor(icon, opt) {\n\t\topt = Object.assign({ attributes: null }, opt);\n\t\topt.attributes = Object.assign({ 'aria-hidden': 'true' }, opt.attributes);\n\t\tsuper('i', opt);\n\t\tthis.icon = \"\";\n\t\tthis.custom = false;\n\t\tthis.setIcon(icon);\n\t}\n\n\t/**\n\t * Sets icon\n\t * @param {string} icon Font-awesome icon name (eg. 'envelope').\n\t * @returns {this}\n\t */\n\tsetIcon(icon) {\n\t\ticon = String(icon || \"\");\n\t\tif (icon == this.icon) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet custom = !!customIcons[icon];\n\n\t\tif (this.icon) {\n\t\t\tif (this.custom) {\n\t\t\t\tthis.removeClass('muicon-' + this.icon);\n\t\t\t\tif (!custom) {\n\t\t\t\t\tthis.removeClass('faicon-custom');\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.removeClass('fa-' + this.icon);\n\t\t\t\tif (custom) {\n\t\t\t\t\tthis.removeClass('fa');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (icon) {\n\t\t\tif (custom) {\n\t\t\t\tthis.addClass('faicon-custom');\n\t\t\t\tthis.addClass('muicon-' + icon);\n\t\t\t} else {\n\t\t\t\tthis.addClass('fa');\n\t\t\t\tthis.addClass('fa-' + icon);\n\t\t\t}\n\t\t}\n\t\tthis.icon = icon;\n\t\tthis.custom = custom;\n\t\treturn this;\n\t}\n}\n\nexport default FAIcon;\n","import { RootElem } from 'modapp-base-component';\nimport { anim } from 'modapp-utils';\n\n/**\n * Fader is component wrapper that can fade in and out components.\n */\nclass Fader extends RootElem {\n\n\t/**\n\t * Creates an instance of Fader\n\t * @param {?Component} component Component to wrap.\n\t * @param {object} [opt] Optional parameters.\n\t * @param {boolean} [opt.duration] Optional transition duration in milliseconds.\n\t * @param {boolean} [opt.hidden] Flag to tell if the fader should start as hidden.\n\t */\n\tconstructor(component, opt) {\n\t\tsuper('div', opt);\n\n\t\topt = opt || {};\n\t\tthis._fadeOpt = {\n\t\t\tcallback: this._onTransitionEnd.bind(this),\n\t\t\tduration: typeof opt?.duration == 'number' ? opt.duration : 150,\n\t\t};\n\t\tthis._current = null;\n\t\tthis._component = null;\n\t\tthis._token = null;\n\n\t\tthis.setComponent(component);\n\t}\n\n\t/**\n\t * Gets the current set component.\n\t * @returns {?Component}\n\t */\n\tgetComponent() {\n\t\treturn this._component;\n\t}\n\n\t/**\n\t * Sets the component to fade in, or null to fade out.\n\t * @param {?Component} component Component to set.\n\t * @param {object} [opt] Optional parameters\n\t * @param {function} [opt.onRender] Callback function to call after rendering the component.\n\t * @param {function} [opt.onUnrender] Callback function to call before unrendering the component.\n\t * @returns {this}\n\t */\n\tsetComponent(component, opt) {\n\t\tcomponent = component || null;\n\t\tif (this._component === component) return this;\n\n\t\tthis._component = component;\n\t\tthis._componentOpt = opt;\n\t\tlet el = this.getElement();\n\t\tif (!el) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Is the component the same at currently rendered one?\n\t\tif (this._component === this._current) {\n\t\t\tif (this._current) {\n\t\t\t\tthis._fade(1);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this._current) {\n\t\t\tthis._fade(0);\n\t\t} else {\n\t\t\tthis._renderComponent();\n\t\t\tthis._fade(1);\n\t\t}\n\t\treturn this;\n\t}\n\n\trender(el) {\n\t\tsuper.render(el);\n\t\tthis._renderComponent();\n\t\tsuper.setStyle('opacity', this._component ? null : 0);\n\t\treturn this.getElement();\n\t}\n\n\tunrender() {\n\t\tanim.stop(this._token);\n\t\tif (this.getElement()) {\n\t\t\tthis._unrenderComponent();\n\t\t\tsuper.unrender();\n\t\t}\n\t}\n\n\t_fade(opacity) {\n\t\tlet el = this.getElement();\n\t\tif (el) {\n\t\t\tanim.stop(this._token);\n\t\t\tthis._token = anim.fade(el, opacity, this._fadeOpt);\n\t\t}\n\t}\n\n\t_renderComponent() {\n\t\tlet el = this.getElement();\n\t\tif (this._component) {\n\t\t\tthis._component.render(el);\n\t\t\tthis._current = this._component;\n\t\t\tthis._currentOpt = this._componentOpt;\n\t\t\t// Call onRender callback if available\n\t\t\tlet onRender = this._currentOpt?.onRender;\n\t\t\tif (onRender) {\n\t\t\t\tonRender(this, this._component);\n\t\t\t}\n\t\t}\n\t}\n\n\t_unrenderComponent() {\n\t\tif (this._current) {\n\t\t\t// Call onUnrender callback if available\n\t\t\tlet onUnrender = this._currentOpt?.onUnrender;\n\t\t\tif (onUnrender) {\n\t\t\t\tonUnrender(this, this._current);\n\t\t\t}\n\t\t\tthis._current.unrender();\n\t\t\tthis._current = null;\n\t\t\tthis._currentOpt = null;\n\t\t}\n\t}\n\n\t_onTransitionEnd() {\n\t\tlet el = this.getElement();\n\t\tif (!el) return;\n\n\t\tif (this._component && this._current === this._component) return;\n\n\t\tthis._unrenderComponent();\n\t\tthis._renderComponent();\n\n\t\tif (this._component) {\n\t\t\tthis._fade(1);\n\t\t}\n\t}\n}\n\nexport default Fader;\n","import { Elem, Txt } from 'modapp-base-component';\nimport FAIcon from 'components/FAIcon';\nimport Fader from 'components/Fader';\nimport './screendialog.scss';\n\n/**\n * ScreenDialog draws a screen dialog\n */\nclass ScreenDialog {\n\tconstructor(component, opt) {\n\t\topt = opt || {};\n\t\tthis.title = opt.title;\n\t\tthis.close = opt.close;\n\t\tthis.size = opt.size;\n\t\tthis.body = new Fader(null, { className: 'screendialog--body' });\n\t\tthis.setComponent(component);\n\t}\n\n\trender(el) {\n\t\tthis.elem = new Elem(n => n.elem('div', { className: 'screendialog' }, [\n\t\t\tn.elem('div', { className: 'screendialog--container' + (this.size ? ' ' + this.size : '') }, [\n\t\t\t\tthis.title || this.close ? n.elem('div', { className: 'screendialog--head' }, [\n\t\t\t\t\tthis.close ? n.elem('button', { className: 'screendialog--close iconbtn medium', events: { click: () => this.close() }}, [\n\t\t\t\t\t\tn.component(new FAIcon('close')),\n\t\t\t\t\t]) : n.component(null),\n\t\t\t\t\tn.component(new Txt(this.title || \"\", { tagName: 'h2' })),\n\t\t\t\t]) : n.component(null),\n\t\t\t\tn.component(this.body),\n\t\t\t]),\n\t\t]));\n\t\tthis.elem.render(el);\n\t}\n\n\tgetComponent() {\n\t\treturn this.body.getComponent();\n\t}\n\n\tunrender() {\n\t\tif (this.elem) {\n\t\t\tthis.elem.unrender();\n\t\t\tthis.elem = null;\n\t\t}\n\t}\n\n\tsetComponent(component) {\n\t\tthis.body.setComponent(component);\n\t\treturn this;\n\t}\n}\n\nexport default ScreenDialog;\n","import ResClient, { isResError } from 'resclient';\n\nconst namespace = 'module.api';\n\n/**\n * Api module connects to the backend api and provides low level\n * methods for service modules to send and receive data.\n */\nclass Api extends ResClient {\n\n\tconstructor(app, params) {\n\t\tlet opt = Object.assign({\n\t\t\tdebug: false,\n\t\t}, params);\n\t\topt.debug = !!(opt.debug && opt.debug != 'false' && opt.debug != '0' && opt.debug != 'no');\n\t\tsuper(app.props.apiHostPath, {\n\t\t\tnamespace,\n\t\t\teventBus: app.eventBus,\n\t\t\treconnectDelay: 3000,\n\t\t\tsubscribeStaleDelay: 2000,\n\t\t\tsubscribeRetryDelay: 0,\n\t\t\tunsubscribeDelay: 5000,\n\t\t\tdebug: opt.debug,\n\t\t });\n\n\t\tthis.app = app;\n\t\tthis.webResourcePath = this._resolveWebResourcePath(app.props.apiWebresourcePath);\n\t}\n\n\tgetWebResourceUri(rid) {\n\t\tlet idx = rid.indexOf('?');\n\t\tlet rname = idx >= 0 ? rid.substr(0, idx) : rid;\n\t\tlet query = idx >= 0 ? rid.substr(idx) : '';\n\n\t\treturn this.webResourcePath + rname.replace(/\\./g, '/') + query;\n\t}\n\n\tisError(resource) {\n\t\treturn isResError(resource);\n\t}\n\n\tonEvent(rid, cb) {\n\t\tthis.app.eventBus.on(null, cb, namespace + '.resource' + (rid ? '.' + rid : ''));\n\t}\n\n\toffEvent(rid, cb) {\n\t\tthis.app.eventBus.off(null, cb, namespace + '.resource' + (rid ? '.' + rid : ''));\n\t}\n\n\t_resolveWebResourcePath(url) {\n\t\tif (!url.match(/^http?:\\/\\//)) {\n\t\t\tlet a = document.createElement('a');\n\t\t\ta.href = url;\n\t\t\turl = a.href;\n\t\t}\n\n\t\treturn url.replace(/\\/$/, '') + '/';\n\t}\n\n\tdispose() {\n\t\tthis.disconnect();\n\t}\n}\n\nexport default Api;\n","import { Model } from 'modapp-resource';\nimport l10n from 'modapp-l10n';\nimport { hmacsha256, publicPepper } from 'utils/sha256';\nimport reload, { redirect } from 'utils/reload';\nimport Err from 'classes/Err';\n\nconst oauth2Url = AUTH_LOGIN_URL;\nconst oauth2LogoutUrl = AUTH_LOGOUT_URL;\nconst authenticateUrl = AUTH_AUTHENTICATE_URL;\nconst crossOrigin = API_CROSS_ORIGIN;\nconst wsLoginRid = AUTH_LOGIN_RID;\nconst wsAuthRid = AUTH_AUTHENTICATE_RID;\n\nfunction redirectWithUri(url, pushHistory) {\n\tredirect(url + '?redirect_uri=' + encodeURIComponent(window.location.href), false, pushHistory);\n}\n\n/**\n * Auth authenticates and fetches the user, or redirects to login on fail.\n */\nclass Auth {\n\n\t/**\n\t * Creates a new Auth instance.\n\t * @param {App} app App instance.\n\t * @param {object} params Module params\n\t * @param {string} [params.player] Login username. Ignored if mode is not 'pass'.\n\t * @param {string} [params.pass] Hashed password. Ignored if mode is not 'pass'.\n\t * @param {\"http\"|\"ws\"|\"pass\"} [params.mode] Auth mode. http=header authentication on http handshake, ws=authenticate call over WebSocket, pass=password authentication\n\t */\n\tconstructor(app, params) {\n\t\tthis.app = app;\n\t\tthis.params = Object.assign({\n\t\t\tplayer: '',\n\t\t\tpass: '',\n\t\t\tmode: 'http',\n\t\t}, params);\n\n\t\t// Bind callbacks\n\t\tthis._onConnect = this._onConnect.bind(this);\n\t\tthis._onUnsubscribe = this._onUnsubscribe.bind(this);\n\t\tthis._onModelChange = this._onModelChange.bind(this);\n\n\t\tthis.app.require([\n\t\t\t'api',\n\t\t\t'screen',\n\t\t], this._init.bind(this));\n\t}\n\n\t_init(module) {\n\t\tthis.module = Object.assign({ self: this }, module);\n\t\tthis.loginPromise = null;\n\t\tthis.loginResolve = null;\n\t\tthis.userPromise = null;\n\t\tthis.model = new Model({ data: { loggedIn: false, user: null, authError: null }});\n\t\tthis.model.on('change', this._onModelChange);\n\t\tthis.state = {};\n\n\t\tthis.module.api.setOnConnect(this._onConnect);\n\t}\n\n\t/**\n\t * Authenticates the user or redirects to login if not logged in.\n\t *\n\t * The returned promise will be rejected if the API returns any other error\n\t * than 'user.authenticationFailed'. If user.authenticationFailed is\n\t * returned, the auth module will redirect the client to the authentication\n\t * endpoint, or resolve to null if noRedirect is true.\n\t * @param {boolean} noRedirect Flag to prevent redirect on not being logged in. Instead, the promise will resolve to null.\n\t * @returns {Promise} Promise to the authenticate.\n\t */\n\tauthenticate(noRedirect) {\n\t\tif (this.params.mode == 'pass') {\n\t\t\treturn this._getCurrentUser(true);\n\t\t}\n\n\t\treturn fetch(authenticateUrl, {\n\t\t\tmethod: 'POST',\n\t\t\tmode: 'cors',\n\t\t\tcredentials: crossOrigin ? 'include' : 'same-origin',\n\t\t}).catch(err => {\n\t\t\tthrow new Err('auth.failedToFetch', \"Failed to send authentication check.\");\n\t\t}).then(resp => {\n\t\t\t// Legacy behavior and other >= 400 errors\n\t\t\tif (resp.status >= 400) {\n\t\t\t\treturn resp.json().then(err => {\n\t\t\t\t\tif (resp.status < 500) {\n\t\t\t\t\t\tif (!noRedirect) {\n\t\t\t\t\t\t\tredirectWithUri(oauth2Url);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tthrow err;\n\t\t\t\t}).catch(err => resp.text().then(\n\t\t\t\t\ttext => {\n\t\t\t\t\t\tthrow new Err('auth.failedToAuthenticateMsg', \"Failed to authenticate: {text}\", resp.text());\n\t\t\t\t\t},\n\t\t\t\t\terr => {\n\t\t\t\t\t\tthrow new Err('auth.failedToAuthenticate', \"Failed to authenticate.\");\n\t\t\t\t\t},\n\t\t\t\t));\n\t\t\t}\n\t\t\t// New behavior allows a 200 response but with an {\"error\": {...}}\n\t\t\t// json object, to indicate failed authentication.\n\t\t\treturn resp.text().then(text => {\n\t\t\t\ttry {\n\t\t\t\t\tlet result = JSON.parse(text);\n\t\t\t\t\tif (result?.error) {\n\t\t\t\t\t\tif (!noRedirect) {\n\t\t\t\t\t\t\tredirectWithUri(oauth2Url);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t} catch (ex) {\n\t\t\t\t\t// A 200 response with invalid JSON is legacy success.\n\t\t\t\t}\n\t\t\t\treturn this._getCurrentUser(true);\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Tries to refresh access tokens by calling the authenticate endpoint.\n\t *\n\t * The returned promise will be rejected if refresh failed.\n\t * @param {boolean} redirectOnerror Flag to redirect to login on error. Defaults to false.\n\t * @returns {Promise} Promise to tokens being refreshed.\n\t */\n\trefreshTokens(redirectOnerror) {\n\t\treturn fetch(authenticateUrl, {\n\t\t\tmethod: 'POST',\n\t\t\tmode: 'cors',\n\t\t\tcredentials: crossOrigin ? 'include' : 'same-origin',\n\t\t}).then(authResp => {\n\t\t\treturn authResp.text().then(text => {\n\t\t\t\tif (text) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet result = JSON.parse(text);\n\t\t\t\t\t\tif (result?.error) {\n\t\t\t\t\t\t\t// A proper error messages means we are not logged in.\n\t\t\t\t\t\t\tif (redirectOnError) {\n\t\t\t\t\t\t\t\tthis.redirectToLogin(true);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn Promise.reject(result.error);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (ex) {}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tgetModel() {\n\t\treturn this.model;\n\t}\n\n\t/**\n\t * Returns a promise to when the user is logged in.\n\t * The promise will never reject.\n\t * @returns {Promise.} Promise to user being logged in.\n\t */\n\tgetUserPromise() {\n\t\treturn this.loginPromise = this.loginPromise || (\n\t\t\tthis.model.loggedIn\n\t\t\t\t? Promise.resolve(this.model.user)\n\t\t\t\t: new Promise(resolve => this.loginResolve = resolve)\n\t\t);\n\t}\n\n\t/**\n\t * Returns the user or null if the user isn't logged in.\n\t * @returns {?Model} User model or null.\n\t */\n\tgetUser() {\n\t\treturn this.model.user;\n\t}\n\n\t/**\n\t * Calls the logout endpoint and then reloads.\n\t */\n\tlogout() {\n\t\tthis._afterFade(() => {\n\t\t\tredirect(oauth2LogoutUrl, true);\n\t\t});\n\t}\n\n\t/**\n\t * Redirects to the oauth2 login page.\n\t * @param {boolean} noFade Flag to prevent fading out.\n\t */\n\tredirectToLogin(noFade) {\n\t\tif (noFade) {\n\t\t\tredirectWithUri(oauth2Url, true);\n\t\t} else {\n\t\t\tthis._afterFade(() => {\n\t\t\t\tredirectWithUri(oauth2Url, true);\n\t\t\t});\n\t\t}\n\t}\n\n\t_getCurrentUser(reconnect) {\n\t\tif (reconnect) {\n\t\t\t// Disconnect to force a reconnect with new header cookies\n\t\t\tthis.module.api.disconnect();\n\t\t\tthis.model.set({ authError: null });\n\t\t\tthis._onUnsubscribe();\n\t\t}\n\t\tif (!this.userPromise) {\n\t\t\tthis.userPromise = this.module.api.connect()\n\t\t\t\t.then(() => {\n\t\t\t\t\tif (this.model.authError) {\n\t\t\t\t\t\tthrow this.model.authError;\n\t\t\t\t\t}\n\t\t\t\t\treturn this.module.api.call(wsAuthRid, 'getUser');\n\t\t\t\t})\n\t\t\t\t.then(user => {\n\t\t\t\t\tif (this.module.api.isError(user)) {\n\t\t\t\t\t\tthrow new Error(\"Error getting user: \" + l10n.t(user.code, user.message, user.data));\n\t\t\t\t\t}\n\t\t\t\t\tthis.model.set({\n\t\t\t\t\t\tloggedIn: true,\n\t\t\t\t\t\tuser,\n\t\t\t\t\t});\n\t\t\t\t\tif (this.loginResolve) {\n\t\t\t\t\t\tthis.loginResolve(user);\n\t\t\t\t\t\tthis.loginResolve = null;\n\t\t\t\t\t}\n\t\t\t\t\tuser.on('unsubscribe', this._onUnsubscribe);\n\t\t\t\t\treturn user;\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tif (err.code?.endsWith?.('.termsNotAgreed')) {\n\t\t\t\t\t\tredirectWithUri(oauth2Url);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Or else we throw the error to be handled by the caller to\n\t\t\t\t\t// show an error message.\n\t\t\t\t\tthis.userPromise = null;\n\t\t\t\t\tthrow err;\n\t\t\t\t});\n\t\t}\n\t\treturn this.userPromise;\n\t}\n\n\t_onConnect() {\n\t\treturn (this.params.mode == 'pass'\n\t\t\t? this.module.api.authenticate(wsLoginRid, 'login', {\n\t\t\t\tname: this.params.player,\n\t\t\t\thash: hmacsha256(this.params.pass.trim(), publicPepper),\n\t\t\t})\n\t\t\t: this.params.mode == 'ws'\n\t\t\t\t? this.module.api.authenticate(wsAuthRid, 'authenticate')\n\t\t\t\t: Promise.resolve() // 'http'\n\t\t).catch(err => {\n\t\t\treturn this.model.set({ authError: err });\n\t\t});\n\t}\n\n\t_onUnsubscribe() {\n\t\t// Remove user model\n\t\tif (this.model.user) {\n\t\t\tthis.model.user.off('unsubscribe', this._onUnsubscribe);\n\t\t\tthis.loginPromise = null;\n\t\t}\n\t\tthis.model.set({\n\t\t\tloggedIn: false,\n\t\t\tuser: null,\n\t\t});\n\t\tthis.userPromise = null;\n\t}\n\n\t_onModelChange(changed) {\n\t\t// Show login screen when logged out\n\t\tif (changed.hasOwnProperty('loggedIn') && !this.model.loggedIn) {\n\t\t\tthis._afterFade(reload);\n\t\t}\n\t}\n\n\t_afterFade(cb) {\n\t\tthis.module.screen.setComponent({\n\t\t\trender: () => cb(),\n\t\t\tunrender: () => {},\n\t\t});\n\t}\n\n\tdispose() {\n\t\tthis.model.off('change', this._onModelChange);\n\t\tthis._onUnsubscribe();\n\t}\n}\n\nexport default Auth;\n","import Fader from 'components/Fader';\nimport './screen.scss';\n\n/**\n * Screen handles the screen viewport.\n */\nclass Screen {\n\tconstructor(app, params) {\n\t\tthis.app = app;\n\n\t\tthis.fader = new Fader(null, { className: 'screen' });\n\t\tthis.app.setComponent(this.fader);\n\t}\n\n\tgetFader() {\n\t\treturn this.fader;\n\t}\n\n\t/**\n\t * Get current component.\n\t * @returns {Component} Current component.\n\t */\n\tgetComponent() {\n\t\treturn this.component;\n\t}\n\n\t/**\n\t * Set component.\n\t * @param {Component?} component Component to set.\n\t * @returns {this}\n\t */\n\tsetComponent(component) {\n\t\tthis.component = component || null;\n\t\tthis.subcomponents = [];\n\t\tthis.fader.setComponent(component);\n\t\treturn this;\n\t}\n\n\n\t/**\n\t * Add subcomponent adds a component that will be shown instead of set\n\t * component until removed. Multiple added subcomponents stack.\n\t * @param {string} id ID of subcomponent\n\t * @param {Component} component Subcomponent\n\t */\n\taddSubcomponent(id, component) {\n\t\tlet o;\n\t\tlet i = this._getSubIdx(id);\n\t\tif (i >= 0) {\n\t\t\t// Move existing subcomponent to back. Keep previous component.\n\t\t\to = this.subcomponents[i];\n\t\t\tthis.subcomponents.splice(i, 1);\n\t\t} else {\n\t\t\t// Add a new subcomponent\n\t\t\to = { id, component };\n\t\t}\n\n\t\tthis.subcomponents.push(o);\n\t\tthis.fader.setComponent(o.component);\n\t}\n\n\t/**\n\t * Removes previously set subcomponent by ID.\n\t * @param {string} id ID of subcomponent.\n\t */\n\tremoveSubcomponent(id) {\n\t\tlet i = this._getSubIdx(id);\n\t\tif (i >= 0) {\n\t\t\tthis.subcomponents.splice(i, 1);\n\t\t}\n\n\t\tlet l = this.subcomponents.length;\n\t\tthis.fader.setComponent(l\n\t\t\t? this.subcomponents[l - 1].component\n\t\t\t: this.component,\n\t\t);\n\t}\n\n\t_getSubIdx(id) {\n\t\treturn this.subcomponents ? this.subcomponents.findIndex(o => o.id === id) : null;\n\t}\n\n\tdispose() {\n\t\tthis.app.unsetComponent(this.fader);\n\t\tthis.component = null;\n\t\tthis.subcomponents = null;\n\t\tthis.fader = null;\n\t}\n}\n\nexport default Screen;\n","/**\n * Tests if an object is has a render and unrender method, making it a component.\n * @param {*} o Object to test.\n * @returns {boolean} True if it is a component, otherwise false.\n */\nexport default function(o) {\n\treturn typeof o == 'object' && o !== null && typeof o.render == 'function' && typeof o.unrender == 'function';\n}\n","import eventBus from 'modapp-eventbus';\n\n/**\n * Creates a single collection out of an array or collection of arrays or\n * collections, joining them one after the other.\n */\nclass JoinedCollection {\n\n\t/**\n\t * Creates a new JoinedCollection instance\n\t * @param {Collection.} collections Collection of collections.\n\t * @param {object} [opt] Optional parameters.\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'joinedCollection'.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t */\n\tconstructor(collections, opt) {\n\t\topt = opt || {};\n\t\tthis._collections = collections;\n\t\tthis._namespace = opt.namespace || 'joinedCollection';\n\t\tthis._eventBus = opt.eventBus || eventBus;\n\n\t\t// Bind callbacks\n\t\tthis._onMainAdd = this._onMainAdd.bind(this);\n\t\tthis._onMainRemove = this._onMainRemove.bind(this);\n\n\t\tthis._subs = [];\n\n\t\tif (this._collections) {\n\t\t\tthis._setListeners(true);\n\t\t\tfor (let c of this._collections) {\n\t\t\t\tthis._subs.push(this._addSubListeners(c));\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Length of the joined collection.\n\t */\n\tget length() {\n\t\tlet l = 0;\n\t\tfor (let sub of this._subs) {\n\t\t\tl += (sub.col && sub.col.length) || 0;\n\t\t}\n\t\treturn l;\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more session events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Remove an event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Sets the collection of collections or arrays.\n\t * @param {?Collection.} collections Collection or array of collections or arrays.\n\t * @returns {this}\n\t */\n\tsetCollections(collections) {\n\t\tcollections = collections || null;\n\t\tif (collections == this._collections) return;\n\n\t\t// Send remove events for all items in previous collection.\n\t\tif (this._collections) {\n\t\t\tthis._setListeners(false);\n\t\t\tfor (let c of this._collections) {\n\t\t\t\tthis._onMainRemove({ item: c, idx: 0 });\n\t\t\t}\n\t\t}\n\n\t\tthis._collections = collections;\n\n\t\t// Send add events for all items in the new collection\n\t\tif (this._collections) {\n\t\t\tlet i = 0;\n\t\t\tfor (let c of this._collections) {\n\t\t\t\tthis._onMainAdd({ item: c, idx: i });\n\t\t\t\ti++;\n\t\t\t}\n\t\t\tthis._setListeners(true);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the item at a given index, or undefined if the index is out of bounds.\n\t * @param {number} idx Zero-based index.\n\t * @returns {*} Item located at the given index.\n\t */\n\tatIndex(idx) {\n\t\tif (this._collections && idx >= 0) {\n\t\t\tlet i = 0;\n\t\t\tfor (let sub of this._subs) {\n\t\t\t\tlet l = (sub.col && sub.col.length) || 0;\n\t\t\t\ti += l;\n\t\t\t\tif (i > idx) {\n\t\t\t\t\ti -= l;\n\t\t\t\t\tfor (let item of sub.col) {\n\t\t\t\t\t\tif (i == idx) {\n\t\t\t\t\t\t\treturn item;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t_setListeners(on) {\n\t\tlet cb = on ? 'on' : 'off';\n\t\tif (this._collections || typeof this._collections[cb] == 'function') {\n\t\t\treturn;\n\t\t}\n\t\tthis._collections[cb]('add', this._onMainAdd);\n\t\tthis._collections[cb]('remove', this._onMainRemove);\n\t}\n\n\t_addSubListeners(c) {\n\t\tif (!c || typeof c.on == 'function') {\n\t\t\treturn { col: c };\n\t\t}\n\t\tlet sub = {};\n\t\tsub.add = this._onSubAdd.bind(this, sub);\n\t\tsub.remove = this._onSubRemove.bind(this, sub);\n\t\tc.on('add', sub.add);\n\t\tc.on('remove', sub.remove);\n\t\treturn sub;\n\t}\n\n\t_removeSubListeners(sub) {\n\t\tlet c = sub.col;\n\t\tif (c && typeof c.off == 'function') {\n\t\t\tc.off('add', sub.add);\n\t\t\tc.off('remove', sub.remove);\n\t\t}\n\t}\n\n\t_onMainAdd(ev) {\n\t\tlet idx = ev.idx;\n\t\tlet c = ev.item;\n\n\t\t// Create a new sub and add it to our list.\n\t\tlet sub = this._addSubListeners(c, true);\n\t\tthis._subs.splice(idx, 0, sub);\n\n\t\t// Then we loop over it, emitting a lot of add events.\n\t\tif (c && c.length) {\n\t\t\tlet i = this._getIdxStart(idx);\n\t\t\tfor (let item of c) {\n\t\t\t\tthis._eventBus.emit(this, this._namespace + '.add', {\n\t\t\t\t\titem,\n\t\t\t\t\tidx: i\n\t\t\t\t});\n\t\t\t\ti++;\n\t\t\t}\n\t\t}\n\t}\n\n\t_onMainRemove(ev) {\n\t\tlet idx = ev.idx;\n\n\t\t// Get the sub, remove it from our list, and stop listening to it.\n\t\tlet sub = this._subs[idx];\n\t\tthis._sub.splice(idx, 1);\n\t\tthis._removeSubListeners(sub);\n\t\tlet c = sub.col;\n\n\t\t// Then we loop over it, emitting a lot of remove events.\n\t\tif (c && c.length) {\n\t\t\tlet i = this._getIdxStart(idx);\n\t\t\tfor (let item of c) {\n\t\t\t\tthis._eventBus.emit(this, this._namespace + '.remove', {\n\t\t\t\t\titem,\n\t\t\t\t\tidx: i\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t_onSubAdd(sub, ev) {\n\t\tlet i = this._getSubStart(sub);\n\t\tthis._eventBus.emit(this, this._namespace + '.add', {\n\t\t\titem: ev.item,\n\t\t\tidx: i + ev.idx\n\t\t});\n\t}\n\n\t_onSubRemove(sub, ev) {\n\t\tlet i = this._getSubStart(sub);\n\t\tthis._eventBus.emit(this, this._namespace + '.remove', {\n\t\t\titem: ev.item,\n\t\t\tidx: i + ev.idx\n\t\t});\n\t}\n\n\t_getIdxStart(idx) {\n\t\tlet i = 0;\n\t\tfor (let j = 0; j < idx; j++) {\n\t\t\tlet s = this._subs[j];\n\t\t\ti += (s.col && s.col.length) || 0;\n\t\t}\n\t\treturn i;\n\t}\n\n\t_getSubStart(sub) {\n\t\tlet i = 0;\n\t\tfor (let s of this._subs) {\n\t\t\tif (s === sub) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t\ti += (s.col && s.col.length) || 0;\n\t\t}\n\t\tthrow new Error(\"Collection not found: \", sub.col);\n\t}\n\n\n\tdispose() {\n\t\tif (this._subs) {\n\t\t\tfor (let sub of this._subs) {\n\t\t\t\tthis._removeSubListeners(sub);\n\t\t\t}\n\t\t\tthis._subs = [];\n\t\t}\n\t\tthis._setListeners(false);\n\t\tthis._collections = null;\n\t}\n\n\t[Symbol.iterator]() {\n\t\tlet done = { done: true };\n\t\tif (!this._collections) {\n\t\t\treturn {\n\t\t\t\tnext: function() {\n\t\t\t\t\treturn done;\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tlet arr = this._subs;\n\t\tlet i = 0;\n\t\tlet len = this._subs.length;\n\t\tlet it = null;\n\t\tlet r = null;\n\n\t\treturn {\n\t\t\tnext: function () {\n\t\t\t\twhile (true) {\n\t\t\t\t\t// Get next iterator\n\t\t\t\t\twhile (!it) {\n\t\t\t\t\t\tif (i >= len) return done;\n\t\t\t\t\t\tit = arr[i].col[Symbol.iterator]();\n\t\t\t\t\t\ti++;\n\t\t\t\t\t}\n\n\t\t\t\t\tr = it.next();\n\t\t\t\t\tif (!r.done) {\n\t\t\t\t\t\treturn r;\n\t\t\t\t\t}\n\t\t\t\t\t// Iterator depleted\n\t\t\t\t\tit = null;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n}\n\nexport default JoinedCollection;\n","import eventBus from 'modapp-eventbus';\nimport { obj } from 'modapp-utils';\n\n/**\n * Model is a generic data model.\n * @implements {module:modapp~Model}\n */\nclass Model {\n\n\t/**\n\t * Creates a Model instance\n\t * @param {object} [opt] Optional parameters.\n\t * @param {object} [opt.definition] Object definition. If not provided, any value will be allowed.\n\t * @param {object} [opt.data] Initial data.\n\t * @param {string} [opt.namespace] Event bus namespace. Defaults to 'model'.\n\t * @param {module:modapp~EventBus} [opt.eventBus] Event bus.\n\t */\n\tconstructor(opt = {}) {\n\t\tthis._definition = opt.definition || null;\n\t\tthis._namespace = opt.namespace || 'model';\n\t\tthis._eventBus = opt.eventBus || eventBus;\n\n\t\tthis._props = {};\n\t\tif (opt.data) {\n\t\t\tthis._update(opt.data, false);\n\t\t}\n\t}\n\n\t/**\n\t * Model properties.\n\t * @returns {object} Anonymous object with all model properties.\n\t */\n\tget props() {\n\t\treturn this._props;\n\t}\n\n\t/**\n\t * Attach an event handler function for one or more session events.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} handler A function to execute when the event is emitted.\n\t */\n\ton(events, handler) {\n\t\tthis._eventBus.on(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Remove an event handler.\n\t * @param {?string} events One or more space-separated events. Null means any event.\n\t * @param {Event~eventCallback} [handler] An option handler function. The handler will only be remove if it is the same handler.\n\t */\n\toff(events, handler) {\n\t\tthis._eventBus.off(this, events, handler, this._namespace);\n\t}\n\n\t/**\n\t * Sets model properties\n\t * If any property where changed, this will trigger a change event.\n\t * @param {object} props Properties to set\n\t * @returns {Promise} Promise to the setting of the properties.\n\t */\n\tset(props) {\n\t\treturn Promise.resolve(this._update(props, true));\n\t}\n\n\t/**\n\t * Resets all model properties to the given props. If any property where\n\t * changed or is missing, this will trigger a change event.\n\t * @param {object} props Properties to reset the model to.\n\t * @returns {Promise} Promise to the setting of the properties.\n\t */\n\treset(props) {\n\t\treturn Promise.resolve(this._update(props, true, true));\n\t}\n\n\t/**\n\t * Returns the model definition, or null if none is set.\n\t * @returns {?object} Object definition\n\t */\n\tgetDefinition() {\n\t\treturn this._definition;\n\t}\n\n\t/**\n\t * Updates the properties.\n\t * @param {object} props Properties to update.\n\t * @param {boolean} emit Flag if changes though be emitted on the eventBus.\n\t * @param {boolean} reset Flag that sets if missing values should be deleted.\n\t * @returns {?object} Key/value object with the change properties and old values, or null if there were no changes.\n\t * @private\n\t */\n\t_update(props, emit, reset) {\n\t\tif (!props) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet changed = null;\n\t\tlet v, promote;\n\t\tlet p = this._props;\n\n\t\tif (reset) {\n\t\t\tprops = Object.assign({}, props);\n\t\t\tfor (var k in p) {\n\t\t\t\tif (!props.hasOwnProperty(k)) {\n\t\t\t\t\tprops[k] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this._definition) {\n\t\t\tchanged = obj.update(p, props, this._definition);\n\t\t\tfor (let key in changed) {\n\t\t\t\tif ((this.hasOwnProperty(key) || !this[key]) && key[0] !== '_') {\n\t\t\t\t\tv = p[key];\n\t\t\t\t\tif (v === undefined) {\n\t\t\t\t\t\tdelete this[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (let key in props) {\n\t\t\t\tv = props[key];\n\t\t\t\tpromote = (this.hasOwnProperty(key) || !this[key]) && key[0] !== '_';\n\t\t\t\tif (p[key] !== v) {\n\t\t\t\t\tchanged = changed || {};\n\t\t\t\t\tchanged[key] = p[key];\n\t\t\t\t\tif (v === undefined) {\n\t\t\t\t\t\tdelete p[key];\n\t\t\t\t\t\tif (promote) delete this[key];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tp[key] = v;\n\t\t\t\t\t\tif (promote) this[key] = v;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (changed && emit) {\n\t\t\tthis._eventBus.emit(this, this._namespace + '.change', changed);\n\t\t}\n\n\t\treturn changed;\n\t}\n\n\ttoJSON() {\n\t\tif (this._definition) {\n\t\t\treturn obj.copy(this._props, this._definition);\n\t\t}\n\n\t\tlet props = {};\n\t\tlet p = this.props;\n\t\tlet v;\n\t\tfor (let k in p) {\n\t\t\tv = p[k];\n\t\t\tprops[k] = v && typeof v == 'object' && typeof v.toJSON == 'function' ? v.toJSON() : v;\n\t\t}\n\t\treturn props;\n\t}\n}\n\nexport default Model;\n","import { array } from 'modapp-utils';\n\n/**\n * A map is an ordered list for key-value items. The map also allows for value lookup\n * by key name through the get() method.\n * @constructor\n * @alias module:class/SortedMap\n * @param {function} [compare] Sort compare function. Defaults to sort by order they are added.\n */\nexport default function(compare) {\n\t/** @lends module:class/SortedMap.prototype */\n\tvar list = [];\n\n\tvar map = {};\n\n\t/**\n\t * Adds a value to the map\n\t * @param {string} key Key of value to add\n\t * @param {*} value Value to add\n\t * @param {number} [idx] Index of position to insert value. Default is at the end. Ignored if a §ompare function is used\n\t * @returns {number} Index of insert position\n\t */\n\tlist.add = function(key, value, idx) {\n\t\tif (map[key]) throw \"Map key [\" + key + \"] already exists\";\n\n\t\tmap[key] = value;\n\n\t\tif (compare) {\n\t\t\tidx = array.binaryInsert(list, value, compare, true);\n\t\t} else {\n\t\t\tif (typeof idx != 'number' || idx >= list.length) {\n\t\t\t\tidx = list.length;\n\t\t\t\tlist.push(value);\n\t\t\t} else if (idx <= 0) {\n\t\t\t\tidx = 0;\n\t\t\t\tlist.unshift(value);\n\t\t\t} else {\n\t\t\t\tlist.splice(idx, 0, value);\n\t\t\t}\n\t\t}\n\n\t\treturn idx;\n\t};\n\n\t/**\n\t * Removes a value item from the map\n\t * @param {string} key Key of value to remove\n\t * @returns {number} Index of value position before removal. -1 if key doesn't exist\n\t */\n\tlist.remove = function(key) {\n\t\tvar idx, value = map[key];\n\t\tif (value === undefined) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tdelete map[key];\n\t\tidx = compare\n\t\t\t? array.binarySearch(list, value, compare)\n\t\t\t: list.indexOf(value);\n\n\t\tif (idx >= 0) {\n\t\t\tlist.splice(idx, 1);\n\t\t}\n\n\t\treturn idx;\n\t};\n\n\t/**\n\t * Gets a value from the map by key\n\t * @param {string} key Key of value to get\n\t * @returns {*} Stored value. Undefined if key doesn't exist\n\t */\n\tlist.get = function(key) {\n\t\treturn map[key];\n\t};\n\n\t/**\n\t * Retrieves the order index of a value in the map\n\t * @param {string} key Key of value to get index for\n\t * @returns {number} Index of value position. -1 if key doesn't exist\n\t */\n\tlist.indexOfKey = function(key) {\n\t\tvar value = map[key];\n\t\tif (!value) {\n\t\t\treturn -1;\n\t\t}\n\t\treturn compare\n\t\t\t? array.binarySearch(list, value, compare)\n\t\t\t: list.indexOf(value);\n\t};\n\n\treturn list;\n};\n","/**\n * Get the props object of a model, or a clone of the model with own properties\n * not prefixed with underscore.\n * @param {*} m Model.\n * @returns {object} Model props object.\n */\nexport function getProps(m) {\n\tif (!m) {\n\t\treturn null;\n\t}\n\tlet props = m && m.props;\n\tif (!props || typeof props !== 'object') {\n\t\tprops = {};\n\t\tfor (let k in m) {\n\t\t\tif (k && m.hasOwnProperty(k) && k[0] !== '_') {\n\t\t\t\tprops[k] = m[k];\n\t\t\t}\n\t\t}\n\t}\n\treturn props;\n}\n\n/**\n * Ensures the value is an array.\n * @param {*} a Array, null, iterable, or object with a toArray function.\n * @returns {Array} An array.\n */\nexport function toArray(a) {\n\tif (!a) {\n\t\treturn [];\n\t}\n\tif (Array.isArray(a)) {\n\t\treturn a;\n\t}\n\tif (typeof a.toArray == 'function') {\n\t\treturn a.toArray();\n\t}\n\n\treturn Array.from(a);\n}\n\n/**\n * Performs a LCS matric calculation\n * https://en.wikipedia.org/wiki/Longest_common_subsequence_problem\n * @param {Array} a Before array.\n * @param {Array} b After array.\n * @param {function} onAdd Called on add.\n * @param {function} onRemove Called on remove.\n */\nexport function patchDiff(a, b, onAdd, onRemove) {\n\tlet t, i, j, s = 0, aa, bb, m = a.length, n = b.length;\n\n\t// Trim of matches at the start and end\n\twhile (s < m && s < n && a[s] === b[s]) {\n\t\ts++;\n\t}\n\tif (s === m && s === n) {\n\t\treturn;\n\t}\n\twhile (s < m && s < n && a[m - 1] === b[n - 1]) {\n\t\tm--;\n\t\tn--;\n\t}\n\n\tif (s > 0 || m < a.length) {\n\t\taa = a.slice(s, m);\n\t\tm = aa.length;\n\t} else {\n\t\taa = a;\n\t}\n\tif (s > 0 || n < b.length) {\n\t\tbb = b.slice(s, n);\n\t\tn = bb.length;\n\t} else {\n\t\tbb = b;\n\t}\n\n\t// Create matrix and initialize it\n\tlet c = new Array(m + 1);\n\tfor (i = 0; i <= m; i++) {\n\t\tc[i] = t = new Array(n + 1);\n\t\tt[0] = 0;\n\t}\n\tt = c[0];\n\tfor (j = 1; j <= n; j++) {\n\t\tt[j] = 0;\n\t}\n\n\tfor (i = 0; i < m; i++) {\n\t\tfor (j = 0; j < n; j++) {\n\t\t\tc[i + 1][j + 1] = aa[i] === bb[j]\n\t\t\t\t? c[i][j] + 1\n\t\t\t\t: Math.max(c[i + 1][j], c[i][j + 1]);\n\t\t}\n\t}\n\n\tlet idx = m + s;\n\ti = m;\n\tj = n;\n\tlet r = 0;\n\tlet adds = [];\n\twhile (true) {\n\t\tm = i - 1;\n\t\tn = j - 1;\n\t\tif (i > 0 && j > 0 && aa[m] === bb[n]) {\n\t\t\t--idx;\n\t\t\ti--;\n\t\t\tj--;\n\t\t} else if (j > 0 && (i === 0 || c[i][n] >= c[m][j])) {\n\t\t\tadds.push([ n, idx, r ]);\n\t\t\tj--;\n\t\t} else if (i > 0 && (j === 0 || c[i][n] < c[m][j])) {\n\t\t\tonRemove(aa[m], m + s, --idx);\n\t\t\tr++;\n\t\t\ti--;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Do the adds\n\tlet len = adds.length - 1;\n\tfor (i = len; i >= 0; i--) {\n\t\t[ n, idx, j ] = adds[i];\n\t\tonAdd(bb[n], n + s, idx - r + j + len - i);\n\t}\n}\n"],"names":["Err","code","message","data","_classCallCheck","this","_code","_message","_data","key","get","value","l10n","l","ConfirmScreenDialog","opt","el","_this","elem","ScreenDialog","Elem","n","className","component","isComponent","body","Txt","events","click","_confirm","confirm","title","close","onClose","render","unrender","onConfirm","customIcons","upstairs","downstairs","icosahedron","FAIcon","_RootElem","_inherits","_super","_createSuper","icon","Object","assign","attributes","call","custom","setIcon","String","removeClass","addClass","RootElem","Fader","_opt","_fadeOpt","callback","_onTransitionEnd","bind","_assertThisInitialized","duration","_current","_component","_token","setComponent","_componentOpt","getElement","_fade","_renderComponent","_get","_getPrototypeOf","prototype","anim","_unrenderComponent","opacity","_this$_currentOpt","_currentOpt","onRender","_this$_currentOpt2","onUnrender","size","tagName","getComponent","namespace","Api","_ResClient","app","params","debug","props","apiHostPath","eventBus","reconnectDelay","subscribeStaleDelay","subscribeRetryDelay","unsubscribeDelay","webResourcePath","_resolveWebResourcePath","apiWebresourcePath","rid","idx","indexOf","rname","substr","query","replace","resource","isResError","cb","on","off","url","match","a","document","createElement","href","disconnect","ResClient","oauth2Url","AUTH_LOGIN_URL","authenticateUrl","AUTH_AUTHENTICATE_URL","wsAuthRid","AUTH_AUTHENTICATE_RID","redirectWithUri","pushHistory","redirect","encodeURIComponent","window","location","Auth","player","pass","mode","_onConnect","_onUnsubscribe","_onModelChange","require","_init","module","self","loginPromise","loginResolve","userPromise","model","Model","loggedIn","user","authError","state","api","setOnConnect","noRedirect","_getCurrentUser","fetch","method","credentials","catch","err","then","resp","status","json","text","result","JSON","parse","error","ex","redirectOnerror","_this2","authResp","redirectOnError","redirectToLogin","Promise","reject","_this3","resolve","_afterFade","AUTH_LOGOUT_URL","noFade","reconnect","_this4","set","connect","isError","Error","t","_err$code","_err$code$endsWith","endsWith","_this5","authenticate","AUTH_LOGIN_RID","name","hash","hmacsha256","trim","publicPepper","changed","hasOwnProperty","reload","screen","Screen","fader","subcomponents","id","o","i","_getSubIdx","splice","push","length","findIndex","unsetComponent","_typeof","Symbol","iterator","constructor","_definition","definition","_namespace","_eventBus","_props","_update","handler","reset","getDefinition","emit","v","promote","p","k","undefined","obj","toJSON","compare","list","map","add","array","unshift","remove","indexOfKey","getProps","m","toArray","Array","isArray","from","patchDiff","b","onAdd","onRemove","j","aa","bb","s","slice","c","Math","max","r","adds","len"],"sourceRoot":""}