1 line
No EOL
226 KiB
Text
1 line
No EOL
226 KiB
Text
{"version":3,"file":"ruffle.js","mappings":"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","sources":["webpack://ruffle-selfhosted/webpack/runtime/load script","webpack://ruffle-selfhosted/webpack/bootstrap","webpack://ruffle-selfhosted/webpack/runtime/define property getters","webpack://ruffle-selfhosted/webpack/runtime/ensure chunk","webpack://ruffle-selfhosted/webpack/runtime/get javascript chunk filename","webpack://ruffle-selfhosted/webpack/runtime/global","webpack://ruffle-selfhosted/webpack/runtime/harmony module decorator","webpack://ruffle-selfhosted/webpack/runtime/hasOwnProperty shorthand","webpack://ruffle-selfhosted/webpack/runtime/make namespace object","webpack://ruffle-selfhosted/webpack/runtime/publicPath","webpack://ruffle-selfhosted/webpack/runtime/jsonp chunk loading","webpack://ruffle-selfhosted/../core/dist/version.js","webpack://ruffle-selfhosted/../core/dist/version-range.js","webpack://ruffle-selfhosted/../../node_modules/wasm-feature-detect/dist/esm/index.js","webpack://ruffle-selfhosted/../core/dist/js-polyfills.js","webpack://ruffle-selfhosted/../core/dist/public-path.js","webpack://ruffle-selfhosted/../core/dist/load-ruffle.js","webpack://ruffle-selfhosted/../core/dist/shadow-template.js","webpack://ruffle-selfhosted/../core/dist/register-element.js","webpack://ruffle-selfhosted/../core/dist/config.js","webpack://ruffle-selfhosted/../core/dist/flash-identifiers.js","webpack://ruffle-selfhosted/../core/dist/swf-utils.js","webpack://ruffle-selfhosted/../core/dist/build-info.js","webpack://ruffle-selfhosted/../core/dist/ruffle-player.js","webpack://ruffle-selfhosted/../core/dist/ruffle-embed.js","webpack://ruffle-selfhosted/../core/dist/ruffle-object.js","webpack://ruffle-selfhosted/../core/dist/plugin-polyfill.js","webpack://ruffle-selfhosted/../core/dist/polyfills.js","webpack://ruffle-selfhosted/../core/dist/source-api.js","webpack://ruffle-selfhosted/../core/dist/public-api.js","webpack://ruffle-selfhosted/./js/ruffle.js"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"ruffle-selfhosted:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"core.ruffle.\" + {\"159\":\"eb34badb9c860590f371\",\"339\":\"7d3ff466cfbd971981de\"}[chunkId] + \".js\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = (module) => {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: () => {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"\";","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkruffle_selfhosted\"] = self[\"webpackChunkruffle_selfhosted\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","/**\n * A representation of a semver 2 compliant version string\n */\nexport class Version {\n /**\n * Construct a Version from specific components.\n *\n * If you wish to parse a string into a Version then please use [[fromSemver]].\n *\n * @param major The major version component.\n * @param minor The minor version component.\n * @param patch The patch version component.\n * @param prIdent A list of pre-release identifiers, if any\n * @param buildIdent A list of build identifiers, if any\n */\n constructor(major, minor, patch, prIdent, \n // @ts-expect-error: Property 'buildIdent' is declared but its value is never read.\n buildIdent) {\n this.major = major;\n this.minor = minor;\n this.patch = patch;\n this.prIdent = prIdent;\n this.buildIdent = buildIdent;\n }\n /**\n * Construct a version from a semver 2 compliant string.\n *\n * This function is intended for use with semver 2 compliant strings.\n * Malformed strings may still parse correctly, but this result is not\n * guaranteed.\n *\n * @param versionString A semver 2.0.0 compliant version string\n * @returns A version object\n */\n static fromSemver(versionString) {\n const buildSplit = versionString.split(\"+\"), prSplit = buildSplit[0].split(\"-\"), versionSplit = prSplit[0].split(\".\");\n const major = parseInt(versionSplit[0], 10);\n let minor = 0;\n let patch = 0;\n let prIdent = null;\n let buildIdent = null;\n if (versionSplit[1] !== undefined) {\n minor = parseInt(versionSplit[1], 10);\n }\n if (versionSplit[2] !== undefined) {\n patch = parseInt(versionSplit[2], 10);\n }\n if (prSplit[1] !== undefined) {\n prIdent = prSplit[1].split(\".\");\n }\n if (buildSplit[1] !== undefined) {\n buildIdent = buildSplit[1].split(\".\");\n }\n return new Version(major, minor, patch, prIdent, buildIdent);\n }\n /**\n * Returns true if a given version is compatible with this one.\n *\n * Compatibility is defined as having the same nonzero major version\n * number, or if both major versions are zero, the same nonzero minor\n * version number, or if both minor versions are zero, the same nonzero\n * patch version number.\n *\n * This implements the ^ operator in npm's semver package, with the\n * exception of the prerelease exclusion rule.\n *\n * @param other The other version to test against\n * @returns True if compatible\n */\n isCompatibleWith(other) {\n return ((this.major !== 0 && this.major === other.major) ||\n (this.major === 0 &&\n other.major === 0 &&\n this.minor !== 0 &&\n this.minor === other.minor) ||\n (this.major === 0 &&\n other.major === 0 &&\n this.minor === 0 &&\n other.minor === 0 &&\n this.patch !== 0 &&\n this.patch === other.patch));\n }\n /**\n * Returns true if this version has precedence over (is newer than) another\n * version.\n *\n * Precedence is defined as in the Semver 2 spec. This implements the >\n * operator in npm's semver package, with the exception of the prerelease\n * exclusion rule.\n *\n * @param other The other version to test against\n * @returns True if this version has precedence over the other one\n */\n hasPrecedenceOver(other) {\n if (this.major > other.major) {\n return true;\n }\n else if (this.major < other.major) {\n return false;\n }\n if (this.minor > other.minor) {\n return true;\n }\n else if (this.minor < other.minor) {\n return false;\n }\n if (this.patch > other.patch) {\n return true;\n }\n else if (this.patch < other.patch) {\n return false;\n }\n if (this.prIdent === null && other.prIdent !== null) {\n return true;\n }\n else if (this.prIdent !== null && other.prIdent !== null) {\n const isNumeric = /^[0-9]*$/;\n for (let i = 0; i < this.prIdent.length && i < other.prIdent.length; i += 1) {\n if (!isNumeric.test(this.prIdent[i]) &&\n isNumeric.test(other.prIdent[i])) {\n return true;\n }\n else if (isNumeric.test(this.prIdent[i]) &&\n isNumeric.test(other.prIdent[i])) {\n if (parseInt(this.prIdent[i], 10) >\n parseInt(other.prIdent[i], 10)) {\n return true;\n }\n else if (parseInt(this.prIdent[i], 10) <\n parseInt(other.prIdent[i], 10)) {\n return false;\n }\n }\n else if (isNumeric.test(this.prIdent[i]) &&\n !isNumeric.test(other.prIdent[i])) {\n return false;\n }\n else if (!isNumeric.test(this.prIdent[i]) &&\n !isNumeric.test(other.prIdent[i])) {\n if (this.prIdent[i] > other.prIdent[i]) {\n return true;\n }\n else if (this.prIdent[i] < other.prIdent[i]) {\n return false;\n }\n }\n }\n return this.prIdent.length > other.prIdent.length;\n }\n return false;\n }\n /**\n * Tests if a given version is equivalent to this one.\n *\n * Build and prerelease tags are ignored.\n *\n * @param other The other version to test against\n * @returns True if the given version is equivalent\n */\n isEqual(other) {\n return (this.major === other.major &&\n this.minor === other.minor &&\n this.patch === other.patch);\n }\n /**\n * Tests if a given version is stable or a compatible prerelease for this\n * version.\n *\n * This implements the prerelease exclusion rule of NPM semver: a\n * prerelease version can only pass this check if the major/minor/patch\n * components of both versions are the same. Otherwise, the prerelease\n * version always fails.\n *\n * @param other The other version to test against\n * @returns True if the given version is either stable, or a\n * prerelease in the same series as this one.\n */\n isStableOrCompatiblePrerelease(other) {\n if (other.prIdent === null) {\n return true;\n }\n else {\n return (this.major === other.major &&\n this.minor === other.minor &&\n this.patch === other.patch);\n }\n }\n}\n","import { Version } from \"./version\";\n/**\n * Represents a set of version requirements.\n */\nexport class VersionRange {\n /**\n * Constructs a range of versions as specified by the given requirements.\n *\n * If you wish to construct this object from a string representation,\n * then use [[fromRequirementString]].\n *\n * @param requirements Requirements to set this range by\n */\n constructor(requirements) {\n this.requirements = requirements;\n }\n /**\n * Determine if a given version satisfies this range.\n *\n * @param fver A version object to test against.\n * @returns Whether or not the given version matches this range\n */\n satisfiedBy(fver) {\n for (const requirement of this.requirements) {\n let matches = true;\n for (const { comparator, version } of requirement) {\n matches =\n matches && version.isStableOrCompatiblePrerelease(fver);\n if (comparator === \"\" || comparator === \"=\") {\n matches = matches && version.isEqual(fver);\n }\n else if (comparator === \">\") {\n matches = matches && fver.hasPrecedenceOver(version);\n }\n else if (comparator === \">=\") {\n matches =\n matches &&\n (fver.hasPrecedenceOver(version) ||\n version.isEqual(fver));\n }\n else if (comparator === \"<\") {\n matches = matches && version.hasPrecedenceOver(fver);\n }\n else if (comparator === \"<=\") {\n matches =\n matches &&\n (version.hasPrecedenceOver(fver) ||\n version.isEqual(fver));\n }\n else if (comparator === \"^\") {\n matches = matches && version.isCompatibleWith(fver);\n }\n }\n if (matches) {\n return true;\n }\n }\n return false;\n }\n /**\n * Parse a requirement string into a version range.\n *\n * @param requirement The version requirements, consisting of a\n * series of space-separated strings, each one being a semver version\n * optionally prefixed by a comparator or a separator.\n *\n * Valid comparators are:\n * - `\"\"` or `\"=\"`: Precisely this version\n * - `\">`\": A version newer than this one\n * - `\">`=\": A version newer or equal to this one\n * - `\"<\"`: A version older than this one\n * - `\"<=\"`: A version older or equal to this one\n * - `\"^\"`: A version that is compatible with this one\n *\n * A separator is `\"||`\" which splits the requirement string into\n * left OR right.\n * @returns A version range object.\n */\n static fromRequirementString(requirement) {\n const components = requirement.split(\" \");\n let set = [];\n const requirements = [];\n for (const component of components) {\n if (component === \"||\") {\n if (set.length > 0) {\n requirements.push(set);\n set = [];\n }\n }\n else if (component.length > 0) {\n const match = /[0-9]/.exec(component);\n if (match) {\n const comparator = component.slice(0, match.index).trim();\n const version = Version.fromSemver(component.slice(match.index).trim());\n set.push({ comparator, version });\n }\n }\n }\n if (set.length > 0) {\n requirements.push(set);\n }\n return new VersionRange(requirements);\n }\n}\n","export const bigInt=()=>(async e=>{try{return(await WebAssembly.instantiate(e)).instance.exports.b(BigInt(0))===BigInt(0)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,1,126,1,126,3,2,1,0,7,5,1,1,98,0,0,10,6,1,4,0,32,0,11])),bulkMemory=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,3,1,0,1,10,14,1,12,0,65,0,65,0,65,0,252,10,0,0,11])),exceptions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11])),extendedConst=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,0,1,11,9,1,0,65,1,65,2,106,11,0])),gc=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,10,2,95,1,125,0,96,0,1,107,0,3,2,1,1,10,12,1,10,0,67,0,0,0,0,251,7,0,11])),memory64=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,5,3,1,4,1])),multiValue=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,6,1,96,0,2,127,127,3,2,1,0,10,8,1,6,0,65,0,65,0,11])),mutableGlobals=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,2,8,1,1,97,1,98,3,127,1,6,6,1,127,1,65,0,11,7,5,1,1,97,3,1])),referenceTypes=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,7,1,5,0,208,112,26,11])),relaxedSimd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,15,1,13,0,65,1,253,15,65,2,253,15,253,128,2,11])),saturatedFloatToInt=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,12,1,10,0,67,0,0,0,0,252,0,26,11])),signExtensions=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,65,0,192,26,11])),simd=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11])),streamingCompilation=()=>(async()=>\"compileStreaming\"in WebAssembly)(),tailCall=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,6,1,4,0,18,0,11])),threads=()=>(async e=>{try{return\"undefined\"!=typeof MessageChannel&&(new MessageChannel).port1.postMessage(new SharedArrayBuffer(1)),WebAssembly.validate(e)}catch(e){return!1}})(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,5,4,1,3,1,1,10,11,1,9,0,65,0,254,16,2,0,26,11]));\n","/**\n * Polyfills the `Array.prototype.reduce` method.\n *\n * Production steps of ECMA-262, Edition 5, 15.4.4.21\n * Reference: https://es5.github.io/#x15.4.4.21\n * https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n */\nfunction polyfillArrayPrototypeReduce() {\n Object.defineProperty(Array.prototype, \"reduce\", {\n value(...args) {\n if (args.length === 0 &&\n window.Prototype &&\n window.Prototype.Version &&\n window.Prototype.Version < \"1.6.1\") {\n // Off-spec: compatibility with prototype.js\n return this.length > 1 ? this : this[0];\n }\n const callback = args[0];\n if (this === null) {\n throw new TypeError(\"Array.prototype.reduce called on null or undefined\");\n }\n if (typeof callback !== \"function\") {\n throw new TypeError(`${callback} is not a function`);\n }\n const o = Object(this);\n const len = o.length >>> 0;\n let k = 0;\n let value;\n if (args.length >= 2) {\n value = args[1];\n }\n else {\n while (k < len && !(k in o)) {\n k++;\n }\n if (k >= len) {\n throw new TypeError(\"Reduce of empty array with no initial value\");\n }\n value = o[k++];\n }\n while (k < len) {\n if (k in o) {\n value = callback(value, o[k], k, o);\n }\n k++;\n }\n return value;\n },\n });\n}\n/**\n * Polyfills the `Window` function.\n */\nfunction polyfillWindow() {\n if (typeof window.constructor !== \"function\" ||\n !isNativeFunction(window.constructor)) {\n // Don't polyfill `Window` if `window.constructor` has been overridden.\n return;\n }\n // @ts-expect-error: `Function not assignable to { new (): Window; prototype: Window; }`\n window.Window = window.constructor;\n}\n/**\n * Polyfills the `Reflect` object and members.\n *\n * This is a partial implementation, just enough to match our needs.\n */\nfunction tryPolyfillReflect() {\n if (window.Reflect === undefined || window.Reflect === null) {\n // @ts-expect-error: {} indeed doesn't implement Reflect's interface.\n window.Reflect = {};\n }\n if (typeof Reflect.get !== \"function\") {\n Object.defineProperty(Reflect, \"get\", {\n value(target, key) {\n return target[key];\n },\n });\n }\n if (typeof Reflect.set !== \"function\") {\n Object.defineProperty(Reflect, \"set\", {\n value(target, key, value) {\n target[key] = value;\n },\n });\n }\n if (typeof Reflect.has !== \"function\") {\n Object.defineProperty(Reflect, \"has\", {\n value(target, key) {\n // @ts-expect-error: Type 'T' is not assignable to type 'object'.\n return key in target;\n },\n });\n }\n if (typeof Reflect.ownKeys !== \"function\") {\n Object.defineProperty(Reflect, \"ownKeys\", {\n value(target) {\n return [\n ...Object.getOwnPropertyNames(target),\n ...Object.getOwnPropertySymbols(target),\n ];\n },\n });\n }\n}\n/**\n * Determines whether a function is native or not.\n *\n * @param func The function to test.\n * @returns True if the function hasn't been overridden.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isNativeFunction(func) {\n const val = typeof Function.prototype.toString === \"function\"\n ? Function.prototype.toString()\n : null;\n if (typeof val === \"string\" && val.indexOf(\"[native code]\") >= 0) {\n return (Function.prototype.toString.call(func).indexOf(\"[native code]\") >= 0);\n }\n return false;\n}\n/**\n * Checks and applies the polyfills to the current window, if needed.\n */\nexport function setPolyfillsOnLoad() {\n if (typeof Array.prototype.reduce !== \"function\" ||\n !isNativeFunction(Array.prototype.reduce)) {\n // Some external libraries override the `Array.prototype.reduce` method in a way\n // that causes Webpack to crash (#1507, #1865), so we need to override it again.\n polyfillArrayPrototypeReduce();\n }\n if (typeof Window !== \"function\" || !isNativeFunction(Window)) {\n // Overriding the native `Window` function causes issues in wasm-bindgen, as a\n // code like `window instanceof Window` will no longer work.\n polyfillWindow();\n }\n // Some pages override the native `Reflect` object, which causes various issues:\n // 1- wasm-bindgen's stdlib may crash (#3173).\n // 2- FlashVars may be ignored (#8537).\n tryPolyfillReflect();\n}\n","// This must be in global scope because `document.currentScript`\n// works only while the script is initially being processed.\nlet currentScriptURL = \"\";\ntry {\n if (document.currentScript !== undefined &&\n document.currentScript !== null &&\n \"src\" in document.currentScript &&\n document.currentScript.src !== \"\") {\n let src = document.currentScript.src;\n // CDNs allow omitting the filename. If it's omitted, append a slash to\n // prevent the last component from being dropped.\n if (!src.endsWith(\".js\") && !src.endsWith(\"/\")) {\n src += \"/\";\n }\n currentScriptURL = new URL(\".\", src).href;\n }\n}\ncatch (e) {\n console.warn(\"Unable to get currentScript URL\");\n}\n/**\n * Attempt to discover the public path of the current Ruffle source. This can\n * be used to configure Webpack.\n *\n * A global public path can be specified for all sources using the RufflePlayer\n * config:\n *\n * ```js\n * window.RufflePlayer.config.publicPath = \"/dist/\";\n * ```\n *\n * If no such config is specified, then the parent path of where this script is\n * hosted is assumed, which should be the correct default in most cases.\n *\n * @param config The `window.RufflePlayer.config` object.\n * @returns The public path for the given source.\n */\nexport function publicPath(config) {\n // Default to the directory where this script resides.\n let path = currentScriptURL;\n if (\"publicPath\" in config &&\n config.publicPath !== null &&\n config.publicPath !== undefined) {\n path = config.publicPath;\n }\n // Webpack expects the paths to end with a slash.\n if (path !== \"\" && !path.endsWith(\"/\")) {\n path += \"/\";\n }\n return path;\n}\n","/**\n * Conditional ruffle loader\n */\nimport { bulkMemory, simd, saturatedFloatToInt, signExtensions, referenceTypes, } from \"wasm-feature-detect\";\nimport { setPolyfillsOnLoad } from \"./js-polyfills\";\nimport { publicPath } from \"./public-path\";\n/**\n * Load ruffle from an automatically-detected location.\n *\n * This function returns a new instance of Ruffle and downloads it every time.\n * You should not use it directly; this module will memoize the resource\n * download.\n *\n * @param config The `window.RufflePlayer.config` object.\n * @param progressCallback The callback that will be run with Ruffle's download progress.\n * @returns A ruffle constructor that may be used to create new Ruffle\n * instances.\n */\nasync function fetchRuffle(config, progressCallback) {\n // Apply some pure JavaScript polyfills to prevent conflicts with external\n // libraries, if needed.\n setPolyfillsOnLoad();\n // NOTE: Keep this list in sync with $RUSTFLAGS in the CI build config!\n const extensionsSupported = (await Promise.all([\n bulkMemory(),\n simd(),\n saturatedFloatToInt(),\n signExtensions(),\n referenceTypes(),\n ])).every(Boolean);\n if (!extensionsSupported) {\n console.log(\"Some WebAssembly extensions are NOT available, falling back to the vanilla WebAssembly module\");\n }\n __webpack_public_path__ = publicPath(config);\n // Note: The argument passed to import() has to be a simple string literal,\n // otherwise some bundler will get confused and won't include the module?\n const { default: init, Ruffle } = await (extensionsSupported\n ? import(\"../dist/ruffle_web-wasm_extensions\")\n : import(\"../dist/ruffle_web\"));\n let response;\n const wasmUrl = extensionsSupported\n ? new URL(\"../dist/ruffle_web-wasm_extensions_bg.wasm\", import.meta.url)\n : new URL(\"../dist/ruffle_web_bg.wasm\", import.meta.url);\n const wasmResponse = await fetch(wasmUrl);\n if (progressCallback) {\n const contentLength = wasmResponse.headers.get(\"content-length\") || \"\";\n let bytesLoaded = 0;\n // Use parseInt rather than Number so the empty string is coerced to NaN instead of 0\n const bytesTotal = parseInt(contentLength);\n response = new Response(new ReadableStream({\n async start(controller) {\n var _a;\n const reader = (_a = wasmResponse.body) === null || _a === void 0 ? void 0 : _a.getReader();\n if (!reader) {\n throw \"Response had no body\";\n }\n progressCallback(bytesLoaded, bytesTotal);\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (value === null || value === void 0 ? void 0 : value.byteLength) {\n bytesLoaded += value === null || value === void 0 ? void 0 : value.byteLength;\n }\n controller.enqueue(value);\n progressCallback(bytesLoaded, bytesTotal);\n }\n controller.close();\n },\n }), wasmResponse);\n }\n else {\n response = wasmResponse;\n }\n await init(response);\n return Ruffle;\n}\nlet lastLoaded = null;\n/**\n * Obtain an instance of `Ruffle`.\n *\n * This function returns a promise which yields `Ruffle` asynchronously.\n *\n * @param config The `window.RufflePlayer.config` object.\n * @param progressCallback The callback that will be run with Ruffle's download progress.\n * @returns A ruffle constructor that may be used to create new Ruffle\n * instances.\n */\nexport function loadRuffle(config, progressCallback) {\n if (lastLoaded === null) {\n lastLoaded = fetchRuffle(config, progressCallback);\n }\n return lastLoaded;\n}\n","/**\n * The shadow template which is used to fill the actual Ruffle player element\n * on the page.\n */\nexport const ruffleShadowTemplate = document.createElement(\"template\");\nruffleShadowTemplate.innerHTML = `\n <style>\n :host {\n all: initial;\n\n --ruffle-blue: #37528c;\n --ruffle-orange: #ffad33;\n\n display: inline-block;\n position: relative;\n /* Default width/height; this will get overridden by user styles/attributes. */\n width: 550px;\n height: 400px;\n font-family: Arial, sans-serif;\n letter-spacing: 0.4px;\n touch-action: none;\n user-select: none;\n -webkit-user-select: none;\n -webkit-tap-highlight-color: transparent;\n }\n\n /* Ruffle's width/height CSS interferes with Safari's fullscreen CSS. */\n /* Ensure that Safari's fullscreen mode actually fills the screen. */\n :host(:-webkit-full-screen) {\n display: block;\n width: 100% !important;\n height: 100% !important;\n }\n\n .hidden {\n display: none !important;\n }\n\n /* All of these use the dimensions specified by the embed. */\n #container,\n #play_button,\n #unmute_overlay,\n #unmute_overlay .background,\n #panic,\n #splash-screen,\n #message_overlay {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n\n #container {\n overflow: hidden;\n }\n\n #container canvas {\n width: 100%;\n height: 100%;\n }\n\n #play_button,\n #unmute_overlay {\n cursor: pointer;\n display: none;\n }\n\n #unmute_overlay .background {\n background: black;\n opacity: 0.7;\n }\n\n #play_button .icon,\n #unmute_overlay .icon {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 50%;\n height: 50%;\n max-width: 384px;\n max-height: 384px;\n transform: translate(-50%, -50%);\n opacity: 0.8;\n }\n\n #play_button:hover .icon,\n #unmute_overlay:hover .icon {\n opacity: 1;\n }\n\n #panic {\n font-size: 20px;\n text-align: center;\n /* Inverted colors from play button! */\n background: linear-gradient(180deg, #fd3a40 0%, #fda138 100%);\n color: white;\n display: flex;\n flex-flow: column;\n justify-content: space-around;\n }\n\n #panic a {\n color: var(--ruffle-blue);\n font-weight: bold;\n }\n\n #panic-title {\n font-size: xxx-large;\n font-weight: bold;\n }\n\n #panic-body.details {\n flex: 0.9;\n margin: 0 10px;\n }\n\n #panic-body textarea {\n width: 100%;\n height: 100%;\n resize: none;\n }\n\n #panic ul {\n padding: 0;\n display: flex;\n list-style-type: none;\n justify-content: space-evenly;\n }\n\n #message_overlay {\n position: absolute;\n background: var(--ruffle-blue);\n color: var(--ruffle-orange);\n opacity: 1;\n z-index: 2;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: auto;\n }\n\n #message_overlay .message {\n text-align: center;\n max-height: 100%;\n max-width: 100%;\n padding: 5%;\n font-size: 20px;\n }\n\n #message_overlay p {\n margin: 0.5em 0;\n }\n\n #message_overlay .message div {\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n column-gap: 1em;\n }\n\n #message_overlay a, #message_overlay button {\n cursor: pointer;\n background: var(--ruffle-blue);\n color: var(--ruffle-orange);\n border: 2px solid var(--ruffle-orange);\n font-weight: bold;\n font-size: 1.25em;\n border-radius: 0.6em;\n padding: 10px;\n text-decoration: none;\n margin: 2% 0;\n }\n\n #message_overlay a:hover, #message_overlay button:hover {\n background: #ffffff4c;\n }\n\n #continue-btn {\n cursor: pointer;\n background: var(--ruffle-blue);\n color: var(--ruffle-orange);\n border: 2px solid var(--ruffle-orange);\n font-weight: bold;\n font-size: 20px;\n border-radius: 20px;\n padding: 10px;\n }\n\n #continue-btn:hover {\n background: #ffffff4c;\n }\n\n #context-menu {\n display: none;\n color: black;\n background: #fafafa;\n border: 1px solid gray;\n box-shadow: 0px 5px 10px -5px black;\n position: absolute;\n font-size: 14px;\n text-align: left;\n list-style: none;\n padding: 0;\n margin: 0;\n }\n\n #context-menu .menu_item {\n padding: 5px 10px;\n cursor: pointer;\n color: black;\n }\n\n #context-menu .menu_item.disabled {\n cursor: default;\n color: gray;\n }\n\n #context-menu .menu_item:not(.disabled):hover {\n background: lightgray;\n }\n\n #context-menu .menu_separator hr {\n border: none;\n border-bottom: 1px solid lightgray;\n margin: 2px;\n }\n\n #splash-screen {\n display: flex;\n flex-direction: column;\n background: var(--splash-screen-background, var(--preloader-background, var(--ruffle-blue)));\n align-items: center;\n justify-content: center;\n }\n\n .loadbar {\n width: 100%;\n max-width: 316px;\n max-height: 10px;\n height: 20%;\n background: #253559;\n }\n\n .loadbar-inner {\n width: 0px;\n max-width: 100%;\n height: 100%;\n background: var(--ruffle-orange);\n }\n \n .logo {\n display: var(--logo-display, block);\n max-width: 380px;\n max-height: 150px;\n }\n\n .loading-animation {\n max-width: 28px;\n max-height: 28px;\n margin-bottom: 2%;\n width: 10%;\n aspect-ratio: 1;\n }\n\n .spinner {\n stroke-dasharray: 180;\n stroke-dashoffset: 135;\n stroke: var(--ruffle-orange);\n transform-origin: 50% 50%;\n animation: rotate 1.5s linear infinite;\n }\n\n @keyframes rotate {\n to {\n transform: rotate(360deg);\n }\n }\n\n #virtual-keyboard {\n position: absolute;\n opacity: 0;\n top: -100px;\n width: 1px;\n height: 1px;\n }\n\n #save-manager {\n height: inherit;\n user-select: text;\n }\n #modal-area {\n position: sticky;\n background: white;\n width: fit-content;\n padding: 16px;\n border: 3px solid black;\n margin: auto;\n height: 500px;\n max-height: calc(100% - 38px);\n min-height: 80px;\n }\n\n #restore-save {\n display: none;\n }\n\n .replace-save {\n display: none;\n }\n\n .save-option {\n display: inline-block;\n padding: 3px 10px;\n margin: 5px 2px;\n cursor: pointer;\n border-radius: 50px;\n background-color: var(--ruffle-blue);\n color: white;\n }\n\n #close-modal {\n position: absolute;\n top: 5px;\n right: 10px;\n cursor: pointer;\n font-size: x-large;\n }\n\n .general-save-options {\n text-align: center;\n padding-bottom: 8px;\n border-bottom: 2px solid #888;\n }\n\n #local-saves {\n border-collapse: collapse;\n overflow-y: auto;\n display: block;\n padding-right: 16px;\n height: calc(100% - 45px);\n min-height: 30px;\n }\n\n #local-saves td {\n border-bottom: 1px solid #bbb;\n height: 30px;\n }\n\n #local-saves tr td:nth-child(1) {\n padding-right: 1em;\n word-break: break-all;\n }\n\n #local-saves tr:nth-child(even) {\n background-color: #f2f2f2;\n }\n </style>\n <style id=\"dynamic_styles\"></style>\n\n <div id=\"container\">\n <div id=\"play_button\"><div class=\"icon\"><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\" viewBox=\"0 0 250 250\" width=\"100%\" height=\"100%\"><defs><linearGradient id=\"a\" gradientUnits=\"userSpaceOnUse\" x1=\"125\" y1=\"0\" x2=\"125\" y2=\"250\" spreadMethod=\"pad\"><stop offset=\"0%\" stop-color=\"#FDA138\"/><stop offset=\"100%\" stop-color=\"#FD3A40\"/></linearGradient><g id=\"b\"><path fill=\"url(#a)\" d=\"M250 125q0-52-37-88-36-37-88-37T37 37Q0 73 0 125t37 88q36 37 88 37t88-37q37-36 37-88M87 195V55l100 70-100 70z\"/><path fill=\"#FFF\" d=\"M87 55v140l100-70L87 55z\"/></g></defs><use xlink:href=\"#b\"/></svg></div></div>\n <div id=\"unmute_overlay\"><div class=\"background\"></div><div class=\"icon\"><svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\" viewBox=\"0 0 512 584\" width=\"100%\" height=\"100%\" scale=\"0.8\"><path fill=\"#FFF\" stroke=\"#FFF\" d=\"m457.941 256 47.029-47.029c9.372-9.373 9.372-24.568 0-33.941-9.373-9.373-24.568-9.373-33.941 0l-47.029 47.029-47.029-47.029c-9.373-9.373-24.568-9.373-33.941 0-9.372 9.373-9.372 24.568 0 33.941l47.029 47.029-47.029 47.029c-9.372 9.373-9.372 24.568 0 33.941 4.686 4.687 10.827 7.03 16.97 7.03s12.284-2.343 16.971-7.029l47.029-47.03 47.029 47.029c4.687 4.687 10.828 7.03 16.971 7.03s12.284-2.343 16.971-7.029c9.372-9.373 9.372-24.568 0-33.941z\"/><path fill=\"#FFF\" stroke=\"#FFF\" d=\"m99 160h-55c-24.301 0-44 19.699-44 44v104c0 24.301 19.699 44 44 44h55c2.761 0 5-2.239 5-5v-182c0-2.761-2.239-5-5-5z\"/><path fill=\"#FFF\" stroke=\"#FFF\" d=\"m280 56h-24c-5.269 0-10.392 1.734-14.578 4.935l-103.459 79.116c-1.237.946-1.963 2.414-1.963 3.972v223.955c0 1.557.726 3.026 1.963 3.972l103.459 79.115c4.186 3.201 9.309 4.936 14.579 4.936h23.999c13.255 0 24-10.745 24-24v-352.001c0-13.255-10.745-24-24-24z\"/><text x=\"256\" y=\"560\" text-anchor=\"middle\" font-size=\"60px\" fill=\"#FFF\" stroke=\"#FFF\">Click to unmute</text></svg></div></div>\n <input id=\"virtual-keyboard\" type=\"text\" autocapitalize=\"off\" autocomplete=\"off\" autocorrect=\"off\">\n </div>\n <div class=\"hidden\" id=\"splash-screen\">\n <svg class=\"logo\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMidYMid\" viewBox=\"0 0 380 150\"><g><path fill=\"#966214\" d=\"M58.75 85.6q.75-.1 1.5-.35.85-.25 1.65-.75.55-.35 1.05-.8.5-.45.95-1 .5-.5.75-1.2-.05.05-.15.1-.1.15-.25.25l-.1.2q-.15.05-.25.1-.4 0-.8.05-.5-.25-.9-.5-.3-.1-.55-.3l-.6-.6-4.25-6.45-1.5 11.25h3.45m83.15-.2h3.45q.75-.1 1.5-.35.25-.05.45-.15.35-.15.65-.3l.5-.3q.25-.15.5-.35.45-.35.9-.75.45-.35.75-.85l.1-.1q.1-.2.2-.35.2-.3.35-.6l-.3.4-.15.15q-.5.15-1.1.1-.25 0-.4-.05-.5-.15-.8-.4-.15-.1-.25-.25-.3-.3-.55-.6l-.05-.05v-.05l-4.25-6.4-1.5 11.25m-21.15-3.95q-.3-.3-.55-.6l-.05-.05v-.05l-4.25-6.4-1.5 11.25h3.45q.75-.1 1.5-.35.85-.25 1.6-.75.75-.5 1.4-1.1.45-.35.75-.85.35-.5.65-1.05l-.45.55q-.5.15-1.1.1-.9 0-1.45-.7m59.15.3q-.75-.5-1.4-1-3.15-2.55-3.5-6.4l-1.5 11.25h21q-3.1-.25-5.7-.75-5.6-1.05-8.9-3.1m94.2 3.85h3.45q.6-.1 1.2-.3.4-.1.75-.2.35-.15.65-.3.7-.35 1.35-.8.75-.55 1.3-1.25.1-.15.25-.3-2.55-.25-3.25-1.8l-4.2-6.3-1.5 11.25m-45.3-4.85q-.5-.4-.9-.8-2.3-2.35-2.6-5.6l-1.5 11.25h21q-11.25-.95-16-4.85m97.7 4.85q-.3-.05-.6-.05-10.8-1-15.4-4.8-3.15-2.55-3.5-6.35l-1.5 11.2h21Z\"/><path fill=\"var(--ruffle-orange)\" d=\"M92.6 54.8q-1.95-1.4-4.5-1.4H60.35q-1.35 0-2.6.45-1.65.55-3.15 1.8-2.75 2.25-3.25 5.25l-1.65 12h.05v.3l5.85 1.15h-9.5q-.5.05-1 .15-.5.15-1 .35-.5.2-.95.45-.5.3-.95.7-.45.35-.85.8-.35.4-.65.85-.3.45-.5.9-.15.45-.3.95l-5.85 41.6H50.3l5-35.5 1.5-11.25 4.25 6.45.6.6q.25.2.55.3.4.25.9.5.4-.05.8-.05.1-.05.25-.1l.1-.2q.15-.1.25-.25.1-.05.15-.1l.3-1.05 1.75-12.3h11.15L75.8 82.6h16.5l2.3-16.25h-.05l.8-5.7q.4-2.45-1-4.2-.35-.4-.75-.8-.25-.25-.55-.5-.2-.2-.45-.35m16.2 18.1h.05l-.05.3 5.85 1.15H105.2q-.5.05-1 .15-.5.15-1 .35-.5.2-.95.45-.5.3-1 .65-.4.4-.8.85-.25.3-.55.65-.05.1-.15.2-.25.45-.4.9-.2.45-.3.95-.1.65-.2 1.25-.2 1.15-.4 2.25l-4.3 30.6q-.25 3 1.75 5.25 1.6 1.8 4 2.15.6.1 1.25.1h27.35q3.25 0 6-2.25.35-.35.7-.55l.3-.2q2-2 2.25-4.5l1.65-11.6q.05-.05.1-.05l1.65-11.35h.05l.7-5.2 1.5-11.25 4.25 6.4v.05l.05.05q.25.3.55.6.1.15.25.25.3.25.8.4.15.05.4.05.6.05 1.1-.1l.15-.15.3-.4.3-1.05 1.3-9.05h-.05l.7-5.05h-.05l.15-1.25h-.05l1.65-11.7h-16.25l-2.65 19.5h.05v.2l-.05.1h.05l5.8 1.15H132.7q-.5.05-1 .15-.5.15-1 .35-.15.05-.3.15-.3.1-.55.25-.05 0-.1.05-.5.3-1 .65-.4.35-.7.7-.55.7-.95 1.45-.35.65-.55 1.4-.15.7-.25 1.4v.05q-.15 1.05-.35 2.05l-1.2 8.75v.1l-2.1 14.7H111.4l2.25-15.55h.05l.7-5.2 1.5-11.25 4.25 6.4v.05l.05.05q.25.3.55.6.55.7 1.45.7.6.05 1.1-.1l.45-.55.3-1.05 1.3-9.05h-.05l.7-5.05h-.05l.15-1.25h-.05l1.65-11.7h-16.25l-2.65 19.5m106.5-41.75q-2.25-2.25-5.5-2.25h-27.75q-3 0-5.75 2.25-1.3.95-2.05 2.1-.45.6-.7 1.2-.2.5-.35 1-.1.45-.15.95l-4.15 29.95h-.05l-.7 5.2h-.05l-.2 1.35h.05l-.05.3 5.85 1.15h-9.45q-2.1.05-3.95 1.6-1.9 1.55-2.25 3.55l-.5 3.5h-.05l-5.3 38.1h16.25l5-35.5 1.5-11.25q.35 3.85 3.5 6.4.65.5 1.4 1 3.3 2.05 8.9 3.1 2.6.5 5.7.75l1.75-11.25h-12.2l.4-2.95h-.05l.7-5.05h-.05q.1-.9.3-1.9.1-.75.2-1.6.85-5.9 2.15-14.9 0-.15.05-.25l.1-.9q.2-1.55.45-3.15h11.25l-3.1 20.8h16.5l4.1-28.05q.15-1.7-.4-3.15-.5-1.1-1.35-2.1m46.65 44.15q-.5.3-1 .65-.4.4-.8.85-.35.4-.7.85-.25.45-.45.9-.15.45-.3.95l-5.85 41.6h16.25l5-35.5 1.5-11.25 4.2 6.3q.7 1.55 3.25 1.8l.05-.1q.25-.4.35-.85l.3-1.05 1.8-14.05v-.05l5.35-37.45h-16.25l-6.15 44.3 5.85 1.15h-9.45q-.5.05-1 .15-.5.15-1 .35-.5.2-.95.45m5.4-38.9q.15-1.7-.4-3.15-.5-1.1-1.35-2.1-2.25-2.25-5.5-2.25h-27.75q-2.3 0-4.45 1.35-.65.35-1.3.9-1.3.95-2.05 2.1-.45.6-.7 1.2-.4.9-.5 1.95l-4.15 29.95h-.05l-.7 5.2h-.05l-.2 1.35h.05l-.05.3 5.85 1.15h-9.45q-2.1.05-3.95 1.6-1.9 1.55-2.25 3.55l-.5 3.5h-.05l-1.2 8.75v.1l-4.1 29.25h16.25l5-35.5 1.5-11.25q.3 3.25 2.6 5.6.4.4.9.8 4.75 3.9 16 4.85l1.75-11.25h-12.2l.4-2.95h-.05l.7-5.05h-.05q.15-.9.3-1.9.1-.75.25-1.6.15-1.25.35-2.65v-.05q.95-6.7 2.35-16.5h11.25l-3.1 20.8h16.5l4.1-28.05M345 66.35h-.05l1.15-8.2q.5-3-1.75-5.25-1.25-1.25-3-1.75-1-.5-2.25-.5h-27.95q-.65 0-1.3.1-2.5.35-4.7 2.15-2.75 2.25-3.25 5.25l-1.95 14.7v.05l-.05.3 5.85 1.15h-9.45q-1.9.05-3.6 1.35-.2.1-.35.25-1.9 1.55-2.25 3.55l-4.85 34.1q-.25 3 1.75 5.25 1.25 1.4 3 1.95 1.05.3 2.25.3H320q3.25 0 6-2.25 2.75-2 3.25-5l2.75-18.5h-16.5l-1.75 11H302.5l2.1-14.75h.05l.85-6 1.5-11.2q.35 3.8 3.5 6.35 4.6 3.8 15.4 4.8.3 0 .6.05h15.75L345 66.35m-16.4-.95-1.25 8.95h-11.3l.4-2.95h-.05l.7-5.05h-.1l.15-.95h11.45Z\"/></g></svg>\n <svg class=\"loading-animation\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 66 66\">\n <circle class=\"spinner\" fill=\"none\" stroke-width=\"6\" stroke-linecap=\"round\" cx=\"33\" cy=\"33\" r=\"30\"></circle>\n </svg> \n <div class=\"loadbar\"><div class=\"loadbar-inner\"></div></div>\n </div>\n\n <div id=\"save-manager\" class=\"hidden\">\n <div id=\"modal-area\">\n <span id=\"close-modal\">×</span>\n <div class=\"general-save-options\">\n <span class=\"save-option\" id=\"backup-saves\">Backup all saves (download all sols)</span>\n </div>\n <table id=\"local-saves\"></table>\n </div>\n </div>\n <ul id=\"context-menu\"></ul>\n`;\n","/**\n * Number of times to try defining a custom element.\n */\nconst MAX_TRIES = 999;\n/**\n * A mapping between internal element IDs and DOM element IDs.\n */\nconst privateRegistry = {};\n/**\n * Lookup a previously registered custom element.\n *\n * The returned object will have `name`, `class`, and `internal_name`\n * properties listing the external name, implementing class, and internal name\n * respectively.\n *\n * @param elementName The internal element name, previously used to\n * register the element with the private registry.\n * @returns The element data in the registry, or null if there is\n * no such element name registered.\n */\nexport function lookupElement(elementName) {\n const data = privateRegistry[elementName];\n if (data !== undefined) {\n return {\n internalName: elementName,\n name: data.name,\n class: data.class,\n };\n }\n else {\n return null;\n }\n}\n/**\n * Register a custom element.\n *\n * This function is designed to be tolerant of naming conflicts. If\n * registration fails, we modify the name, and try again. As a result, this\n * function returns the real element name to use.\n *\n * Calling this function multiple times will *not* register multiple elements.\n * We store a private registry mapping internal element names to DOM names.\n * Thus, the proper way to use this function is to call it every time you are\n * about to work with custom element names.\n *\n * @param elementName The internal name of the element.\n * @param elementClass The class of the element.\n *\n * You must call this function with the same class every time.\n * @returns The actual element name.\n * @throws Throws an error if two different elements were registered with the\n * same internal name.\n */\nexport function registerElement(elementName, elementClass) {\n const registration = privateRegistry[elementName];\n if (registration !== undefined) {\n if (registration.class !== elementClass) {\n throw new Error(\"Internal naming conflict on \" + elementName);\n }\n else {\n return registration.name;\n }\n }\n let tries = 0;\n if (window.customElements !== undefined) {\n while (tries < MAX_TRIES) {\n let externalName = elementName;\n if (tries > 0) {\n externalName = externalName + \"-\" + tries;\n }\n if (window.customElements.get(externalName) !== undefined) {\n tries += 1;\n continue;\n }\n else {\n window.customElements.define(externalName, elementClass);\n }\n privateRegistry[elementName] = {\n class: elementClass,\n name: externalName,\n internalName: elementName,\n };\n return externalName;\n }\n }\n throw new Error(\"Failed to assign custom element \" + elementName);\n}\n","export const DEFAULT_CONFIG = {\n allowScriptAccess: false,\n parameters: {},\n autoplay: \"auto\" /* AutoPlay.Auto */,\n backgroundColor: null,\n letterbox: \"fullscreen\" /* Letterbox.Fullscreen */,\n unmuteOverlay: \"visible\" /* UnmuteOverlay.Visible */,\n upgradeToHttps: true,\n compatibilityRules: true,\n warnOnUnsupportedContent: true,\n logLevel: \"error\" /* LogLevel.Error */,\n showSwfDownload: false,\n contextMenu: true,\n // Backwards-compatibility option\n preloader: true,\n splashScreen: true,\n maxExecutionDuration: 15,\n base: null,\n menu: true,\n salign: \"\",\n quality: \"high\",\n scale: \"showAll\",\n forceScale: false,\n frameRate: null,\n wmode: \"opaque\" /* WindowMode.Opaque */,\n publicPath: null,\n polyfills: true,\n playerVersion: null,\n preferredRenderer: null,\n openUrlMode: \"allow\" /* OpenURLMode.Allow */,\n allowNetworking: \"all\" /* NetworkingAccessMode.All */,\n};\n","export const FLASH_MIMETYPE = \"application/x-shockwave-flash\";\nexport const FUTURESPLASH_MIMETYPE = \"application/futuresplash\";\nexport const FLASH7_AND_8_MIMETYPE = \"application/x-shockwave-flash2-preview\";\nexport const FLASH_MOVIE_MIMETYPE = \"application/vnd.adobe.flash.movie\";\nexport const FLASH_ACTIVEX_CLASSID = \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\";\n","import { FLASH_MIMETYPE, FUTURESPLASH_MIMETYPE, FLASH7_AND_8_MIMETYPE, FLASH_MOVIE_MIMETYPE, } from \"./flash-identifiers\";\n/**\n * Returns whether the given filename ends in a known flash extension.\n *\n * @param filename The filename to test.\n * @returns True if the filename is a flash movie (swf or spl).\n */\nexport function isSwfFilename(filename) {\n if (filename) {\n let pathname = \"\";\n try {\n // A base URL is required if `filename` is a relative URL, but we don't need to detect the real URL origin.\n pathname = new URL(filename, \"https://example.com\").pathname;\n }\n catch (err) {\n // Some invalid filenames, like `///`, could raise a TypeError. Let's fail silently in this situation.\n }\n if (pathname && pathname.length >= 4) {\n const extension = pathname.slice(-4).toLowerCase();\n if (extension === \".swf\" || extension === \".spl\") {\n return true;\n }\n }\n }\n return false;\n}\n/**\n * Returns whether the given MIME type is a known flash type.\n *\n * @param mimeType The MIME type to test.\n * @returns True if the MIME type is a flash MIME type.\n */\nexport function isSwfMimeType(mimeType) {\n switch (mimeType.toLowerCase()) {\n case FLASH_MIMETYPE.toLowerCase():\n case FUTURESPLASH_MIMETYPE.toLowerCase():\n case FLASH7_AND_8_MIMETYPE.toLowerCase():\n case FLASH_MOVIE_MIMETYPE.toLowerCase():\n return true;\n default:\n return false;\n }\n}\n/**\n * Create a filename to save a downloaded SWF into.\n *\n * @param swfUrl The URL of the SWF file.\n * @returns The filename the SWF file can be saved at.\n */\nexport function swfFileName(swfUrl) {\n const pathName = swfUrl.pathname;\n const name = pathName.substring(pathName.lastIndexOf(\"/\") + 1);\n return name;\n}\n","/**\n * Stores build information. The string literals are replaces at compile time by `set_version.js`.\n */\nexport const buildInfo = {\n versionNumber: \"0.1.0\",\n versionName: \"nightly 2023-05-04\",\n versionChannel: \"nightly\",\n buildDate: \"2023-05-04T00:18:58.562Z\",\n commitHash: \"891d1dce7e1577f950d1c54cac1b84dad3c30291\",\n};\n","import { loadRuffle } from \"./load-ruffle\";\nimport { ruffleShadowTemplate } from \"./shadow-template\";\nimport { lookupElement } from \"./register-element\";\nimport { DEFAULT_CONFIG } from \"./config\";\nimport { swfFileName } from \"./swf-utils\";\nimport { buildInfo } from \"./build-info\";\nconst RUFFLE_ORIGIN = \"https://ruffle.rs\";\nconst DIMENSION_REGEX = /^\\s*(\\d+(\\.\\d+)?(%)?)/;\nlet isAudioContextUnmuted = false;\n/**\n * Converts arbitrary input to an easy to use record object.\n *\n * @param parameters Parameters to sanitize\n * @returns A sanitized map of param name to param value\n */\nfunction sanitizeParameters(parameters) {\n if (parameters === null || parameters === undefined) {\n return {};\n }\n if (!(parameters instanceof URLSearchParams)) {\n parameters = new URLSearchParams(parameters);\n }\n const output = {};\n for (const [key, value] of parameters) {\n // Every value must be type of string\n output[key] = value.toString();\n }\n return output;\n}\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n distanceTo(other) {\n const dx = other.x - this.x;\n const dy = other.y - this.y;\n return Math.sqrt(dx * dx + dy * dy);\n }\n}\n/**\n * The ruffle player element that should be inserted onto the page.\n *\n * This element will represent the rendered and intractable flash movie.\n */\nclass RufflePlayer extends HTMLElement {\n /**\n * Indicates the readiness of the playing movie.\n *\n * @returns The `ReadyState` of the player.\n */\n get readyState() {\n return this._readyState;\n }\n /**\n * The metadata of the playing movie (such as movie width and height).\n * These are inherent properties stored in the SWF file and are not affected by runtime changes.\n * For example, `metadata.width` is the width of the SWF file, and not the width of the Ruffle player.\n *\n * @returns The metadata of the movie, or `null` if the movie metadata has not yet loaded.\n */\n get metadata() {\n return this._metadata;\n }\n /**\n * Constructs a new Ruffle flash player for insertion onto the page.\n */\n constructor() {\n super();\n // Allows the user to permanently disable the context menu.\n this.contextMenuForceDisabled = false;\n // Whether this device is a touch device.\n // Set to true when a touch event is encountered.\n this.isTouch = false;\n // Whether this device sends contextmenu events.\n // Set to true when a contextmenu event is seen.\n this.contextMenuSupported = false;\n this.panicked = false;\n this._cachedDebugInfo = null;\n this.isExtension = false;\n this.longPressTimer = null;\n this.pointerDownPosition = null;\n this.pointerMoveMaxDistance = 0;\n /**\n * Any configuration that should apply to this specific player.\n * This will be defaulted with any global configuration.\n */\n this.config = {};\n this.shadow = this.attachShadow({ mode: \"open\" });\n this.shadow.appendChild(ruffleShadowTemplate.content.cloneNode(true));\n this.dynamicStyles = (this.shadow.getElementById(\"dynamic_styles\"));\n this.container = this.shadow.getElementById(\"container\");\n this.playButton = this.shadow.getElementById(\"play_button\");\n this.playButton.addEventListener(\"click\", () => this.play());\n this.unmuteOverlay = this.shadow.getElementById(\"unmute_overlay\");\n this.splashScreen = this.shadow.getElementById(\"splash-screen\");\n this.virtualKeyboard = (this.shadow.getElementById(\"virtual-keyboard\"));\n this.virtualKeyboard.addEventListener(\"input\", this.virtualKeyboardInput.bind(this));\n this.saveManager = (this.shadow.getElementById(\"save-manager\"));\n this.saveManager.addEventListener(\"click\", () => this.saveManager.classList.add(\"hidden\"));\n const modalArea = this.saveManager.querySelector(\"#modal-area\");\n if (modalArea) {\n modalArea.addEventListener(\"click\", (event) => event.stopPropagation());\n }\n const closeSaveManager = this.saveManager.querySelector(\"#close-modal\");\n if (closeSaveManager) {\n closeSaveManager.addEventListener(\"click\", () => this.saveManager.classList.add(\"hidden\"));\n }\n const backupSaves = this.saveManager.querySelector(\"#backup-saves\");\n if (backupSaves) {\n backupSaves.addEventListener(\"click\", this.backupSaves.bind(this));\n }\n this.contextMenuElement = this.shadow.getElementById(\"context-menu\");\n window.addEventListener(\"pointerdown\", this.checkIfTouch.bind(this));\n this.addEventListener(\"contextmenu\", this.showContextMenu.bind(this));\n this.container.addEventListener(\"pointerdown\", this.pointerDown.bind(this));\n this.container.addEventListener(\"pointermove\", this.checkLongPressMovement.bind(this));\n this.container.addEventListener(\"pointerup\", this.checkLongPress.bind(this));\n this.container.addEventListener(\"pointercancel\", this.clearLongPressTimer.bind(this));\n this.addEventListener(\"fullscreenchange\", this.fullScreenChange.bind(this));\n this.addEventListener(\"webkitfullscreenchange\", this.fullScreenChange.bind(this));\n this.instance = null;\n this.onFSCommand = null;\n this._readyState = 0 /* ReadyState.HaveNothing */;\n this._metadata = null;\n this.lastActivePlayingState = false;\n this.setupPauseOnTabHidden();\n }\n /**\n * Setup event listener to detect when tab is not active to pause instance playback.\n * this.instance.play() is called when the tab becomes visible only if the\n * the instance was not paused before tab became hidden.\n *\n * See: https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API\n * @ignore\n * @internal\n */\n setupPauseOnTabHidden() {\n document.addEventListener(\"visibilitychange\", () => {\n if (!this.instance) {\n return;\n }\n // Tab just changed to be inactive. Record whether instance was playing.\n if (document.hidden) {\n this.lastActivePlayingState = this.instance.is_playing();\n this.instance.pause();\n }\n // Play only if instance was playing originally.\n if (!document.hidden && this.lastActivePlayingState === true) {\n this.instance.play();\n }\n }, false);\n }\n /**\n * @ignore\n * @internal\n */\n connectedCallback() {\n this.updateStyles();\n }\n /**\n * @ignore\n * @internal\n */\n static get observedAttributes() {\n return [\"width\", \"height\"];\n }\n /**\n * @ignore\n * @internal\n */\n attributeChangedCallback(name, _oldValue, _newValue) {\n if (name === \"width\" || name === \"height\") {\n this.updateStyles();\n }\n }\n /**\n * @ignore\n * @internal\n */\n disconnectedCallback() {\n this.destroy();\n }\n /**\n * Updates the internal shadow DOM to reflect any set attributes from\n * this element.\n */\n updateStyles() {\n if (this.dynamicStyles.sheet) {\n if (this.dynamicStyles.sheet.rules) {\n for (let i = 0; i < this.dynamicStyles.sheet.rules.length; i++) {\n this.dynamicStyles.sheet.deleteRule(i);\n }\n }\n const widthAttr = this.attributes.getNamedItem(\"width\");\n if (widthAttr !== undefined && widthAttr !== null) {\n const width = RufflePlayer.htmlDimensionToCssDimension(widthAttr.value);\n if (width !== null) {\n this.dynamicStyles.sheet.insertRule(`:host { width: ${width}; }`);\n }\n }\n const heightAttr = this.attributes.getNamedItem(\"height\");\n if (heightAttr !== undefined && heightAttr !== null) {\n const height = RufflePlayer.htmlDimensionToCssDimension(heightAttr.value);\n if (height !== null) {\n this.dynamicStyles.sheet.insertRule(`:host { height: ${height}; }`);\n }\n }\n }\n }\n /**\n * Determine if this element is the fallback content of another Ruffle\n * player.\n *\n * This heuristic assumes Ruffle objects will never use their fallback\n * content. If this changes, then this code also needs to change.\n *\n * @private\n */\n isUnusedFallbackObject() {\n const element = lookupElement(\"ruffle-object\");\n if (element !== null) {\n let parent = this.parentNode;\n while (parent !== document && parent !== null) {\n if (parent.nodeName === element.name) {\n return true;\n }\n parent = parent.parentNode;\n }\n }\n return false;\n }\n /**\n * Ensure a fresh Ruffle instance is ready on this player before continuing.\n *\n * @throws Any exceptions generated by loading Ruffle Core will be logged\n * and passed on.\n *\n * @private\n */\n async ensureFreshInstance() {\n var _a;\n this.destroy();\n if (this.loadedConfig &&\n this.loadedConfig.splashScreen !== false &&\n this.loadedConfig.preloader !== false) {\n this.showSplashScreen();\n }\n if (this.loadedConfig && this.loadedConfig.preloader === false) {\n console.warn(\"The configuration option preloader has been replaced with splashScreen. If you own this website, please update the configuration.\");\n }\n if (this.loadedConfig &&\n this.loadedConfig.maxExecutionDuration &&\n typeof this.loadedConfig.maxExecutionDuration !== \"number\") {\n console.warn(\"Configuration: An obsolete format for duration for 'maxExecutionDuration' was used, \" +\n \"please use a single number indicating seconds instead. For instance '15' instead of \" +\n \"'{secs: 15, nanos: 0}'.\");\n }\n const ruffleConstructor = await loadRuffle(this.loadedConfig || {}, this.onRuffleDownloadProgress.bind(this)).catch((e) => {\n console.error(`Serious error loading Ruffle: ${e}`);\n // Serious duck typing. In error conditions, let's not make assumptions.\n if (window.location.protocol === \"file:\") {\n e.ruffleIndexError = 2 /* PanicError.FileProtocol */;\n }\n else {\n e.ruffleIndexError = 9 /* PanicError.WasmNotFound */;\n const message = String(e.message).toLowerCase();\n if (message.includes(\"mime\")) {\n e.ruffleIndexError = 8 /* PanicError.WasmMimeType */;\n }\n else if (message.includes(\"networkerror\") ||\n message.includes(\"failed to fetch\")) {\n e.ruffleIndexError = 6 /* PanicError.WasmCors */;\n }\n else if (message.includes(\"disallowed by embedder\")) {\n e.ruffleIndexError = 1 /* PanicError.CSPConflict */;\n }\n else if (e.name === \"CompileError\") {\n e.ruffleIndexError = 3 /* PanicError.InvalidWasm */;\n }\n else if (message.includes(\"could not download wasm module\") &&\n e.name === \"TypeError\") {\n e.ruffleIndexError = 7 /* PanicError.WasmDownload */;\n }\n else if (e.name === \"TypeError\") {\n e.ruffleIndexError = 5 /* PanicError.JavascriptConflict */;\n }\n else if (navigator.userAgent.includes(\"Edg\") &&\n message.includes(\"webassembly is not defined\")) {\n // Microsoft Edge detection.\n e.ruffleIndexError = 10 /* PanicError.WasmDisabledMicrosoftEdge */;\n }\n }\n this.panic(e);\n throw e;\n });\n this.instance = await new ruffleConstructor(this.container, this, this.loadedConfig);\n this._cachedDebugInfo = this.instance.renderer_debug_info();\n const actuallyUsedRendererName = this.instance.renderer_name();\n console.log(\"%c\" +\n \"New Ruffle instance created (WebAssembly extensions: \" +\n (ruffleConstructor.is_wasm_simd_used() ? \"ON\" : \"OFF\") +\n \" | Used renderer: \" +\n (actuallyUsedRendererName !== null && actuallyUsedRendererName !== void 0 ? actuallyUsedRendererName : \"\") +\n \")\", \"background: #37528C; color: #FFAD33\");\n // In Firefox, AudioContext.state is always \"suspended\" when the object has just been created.\n // It may change by itself to \"running\" some milliseconds later. So we need to wait a little\n // bit before checking if autoplay is supported and applying the instance config.\n if (this.audioState() !== \"running\") {\n this.container.style.visibility = \"hidden\";\n await new Promise((resolve) => {\n window.setTimeout(() => {\n resolve();\n }, 200);\n });\n this.container.style.visibility = \"\";\n }\n this.unmuteAudioContext();\n // On Android, the virtual keyboard needs to be dismissed as otherwise it re-focuses when clicking elsewhere\n if (navigator.userAgent.toLowerCase().includes(\"android\")) {\n this.container.addEventListener(\"click\", () => this.virtualKeyboard.blur());\n }\n // Treat invalid values as `AutoPlay.Auto`.\n if (!this.loadedConfig ||\n this.loadedConfig.autoplay === \"on\" /* AutoPlay.On */ ||\n (this.loadedConfig.autoplay !== \"off\" /* AutoPlay.Off */ &&\n this.audioState() === \"running\")) {\n this.play();\n if (this.audioState() !== \"running\") {\n // Treat invalid values as `UnmuteOverlay.Visible`.\n if (!this.loadedConfig ||\n this.loadedConfig.unmuteOverlay !== \"hidden\" /* UnmuteOverlay.Hidden */) {\n this.unmuteOverlay.style.display = \"block\";\n }\n this.container.addEventListener(\"click\", this.unmuteOverlayClicked.bind(this), {\n once: true,\n });\n const audioContext = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.audio_context();\n if (audioContext) {\n audioContext.onstatechange = () => {\n if (audioContext.state === \"running\") {\n this.unmuteOverlayClicked();\n }\n audioContext.onstatechange = null;\n };\n }\n }\n }\n else {\n this.playButton.style.display = \"block\";\n }\n }\n /**\n * Uploads the splash screen progress bar.\n *\n * @param bytesLoaded The size of the Ruffle WebAssembly file downloaded so far.\n * @param bytesTotal The total size of the Ruffle WebAssembly file.\n */\n onRuffleDownloadProgress(bytesLoaded, bytesTotal) {\n const loadBar = (this.splashScreen.querySelector(\".loadbar-inner\"));\n const outerLoadbar = (this.splashScreen.querySelector(\".loadbar\"));\n if (Number.isNaN(bytesTotal)) {\n if (outerLoadbar) {\n outerLoadbar.style.display = \"none\";\n }\n }\n else {\n loadBar.style.width = `${100.0 * (bytesLoaded / bytesTotal)}%`;\n }\n }\n /**\n * Destroys the currently running instance of Ruffle.\n */\n destroy() {\n if (this.instance) {\n this.instance.destroy();\n this.instance = null;\n this._metadata = null;\n this._readyState = 0 /* ReadyState.HaveNothing */;\n console.log(\"Ruffle instance destroyed.\");\n }\n }\n checkOptions(options) {\n if (typeof options === \"string\") {\n return { url: options };\n }\n const check = (condition, message) => {\n if (!condition) {\n const error = new TypeError(message);\n error.ruffleIndexError = 4 /* PanicError.JavascriptConfiguration */;\n this.panic(error);\n throw error;\n }\n };\n check(options !== null && typeof options === \"object\", \"Argument 0 must be a string or object\");\n check(\"url\" in options || \"data\" in options, \"Argument 0 must contain a `url` or `data` key\");\n check(!(\"url\" in options) || typeof options.url === \"string\", \"`url` must be a string\");\n return options;\n }\n /**\n * Gets the configuration set by the Ruffle extension\n *\n * @returns The configuration set by the Ruffle extension\n */\n getExtensionConfig() {\n var _a;\n return window.RufflePlayer &&\n window.RufflePlayer.conflict &&\n (window.RufflePlayer.conflict[\"newestName\"] === \"extension\" ||\n window.RufflePlayer[\"newestName\"] === \"extension\")\n ? (_a = window.RufflePlayer) === null || _a === void 0 ? void 0 : _a.conflict[\"config\"]\n : {};\n }\n /**\n * Loads a specified movie into this player.\n *\n * This will replace any existing movie that may be playing.\n *\n * @param options One of the following:\n * - A URL, passed as a string, which will load a URL with default options.\n * - A [[URLLoadOptions]] object, to load a URL with options.\n * - A [[DataLoadOptions]] object, to load data with options.\n *\n * The options will be defaulted by the [[config]] field, which itself\n * is defaulted by a global `window.RufflePlayer.config`.\n */\n async load(options) {\n var _a, _b;\n options = this.checkOptions(options);\n if (!this.isConnected || this.isUnusedFallbackObject()) {\n console.warn(\"Ignoring attempt to play a disconnected or suspended Ruffle element\");\n return;\n }\n if (isFallbackElement(this)) {\n // Silently fail on attempt to play a Ruffle element inside a specific node.\n return;\n }\n try {\n const extensionConfig = this.getExtensionConfig();\n this.loadedConfig = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, DEFAULT_CONFIG), extensionConfig), ((_b = (_a = window.RufflePlayer) === null || _a === void 0 ? void 0 : _a.config) !== null && _b !== void 0 ? _b : {})), this.config), options);\n // `allowScriptAccess` can only be set in `options`.\n this.loadedConfig.allowScriptAccess =\n options.allowScriptAccess === true;\n // Pre-emptively set background color of container while Ruffle/SWF loads.\n if (this.loadedConfig.backgroundColor &&\n this.loadedConfig.wmode !== \"transparent\" /* WindowMode.Transparent */) {\n this.container.style.backgroundColor =\n this.loadedConfig.backgroundColor;\n }\n await this.ensureFreshInstance();\n if (\"url\" in options) {\n console.log(`Loading SWF file ${options.url}`);\n this.swfUrl = new URL(options.url, document.baseURI);\n const parameters = Object.assign(Object.assign({}, sanitizeParameters(options.url.substring(options.url.indexOf(\"?\")))), sanitizeParameters(options.parameters));\n this.instance.stream_from(this.swfUrl.href, parameters);\n }\n else if (\"data\" in options) {\n console.log(\"Loading SWF data\");\n this.instance.load_data(new Uint8Array(options.data), sanitizeParameters(options.parameters), options.swfFileName || \"movie.swf\");\n }\n }\n catch (e) {\n console.error(`Serious error occurred loading SWF file: ${e}`);\n const err = new Error(e);\n if (err.message.includes(\"Error parsing config\")) {\n err.ruffleIndexError = 4 /* PanicError.JavascriptConfiguration */;\n }\n this.panic(err);\n throw err;\n }\n }\n /**\n * Plays or resumes the movie.\n */\n play() {\n if (this.instance) {\n this.instance.play();\n this.playButton.style.display = \"none\";\n }\n }\n /**\n * Whether this player is currently playing.\n *\n * @returns True if this player is playing, false if it's paused or hasn't started yet.\n */\n get isPlaying() {\n if (this.instance) {\n return this.instance.is_playing();\n }\n return false;\n }\n /**\n * Returns the master volume of the player.\n *\n * @returns The volume. 1.0 is 100% volume.\n */\n get volume() {\n if (this.instance) {\n return this.instance.volume();\n }\n return 1.0;\n }\n /**\n * Sets the master volume of the player.\n *\n * @param value The volume. 1.0 is 100% volume.\n */\n set volume(value) {\n if (this.instance) {\n this.instance.set_volume(value);\n }\n }\n /**\n * Checks if this player is allowed to be fullscreen by the browser.\n *\n * @returns True if you may call [[enterFullscreen]].\n */\n get fullscreenEnabled() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled);\n }\n /**\n * Checks if this player is currently fullscreen inside the browser.\n *\n * @returns True if it is fullscreen.\n */\n get isFullscreen() {\n return ((document.fullscreenElement || document.webkitFullscreenElement) ===\n this);\n }\n /**\n * Exported function that requests the browser to change the fullscreen state if\n * it is allowed.\n *\n * @param isFull Whether to set to fullscreen or return to normal.\n */\n setFullscreen(isFull) {\n if (this.fullscreenEnabled) {\n if (isFull) {\n this.enterFullscreen();\n }\n else {\n this.exitFullscreen();\n }\n }\n }\n /**\n * Requests the browser to make this player fullscreen.\n *\n * This is not guaranteed to succeed, please check [[fullscreenEnabled]] first.\n */\n enterFullscreen() {\n const options = {\n navigationUI: \"hide\",\n };\n if (this.requestFullscreen) {\n this.requestFullscreen(options);\n }\n else if (this.webkitRequestFullscreen) {\n this.webkitRequestFullscreen(options);\n }\n else if (this.webkitRequestFullScreen) {\n this.webkitRequestFullScreen(options);\n }\n }\n /**\n * Requests the browser to no longer make this player fullscreen.\n */\n exitFullscreen() {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n }\n else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n else if (document.webkitCancelFullScreen) {\n document.webkitCancelFullScreen();\n }\n }\n /**\n * Called when entering / leaving fullscreen\n */\n fullScreenChange() {\n var _a;\n (_a = this.instance) === null || _a === void 0 ? void 0 : _a.set_fullscreen(this.isFullscreen);\n }\n checkIfTouch(event) {\n if (event.pointerType === \"touch\" || event.pointerType === \"pen\") {\n this.isTouch = true;\n }\n }\n base64ToBlob(bytesBase64, mimeString) {\n const byteString = atob(bytesBase64);\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n const blob = new Blob([ab], { type: mimeString });\n return blob;\n }\n /**\n * Download base-64 string as file\n *\n * @param bytesBase64 The base-64 encoded SOL string\n * @param mimeType The MIME type\n * @param fileName The name to give the file\n */\n saveFile(bytesBase64, mimeType, fileName) {\n const blob = this.base64ToBlob(bytesBase64, mimeType);\n const blobURL = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = blobURL;\n link.style.display = \"none\";\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(blobURL);\n }\n /**\n * @returns If the string represent a base-64 encoded SOL file\n * Check if string is a base-64 encoded SOL file\n * @param solData The base-64 encoded SOL string\n */\n isB64SOL(solData) {\n try {\n const decodedData = atob(solData);\n return decodedData.slice(6, 10) === \"TCSO\";\n }\n catch (e) {\n return false;\n }\n }\n confirmReloadSave(solKey, b64SolData, replace) {\n if (this.isB64SOL(b64SolData)) {\n if (localStorage[solKey]) {\n if (!replace) {\n const confirmDelete = confirm(\"Are you sure you want to delete this save file?\");\n if (!confirmDelete) {\n return;\n }\n }\n const swfPath = this.swfUrl ? this.swfUrl.pathname : \"\";\n const swfHost = this.swfUrl\n ? this.swfUrl.hostname\n : document.location.hostname;\n const savePath = solKey.split(\"/\").slice(1, -1).join(\"/\");\n if (swfPath.includes(savePath) && solKey.startsWith(swfHost)) {\n const confirmReload = confirm(`The only way to ${replace ? \"replace\" : \"delete\"} this save file without potential conflict is to reload this content. Do you wish to continue anyway?`);\n if (confirmReload && this.loadedConfig) {\n this.destroy();\n replace\n ? localStorage.setItem(solKey, b64SolData)\n : localStorage.removeItem(solKey);\n this.load(this.loadedConfig);\n this.populateSaves();\n this.saveManager.classList.add(\"hidden\");\n }\n return;\n }\n replace\n ? localStorage.setItem(solKey, b64SolData)\n : localStorage.removeItem(solKey);\n this.populateSaves();\n this.saveManager.classList.add(\"hidden\");\n }\n }\n }\n /**\n * Replace save from SOL file.\n *\n * @param event The change event fired\n * @param solKey The localStorage save file key\n */\n replaceSOL(event, solKey) {\n const fileInput = event.target;\n const reader = new FileReader();\n reader.addEventListener(\"load\", () => {\n if (reader.result && typeof reader.result === \"string\") {\n const b64Regex = new RegExp(\"data:.*;base64,\");\n const b64SolData = reader.result.replace(b64Regex, \"\");\n this.confirmReloadSave(solKey, b64SolData, true);\n }\n });\n if (fileInput &&\n fileInput.files &&\n fileInput.files.length > 0 &&\n fileInput.files[0]) {\n reader.readAsDataURL(fileInput.files[0]);\n }\n }\n /**\n * Delete local save.\n *\n * @param key The key to remove from local storage\n */\n deleteSave(key) {\n const b64SolData = localStorage.getItem(key);\n if (b64SolData) {\n this.confirmReloadSave(key, b64SolData, false);\n }\n }\n /**\n * Puts the local save SOL file keys in a table.\n */\n populateSaves() {\n const saveTable = this.saveManager.querySelector(\"#local-saves\");\n if (!saveTable) {\n return;\n }\n try {\n localStorage;\n }\n catch (e) {\n return;\n }\n saveTable.textContent = \"\";\n Object.keys(localStorage).forEach((key) => {\n const solName = key.split(\"/\").pop();\n const solData = localStorage.getItem(key);\n if (solName && solData && this.isB64SOL(solData)) {\n const row = document.createElement(\"TR\");\n const keyCol = document.createElement(\"TD\");\n keyCol.textContent = solName;\n keyCol.title = key;\n const downloadCol = document.createElement(\"TD\");\n const downloadSpan = document.createElement(\"SPAN\");\n downloadSpan.textContent = \"Download\";\n downloadSpan.className = \"save-option\";\n downloadSpan.addEventListener(\"click\", () => this.saveFile(solData, \"application/octet-stream\", solName + \".sol\"));\n downloadCol.appendChild(downloadSpan);\n const replaceCol = document.createElement(\"TD\");\n const replaceInput = (document.createElement(\"INPUT\"));\n replaceInput.type = \"file\";\n replaceInput.accept = \".sol\";\n replaceInput.className = \"replace-save\";\n replaceInput.id = \"replace-save-\" + key;\n const replaceLabel = (document.createElement(\"LABEL\"));\n replaceLabel.htmlFor = \"replace-save-\" + key;\n replaceLabel.textContent = \"Replace\";\n replaceLabel.className = \"save-option\";\n replaceInput.addEventListener(\"change\", (event) => this.replaceSOL(event, key));\n replaceCol.appendChild(replaceInput);\n replaceCol.appendChild(replaceLabel);\n const deleteCol = document.createElement(\"TD\");\n const deleteSpan = document.createElement(\"SPAN\");\n deleteSpan.textContent = \"Delete\";\n deleteSpan.className = \"save-option\";\n deleteSpan.addEventListener(\"click\", () => this.deleteSave(key));\n deleteCol.appendChild(deleteSpan);\n row.appendChild(keyCol);\n row.appendChild(downloadCol);\n row.appendChild(replaceCol);\n row.appendChild(deleteCol);\n saveTable.appendChild(row);\n }\n });\n }\n /**\n * Gets the local save information as SOL files and downloads them.\n */\n backupSaves() {\n Object.keys(localStorage).forEach((key) => {\n const solName = key.split(\"/\").pop();\n const solData = localStorage.getItem(key);\n if (solData && this.isB64SOL(solData)) {\n this.saveFile(solData, \"application/octet-stream\", solName + \".sol\");\n }\n });\n }\n /**\n * Opens the save manager.\n */\n openSaveManager() {\n this.saveManager.classList.remove(\"hidden\");\n }\n /**\n * Fetches the loaded SWF and downloads it.\n */\n async downloadSwf() {\n try {\n if (this.swfUrl) {\n console.log(\"Downloading SWF: \" + this.swfUrl);\n const response = await fetch(this.swfUrl.href);\n if (!response.ok) {\n console.error(\"SWF download failed\");\n return;\n }\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n const swfDownloadA = document.createElement(\"a\");\n swfDownloadA.style.display = \"none\";\n swfDownloadA.href = blobUrl;\n swfDownloadA.download = swfFileName(this.swfUrl);\n document.body.appendChild(swfDownloadA);\n swfDownloadA.click();\n document.body.removeChild(swfDownloadA);\n URL.revokeObjectURL(blobUrl);\n }\n else {\n console.error(\"SWF download failed\");\n }\n }\n catch (err) {\n console.error(\"SWF download failed\");\n }\n }\n virtualKeyboardInput() {\n const input = this.virtualKeyboard;\n const string = input.value;\n for (const char of string) {\n for (const eventType of [\"keydown\", \"keyup\"]) {\n this.dispatchEvent(new KeyboardEvent(eventType, {\n key: char,\n bubbles: true,\n }));\n }\n }\n input.value = \"\";\n }\n openVirtualKeyboard() {\n // On Android, the Rust code that opens the virtual keyboard triggers\n // before the TypeScript code that closes it, so delay opening it\n if (navigator.userAgent.toLowerCase().includes(\"android\")) {\n setTimeout(() => {\n this.virtualKeyboard.focus({ preventScroll: true });\n }, 100);\n }\n else {\n this.virtualKeyboard.focus({ preventScroll: true });\n }\n }\n contextMenuItems() {\n const CHECKMARK = String.fromCharCode(0x2713);\n const items = [];\n const addSeparator = () => {\n // Don't start with or duplicate separators.\n if (items.length > 0 && items[items.length - 1] !== null) {\n items.push(null);\n }\n };\n if (this.instance) {\n const customItems = this.instance.prepare_context_menu();\n customItems.forEach((item, index) => {\n if (item.separatorBefore) {\n addSeparator();\n }\n items.push({\n // TODO: better checkboxes\n text: item.caption + (item.checked ? ` (${CHECKMARK})` : ``),\n onClick: () => { var _a; return (_a = this.instance) === null || _a === void 0 ? void 0 : _a.run_context_menu_callback(index); },\n enabled: item.enabled,\n });\n });\n addSeparator();\n }\n if (this.fullscreenEnabled) {\n if (this.isFullscreen) {\n items.push({\n text: \"Exit fullscreen\",\n onClick: () => { var _a; return (_a = this.instance) === null || _a === void 0 ? void 0 : _a.set_fullscreen(false); },\n });\n }\n else {\n items.push({\n text: \"Enter fullscreen\",\n onClick: () => { var _a; return (_a = this.instance) === null || _a === void 0 ? void 0 : _a.set_fullscreen(true); },\n });\n }\n }\n if (this.instance &&\n this.swfUrl &&\n this.loadedConfig &&\n this.loadedConfig.showSwfDownload === true) {\n addSeparator();\n items.push({\n text: \"Download .swf\",\n onClick: this.downloadSwf.bind(this),\n });\n }\n if (window.isSecureContext) {\n items.push({\n text: \"Copy debug info\",\n onClick: () => navigator.clipboard.writeText(this.getPanicData()),\n });\n }\n this.populateSaves();\n const localSaveTable = this.saveManager.querySelector(\"#local-saves\");\n if (localSaveTable && localSaveTable.textContent !== \"\") {\n items.push({\n text: \"Open Save Manager\",\n onClick: this.openSaveManager.bind(this),\n });\n }\n addSeparator();\n const extensionString = this.isExtension ? \"extension\" : \"\";\n items.push({\n text: `About Ruffle ${extensionString} (${buildInfo.versionName})`,\n onClick() {\n window.open(RUFFLE_ORIGIN, \"_blank\");\n },\n });\n // Give option to disable context menu when touch support is being used\n // to avoid a long press triggering the context menu. (#1972)\n if (this.isTouch) {\n addSeparator();\n items.push({\n text: \"Hide this menu\",\n onClick: () => (this.contextMenuForceDisabled = true),\n });\n }\n return items;\n }\n pointerDown(event) {\n this.pointerDownPosition = new Point(event.pageX, event.pageY);\n this.pointerMoveMaxDistance = 0;\n this.startLongPressTimer();\n }\n clearLongPressTimer() {\n if (this.longPressTimer) {\n clearTimeout(this.longPressTimer);\n this.longPressTimer = null;\n }\n }\n startLongPressTimer() {\n const longPressTimeout = 800;\n this.clearLongPressTimer();\n this.longPressTimer = setTimeout(() => this.clearLongPressTimer(), longPressTimeout);\n }\n checkLongPressMovement(event) {\n if (this.pointerDownPosition !== null) {\n const currentPosition = new Point(event.pageX, event.pageY);\n const distance = this.pointerDownPosition.distanceTo(currentPosition);\n if (distance > this.pointerMoveMaxDistance) {\n this.pointerMoveMaxDistance = distance;\n }\n }\n }\n checkLongPress(event) {\n const maxAllowedDistance = 15;\n if (this.longPressTimer) {\n this.clearLongPressTimer();\n // The pointerType condition is to ensure right-click does not trigger\n // a context menu the wrong way the first time you right-click,\n // before contextMenuSupported is set.\n }\n else if (!this.contextMenuSupported &&\n event.pointerType !== \"mouse\" &&\n this.pointerMoveMaxDistance < maxAllowedDistance) {\n this.showContextMenu(event);\n }\n }\n showContextMenu(event) {\n event.preventDefault();\n if (event.type === \"contextmenu\") {\n this.contextMenuSupported = true;\n window.addEventListener(\"click\", this.hideContextMenu.bind(this), {\n once: true,\n });\n }\n else {\n window.addEventListener(\"pointerup\", this.hideContextMenu.bind(this), { once: true });\n event.stopPropagation();\n }\n if ((this.loadedConfig && this.loadedConfig.contextMenu === false) ||\n this.contextMenuForceDisabled) {\n return;\n }\n // Clear all context menu items.\n while (this.contextMenuElement.firstChild) {\n this.contextMenuElement.removeChild(this.contextMenuElement.firstChild);\n }\n // Populate context menu items.\n for (const item of this.contextMenuItems()) {\n if (item === null) {\n const menuSeparator = document.createElement(\"li\");\n menuSeparator.className = \"menu_separator\";\n const hr = document.createElement(\"hr\");\n menuSeparator.appendChild(hr);\n this.contextMenuElement.appendChild(menuSeparator);\n }\n else {\n const { text, onClick, enabled } = item;\n const menuItem = document.createElement(\"li\");\n menuItem.className = \"menu_item\";\n menuItem.textContent = text;\n this.contextMenuElement.appendChild(menuItem);\n if (enabled !== false) {\n menuItem.addEventListener(this.contextMenuSupported ? \"click\" : \"pointerup\", onClick);\n }\n else {\n menuItem.classList.add(\"disabled\");\n }\n }\n }\n // Place a context menu in the top-left corner, so\n // its `clientWidth` and `clientHeight` are not clamped.\n this.contextMenuElement.style.left = \"0\";\n this.contextMenuElement.style.top = \"0\";\n this.contextMenuElement.style.display = \"block\";\n const rect = this.getBoundingClientRect();\n const x = event.clientX - rect.x;\n const y = event.clientY - rect.y;\n const maxX = rect.width - this.contextMenuElement.clientWidth - 1;\n const maxY = rect.height - this.contextMenuElement.clientHeight - 1;\n this.contextMenuElement.style.left =\n Math.floor(Math.min(x, maxX)) + \"px\";\n this.contextMenuElement.style.top =\n Math.floor(Math.min(y, maxY)) + \"px\";\n }\n hideContextMenu() {\n var _a;\n (_a = this.instance) === null || _a === void 0 ? void 0 : _a.clear_custom_menu_items();\n this.contextMenuElement.style.display = \"none\";\n }\n /**\n * Pauses this player.\n *\n * No more frames, scripts or sounds will be executed.\n * This movie will be considered inactive and will not wake up until resumed.\n */\n pause() {\n if (this.instance) {\n this.instance.pause();\n this.playButton.style.display = \"block\";\n }\n }\n audioState() {\n if (this.instance) {\n const audioContext = this.instance.audio_context();\n return (audioContext && audioContext.state) || \"running\";\n }\n return \"suspended\";\n }\n unmuteOverlayClicked() {\n if (this.instance) {\n if (this.audioState() !== \"running\") {\n const audioContext = this.instance.audio_context();\n if (audioContext) {\n audioContext.resume();\n }\n }\n this.unmuteOverlay.style.display = \"none\";\n }\n }\n /**\n * Plays a silent sound based on the AudioContext's sample rate.\n *\n * This is used to unmute audio on iOS and iPadOS when silent mode is enabled on the device (issue 1552).\n */\n unmuteAudioContext() {\n // No need to play the dummy sound again once audio is unmuted.\n if (isAudioContextUnmuted) {\n return;\n }\n // TODO: Use `navigator.userAgentData` to detect the platform when support improves?\n if (navigator.maxTouchPoints < 1) {\n isAudioContextUnmuted = true;\n return;\n }\n this.container.addEventListener(\"click\", () => {\n var _a;\n if (isAudioContextUnmuted) {\n return;\n }\n const audioContext = (_a = this.instance) === null || _a === void 0 ? void 0 : _a.audio_context();\n if (!audioContext) {\n return;\n }\n const audio = new Audio();\n audio.src = (() => {\n // Returns a seven samples long 8 bit mono WAVE file.\n // This is required to prevent the AudioContext from desyncing and crashing.\n const arrayBuffer = new ArrayBuffer(10);\n const dataView = new DataView(arrayBuffer);\n const sampleRate = audioContext.sampleRate;\n dataView.setUint32(0, sampleRate, true);\n dataView.setUint32(4, sampleRate, true);\n dataView.setUint16(8, 1, true);\n const missingCharacters = window\n .btoa(String.fromCharCode(...new Uint8Array(arrayBuffer)))\n .slice(0, 13);\n return `data:audio/wav;base64,UklGRisAAABXQVZFZm10IBAAAAABAAEA${missingCharacters}AgAZGF0YQcAAACAgICAgICAAAA=`;\n })();\n audio.load();\n audio\n .play()\n .then(() => {\n isAudioContextUnmuted = true;\n })\n .catch((err) => {\n console.warn(`Failed to play dummy sound: ${err}`);\n });\n }, { once: true });\n }\n /**\n * Copies attributes and children from another element to this player element.\n * Used by the polyfill elements, RuffleObject and RuffleEmbed.\n *\n * @param element The element to copy all attributes from.\n */\n copyElement(element) {\n if (element) {\n for (const attribute of element.attributes) {\n if (attribute.specified) {\n // Issue 468: Chrome \"Click to Active Flash\" box stomps on title attribute\n if (attribute.name === \"title\" &&\n attribute.value === \"Adobe Flash Player\") {\n continue;\n }\n try {\n this.setAttribute(attribute.name, attribute.value);\n }\n catch (err) {\n // The embed may have invalid attributes, so handle these gracefully.\n console.warn(`Unable to set attribute ${attribute.name} on Ruffle instance`);\n }\n }\n }\n for (const node of Array.from(element.children)) {\n this.appendChild(node);\n }\n }\n }\n /**\n * Converts a dimension attribute on an HTML embed/object element to a valid CSS dimension.\n * HTML element dimensions are unitless, but can also be percentages.\n * Add a 'px' unit unless the value is a percentage.\n * Returns null if this is not a valid dimension.\n *\n * @param attribute The attribute to convert\n *\n * @private\n */\n static htmlDimensionToCssDimension(attribute) {\n if (attribute) {\n const match = attribute.match(DIMENSION_REGEX);\n if (match) {\n let out = match[1];\n if (!match[3]) {\n // Unitless -- add px for CSS.\n out += \"px\";\n }\n return out;\n }\n }\n return null;\n }\n /**\n * When a movie presents a new callback through `ExternalInterface.addCallback`,\n * we are informed so that we can expose the method on any relevant DOM element.\n *\n * This should only be called by Ruffle itself and not by users.\n *\n * @param name The name of the callback that is now available.\n *\n * @internal\n * @ignore\n */\n onCallbackAvailable(name) {\n const instance = this.instance;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this[name] = (...args) => {\n return instance === null || instance === void 0 ? void 0 : instance.call_exposed_callback(name, args);\n };\n }\n /**\n * Sets a trace observer on this flash player.\n *\n * The observer will be called, as a function, for each message that the playing movie will \"trace\" (output).\n *\n * @param observer The observer that will be called for each trace.\n */\n set traceObserver(observer) {\n var _a;\n (_a = this.instance) === null || _a === void 0 ? void 0 : _a.set_trace_observer(observer);\n }\n /**\n * Get data included in any panic of this ruffle-player\n *\n * @returns A string containing all the data included in the panic.\n */\n getPanicData() {\n const dataArray = [];\n dataArray.push(\"\\n# Player Info\\n\");\n dataArray.push(this.debugPlayerInfo());\n dataArray.push(\"\\n# Page Info\\n\");\n dataArray.push(`Page URL: ${document.location.href}\\n`);\n if (this.swfUrl) {\n dataArray.push(`SWF URL: ${this.swfUrl}\\n`);\n }\n dataArray.push(\"\\n# Browser Info\\n\");\n dataArray.push(`User Agent: ${window.navigator.userAgent}\\n`);\n dataArray.push(`Platform: ${window.navigator.platform}\\n`);\n dataArray.push(`Has touch support: ${window.navigator.maxTouchPoints > 0}\\n`);\n dataArray.push(\"\\n# Ruffle Info\\n\");\n dataArray.push(`Version: ${buildInfo.versionNumber}\\n`);\n dataArray.push(`Name: ${buildInfo.versionName}\\n`);\n dataArray.push(`Channel: ${buildInfo.versionChannel}\\n`);\n dataArray.push(`Built: ${buildInfo.buildDate}\\n`);\n dataArray.push(`Commit: ${buildInfo.commitHash}\\n`);\n dataArray.push(`Is extension: ${this.isExtension}\\n`);\n dataArray.push(\"\\n# Metadata\\n\");\n if (this.metadata) {\n for (const [key, value] of Object.entries(this.metadata)) {\n dataArray.push(`${key}: ${value}\\n`);\n }\n }\n return dataArray.join(\"\");\n }\n /**\n * Panics this specific player, forcefully destroying all resources and displays an error message to the user.\n *\n * This should be called when something went absolutely, incredibly and disastrously wrong and there is no chance\n * of recovery.\n *\n * Ruffle will attempt to isolate all damage to this specific player instance, but no guarantees can be made if there\n * was a core issue which triggered the panic. If Ruffle is unable to isolate the cause to a specific player, then\n * all players will panic and Ruffle will become \"poisoned\" - no more players will run on this page until it is\n * reloaded fresh.\n *\n * @param error The error, if any, that triggered this panic.\n */\n panic(error) {\n var _a;\n if (this.panicked) {\n // Only show the first major error, not any repeats - they aren't as important\n return;\n }\n this.panicked = true;\n this.hideSplashScreen();\n if (error instanceof Error &&\n (error.name === \"AbortError\" ||\n error.message.includes(\"AbortError\"))) {\n // Firefox: Don't display the panic screen if the user leaves the page while something is still loading\n return;\n }\n const errorIndex = (_a = error === null || error === void 0 ? void 0 : error.ruffleIndexError) !== null && _a !== void 0 ? _a : 0 /* PanicError.Unknown */;\n const errorArray = Object.assign([], {\n stackIndex: -1,\n avmStackIndex: -1,\n });\n errorArray.push(\"# Error Info\\n\");\n if (error instanceof Error) {\n errorArray.push(`Error name: ${error.name}\\n`);\n errorArray.push(`Error message: ${error.message}\\n`);\n if (error.stack) {\n const stackIndex = errorArray.push(`Error stack:\\n\\`\\`\\`\\n${error.stack}\\n\\`\\`\\`\\n`) - 1;\n if (error.avmStack) {\n const avmStackIndex = errorArray.push(`AVM2 stack:\\n\\`\\`\\`\\n ${error.avmStack\n .trim()\n .replace(/\\t/g, \" \")}\\n\\`\\`\\`\\n`) - 1;\n errorArray.avmStackIndex = avmStackIndex;\n }\n errorArray.stackIndex = stackIndex;\n }\n }\n else {\n errorArray.push(`Error: ${error}\\n`);\n }\n errorArray.push(this.getPanicData());\n const errorText = errorArray.join(\"\");\n const buildDate = new Date(buildInfo.buildDate);\n const monthsPrior = new Date();\n monthsPrior.setMonth(monthsPrior.getMonth() - 6); // 6 months prior\n const isBuildOutdated = monthsPrior > buildDate;\n // Create a link to GitHub with all of the error data, if the build is not outdated.\n // Otherwise, create a link to the downloads section on the Ruffle website.\n let actionTag;\n if (!isBuildOutdated) {\n // Remove query params for the issue title.\n const pageUrl = document.location.href.split(/[?#]/)[0];\n const issueTitle = `Error on ${pageUrl}`;\n let issueLink = `https://github.com/ruffle-rs/ruffle/issues/new?title=${encodeURIComponent(issueTitle)}&template=error_report.md&labels=error-report&body=`;\n let issueBody = encodeURIComponent(errorText);\n if (errorArray.stackIndex > -1 &&\n String(issueLink + issueBody).length > 8195) {\n // Strip the stack error from the array when the produced URL is way too long.\n // This should prevent \"414 Request-URI Too Large\" errors on GitHub.\n errorArray[errorArray.stackIndex] = null;\n if (errorArray.avmStackIndex > -1) {\n errorArray[errorArray.avmStackIndex] = null;\n }\n issueBody = encodeURIComponent(errorArray.join(\"\"));\n }\n issueLink += issueBody;\n actionTag = `<a target=\"_top\" href=\"${issueLink}\">Report Bug</a>`;\n }\n else {\n actionTag = `<a target=\"_top\" href=\"${RUFFLE_ORIGIN}#downloads\">Update Ruffle</a>`;\n }\n // Clears out any existing content (ie play button or canvas) and replaces it with the error screen\n let errorBody, errorFooter;\n switch (errorIndex) {\n case 2 /* PanicError.FileProtocol */:\n // General error: Running on the `file:` protocol\n errorBody = `\n <p>It appears you are running Ruffle on the \"file:\" protocol.</p>\n <p>This doesn't work as browsers block many features from working for security reasons.</p>\n <p>Instead, we invite you to setup a local server or either use the web demo or the desktop application.</p>\n `;\n errorFooter = `\n <li><a target=\"_top\" href=\"${RUFFLE_ORIGIN}/demo\">Web Demo</a></li>\n <li><a target=\"_top\" href=\"${RUFFLE_ORIGIN}#downloads\">Desktop Application</a></li>\n `;\n break;\n case 4 /* PanicError.JavascriptConfiguration */:\n // General error: Incorrect JavaScript configuration\n errorBody = `\n <p>Ruffle has encountered a major issue due to an incorrect JavaScript configuration.</p>\n <p>If you are the server administrator, we invite you to check the error details to find out which parameter is at fault.</p>\n <p>You can also consult the Ruffle wiki for help.</p>\n `;\n errorFooter = `\n <li><a target=\"_top\" href=\"https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#javascript-api\">View Ruffle Wiki</a></li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 9 /* PanicError.WasmNotFound */:\n // Self hosted: Cannot load `.wasm` file - file not found\n errorBody = `\n <p>Ruffle failed to load the required \".wasm\" file component.</p>\n <p>If you are the server administrator, please ensure the file has correctly been uploaded.</p>\n <p>If the issue persists, you may need to use the \"publicPath\" setting: please consult the Ruffle wiki for help.</p>\n `;\n errorFooter = `\n <li><a target=\"_top\" href=\"https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#configuration-options\">View Ruffle Wiki</a></li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 8 /* PanicError.WasmMimeType */:\n // Self hosted: Cannot load `.wasm` file - incorrect MIME type\n errorBody = `\n <p>Ruffle has encountered a major issue whilst trying to initialize.</p>\n <p>This web server is not serving \".wasm\" files with the correct MIME type.</p>\n <p>If you are the server administrator, please consult the Ruffle wiki for help.</p>\n `;\n errorFooter = `\n <li><a target=\"_top\" href=\"https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#configure-webassembly-mime-type\">View Ruffle Wiki</a></li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 11 /* PanicError.SwfFetchError */:\n errorBody = `\n <p>Ruffle failed to load the Flash SWF file.</p>\n <p>The most likely reason is that the file no longer exists, so there is nothing for Ruffle to load.</p>\n <p>Try contacting the website administrator for help.</p>\n `;\n errorFooter = `\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 12 /* PanicError.SwfCors */:\n // Self hosted: Cannot load SWF file - CORS issues\n errorBody = `\n <p>Ruffle failed to load the Flash SWF file.</p>\n <p>Access to fetch has likely been blocked by CORS policy.</p>\n <p>If you are the server administrator, please consult the Ruffle wiki for help.</p>\n `;\n errorFooter = `\n <li><a target=\"_top\" href=\"https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#configure-cors-header\">View Ruffle Wiki</a></li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 6 /* PanicError.WasmCors */:\n // Self hosted: Cannot load `.wasm` file - CORS issues\n errorBody = `\n <p>Ruffle failed to load the required \".wasm\" file component.</p>\n <p>Access to fetch has likely been blocked by CORS policy.</p>\n <p>If you are the server administrator, please consult the Ruffle wiki for help.</p>\n `;\n errorFooter = `\n <li><a target=\"_top\" href=\"https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#configure-cors-header\">View Ruffle Wiki</a></li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 3 /* PanicError.InvalidWasm */:\n // Self hosted: Cannot load `.wasm` file - incorrect configuration or missing files\n errorBody = `\n <p>Ruffle has encountered a major issue whilst trying to initialize.</p>\n <p>It seems like this page has missing or invalid files for running Ruffle.</p>\n <p>If you are the server administrator, please consult the Ruffle wiki for help.</p>\n `;\n errorFooter = `\n <li><a target=\"_top\" href=\"https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#addressing-a-compileerror\">View Ruffle Wiki</a></li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 7 /* PanicError.WasmDownload */:\n // Usually a transient network error or botched deployment\n errorBody = `\n <p>Ruffle has encountered a major issue whilst trying to initialize.</p>\n <p>This can often resolve itself, so you can try reloading the page.</p>\n <p>Otherwise, please contact the website administrator.</p>\n `;\n errorFooter = `\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 10 /* PanicError.WasmDisabledMicrosoftEdge */:\n // Self hosted: User has disabled WebAssembly in Microsoft Edge through the\n // \"Enhance your Security on the web\" setting.\n errorBody = `\n <p>Ruffle failed to load the required \".wasm\" file component.</p>\n <p>To fix this, try opening your browser's settings, clicking \"Privacy, search, and services\", scrolling down, and turning off \"Enhance your security on the web\".</p>\n <p>This will allow your browser to load the required \".wasm\" files.</p>\n <p>If the issue persists, you might have to use a different browser.</p>\n `;\n errorFooter = `\n <li><a target=\"_top\" href=\"https://github.com/ruffle-rs/ruffle/wiki/Frequently-Asked-Questions-For-Users#edge-webassembly-error\">More Information</a></li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 5 /* PanicError.JavascriptConflict */:\n // Self hosted: Cannot load `.wasm` file - a native object / function is overriden\n errorBody = `\n <p>Ruffle has encountered a major issue whilst trying to initialize.</p>\n <p>It seems like this page uses JavaScript code that conflicts with Ruffle.</p>\n <p>If you are the server administrator, we invite you to try loading the file on a blank page.</p>\n `;\n if (isBuildOutdated) {\n errorBody += `<p>You can also try to upload a more recent version of Ruffle that may circumvent the issue (current build is outdated: ${buildInfo.buildDate}).</p>`;\n }\n errorFooter = `\n <li>${actionTag}</li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n case 1 /* PanicError.CSPConflict */:\n // General error: Cannot load `.wasm` file - a native object / function is overriden\n errorBody = `\n <p>Ruffle has encountered a major issue whilst trying to initialize.</p>\n <p>This web server's Content Security Policy does not allow the required \".wasm\" component to run.</p>\n <p>If you are the server administrator, please consult the Ruffle wiki for help.</p>\n `;\n errorFooter = `\n <li><a target=\"_top\" href=\"https://github.com/ruffle-rs/ruffle/wiki/Using-Ruffle#configure-wasm-csp\">View Ruffle Wiki</a></li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n default:\n // Unknown error\n errorBody = `<p>Ruffle has encountered a major issue whilst trying to display this Flash content.</p>`;\n if (!isBuildOutdated) {\n errorBody += `<p>This isn't supposed to happen, so we'd really appreciate if you could file a bug!</p>`;\n }\n else {\n errorBody += `<p>If you are the server administrator, please try to upload a more recent version of Ruffle (current build is outdated: ${buildInfo.buildDate}).</p>`;\n }\n errorFooter = `\n <li>${actionTag}</li>\n <li><a href=\"#\" id=\"panic-view-details\">View Error Details</a></li>\n `;\n break;\n }\n this.container.innerHTML = `\n <div id=\"panic\">\n <div id=\"panic-title\">Something went wrong :(</div>\n <div id=\"panic-body\">${errorBody}</div>\n <div id=\"panic-footer\">\n <ul>${errorFooter}</ul>\n </div>\n </div>\n `;\n const viewDetails = (this.container.querySelector(\"#panic-view-details\"));\n if (viewDetails) {\n viewDetails.onclick = () => {\n const panicBody = (this.container.querySelector(\"#panic-body\"));\n panicBody.classList.add(\"details\");\n const panicText = document.createElement(\"textarea\");\n panicText.readOnly = true;\n panicText.value = errorText;\n panicBody.replaceChildren(panicText);\n return false;\n };\n }\n // Do this last, just in case it causes any cascading issues.\n this.destroy();\n }\n displayRootMovieDownloadFailedMessage() {\n if (this.isExtension &&\n window.location.origin !== this.swfUrl.origin) {\n this.hideSplashScreen();\n const div = document.createElement(\"div\");\n div.id = \"message_overlay\";\n div.innerHTML = `<div class=\"message\">\n <p>Ruffle wasn't able to run the Flash embedded in this page.</p>\n <p>You can try to open the file in a separate tab, to sidestep this issue.</p>\n <div>\n <a target=\"_blank\" href=\"${this.swfUrl}\">Open in a new tab</a>\n </div>\n </div>`;\n this.container.prepend(div);\n }\n else {\n const error = new Error(\"Failed to fetch: \" + this.swfUrl);\n if (!this.swfUrl.protocol.includes(\"http\")) {\n error.ruffleIndexError = 2 /* PanicError.FileProtocol */;\n }\n else if (window.location.origin === this.swfUrl.origin) {\n error.ruffleIndexError = 11 /* PanicError.SwfFetchError */;\n }\n else {\n // This is a selfhosted build of Ruffle that tried to make a cross-origin request\n error.ruffleIndexError = 12 /* PanicError.SwfCors */;\n }\n this.panic(error);\n }\n }\n displayUnsupportedMessage() {\n const div = document.createElement(\"div\");\n div.id = \"message_overlay\";\n // TODO: Change link to https://ruffle.rs/faq or similar\n // TODO: Pause content until message is dismissed\n div.innerHTML = `<div class=\"message\">\n <p>The Ruffle emulator may not yet fully support all of ActionScript 3 used by this content.</p>\n <p>Some parts of the content may not work as expected.</p>\n <div>\n <a target=\"_blank\" class=\"more-info-link\" href=\"https://github.com/ruffle-rs/ruffle/wiki/Frequently-Asked-Questions-For-Users\">More info</a>\n <button id=\"run-anyway-btn\">Run anyway</button>\n </div>\n </div>`;\n this.container.prepend(div);\n const button = div.querySelector(\"#run-anyway-btn\");\n button.onclick = () => {\n div.parentNode.removeChild(div);\n };\n }\n /**\n * Show a dismissible message in front of the player.\n *\n * @param message The message shown to the user.\n */\n displayMessage(message) {\n const div = document.createElement(\"div\");\n div.id = \"message_overlay\";\n div.innerHTML = `<div class=\"message\">\n <p>${message}</p>\n <div>\n <button id=\"continue-btn\">continue</button>\n </div>\n </div>`;\n this.container.prepend(div);\n (this.container.querySelector(\"#continue-btn\")).onclick = () => {\n div.parentNode.removeChild(div);\n };\n }\n debugPlayerInfo() {\n let result = `Allows script access: ${this.loadedConfig ? this.loadedConfig.allowScriptAccess : false}\\n`;\n let renderInfo = `(Cached) ${this._cachedDebugInfo}`;\n if (this.instance) {\n try {\n renderInfo = this.instance.renderer_debug_info();\n }\n catch (_a) {\n // ignored\n }\n }\n if (renderInfo) {\n result += `${renderInfo}\\n`;\n }\n return result;\n }\n hideSplashScreen() {\n this.splashScreen.classList.add(\"hidden\");\n this.container.classList.remove(\"hidden\");\n }\n showSplashScreen() {\n this.splashScreen.classList.remove(\"hidden\");\n this.container.classList.add(\"hidden\");\n }\n setMetadata(metadata) {\n this._metadata = metadata;\n // TODO: Switch this to ReadyState.Loading when we have streaming support.\n this._readyState = 2 /* ReadyState.Loaded */;\n this.hideSplashScreen();\n this.dispatchEvent(new Event(RufflePlayer.LOADED_METADATA));\n // TODO: Move this to whatever function changes the ReadyState to Loaded when we have streaming support.\n this.dispatchEvent(new Event(RufflePlayer.LOADED_DATA));\n }\n setIsExtension(isExtension) {\n this.isExtension = isExtension;\n }\n}\n/**\n * Triggered when a movie metadata has been loaded (such as movie width and height).\n *\n * @event RufflePlayer#loadedmetadata\n */\nRufflePlayer.LOADED_METADATA = \"loadedmetadata\";\n/**\n * Triggered when a movie is fully loaded.\n *\n * @event RufflePlayer#loadeddata\n */\nRufflePlayer.LOADED_DATA = \"loadeddata\";\nexport { RufflePlayer };\n/**\n * Returns whether a SWF file can call JavaScript code in the surrounding HTML file.\n *\n * @param access The value of the `allowScriptAccess` attribute.\n * @param url The URL of the SWF file.\n * @returns True if script access is allowed.\n */\nexport function isScriptAccessAllowed(access, url) {\n if (!access) {\n access = \"sameDomain\";\n }\n switch (access.toLowerCase()) {\n case \"always\":\n return true;\n case \"never\":\n return false;\n case \"samedomain\":\n default:\n try {\n return (new URL(window.location.href).origin ===\n new URL(url, window.location.href).origin);\n }\n catch (_a) {\n return false;\n }\n }\n}\n/**\n * Returns whether a SWF file should show the built-in context menu items.\n *\n * @param menu The value of the `menu` attribute.\n * @returns True if the built-in context items should be shown.\n */\nexport function isBuiltInContextMenuVisible(menu) {\n if (menu === null || menu.toLowerCase() === \"true\") {\n return true;\n }\n return false;\n}\n/**\n * Returns whether the given filename is a Youtube Flash source.\n *\n * @param filename The filename to test.\n * @returns True if the filename is a Youtube Flash source.\n */\nexport function isYoutubeFlashSource(filename) {\n if (filename) {\n let pathname = \"\";\n let cleaned_hostname = \"\";\n try {\n // A base URL is required if `filename` is a relative URL, but we don't need to detect the real URL origin.\n const url = new URL(filename, RUFFLE_ORIGIN);\n pathname = url.pathname;\n cleaned_hostname = url.hostname.replace(\"www.\", \"\");\n }\n catch (err) {\n // Some invalid filenames, like `///`, could raise a TypeError. Let's fail silently in this situation.\n }\n // See https://wiki.mozilla.org/QA/Youtube_Embedded_Rewrite\n if (pathname.startsWith(\"/v/\") &&\n (cleaned_hostname === \"youtube.com\" ||\n cleaned_hostname === \"youtube-nocookie.com\")) {\n return true;\n }\n }\n return false;\n}\n/**\n * Workaround Youtube mixed content if upgradeToHttps is true.\n *\n * @param elem The element to change.\n * @param attr The attribute to adjust.\n */\nexport function workaroundYoutubeMixedContent(elem, attr) {\n var _a, _b;\n const elem_attr = elem.getAttribute(attr);\n const window_config = (_b = (_a = window.RufflePlayer) === null || _a === void 0 ? void 0 : _a.config) !== null && _b !== void 0 ? _b : {};\n if (elem_attr) {\n try {\n const url = new URL(elem_attr);\n if (url.protocol === \"http:\" &&\n window.location.protocol === \"https:\" &&\n (!(\"upgradeToHttps\" in window_config) ||\n window_config.upgradeToHttps !== false)) {\n url.protocol = \"https:\";\n elem.setAttribute(attr, url.toString());\n }\n }\n catch (err) {\n // Some invalid filenames, like `///`, could raise a TypeError. Let's fail silently in this situation.\n }\n }\n}\n/**\n * Determine if an element is a child of a node that was not supported\n * in non-HTML5 compliant browsers. If so, the element was meant to be\n * used as a fallback content.\n *\n * @param elem The element to test.\n * @returns True if the element is inside an <audio> or <video> node.\n */\nexport function isFallbackElement(elem) {\n let parent = elem.parentElement;\n while (parent !== null) {\n switch (parent.tagName) {\n case \"AUDIO\":\n case \"VIDEO\":\n return true;\n }\n parent = parent.parentElement;\n }\n return false;\n}\n","import { isBuiltInContextMenuVisible, isFallbackElement, isScriptAccessAllowed, isYoutubeFlashSource, RufflePlayer, workaroundYoutubeMixedContent, } from \"./ruffle-player\";\nimport { registerElement } from \"./register-element\";\nimport { isSwfFilename, isSwfMimeType } from \"./swf-utils\";\n/**\n * A polyfill html element.\n *\n * This specific class tries to polyfill existing `<embed>` tags,\n * and should not be used. Prefer [[RufflePlayer]] instead.\n *\n * @internal\n */\nexport class RuffleEmbed extends RufflePlayer {\n /**\n * Constructs a new Ruffle flash player for insertion onto the page.\n *\n * This specific class tries to polyfill existing `<embed>` tags,\n * and should not be used. Prefer [[RufflePlayer]] instead.\n */\n constructor() {\n super();\n }\n /**\n * @ignore\n * @internal\n */\n connectedCallback() {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;\n super.connectedCallback();\n const src = this.attributes.getNamedItem(\"src\");\n if (src) {\n const allowScriptAccess = (_b = (_a = this.attributes.getNamedItem(\"allowScriptAccess\")) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null;\n const menu = (_d = (_c = this.attributes.getNamedItem(\"menu\")) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : null;\n // Kick off the SWF download.\n this.load({\n url: src.value,\n allowScriptAccess: isScriptAccessAllowed(allowScriptAccess, src.value),\n parameters: (_f = (_e = this.attributes.getNamedItem(\"flashvars\")) === null || _e === void 0 ? void 0 : _e.value) !== null && _f !== void 0 ? _f : null,\n backgroundColor: (_h = (_g = this.attributes.getNamedItem(\"bgcolor\")) === null || _g === void 0 ? void 0 : _g.value) !== null && _h !== void 0 ? _h : null,\n base: (_k = (_j = this.attributes.getNamedItem(\"base\")) === null || _j === void 0 ? void 0 : _j.value) !== null && _k !== void 0 ? _k : null,\n menu: isBuiltInContextMenuVisible(menu),\n salign: (_m = (_l = this.attributes.getNamedItem(\"salign\")) === null || _l === void 0 ? void 0 : _l.value) !== null && _m !== void 0 ? _m : \"\",\n quality: (_p = (_o = this.attributes.getNamedItem(\"quality\")) === null || _o === void 0 ? void 0 : _o.value) !== null && _p !== void 0 ? _p : \"high\",\n scale: (_r = (_q = this.attributes.getNamedItem(\"scale\")) === null || _q === void 0 ? void 0 : _q.value) !== null && _r !== void 0 ? _r : \"showAll\",\n wmode: (_t = (_s = this.attributes.getNamedItem(\"wmode\")) === null || _s === void 0 ? void 0 : _s.value) !== null && _t !== void 0 ? _t : \"window\" /* WindowMode.Window */,\n allowNetworking: (_v = (_u = this.attributes.getNamedItem(\"allowNetworking\")) === null || _u === void 0 ? void 0 : _u.value) !== null && _v !== void 0 ? _v : \"all\" /* NetworkingAccessMode.All */,\n });\n }\n }\n /**\n * Polyfill of HTMLObjectElement.\n *\n * @ignore\n * @internal\n */\n get src() {\n var _a;\n return (_a = this.attributes.getNamedItem(\"src\")) === null || _a === void 0 ? void 0 : _a.value;\n }\n /**\n * Polyfill of HTMLObjectElement.\n *\n * @ignore\n * @internal\n */\n set src(srcval) {\n if (srcval) {\n const attr = document.createAttribute(\"src\");\n attr.value = srcval;\n this.attributes.setNamedItem(attr);\n }\n else {\n this.attributes.removeNamedItem(\"src\");\n }\n }\n /**\n * @ignore\n * @internal\n */\n static get observedAttributes() {\n return [\"src\", \"width\", \"height\"];\n }\n /**\n * @ignore\n * @internal\n */\n attributeChangedCallback(name, oldValue, newValue) {\n var _a, _b, _c, _d;\n super.attributeChangedCallback(name, oldValue, newValue);\n if (this.isConnected && name === \"src\") {\n const src = this.attributes.getNamedItem(\"src\");\n if (src) {\n this.load({\n url: src.value,\n parameters: (_b = (_a = this.attributes.getNamedItem(\"flashvars\")) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : null,\n base: (_d = (_c = this.attributes.getNamedItem(\"base\")) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : null,\n });\n }\n }\n }\n /**\n * Checks if the given element may be polyfilled with this one.\n *\n * @param elem Element to check.\n * @returns True if the element looks like a flash embed.\n */\n static isInterdictable(elem) {\n // Don't polyfill if the element is inside a specific node.\n if (isFallbackElement(elem)) {\n return false;\n }\n // Don't polyfill when no file is specified.\n if (!elem.getAttribute(\"src\")) {\n return false;\n }\n // Don't polyfill when the file is a Youtube Flash source.\n if (isYoutubeFlashSource(elem.getAttribute(\"src\"))) {\n // Workaround YouTube mixed content; this isn't what browsers do automatically, but while we're here, we may as well\n workaroundYoutubeMixedContent(elem, \"src\");\n return false;\n }\n // Check for MIME type.\n const type = elem.getAttribute(\"type\");\n if (!type) {\n // If no MIME type is specified, polyfill if movie is an SWF file.\n return isSwfFilename(elem.getAttribute(\"src\"));\n }\n else {\n return isSwfMimeType(type);\n }\n }\n /**\n * Creates a RuffleEmbed that will polyfill and replace the given element.\n *\n * @param elem Element to replace.\n * @returns Created RuffleEmbed.\n */\n static fromNativeEmbedElement(elem) {\n const externalName = registerElement(\"ruffle-embed\", RuffleEmbed);\n const ruffleObj = document.createElement(externalName);\n ruffleObj.copyElement(elem);\n return ruffleObj;\n }\n}\n","import { isBuiltInContextMenuVisible, isFallbackElement, isScriptAccessAllowed, isYoutubeFlashSource, workaroundYoutubeMixedContent, RufflePlayer, } from \"./ruffle-player\";\nimport { FLASH_ACTIVEX_CLASSID } from \"./flash-identifiers\";\nimport { registerElement } from \"./register-element\";\nimport { RuffleEmbed } from \"./ruffle-embed\";\nimport { isSwfFilename, isSwfMimeType } from \"./swf-utils\";\n/**\n * Find and return the first value in obj with the given key.\n * Many Flash params were case insensitive, so we use this when checking for them.\n *\n * @param obj Object to check\n * @param key Key to find\n * @param defaultValue Value if not found\n * @returns Value if found, else [[defaultValue]]\n */\nfunction findCaseInsensitive(obj, key, defaultValue) {\n key = key.toLowerCase();\n for (const [k, value] of Object.entries(obj)) {\n if (k.toLowerCase() === key) {\n return value;\n }\n }\n return defaultValue;\n}\n/**\n * Returns all flash params ([[HTMLParamElement]]) that are for the given object.\n *\n * @param elem Element to check.\n * @returns A record of every parameter.\n */\nfunction paramsOf(elem) {\n var _a, _b;\n const params = {};\n for (const param of elem.children) {\n if (param instanceof HTMLParamElement) {\n const key = (_a = param.attributes.getNamedItem(\"name\")) === null || _a === void 0 ? void 0 : _a.value;\n const value = (_b = param.attributes.getNamedItem(\"value\")) === null || _b === void 0 ? void 0 : _b.value;\n if (key && value) {\n params[key] = value;\n }\n }\n }\n return params;\n}\n/**\n * A polyfill html element.\n *\n * This specific class tries to polyfill existing `<object>` tags,\n * and should not be used. Prefer [[RufflePlayer]] instead.\n *\n * @internal\n */\nexport class RuffleObject extends RufflePlayer {\n /**\n * Constructs a new Ruffle flash player for insertion onto the page.\n *\n * This specific class tries to polyfill existing `<object>` tags,\n * and should not be used. Prefer [[RufflePlayer]] instead.\n */\n constructor() {\n super();\n this.params = {};\n }\n /**\n * @ignore\n * @internal\n */\n connectedCallback() {\n var _a;\n super.connectedCallback();\n this.params = paramsOf(this);\n let url = null;\n if (this.attributes.getNamedItem(\"data\")) {\n url = (_a = this.attributes.getNamedItem(\"data\")) === null || _a === void 0 ? void 0 : _a.value;\n }\n else if (this.params[\"movie\"]) {\n url = this.params[\"movie\"];\n }\n const allowScriptAccess = findCaseInsensitive(this.params, \"allowScriptAccess\", null);\n const parameters = findCaseInsensitive(this.params, \"flashvars\", this.getAttribute(\"flashvars\"));\n const backgroundColor = findCaseInsensitive(this.params, \"bgcolor\", this.getAttribute(\"bgcolor\"));\n const allowNetworking = findCaseInsensitive(this.params, \"allowNetworking\", this.getAttribute(\"allowNetworking\"));\n const base = findCaseInsensitive(this.params, \"base\", this.getAttribute(\"base\"));\n const menu = findCaseInsensitive(this.params, \"menu\", null);\n const salign = findCaseInsensitive(this.params, \"salign\", \"\");\n const quality = findCaseInsensitive(this.params, \"quality\", \"high\");\n const scale = findCaseInsensitive(this.params, \"scale\", \"showAll\");\n const wmode = findCaseInsensitive(this.params, \"wmode\", \"window\");\n if (url) {\n const options = { url };\n options.allowScriptAccess = isScriptAccessAllowed(allowScriptAccess, url);\n if (parameters) {\n options.parameters = parameters;\n }\n if (backgroundColor) {\n options.backgroundColor = backgroundColor;\n }\n if (base) {\n options.base = base;\n }\n options.menu = isBuiltInContextMenuVisible(menu);\n if (salign) {\n options.salign = salign;\n }\n if (quality) {\n options.quality = quality;\n }\n if (scale) {\n options.scale = scale;\n }\n if (wmode) {\n options.wmode = wmode;\n }\n if (allowNetworking) {\n options.allowNetworking =\n allowNetworking;\n }\n // Kick off the SWF download.\n this.load(options);\n }\n }\n debugPlayerInfo() {\n var _a;\n let errorText = super.debugPlayerInfo();\n errorText += \"Player type: Object\\n\";\n let url = null;\n if (this.attributes.getNamedItem(\"data\")) {\n url = (_a = this.attributes.getNamedItem(\"data\")) === null || _a === void 0 ? void 0 : _a.value;\n }\n else if (this.params[\"movie\"]) {\n url = this.params[\"movie\"];\n }\n errorText += `SWF URL: ${url}\\n`;\n Object.keys(this.params).forEach((key) => {\n errorText += `Param ${key}: ${this.params[key]}\\n`;\n });\n Object.keys(this.attributes).forEach((key) => {\n var _a;\n errorText += `Attribute ${key}: ${(_a = this.attributes.getNamedItem(key)) === null || _a === void 0 ? void 0 : _a.value}\\n`;\n });\n return errorText;\n }\n /**\n * Polyfill of HTMLObjectElement.\n *\n * @ignore\n * @internal\n */\n get data() {\n return this.getAttribute(\"data\");\n }\n /**\n * Polyfill of HTMLObjectElement.\n *\n * @ignore\n * @internal\n */\n set data(href) {\n if (href) {\n const attr = document.createAttribute(\"data\");\n attr.value = href;\n this.attributes.setNamedItem(attr);\n }\n else {\n this.attributes.removeNamedItem(\"data\");\n }\n }\n /**\n * Checks if the given element may be polyfilled with this one.\n *\n * @param elem Element to check.\n * @returns True if the element looks like a flash object.\n */\n static isInterdictable(elem) {\n var _a, _b;\n // Don't polyfill if the element is inside a specific node.\n if (isFallbackElement(elem)) {\n return false;\n }\n // Don't polyfill if there's already a <ruffle-object> or a <ruffle-embed> inside the <object>.\n if (elem.getElementsByTagName(\"ruffle-object\").length > 0 ||\n elem.getElementsByTagName(\"ruffle-embed\").length > 0) {\n return false;\n }\n // Don't polyfill if no movie specified.\n const data = (_a = elem.attributes.getNamedItem(\"data\")) === null || _a === void 0 ? void 0 : _a.value.toLowerCase();\n const params = paramsOf(elem);\n let isSwf;\n // Check for SWF file.\n if (data) {\n // Don't polyfill when the file is a Youtube Flash source.\n if (isYoutubeFlashSource(data)) {\n // Workaround YouTube mixed content; this isn't what browsers do automatically, but while we're here, we may as well\n workaroundYoutubeMixedContent(elem, \"data\");\n return false;\n }\n isSwf = isSwfFilename(data);\n }\n else if (params && params[\"movie\"]) {\n // Don't polyfill when the file is a Youtube Flash source.\n if (isYoutubeFlashSource(params[\"movie\"])) {\n // Workaround YouTube mixed content; this isn't what browsers do automatically, but while we're here, we may as well\n const movie_elem = elem.querySelector(\"param[name='movie']\");\n if (movie_elem) {\n workaroundYoutubeMixedContent(movie_elem, \"value\");\n // The data attribute needs to be set for the re-fetch to happen\n // It also needs to be set on Firefox for the YouTube object rewrite to work, regardless of mixed content\n const movie_src = movie_elem.getAttribute(\"value\");\n if (movie_src) {\n elem.setAttribute(\"data\", movie_src);\n }\n }\n return false;\n }\n isSwf = isSwfFilename(params[\"movie\"]);\n }\n else {\n // Don't polyfill when no file is specified.\n return false;\n }\n // Check ActiveX class ID.\n const classid = (_b = elem.attributes\n .getNamedItem(\"classid\")) === null || _b === void 0 ? void 0 : _b.value.toLowerCase();\n if (classid === FLASH_ACTIVEX_CLASSID.toLowerCase()) {\n // classid is an old-IE style embed that would not work on modern browsers.\n // Often there will be an <embed> inside the <object> that would take precedence.\n // Only polyfill this <object> if it doesn't contain a polyfillable <embed> or\n // another <object> that would be supported on modern browsers.\n return (!Array.from(elem.getElementsByTagName(\"object\")).some(RuffleObject.isInterdictable) &&\n !Array.from(elem.getElementsByTagName(\"embed\")).some(RuffleEmbed.isInterdictable));\n }\n else if (classid) {\n // Non-Flash classid.\n return false;\n }\n // Check for MIME type.\n const type = elem.attributes.getNamedItem(\"type\");\n if (!type) {\n // If no MIME type is specified, polyfill if movie is an SWF file.\n return isSwf;\n }\n else {\n return isSwfMimeType(type.value);\n }\n }\n /**\n * Creates a RuffleObject that will polyfill and replace the given element.\n *\n * @param elem Element to replace.\n * @returns Created RuffleObject.\n */\n static fromNativeObjectElement(elem) {\n const externalName = registerElement(\"ruffle-object\", RuffleObject);\n const ruffleObj = (document.createElement(externalName));\n // Avoid copying embeds-inside-objects to avoid double polyfilling.\n for (const embedElem of Array.from(elem.getElementsByTagName(\"embed\"))) {\n if (RuffleEmbed.isInterdictable(embedElem)) {\n embedElem.remove();\n }\n }\n // Avoid copying objects-inside-objects to avoid double polyfilling.\n // This may happen when Internet Explorer's conditional comments are used.\n for (const objectElem of Array.from(elem.getElementsByTagName(\"object\"))) {\n if (RuffleObject.isInterdictable(objectElem)) {\n objectElem.remove();\n }\n }\n ruffleObj.copyElement(elem);\n return ruffleObj;\n }\n}\n","import { FLASH_MIMETYPE, FUTURESPLASH_MIMETYPE, FLASH7_AND_8_MIMETYPE, FLASH_MOVIE_MIMETYPE, } from \"./flash-identifiers\";\n/**\n * Replacement object for `MimeTypeArray` that lets us install new fake mime\n * types.\n *\n * Unlike plugins we can at least enumerate mime types in Firefox, so we don't\n * lose data.\n *\n * We also expose a method called `install` which adds a new plugin. This is\n * used to falsify Flash detection. If the existing `navigator.mimeTypes` has an\n * `install` method, you should not use `RuffleMimeTypeArray` as some other\n * plugin emulator is already present.\n */\nclass RuffleMimeTypeArray {\n constructor(mimeTypes) {\n this.__mimeTypes = [];\n this.__namedMimeTypes = {};\n if (mimeTypes) {\n for (let i = 0; i < mimeTypes.length; i++) {\n this.install(mimeTypes[i]);\n }\n }\n }\n /**\n * Install a MIME Type into the array.\n *\n * @param mimeType The mime type to install\n */\n install(mimeType) {\n const index = this.__mimeTypes.length;\n this.__mimeTypes.push(mimeType);\n this.__namedMimeTypes[mimeType.type] = mimeType;\n this[mimeType.type] = mimeType;\n this[index] = mimeType;\n }\n item(index) {\n // This behavior is done to emulate a 32-bit uint,\n // which browsers use.\n return this.__mimeTypes[index >>> 0];\n }\n namedItem(name) {\n return this.__namedMimeTypes[name];\n }\n get length() {\n return this.__mimeTypes.length;\n }\n [Symbol.iterator]() {\n return this.__mimeTypes[Symbol.iterator]();\n }\n}\n/**\n * Equivalent object to `Plugin` that allows us to falsify plugins.\n */\nclass RufflePlugin extends RuffleMimeTypeArray {\n constructor(name, description, filename) {\n super();\n this.name = name;\n this.description = description;\n this.filename = filename;\n }\n}\n/**\n * Replacement object for `PluginArray` that lets us install new fake plugins.\n *\n * This object needs to wrap the native plugin array, since the user might have\n * actual plugins installed. Firefox doesn't let us enumerate the array, though,\n * which has some consequences. Namely, we can't actually perfectly wrap the\n * native plugin array, at least unless there's some secret \"unresolved object\n * property name handler\" that I've never known before in JS...\n *\n * We can still wrap `namedItem` perfectly at least.\n *\n * We also expose a method called `install` which adds a new plugin. This is\n * used to falsify Flash detection. If the existing `navigator.plugins` has an\n * `install` method, you should not use `RufflePluginArray` as some other plugin\n * emulator is already present.\n */\nclass RufflePluginArray {\n constructor(plugins) {\n this.__plugins = [];\n this.__namedPlugins = {};\n for (let i = 0; i < plugins.length; i++) {\n this.install(plugins[i]);\n }\n }\n install(plugin) {\n const index = this.__plugins.length;\n this.__plugins.push(plugin);\n this.__namedPlugins[plugin.name] = plugin;\n this[plugin.name] = plugin;\n this[index] = plugin;\n }\n item(index) {\n // This behavior is done to emulate a 32-bit uint,\n // which browsers use. Cloudflare's anti-bot\n // checks rely on this.\n return this.__plugins[index >>> 0];\n }\n namedItem(name) {\n return this.__namedPlugins[name];\n }\n refresh() {\n // Nothing to do, we just need to define the method.\n }\n [Symbol.iterator]() {\n return this.__plugins[Symbol.iterator]();\n }\n get length() {\n return this.__plugins.length;\n }\n}\n/**\n * A fake plugin designed to trigger Flash detection scripts.\n */\nexport const FLASH_PLUGIN = new RufflePlugin(\"Shockwave Flash\", \"Shockwave Flash 32.0 r0\", \"ruffle.js\");\n/**\n * A fake plugin designed to allow early detection of if the Ruffle extension is in use.\n */\nexport const RUFFLE_EXTENSION = new RufflePlugin(\"Ruffle Extension\", \"Ruffle Extension\", \"ruffle.js\");\nFLASH_PLUGIN.install({\n type: FUTURESPLASH_MIMETYPE,\n description: \"Shockwave Flash\",\n suffixes: \"spl\",\n enabledPlugin: FLASH_PLUGIN,\n});\nFLASH_PLUGIN.install({\n type: FLASH_MIMETYPE,\n description: \"Shockwave Flash\",\n suffixes: \"swf\",\n enabledPlugin: FLASH_PLUGIN,\n});\nFLASH_PLUGIN.install({\n type: FLASH7_AND_8_MIMETYPE,\n description: \"Shockwave Flash\",\n suffixes: \"swf\",\n enabledPlugin: FLASH_PLUGIN,\n});\nFLASH_PLUGIN.install({\n type: FLASH_MOVIE_MIMETYPE,\n description: \"Shockwave Flash\",\n suffixes: \"swf\",\n enabledPlugin: FLASH_PLUGIN,\n});\nRUFFLE_EXTENSION.install({\n type: \"\",\n description: \"Ruffle Detection\",\n suffixes: \"\",\n enabledPlugin: RUFFLE_EXTENSION,\n});\n/**\n * Install a fake plugin such that detectors will see it in `navigator.plugins`.\n *\n * This function takes care to check if the existing implementation of\n * `navigator.plugins` already accepts fake plugin entries. If so, it will use\n * that version of the plugin array. This allows the plugin polyfill to compose\n * across multiple plugin emulators with the first emulator's polyfill winning.\n *\n * @param plugin The plugin to install\n */\nexport function installPlugin(plugin) {\n if (!(\"install\" in navigator.plugins) || !navigator.plugins[\"install\"]) {\n Object.defineProperty(navigator, \"plugins\", {\n value: new RufflePluginArray(navigator.plugins),\n writable: false,\n });\n }\n const plugins = navigator.plugins;\n plugins.install(plugin);\n if (plugin.length > 0 &&\n (!(\"install\" in navigator.mimeTypes) || !navigator.mimeTypes[\"install\"])) {\n Object.defineProperty(navigator, \"mimeTypes\", {\n value: new RuffleMimeTypeArray(navigator.mimeTypes),\n writable: false,\n });\n }\n const mimeTypes = navigator.mimeTypes;\n for (let i = 0; i < plugin.length; i += 1) {\n mimeTypes.install(plugin[i]);\n }\n}\n","var _a, _b;\nimport { RuffleObject } from \"./ruffle-object\";\nimport { RuffleEmbed } from \"./ruffle-embed\";\nimport { installPlugin, FLASH_PLUGIN } from \"./plugin-polyfill\";\nimport { publicPath } from \"./public-path\";\nlet isExtension;\nconst globalConfig = (_b = (_a = window.RufflePlayer) === null || _a === void 0 ? void 0 : _a.config) !== null && _b !== void 0 ? _b : {};\nconst jsScriptUrl = publicPath(globalConfig) + \"ruffle.js\";\n/**\n * Polyfill native Flash elements with Ruffle equivalents.\n *\n * This polyfill isn't fool-proof: If there's a chance site JavaScript has\n * access to a pre-polyfill element, then this will break horribly. We can\n * keep native objects out of the DOM, and thus out of JavaScript's grubby\n * little hands, but only if we load first.\n */\nlet objects;\nlet embeds;\n/**\n *\n */\nfunction polyfillFlashInstances() {\n try {\n // Create live collections to track embed tags.\n objects = objects !== null && objects !== void 0 ? objects : document.getElementsByTagName(\"object\");\n embeds = embeds !== null && embeds !== void 0 ? embeds : document.getElementsByTagName(\"embed\");\n // Replace <object> first, because <object> often wraps <embed>.\n for (const elem of Array.from(objects)) {\n if (RuffleObject.isInterdictable(elem)) {\n const ruffleObject = RuffleObject.fromNativeObjectElement(elem);\n ruffleObject.setIsExtension(isExtension);\n elem.replaceWith(ruffleObject);\n }\n }\n for (const elem of Array.from(embeds)) {\n if (RuffleEmbed.isInterdictable(elem)) {\n const ruffleEmbed = RuffleEmbed.fromNativeEmbedElement(elem);\n ruffleEmbed.setIsExtension(isExtension);\n elem.replaceWith(ruffleEmbed);\n }\n }\n }\n catch (err) {\n console.error(`Serious error encountered when polyfilling native Flash elements: ${err}`);\n }\n}\n/**\n * Inject Ruffle into <iframe> and <frame> elements.\n *\n * This polyfill isn't fool-proof either: On self-hosted builds, it may\n * not work due to browsers CORS policy or be loaded too late for some\n * libraries like SWFObject. These should be less of a problem on the\n * web extension. This polyfill should, however, do the trick in most\n * cases, but users should be aware of its natural limits.\n */\nlet iframes;\nlet frames;\n/**\n *\n */\nfunction polyfillFrames() {\n // Create live collections to track embed tags.\n iframes = iframes !== null && iframes !== void 0 ? iframes : document.getElementsByTagName(\"iframe\");\n frames = frames !== null && frames !== void 0 ? frames : document.getElementsByTagName(\"frame\");\n [iframes, frames].forEach((elements) => {\n for (const element of elements) {\n if (element.dataset[\"rufflePolyfilled\"] !== undefined) {\n // Don't re-polyfill elements with the \"data-ruffle-polyfilled\" attribute.\n continue;\n }\n element.dataset[\"rufflePolyfilled\"] = \"\";\n const elementWindow = element.contentWindow;\n // Cross origin requests may reach an exception, so let's prepare for this eventuality.\n const errorMessage = `Couldn't load Ruffle into ${element.tagName}[${element.src}]: `;\n try {\n if (elementWindow.document.readyState === \"complete\") {\n injectRuffle(elementWindow, errorMessage);\n }\n }\n catch (err) {\n if (!isExtension) {\n // The web extension should be able to load Ruffle into cross origin frames\n // because it has \"all_frames\" set to true in its manifest.json: RufflePlayer\n // config won't be injected but it's not worth showing an error.\n console.warn(errorMessage + err);\n }\n }\n // Attach listener to the element to handle frame navigation.\n element.addEventListener(\"load\", () => {\n injectRuffle(elementWindow, errorMessage);\n }, false);\n }\n });\n}\n/**\n * @param elementWindow The (i)frame's window object.\n * @param errorMessage The message to log when Ruffle cannot access the (i)frame's document.\n */\nasync function injectRuffle(elementWindow, errorMessage) {\n var _a;\n // The document is supposed to be completely loaded when this function is run.\n // As Chrome may be unable to access the document properties, we have to delay the execution a little bit.\n await new Promise((resolve) => {\n window.setTimeout(() => {\n resolve();\n }, 100);\n });\n let elementDocument;\n try {\n elementDocument = elementWindow.document;\n if (!elementDocument) {\n // Don't polyfill if the window has no document: the element may have been removed from the parent window.\n return;\n }\n }\n catch (err) {\n if (!isExtension) {\n console.warn(errorMessage + err);\n }\n return;\n }\n if (!isExtension &&\n elementDocument.documentElement.dataset[\"ruffleOptout\"] !== undefined) {\n // Don't polyfill elements with the \"data-ruffle-optout\" attribute.\n return;\n }\n if (!isExtension) {\n if (!elementWindow.RufflePlayer) {\n const script = elementDocument.createElement(\"script\");\n script.setAttribute(\"src\", jsScriptUrl);\n script.onload = () => {\n // Inject parent configuration once the script is loaded, preventing it from being ignored.\n elementWindow.RufflePlayer = {};\n elementWindow.RufflePlayer.config = globalConfig;\n };\n elementDocument.head.appendChild(script);\n }\n }\n else {\n if (!elementWindow.RufflePlayer) {\n elementWindow.RufflePlayer = {};\n }\n // Merge parent window and frame configurations, will likely be applied too late though.\n elementWindow.RufflePlayer.config = Object.assign(Object.assign({}, globalConfig), ((_a = elementWindow.RufflePlayer.config) !== null && _a !== void 0 ? _a : {}));\n }\n}\n/**\n * Listen for changes to the DOM.\n */\nfunction initMutationObserver() {\n const observer = new MutationObserver(function (mutationsList) {\n // If any nodes were added, re-run the polyfill to detect any new instances.\n const nodesAdded = mutationsList.some((mutation) => mutation.addedNodes.length > 0);\n if (nodesAdded) {\n polyfillFlashInstances();\n polyfillFrames();\n }\n });\n observer.observe(document, { childList: true, subtree: true });\n}\n/**\n * Polyfills the detection of Flash plugins in the browser.\n */\nexport function pluginPolyfill() {\n installPlugin(FLASH_PLUGIN);\n}\n/**\n * Polyfills legacy Flash content on the page.\n *\n * @param isExt Whether or not Ruffle is running as a browser's extension.\n */\nexport function polyfill(isExt) {\n var _a;\n isExtension = isExt;\n const usingExtension = ((_a = navigator.plugins.namedItem(\"Ruffle Extension\")) === null || _a === void 0 ? void 0 : _a.filename) ===\n \"ruffle.js\";\n if (isExtension || !usingExtension) {\n polyfillFlashInstances();\n polyfillFrames();\n initMutationObserver();\n }\n}\n","import { pluginPolyfill, polyfill } from \"./polyfills\";\nimport { registerElement } from \"./register-element\";\nimport { RufflePlayer } from \"./ruffle-player\";\nimport { buildInfo } from \"./build-info\";\n/**\n * Represents this particular version of Ruffle.\n *\n * Multiple APIs can be instantiated from different sources; e.g. an \"extension\"\n * version, versus a \"local\" version. This expresses to the Public API\n * negotiator (see [[PublicAPI]]) what this particular version of Ruffle is and\n * how to control it.\n */\nexport const SourceAPI = {\n /**\n * The version of this particular API, as a string in a semver compatible format.\n */\n version: buildInfo.versionNumber,\n /**\n * Start up the polyfills.\n *\n * Do not run polyfills for more than one Ruffle source at a time.\n *\n * @param isExt Whether or not Ruffle is running as a browser's extension.\n */\n polyfill(isExt) {\n polyfill(isExt);\n },\n /**\n * Polyfill the plugin detection.\n *\n * This needs to run before any plugin detection script does.\n */\n pluginPolyfill() {\n pluginPolyfill();\n },\n /**\n * Create a Ruffle player element using this particular version of Ruffle.\n *\n * @returns The player element. This is a DOM element that may be inserted\n * into the current page as you wish.\n */\n createPlayer() {\n const name = registerElement(\"ruffle-player\", RufflePlayer);\n return document.createElement(name);\n },\n};\n","import { Version } from \"./version\";\nimport { VersionRange } from \"./version-range\";\nimport { SourceAPI } from \"./source-api\";\n/**\n * Represents the Ruffle public API.\n *\n * The public API exists primarily to allow multiple installs of Ruffle on a\n * page (e.g. an extension install and a local one) to cooperate. In an ideal\n * situation, all Ruffle sources on the page install themselves into a single\n * public API, and then the public API picks the newest version by default.\n *\n * This API *is* versioned, in case we need to upgrade it. However, it must be\n * backwards- and forwards-compatible with all known sources.\n */\nexport class PublicAPI {\n /**\n * Construct the Ruffle public API.\n *\n * Do not use this function to negotiate a public API. Instead, use\n * `public_api` to register your Ruffle source with an existing public API\n * if it exists.\n *\n * Constructing a Public API will also trigger it to initialize Ruffle once\n * the page loads, if the API has not already been superseded.\n *\n * @param prev What used to be in the public API slot.\n *\n * This is used to upgrade from a prior version of the public API, or from\n * a user-defined configuration object placed in the public API slot.\n */\n constructor(prev) {\n this.sources = {};\n this.config = {};\n this.invoked = false;\n this.newestName = null;\n this.conflict = null;\n if (prev !== undefined && prev !== null) {\n if (prev instanceof PublicAPI) {\n // We're upgrading from a previous API to a new one.\n this.sources = prev.sources;\n this.config = prev.config;\n this.invoked = prev.invoked;\n this.conflict = prev.conflict;\n this.newestName = prev.newestName;\n prev.superseded();\n }\n else if (prev.constructor === Object &&\n prev[\"config\"] instanceof Object) {\n // We're the first, install user configuration.\n this.config = prev[\"config\"];\n }\n else {\n // We're the first, but conflicting with someone else.\n this.conflict = prev;\n }\n }\n if (document.readyState === \"loading\") {\n // Cloudflare Rocket Loader interferes with the DOMContentLoaded event,\n // so we listen for readystatechange instead\n document.addEventListener(\"readystatechange\", this.init.bind(this));\n }\n else {\n window.setTimeout(this.init.bind(this), 0);\n }\n }\n /**\n * The version of the public API.\n *\n * This is *not* the version of Ruffle itself.\n *\n * This allows a page with an old version of the Public API to be upgraded\n * to a new version of the API. The public API is intended to be changed\n * very infrequently, if at all, but this provides an escape mechanism for\n * newer Ruffle sources to upgrade older installations.\n *\n * @returns The version of this public API.\n */\n get version() {\n return \"0.1.0\";\n }\n /**\n * Register a given source with the Ruffle Public API.\n *\n * @param name The name of the source.\n */\n registerSource(name) {\n this.sources[name] = SourceAPI;\n }\n /**\n * Determine the name of the newest registered source in the Public API.\n *\n * @returns The name of the source, or `null` if no source\n * has yet to be registered.\n */\n newestSourceName() {\n let newestName = null, newestVersion = Version.fromSemver(\"0.0.0\");\n for (const k in this.sources) {\n if (Object.prototype.hasOwnProperty.call(this.sources, k)) {\n const kVersion = Version.fromSemver(this.sources[k].version);\n if (kVersion.hasPrecedenceOver(newestVersion)) {\n newestName = k;\n newestVersion = kVersion;\n }\n }\n }\n return newestName;\n }\n /**\n * Negotiate and start Ruffle.\n *\n * This function reads the config parameter to determine which polyfills\n * should be enabled. If the configuration parameter is missing, then we\n * use a built-in set of defaults sufficient to fool sites with static\n * content and weak plugin detection.\n */\n init() {\n if (!this.invoked) {\n this.invoked = true;\n this.newestName = this.newestSourceName();\n if (this.newestName === null) {\n throw new Error(\"No registered Ruffle source!\");\n }\n const polyfills = \"polyfills\" in this.config ? this.config.polyfills : true;\n if (polyfills !== false) {\n this.sources[this.newestName].polyfill(this.newestName === \"extension\");\n }\n }\n }\n /**\n * Look up the newest Ruffle source and return it's API.\n *\n * @returns An instance of the Source API.\n */\n newest() {\n const name = this.newestSourceName();\n return name !== null ? this.sources[name] : null;\n }\n /**\n * Look up a specific Ruffle version (or any version satisfying a given set\n * of requirements) and return it's API.\n *\n * @param ver_requirement A set of semantic version requirement\n * strings that the player version must satisfy.\n * @returns An instance of the Source API, if one or more\n * sources satisfied the requirement.\n */\n satisfying(ver_requirement) {\n const requirement = VersionRange.fromRequirementString(ver_requirement);\n let valid = null;\n for (const k in this.sources) {\n if (Object.prototype.hasOwnProperty.call(this.sources, k)) {\n const version = Version.fromSemver(this.sources[k].version);\n if (requirement.satisfiedBy(version)) {\n valid = this.sources[k];\n }\n }\n }\n return valid;\n }\n /**\n * Look up the newest Ruffle version compatible with the `local` source, if\n * it's installed. Otherwise, use the latest version.\n *\n * @returns An instance of the Source API\n */\n localCompatible() {\n if (this.sources[\"local\"] !== undefined) {\n return this.satisfying(\"^\" + this.sources[\"local\"].version);\n }\n else {\n return this.newest();\n }\n }\n /**\n * Look up the newest Ruffle version with the exact same version as the\n * `local` source, if it's installed. Otherwise, use the latest version.\n *\n * @returns An instance of the Source API\n */\n local() {\n if (this.sources[\"local\"] !== undefined) {\n return this.satisfying(\"=\" + this.sources[\"local\"].version);\n }\n else {\n return this.newest();\n }\n }\n /**\n * Indicates that this version of the public API has been superseded by a\n * newer version.\n *\n * This should only be called by a newer version of the Public API.\n * Identical versions of the Public API should not supersede older versions\n * of that same API.\n *\n * Unfortunately, we can't disable polyfills after-the-fact, so this\n * only lets you disable the init event...\n */\n superseded() {\n this.invoked = true;\n }\n /**\n * Join a source into the public API, if it doesn't already exist.\n *\n * @param prevRuffle The previous iteration of the Ruffle API.\n *\n * The `prevRuffle` param lists the previous object in the RufflePlayer\n * slot. We perform some checks to see if this is a Ruffle public API or a\n * conflicting object. If this is conflicting, then a new public API will\n * be constructed (see the constructor information for what happens to\n * `prevRuffle`).\n *\n * Note that Public API upgrades are deliberately not enabled in this\n * version of Ruffle, since there is no Public API to upgrade from.\n * @param sourceName The name of this particular\n * Ruffle source.\n *\n * If both parameters are provided they will be used to define a new Ruffle\n * source to register with the public API.\n * @returns The Ruffle Public API.\n */\n static negotiate(prevRuffle, sourceName) {\n let publicAPI;\n if (prevRuffle instanceof PublicAPI) {\n publicAPI = prevRuffle;\n }\n else {\n publicAPI = new PublicAPI(prevRuffle);\n }\n if (sourceName !== undefined) {\n publicAPI.registerSource(sourceName);\n // Install the faux plugin detection immediately.\n // This is necessary because scripts such as SWFObject check for the\n // Flash Player immediately when they load.\n // TODO: Maybe there's a better place for this.\n const polyfills = \"polyfills\" in publicAPI.config\n ? publicAPI.config.polyfills\n : true;\n if (polyfills !== false) {\n SourceAPI.pluginPolyfill();\n }\n }\n return publicAPI;\n }\n}\n","import { PublicAPI } from \"ruffle-core\";\n\nwindow.RufflePlayer = PublicAPI.negotiate(window.RufflePlayer, \"local\");\n"],"names":["inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","id","loaded","__webpack_modules__","m","d","definition","key","o","Object","defineProperty","enumerable","get","f","e","chunkId","Promise","all","keys","reduce","promises","u","g","globalThis","this","Function","window","hmd","create","children","set","Error","obj","prop","prototype","hasOwnProperty","call","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","i","length","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","forEach","fn","setTimeout","bind","type","target","head","appendChild","r","Symbol","toStringTag","value","p","b","baseURI","self","location","href","installedChunks","j","installedChunkData","promise","resolve","reject","error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","Version","constructor","major","minor","patch","prIdent","buildIdent","static","versionString","buildSplit","split","prSplit","versionSplit","parseInt","isCompatibleWith","other","hasPrecedenceOver","isNumeric","test","isEqual","isStableOrCompatiblePrerelease","VersionRange","requirements","satisfiedBy","fver","requirement","matches","comparator","version","components","component","match","exec","slice","index","trim","fromSemver","bulkMemory","async","WebAssembly","validate","Uint8Array","referenceTypes","saturatedFloatToInt","signExtensions","simd","isNativeFunction","func","val","toString","indexOf","currentScriptURL","currentScript","endsWith","URL","console","warn","publicPath","config","path","lastLoaded","loadRuffle","progressCallback","Array","args","Prototype","callback","TypeError","len","k","Window","Reflect","has","ownKeys","getOwnPropertyNames","getOwnPropertySymbols","extensionsSupported","every","Boolean","log","default","init","Ruffle","response","wasmUrl","wasmResponse","fetch","contentLength","headers","bytesLoaded","bytesTotal","Response","ReadableStream","controller","_a","reader","body","getReader","read","byteLength","enqueue","close","fetchRuffle","ruffleShadowTemplate","innerHTML","privateRegistry","registerElement","elementName","elementClass","registration","class","tries","customElements","externalName","define","internalName","DEFAULT_CONFIG","allowScriptAccess","parameters","autoplay","backgroundColor","letterbox","unmuteOverlay","upgradeToHttps","compatibilityRules","warnOnUnsupportedContent","logLevel","showSwfDownload","contextMenu","preloader","splashScreen","maxExecutionDuration","base","menu","salign","quality","scale","forceScale","frameRate","wmode","polyfills","playerVersion","preferredRenderer","openUrlMode","allowNetworking","FLASH_MIMETYPE","FUTURESPLASH_MIMETYPE","FLASH7_AND_8_MIMETYPE","FLASH_MOVIE_MIMETYPE","isSwfFilename","filename","pathname","err","extension","toLowerCase","isSwfMimeType","mimeType","buildInfo","RUFFLE_ORIGIN","DIMENSION_REGEX","isAudioContextUnmuted","sanitizeParameters","URLSearchParams","output","Point","x","y","distanceTo","dx","dy","Math","sqrt","RufflePlayer","HTMLElement","readyState","_readyState","metadata","_metadata","super","contextMenuForceDisabled","isTouch","contextMenuSupported","panicked","_cachedDebugInfo","isExtension","longPressTimer","pointerDownPosition","pointerMoveMaxDistance","shadow","attachShadow","mode","content","cloneNode","dynamicStyles","getElementById","container","playButton","addEventListener","play","virtualKeyboard","virtualKeyboardInput","saveManager","classList","add","modalArea","querySelector","stopPropagation","closeSaveManager","backupSaves","contextMenuElement","checkIfTouch","showContextMenu","pointerDown","checkLongPressMovement","checkLongPress","clearLongPressTimer","fullScreenChange","instance","onFSCommand","lastActivePlayingState","setupPauseOnTabHidden","hidden","is_playing","pause","connectedCallback","updateStyles","observedAttributes","attributeChangedCallback","_oldValue","_newValue","disconnectedCallback","destroy","sheet","rules","deleteRule","widthAttr","attributes","getNamedItem","width","htmlDimensionToCssDimension","insertRule","heightAttr","height","isUnusedFallbackObject","element","lookupElement","parent","nodeName","loadedConfig","showSplashScreen","ruffleConstructor","onRuffleDownloadProgress","catch","protocol","ruffleIndexError","String","includes","navigator","userAgent","panic","renderer_debug_info","actuallyUsedRendererName","renderer_name","is_wasm_simd_used","audioState","style","visibility","unmuteAudioContext","blur","display","unmuteOverlayClicked","once","audioContext","audio_context","onstatechange","state","loadBar","outerLoadbar","Number","isNaN","checkOptions","options","check","condition","getExtensionConfig","conflict","_b","isConnected","isFallbackElement","extensionConfig","assign","ensureFreshInstance","swfUrl","substring","stream_from","load_data","swfFileName","isPlaying","volume","set_volume","fullscreenEnabled","webkitFullscreenEnabled","isFullscreen","fullscreenElement","webkitFullscreenElement","setFullscreen","isFull","enterFullscreen","exitFullscreen","navigationUI","requestFullscreen","webkitRequestFullscreen","webkitRequestFullScreen","webkitExitFullscreen","webkitCancelFullScreen","set_fullscreen","pointerType","base64ToBlob","bytesBase64","mimeString","byteString","atob","ab","ArrayBuffer","ia","charCodeAt","Blob","saveFile","fileName","blob","blobURL","createObjectURL","link","download","click","revokeObjectURL","isB64SOL","solData","confirmReloadSave","solKey","b64SolData","replace","localStorage","confirm","swfPath","swfHost","hostname","savePath","join","startsWith","setItem","removeItem","load","populateSaves","replaceSOL","fileInput","FileReader","result","b64Regex","RegExp","files","readAsDataURL","deleteSave","getItem","saveTable","textContent","solName","pop","row","keyCol","title","downloadCol","downloadSpan","className","replaceCol","replaceInput","accept","replaceLabel","htmlFor","deleteCol","deleteSpan","openSaveManager","remove","ok","blobUrl","swfDownloadA","pathName","lastIndexOf","input","string","char","eventType","dispatchEvent","KeyboardEvent","bubbles","openVirtualKeyboard","focus","preventScroll","contextMenuItems","CHECKMARK","fromCharCode","items","addSeparator","prepare_context_menu","item","separatorBefore","text","caption","checked","onClick","run_context_menu_callback","enabled","downloadSwf","isSecureContext","clipboard","writeText","getPanicData","localSaveTable","extensionString","open","pageX","pageY","startLongPressTimer","currentPosition","distance","preventDefault","hideContextMenu","firstChild","menuSeparator","hr","menuItem","left","top","rect","getBoundingClientRect","clientX","clientY","maxX","clientWidth","maxY","clientHeight","floor","min","clear_custom_menu_items","resume","maxTouchPoints","audio","Audio","arrayBuffer","dataView","DataView","sampleRate","setUint32","setUint16","btoa","then","copyElement","attribute","specified","node","from","out","onCallbackAvailable","call_exposed_callback","traceObserver","observer","set_trace_observer","dataArray","debugPlayerInfo","platform","entries","hideSplashScreen","errorIndex","errorArray","stackIndex","avmStackIndex","stack","avmStack","errorText","buildDate","Date","monthsPrior","setMonth","getMonth","isBuildOutdated","actionTag","errorBody","errorFooter","pageUrl","issueLink","encodeURIComponent","issueBody","viewDetails","onclick","panicBody","panicText","readOnly","replaceChildren","displayRootMovieDownloadFailedMessage","origin","div","prepend","displayUnsupportedMessage","displayMessage","renderInfo","setMetadata","Event","LOADED_METADATA","LOADED_DATA","setIsExtension","isScriptAccessAllowed","access","isBuiltInContextMenuVisible","isYoutubeFlashSource","cleaned_hostname","workaroundYoutubeMixedContent","elem","attr","elem_attr","window_config","parentElement","tagName","RuffleEmbed","_c","_d","_e","_f","_g","_h","_j","_k","_l","_m","_o","_p","_q","_r","_s","_t","_u","_v","srcval","createAttribute","setNamedItem","removeNamedItem","oldValue","newValue","ruffleObj","findCaseInsensitive","defaultValue","paramsOf","params","param","HTMLParamElement","RuffleObject","isSwf","movie_elem","movie_src","classid","isInterdictable","embedElem","objectElem","RuffleMimeTypeArray","mimeTypes","__mimeTypes","__namedMimeTypes","install","namedItem","iterator","RufflePlugin","description","RufflePluginArray","plugins","__plugins","__namedPlugins","plugin","refresh","FLASH_PLUGIN","RUFFLE_EXTENSION","suffixes","enabledPlugin","globalConfig","jsScriptUrl","objects","iframes","polyfillFlashInstances","ruffleObject","fromNativeObjectElement","replaceWith","ruffleEmbed","fromNativeEmbedElement","polyfillFrames","elements","dataset","elementWindow","contentWindow","errorMessage","injectRuffle","elementDocument","documentElement","SourceAPI","polyfill","isExt","usingExtension","MutationObserver","mutationsList","mutation","addedNodes","observe","childList","subtree","pluginPolyfill","writable","installPlugin","createPlayer","PublicAPI","sources","invoked","newestName","superseded","registerSource","newestSourceName","newestVersion","kVersion","newest","satisfying","ver_requirement","fromRequirementString","valid","localCompatible","local","prevRuffle","sourceName","publicAPI","negotiate"],"sourceRoot":""} |