mirror of
https://github.com/ThaUnknown/miru.git
synced 2026-04-21 00:02:06 +00:00
13389 lines
473 KiB
JavaScript
13389 lines
473 KiB
JavaScript
var Module = typeof Module !== 'undefined' ? Module : {}
|
|
if (!Module.expectedDataFileDownloads) {
|
|
Module.expectedDataFileDownloads = 0
|
|
Module.finishedDataFileDownloads = 0
|
|
}
|
|
Module.expectedDataFileDownloads++
|
|
;(function () {
|
|
const loadPackage = function (metadata) {
|
|
let PACKAGE_PATH
|
|
if (typeof window === 'object') {
|
|
PACKAGE_PATH = window.encodeURIComponent(
|
|
window.location.pathname
|
|
.toString()
|
|
.substring(0, window.location.pathname.toString().lastIndexOf('/')) +
|
|
'/'
|
|
)
|
|
} else if (typeof location !== 'undefined') {
|
|
PACKAGE_PATH = encodeURIComponent(
|
|
location.pathname
|
|
.toString()
|
|
.substring(0, location.pathname.toString().lastIndexOf('/')) + '/'
|
|
)
|
|
} else {
|
|
throw 'using preloaded data can only be done on a web page or in a web worker'
|
|
}
|
|
const PACKAGE_NAME = 'dist/js/subtitles-octopus-worker.data'
|
|
const REMOTE_PACKAGE_BASE = 'subtitles-octopus-worker.data'
|
|
if (typeof Module.locateFilePackage === 'function' && !Module.locateFile) {
|
|
Module.locateFile = Module.locateFilePackage
|
|
err(
|
|
'warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)'
|
|
)
|
|
}
|
|
const REMOTE_PACKAGE_NAME = Module.locateFile
|
|
? Module.locateFile(REMOTE_PACKAGE_BASE, '')
|
|
: REMOTE_PACKAGE_BASE
|
|
const REMOTE_PACKAGE_SIZE = metadata.remote_package_size
|
|
const PACKAGE_UUID = metadata.package_uuid
|
|
|
|
function fetchRemotePackage (packageName, packageSize, callback, errback) {
|
|
const xhr = new XMLHttpRequest()
|
|
xhr.open('GET', packageName, true)
|
|
xhr.responseType = 'arraybuffer'
|
|
xhr.onprogress = function (event) {
|
|
const url = packageName
|
|
let size = packageSize
|
|
if (event.total) size = event.total
|
|
if (event.loaded) {
|
|
if (!xhr.addedTotal) {
|
|
xhr.addedTotal = true
|
|
if (!Module.dataFileDownloads) Module.dataFileDownloads = {}
|
|
Module.dataFileDownloads[url] = {
|
|
loaded: event.loaded,
|
|
total: size
|
|
}
|
|
} else {
|
|
Module.dataFileDownloads[url].loaded = event.loaded
|
|
}
|
|
let total = 0
|
|
let loaded = 0
|
|
let num = 0
|
|
for (const download in Module.dataFileDownloads) {
|
|
const data = Module.dataFileDownloads[download]
|
|
total += data.total
|
|
loaded += data.loaded
|
|
num++
|
|
}
|
|
total = Math.ceil((total * Module.expectedDataFileDownloads) / num)
|
|
if (Module.setStatus) {
|
|
Module.setStatus(
|
|
'Downloading data... (' + loaded + '/' + total + ')'
|
|
)
|
|
}
|
|
} else if (!Module.dataFileDownloads) {
|
|
if (Module.setStatus) Module.setStatus('Downloading data...')
|
|
}
|
|
}
|
|
xhr.onerror = function (event) {
|
|
throw new Error('NetworkError for: ' + packageName)
|
|
}
|
|
xhr.onload = function (event) {
|
|
if (
|
|
xhr.status == 200 ||
|
|
xhr.status == 304 ||
|
|
xhr.status == 206 ||
|
|
(xhr.status == 0 && xhr.response)
|
|
) {
|
|
const packageData = xhr.response
|
|
callback(packageData)
|
|
} else {
|
|
throw new Error(xhr.statusText + ' : ' + xhr.responseURL)
|
|
}
|
|
}
|
|
xhr.send(null)
|
|
}
|
|
|
|
function handleError (error) {
|
|
console.error('package error:', error)
|
|
}
|
|
let fetchedCallback = null
|
|
let fetched = Module.getPreloadedPackage
|
|
? Module.getPreloadedPackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE)
|
|
: null
|
|
if (!fetched) {
|
|
fetchRemotePackage(
|
|
REMOTE_PACKAGE_NAME,
|
|
REMOTE_PACKAGE_SIZE,
|
|
function (data) {
|
|
if (fetchedCallback) {
|
|
fetchedCallback(data)
|
|
fetchedCallback = null
|
|
} else {
|
|
fetched = data
|
|
}
|
|
},
|
|
handleError
|
|
)
|
|
}
|
|
|
|
function runWithFS () {
|
|
function assert (check, msg) {
|
|
if (!check) throw msg + new Error().stack
|
|
}
|
|
Module.FS_createPath('/', 'assets', true, true)
|
|
|
|
function DataRequest (start, end, audio) {
|
|
this.start = start
|
|
this.end = end
|
|
this.audio = audio
|
|
}
|
|
DataRequest.prototype = {
|
|
requests: {},
|
|
open: function (mode, name) {
|
|
this.name = name
|
|
this.requests[name] = this
|
|
Module.addRunDependency('fp ' + this.name)
|
|
},
|
|
send: function () {},
|
|
onload: function () {
|
|
const byteArray = this.byteArray.subarray(this.start, this.end)
|
|
this.finish(byteArray)
|
|
},
|
|
finish: function (byteArray) {
|
|
const that = this
|
|
Module.FS_createPreloadedFile(
|
|
this.name,
|
|
null,
|
|
byteArray,
|
|
true,
|
|
true,
|
|
function () {
|
|
Module.removeRunDependency('fp ' + that.name)
|
|
},
|
|
function () {
|
|
if (that.audio) {
|
|
Module.removeRunDependency('fp ' + that.name)
|
|
} else {
|
|
err('Preloading file ' + that.name + ' failed')
|
|
}
|
|
},
|
|
false,
|
|
true
|
|
)
|
|
this.requests[this.name] = null
|
|
}
|
|
}
|
|
const files = metadata.files
|
|
for (let i = 0; i < files.length; ++i) {
|
|
new DataRequest(files[i].start, files[i].end, files[i].audio).open(
|
|
'GET',
|
|
files[i].filename
|
|
)
|
|
}
|
|
|
|
function processPackageData (arrayBuffer) {
|
|
Module.finishedDataFileDownloads++
|
|
assert(arrayBuffer, 'Loading data file failed.')
|
|
assert(
|
|
arrayBuffer instanceof ArrayBuffer,
|
|
'bad input to processPackageData'
|
|
)
|
|
const byteArray = new Uint8Array(arrayBuffer)
|
|
DataRequest.prototype.byteArray = byteArray
|
|
const files = metadata.files
|
|
for (let i = 0; i < files.length; ++i) {
|
|
DataRequest.prototype.requests[files[i].filename].onload()
|
|
}
|
|
Module.removeRunDependency(
|
|
'datafile_dist/js/subtitles-octopus-worker.data'
|
|
)
|
|
}
|
|
Module.addRunDependency('datafile_dist/js/subtitles-octopus-worker.data')
|
|
if (!Module.preloadResults) Module.preloadResults = {}
|
|
Module.preloadResults[PACKAGE_NAME] = {
|
|
fromCache: false
|
|
}
|
|
if (fetched) {
|
|
processPackageData(fetched)
|
|
fetched = null
|
|
} else {
|
|
fetchedCallback = processPackageData
|
|
}
|
|
}
|
|
if (Module.calledRun) {
|
|
runWithFS()
|
|
} else {
|
|
if (!Module.preRun) Module.preRun = []
|
|
Module.preRun.push(runWithFS)
|
|
}
|
|
}
|
|
loadPackage({
|
|
files: [
|
|
{
|
|
filename: '/assets/default.ttc',
|
|
start: 0,
|
|
end: 18748872,
|
|
audio: 0
|
|
},
|
|
{
|
|
filename: '/assets/fonts.conf',
|
|
start: 18748872,
|
|
end: 18749675,
|
|
audio: 0
|
|
}
|
|
],
|
|
remote_package_size: 18749675,
|
|
package_uuid: 'c2c4bc8c-8d5f-44f7-ba59-afa5c87c5ec1'
|
|
})
|
|
})()
|
|
if (!String.prototype.endsWith) {
|
|
String.prototype.endsWith = function (search, this_len) {
|
|
if (this_len === undefined || this_len > this.length) {
|
|
this_len = this.length
|
|
}
|
|
return this.substring(this_len - search.length, this_len) === search
|
|
}
|
|
}
|
|
if (!Uint8Array.prototype.slice) {
|
|
Object.defineProperty(Uint8Array.prototype, 'slice', {
|
|
value: function (begin, end) {
|
|
return new Uint8Array(this.subarray(begin, end))
|
|
}
|
|
})
|
|
}
|
|
const hasNativeConsole = typeof console !== 'undefined'
|
|
|
|
function makeCustomConsole () {
|
|
const console = (function () {
|
|
function postConsoleMessage (prefix, args) {
|
|
postMessage({
|
|
target: 'console-' + prefix,
|
|
content: JSON.stringify(Array.prototype.slice.call(args))
|
|
})
|
|
}
|
|
return {
|
|
log: function () {
|
|
postConsoleMessage('log', arguments)
|
|
},
|
|
debug: function () {
|
|
postConsoleMessage('debug', arguments)
|
|
},
|
|
info: function () {
|
|
postConsoleMessage('info', arguments)
|
|
},
|
|
warn: function () {
|
|
postConsoleMessage('warn', arguments)
|
|
},
|
|
error: function () {
|
|
postConsoleMessage('error', arguments)
|
|
}
|
|
}
|
|
})()
|
|
return console
|
|
}
|
|
Module = Module || {}
|
|
Module.preRun = Module.preRun || []
|
|
Module.preRun.push(function () {
|
|
var i
|
|
Module.FS_createFolder('/', 'fonts', true, true)
|
|
if (!self.subContent) {
|
|
if (self.subUrl.endsWith('.br')) {
|
|
self.subContent = Module.BrotliDecode(readBinary(self.subUrl))
|
|
} else {
|
|
self.subContent = read_(self.subUrl)
|
|
}
|
|
}
|
|
let result
|
|
{
|
|
const regex = new RegExp(
|
|
'^fontname((v2:[ \t]*(?<fontName2>[^_]+)_(?<fontProperties2>[^,]*).(?<fontExtension2>[a-z0-9]{3,5}),[ \t]*(?<fontContent2>.+)$)|(:[ \t]*(?<fontName>[^_]+)_(?<fontProperties>[^$]*).(?<fontExtension>[a-z0-9]{3,5})(?<fontContent>(?:\r?\n[!-`]+)+)))',
|
|
'mg'
|
|
)
|
|
while ((result = regex.exec(self.subContent)) !== null) {
|
|
let font
|
|
if (
|
|
'fontName2' in result.groups &&
|
|
result.groups.fontName2 !== undefined
|
|
) {
|
|
font = {
|
|
content: self.readDataUri(result.groups.fontContent2),
|
|
id: result.groups.fontName2,
|
|
name: result.groups.fontName2 + '.' + result.groups.fontExtension2
|
|
}
|
|
} else {
|
|
font = {
|
|
content: self.decodeASSFontEncoding(result.groups.fontContent),
|
|
id: result.groups.fontName2,
|
|
name: result.groups.fontName + '.' + result.groups.fontExtension
|
|
}
|
|
}
|
|
self.fontMap_[font.id] = true
|
|
Module.FS.writeFile(
|
|
'/fonts/font' + self.fontId++ + '-' + font.name,
|
|
font.content,
|
|
{
|
|
encoding: 'binary'
|
|
}
|
|
)
|
|
console.log('libass: attaching embedded font ' + font.name)
|
|
}
|
|
}
|
|
if (self.availableFonts && self.availableFonts.length !== 0) {
|
|
const sections = parseAss(self.subContent)
|
|
for (var i = 0; i < sections.length; i++) {
|
|
for (let j = 0; j < sections[i].body.length; j++) {
|
|
if (sections[i].body[j].key === 'Style') {
|
|
self.writeFontToFS(sections[i].body[j].value.Fontname)
|
|
}
|
|
}
|
|
}
|
|
const regex = /\\fn([^\\}]*?)[\\}]/g
|
|
let matches
|
|
while ((matches = regex.exec(self.subContent))) {
|
|
self.writeFontToFS(matches[1])
|
|
}
|
|
}
|
|
if (self.subContent) {
|
|
Module.FS.writeFile('/sub.ass', self.subContent)
|
|
}
|
|
self.subContent = null
|
|
const fontFiles = self.fontFiles || []
|
|
for (i = 0; i < fontFiles.length; i++) {
|
|
Module.FS_createPreloadedFile(
|
|
'/fonts',
|
|
'font' + i + '-' + fontFiles[i].split('/').pop(),
|
|
fontFiles[i],
|
|
true,
|
|
true
|
|
)
|
|
}
|
|
})
|
|
Module.onRuntimeInitialized = function () {
|
|
self.octObj = new Module.SubtitleOctopus()
|
|
self.changed = Module._malloc(4)
|
|
self.octObj.initLibrary(screen.width, screen.height)
|
|
self.octObj.setDropAnimations(!!self.dropAllAnimations)
|
|
self.octObj.createTrack('/sub.ass')
|
|
self.ass_track = self.octObj.track
|
|
self.ass_library = self.octObj.ass_library
|
|
self.ass_renderer = self.octObj.ass_renderer
|
|
if (self.libassMemoryLimit > 0 || self.libassGlyphLimit > 0) {
|
|
self.octObj.setMemoryLimits(self.libassGlyphLimit, self.libassMemoryLimit)
|
|
}
|
|
}
|
|
Module.print = function (text) {
|
|
if (arguments.length > 1) {
|
|
text = Array.prototype.slice.call(arguments).join(' ')
|
|
}
|
|
console.log(text)
|
|
}
|
|
Module.printErr = function (text) {
|
|
if (arguments.length > 1) {
|
|
text = Array.prototype.slice.call(arguments).join(' ')
|
|
}
|
|
console.error(text)
|
|
}
|
|
if (!hasNativeConsole) {
|
|
var console = {
|
|
log: function (x) {
|
|
if (typeof dump === 'function') dump('log: ' + x + '\n')
|
|
},
|
|
debug: function (x) {
|
|
if (typeof dump === 'function') dump('debug: ' + x + '\n')
|
|
},
|
|
info: function (x) {
|
|
if (typeof dump === 'function') dump('info: ' + x + '\n')
|
|
},
|
|
warn: function (x) {
|
|
if (typeof dump === 'function') dump('warn: ' + x + '\n')
|
|
},
|
|
error: function (x) {
|
|
if (typeof dump === 'function') dump('error: ' + x + '\n')
|
|
}
|
|
}
|
|
}
|
|
if ('performance' in self === false) {
|
|
self.performance = {}
|
|
}
|
|
Date.now =
|
|
Date.now ||
|
|
function () {
|
|
return new Date().getTime()
|
|
}
|
|
if ('now' in self.performance === false) {
|
|
let nowOffset = Date.now()
|
|
if (performance.timing && performance.timing.navigationStart) {
|
|
nowOffset = performance.timing.navigationStart
|
|
}
|
|
self.performance.now = function now () {
|
|
return Date.now() - nowOffset
|
|
}
|
|
}
|
|
;(function (f) {
|
|
if (typeof exports === 'object' && typeof module !== 'undefined') {
|
|
module.exports = f()
|
|
} else if (typeof define === 'function' && define.amd) {
|
|
define([], f)
|
|
} else {
|
|
let g
|
|
if (typeof window !== 'undefined') {
|
|
g = window
|
|
} else if (typeof global !== 'undefined') {
|
|
g = global
|
|
} else if (typeof self !== 'undefined') {
|
|
g = self
|
|
} else {
|
|
g = this
|
|
}
|
|
g.unbrotli = f()
|
|
}
|
|
})(function () {
|
|
return (function () {
|
|
function r (e, n, t) {
|
|
function o (i, f) {
|
|
if (!n[i]) {
|
|
if (!e[i]) {
|
|
const c = typeof require === 'function' && require
|
|
if (!f && c) return c(i, !0)
|
|
if (u) return u(i, !0)
|
|
const a = new Error("Cannot find module '" + i + "'")
|
|
throw ((a.code = 'MODULE_NOT_FOUND'), a)
|
|
}
|
|
const p = (n[i] = {
|
|
exports: {}
|
|
})
|
|
e[i][0].call(
|
|
p.exports,
|
|
function (r) {
|
|
const n = e[i][1][r]
|
|
return o(n || r)
|
|
},
|
|
p,
|
|
p.exports,
|
|
r,
|
|
e,
|
|
n,
|
|
t
|
|
)
|
|
}
|
|
return n[i].exports
|
|
}
|
|
for (
|
|
var u = typeof require === 'function' && require, i = 0;
|
|
i < t.length;
|
|
i++
|
|
) {
|
|
o(t[i])
|
|
}
|
|
return o
|
|
}
|
|
return r
|
|
})()(
|
|
{
|
|
1: [
|
|
function (require, module, exports) {
|
|
const BROTLI_READ_SIZE = 4096
|
|
const BROTLI_IBUF_SIZE = 2 * BROTLI_READ_SIZE + 32
|
|
const BROTLI_IBUF_MASK = 2 * BROTLI_READ_SIZE - 1
|
|
const kBitMask = new Uint32Array([
|
|
0,
|
|
1,
|
|
3,
|
|
7,
|
|
15,
|
|
31,
|
|
63,
|
|
127,
|
|
255,
|
|
511,
|
|
1023,
|
|
2047,
|
|
4095,
|
|
8191,
|
|
16383,
|
|
32767,
|
|
65535,
|
|
131071,
|
|
262143,
|
|
524287,
|
|
1048575,
|
|
2097151,
|
|
4194303,
|
|
8388607,
|
|
16777215
|
|
])
|
|
|
|
function BrotliBitReader (input) {
|
|
this.buf_ = new Uint8Array(BROTLI_IBUF_SIZE)
|
|
this.input_ = input
|
|
this.reset()
|
|
}
|
|
BrotliBitReader.READ_SIZE = BROTLI_READ_SIZE
|
|
BrotliBitReader.IBUF_MASK = BROTLI_IBUF_MASK
|
|
BrotliBitReader.prototype.reset = function () {
|
|
this.buf_ptr_ = 0
|
|
this.val_ = 0
|
|
this.pos_ = 0
|
|
this.bit_pos_ = 0
|
|
this.bit_end_pos_ = 0
|
|
this.eos_ = 0
|
|
this.readMoreInput()
|
|
for (let i = 0; i < 4; i++) {
|
|
this.val_ |= this.buf_[this.pos_] << (8 * i)
|
|
++this.pos_
|
|
}
|
|
return this.bit_end_pos_ > 0
|
|
}
|
|
BrotliBitReader.prototype.readMoreInput = function () {
|
|
if (this.bit_end_pos_ > 256) {
|
|
} else if (this.eos_) {
|
|
if (this.bit_pos_ > this.bit_end_pos_) {
|
|
throw new Error(
|
|
'Unexpected end of input ' +
|
|
this.bit_pos_ +
|
|
' ' +
|
|
this.bit_end_pos_
|
|
)
|
|
}
|
|
} else {
|
|
const dst = this.buf_ptr_
|
|
const bytes_read = this.input_.read(
|
|
this.buf_,
|
|
dst,
|
|
BROTLI_READ_SIZE
|
|
)
|
|
if (bytes_read < 0) {
|
|
throw new Error('Unexpected end of input')
|
|
}
|
|
if (bytes_read < BROTLI_READ_SIZE) {
|
|
this.eos_ = 1
|
|
for (var p = 0; p < 32; p++) this.buf_[dst + bytes_read + p] = 0
|
|
}
|
|
if (dst === 0) {
|
|
for (var p = 0; p < 32; p++) {
|
|
this.buf_[(BROTLI_READ_SIZE << 1) + p] = this.buf_[p]
|
|
}
|
|
this.buf_ptr_ = BROTLI_READ_SIZE
|
|
} else {
|
|
this.buf_ptr_ = 0
|
|
}
|
|
this.bit_end_pos_ += bytes_read << 3
|
|
}
|
|
}
|
|
BrotliBitReader.prototype.fillBitWindow = function () {
|
|
while (this.bit_pos_ >= 8) {
|
|
this.val_ >>>= 8
|
|
this.val_ |= this.buf_[this.pos_ & BROTLI_IBUF_MASK] << 24
|
|
++this.pos_
|
|
this.bit_pos_ = (this.bit_pos_ - 8) >>> 0
|
|
this.bit_end_pos_ = (this.bit_end_pos_ - 8) >>> 0
|
|
}
|
|
}
|
|
BrotliBitReader.prototype.readBits = function (n_bits) {
|
|
if (32 - this.bit_pos_ < n_bits) {
|
|
this.fillBitWindow()
|
|
}
|
|
const val = (this.val_ >>> this.bit_pos_) & kBitMask[n_bits]
|
|
this.bit_pos_ += n_bits
|
|
return val
|
|
}
|
|
module.exports = BrotliBitReader
|
|
},
|
|
{}
|
|
],
|
|
2: [
|
|
function (require, module, exports) {
|
|
exports.lookup = new Uint8Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
4,
|
|
4,
|
|
0,
|
|
0,
|
|
4,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
8,
|
|
12,
|
|
16,
|
|
12,
|
|
12,
|
|
20,
|
|
12,
|
|
16,
|
|
24,
|
|
28,
|
|
12,
|
|
12,
|
|
32,
|
|
12,
|
|
36,
|
|
12,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
32,
|
|
32,
|
|
24,
|
|
40,
|
|
28,
|
|
12,
|
|
12,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
48,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
24,
|
|
12,
|
|
28,
|
|
12,
|
|
12,
|
|
12,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
56,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
24,
|
|
12,
|
|
28,
|
|
12,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
2,
|
|
3,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
0,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
7,
|
|
0,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
56,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
58,
|
|
59,
|
|
60,
|
|
61,
|
|
62,
|
|
63,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
58,
|
|
59,
|
|
60,
|
|
61,
|
|
62,
|
|
63,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
58,
|
|
59,
|
|
60,
|
|
61,
|
|
62,
|
|
63,
|
|
0,
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
5,
|
|
6,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15,
|
|
16,
|
|
17,
|
|
18,
|
|
19,
|
|
20,
|
|
21,
|
|
22,
|
|
23,
|
|
24,
|
|
25,
|
|
26,
|
|
27,
|
|
28,
|
|
29,
|
|
30,
|
|
31,
|
|
32,
|
|
33,
|
|
34,
|
|
35,
|
|
36,
|
|
37,
|
|
38,
|
|
39,
|
|
40,
|
|
41,
|
|
42,
|
|
43,
|
|
44,
|
|
45,
|
|
46,
|
|
47,
|
|
48,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
54,
|
|
55,
|
|
56,
|
|
57,
|
|
58,
|
|
59,
|
|
60,
|
|
61,
|
|
62,
|
|
63,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
5,
|
|
5,
|
|
5,
|
|
5,
|
|
6,
|
|
6,
|
|
6,
|
|
6,
|
|
7,
|
|
7,
|
|
7,
|
|
7,
|
|
8,
|
|
8,
|
|
8,
|
|
8,
|
|
9,
|
|
9,
|
|
9,
|
|
9,
|
|
10,
|
|
10,
|
|
10,
|
|
10,
|
|
11,
|
|
11,
|
|
11,
|
|
11,
|
|
12,
|
|
12,
|
|
12,
|
|
12,
|
|
13,
|
|
13,
|
|
13,
|
|
13,
|
|
14,
|
|
14,
|
|
14,
|
|
14,
|
|
15,
|
|
15,
|
|
15,
|
|
15,
|
|
16,
|
|
16,
|
|
16,
|
|
16,
|
|
17,
|
|
17,
|
|
17,
|
|
17,
|
|
18,
|
|
18,
|
|
18,
|
|
18,
|
|
19,
|
|
19,
|
|
19,
|
|
19,
|
|
20,
|
|
20,
|
|
20,
|
|
20,
|
|
21,
|
|
21,
|
|
21,
|
|
21,
|
|
22,
|
|
22,
|
|
22,
|
|
22,
|
|
23,
|
|
23,
|
|
23,
|
|
23,
|
|
24,
|
|
24,
|
|
24,
|
|
24,
|
|
25,
|
|
25,
|
|
25,
|
|
25,
|
|
26,
|
|
26,
|
|
26,
|
|
26,
|
|
27,
|
|
27,
|
|
27,
|
|
27,
|
|
28,
|
|
28,
|
|
28,
|
|
28,
|
|
29,
|
|
29,
|
|
29,
|
|
29,
|
|
30,
|
|
30,
|
|
30,
|
|
30,
|
|
31,
|
|
31,
|
|
31,
|
|
31,
|
|
32,
|
|
32,
|
|
32,
|
|
32,
|
|
33,
|
|
33,
|
|
33,
|
|
33,
|
|
34,
|
|
34,
|
|
34,
|
|
34,
|
|
35,
|
|
35,
|
|
35,
|
|
35,
|
|
36,
|
|
36,
|
|
36,
|
|
36,
|
|
37,
|
|
37,
|
|
37,
|
|
37,
|
|
38,
|
|
38,
|
|
38,
|
|
38,
|
|
39,
|
|
39,
|
|
39,
|
|
39,
|
|
40,
|
|
40,
|
|
40,
|
|
40,
|
|
41,
|
|
41,
|
|
41,
|
|
41,
|
|
42,
|
|
42,
|
|
42,
|
|
42,
|
|
43,
|
|
43,
|
|
43,
|
|
43,
|
|
44,
|
|
44,
|
|
44,
|
|
44,
|
|
45,
|
|
45,
|
|
45,
|
|
45,
|
|
46,
|
|
46,
|
|
46,
|
|
46,
|
|
47,
|
|
47,
|
|
47,
|
|
47,
|
|
48,
|
|
48,
|
|
48,
|
|
48,
|
|
49,
|
|
49,
|
|
49,
|
|
49,
|
|
50,
|
|
50,
|
|
50,
|
|
50,
|
|
51,
|
|
51,
|
|
51,
|
|
51,
|
|
52,
|
|
52,
|
|
52,
|
|
52,
|
|
53,
|
|
53,
|
|
53,
|
|
53,
|
|
54,
|
|
54,
|
|
54,
|
|
54,
|
|
55,
|
|
55,
|
|
55,
|
|
55,
|
|
56,
|
|
56,
|
|
56,
|
|
56,
|
|
57,
|
|
57,
|
|
57,
|
|
57,
|
|
58,
|
|
58,
|
|
58,
|
|
58,
|
|
59,
|
|
59,
|
|
59,
|
|
59,
|
|
60,
|
|
60,
|
|
60,
|
|
60,
|
|
61,
|
|
61,
|
|
61,
|
|
61,
|
|
62,
|
|
62,
|
|
62,
|
|
62,
|
|
63,
|
|
63,
|
|
63,
|
|
63,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0
|
|
])
|
|
exports.lookupOffsets = new Uint16Array([
|
|
1024,
|
|
1536,
|
|
1280,
|
|
1536,
|
|
0,
|
|
256,
|
|
768,
|
|
512
|
|
])
|
|
},
|
|
{}
|
|
],
|
|
3: [
|
|
function (require, module, exports) {
|
|
const BrotliInput = require('./streams').BrotliInput
|
|
const BrotliOutput = require('./streams').BrotliOutput
|
|
const BrotliBitReader = require('./bit_reader')
|
|
const BrotliDictionary = require('./dictionary')
|
|
const HuffmanCode = require('./huffman').HuffmanCode
|
|
const BrotliBuildHuffmanTable = require('./huffman')
|
|
.BrotliBuildHuffmanTable
|
|
const Context = require('./context')
|
|
const Prefix = require('./prefix')
|
|
const Transform = require('./transform')
|
|
const kDefaultCodeLength = 8
|
|
const kCodeLengthRepeatCode = 16
|
|
const kNumLiteralCodes = 256
|
|
const kNumInsertAndCopyCodes = 704
|
|
const kNumBlockLengthCodes = 26
|
|
const kLiteralContextBits = 6
|
|
const kDistanceContextBits = 2
|
|
const HUFFMAN_TABLE_BITS = 8
|
|
const HUFFMAN_TABLE_MASK = 255
|
|
const HUFFMAN_MAX_TABLE_SIZE = 1080
|
|
const CODE_LENGTH_CODES = 18
|
|
const kCodeLengthCodeOrder = new Uint8Array([
|
|
1,
|
|
2,
|
|
3,
|
|
4,
|
|
0,
|
|
5,
|
|
17,
|
|
6,
|
|
16,
|
|
7,
|
|
8,
|
|
9,
|
|
10,
|
|
11,
|
|
12,
|
|
13,
|
|
14,
|
|
15
|
|
])
|
|
const NUM_DISTANCE_SHORT_CODES = 16
|
|
const kDistanceShortCodeIndexOffset = new Uint8Array([
|
|
3,
|
|
2,
|
|
1,
|
|
0,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
3,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2,
|
|
2
|
|
])
|
|
const kDistanceShortCodeValueOffset = new Int8Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
-1,
|
|
1,
|
|
-2,
|
|
2,
|
|
-3,
|
|
3,
|
|
-1,
|
|
1,
|
|
-2,
|
|
2,
|
|
-3,
|
|
3
|
|
])
|
|
const kMaxHuffmanTableSize = new Uint16Array([
|
|
256,
|
|
402,
|
|
436,
|
|
468,
|
|
500,
|
|
534,
|
|
566,
|
|
598,
|
|
630,
|
|
662,
|
|
694,
|
|
726,
|
|
758,
|
|
790,
|
|
822,
|
|
854,
|
|
886,
|
|
920,
|
|
952,
|
|
984,
|
|
1016,
|
|
1048,
|
|
1080
|
|
])
|
|
|
|
function DecodeWindowBits (br) {
|
|
let n
|
|
if (br.readBits(1) === 0) {
|
|
return 16
|
|
}
|
|
n = br.readBits(3)
|
|
if (n > 0) {
|
|
return 17 + n
|
|
}
|
|
n = br.readBits(3)
|
|
if (n > 0) {
|
|
return 8 + n
|
|
}
|
|
return 17
|
|
}
|
|
|
|
function DecodeVarLenUint8 (br) {
|
|
if (br.readBits(1)) {
|
|
const nbits = br.readBits(3)
|
|
if (nbits === 0) {
|
|
return 1
|
|
} else {
|
|
return br.readBits(nbits) + (1 << nbits)
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
|
|
function MetaBlockLength () {
|
|
this.meta_block_length = 0
|
|
this.input_end = 0
|
|
this.is_uncompressed = 0
|
|
this.is_metadata = false
|
|
}
|
|
|
|
function DecodeMetaBlockLength (br) {
|
|
const out = new MetaBlockLength()
|
|
let size_nibbles
|
|
let size_bytes
|
|
let i
|
|
out.input_end = br.readBits(1)
|
|
if (out.input_end && br.readBits(1)) {
|
|
return out
|
|
}
|
|
size_nibbles = br.readBits(2) + 4
|
|
if (size_nibbles === 7) {
|
|
out.is_metadata = true
|
|
if (br.readBits(1) !== 0) throw new Error('Invalid reserved bit')
|
|
size_bytes = br.readBits(2)
|
|
if (size_bytes === 0) return out
|
|
for (i = 0; i < size_bytes; i++) {
|
|
const next_byte = br.readBits(8)
|
|
if (i + 1 === size_bytes && size_bytes > 1 && next_byte === 0) {
|
|
throw new Error('Invalid size byte')
|
|
}
|
|
out.meta_block_length |= next_byte << (i * 8)
|
|
}
|
|
} else {
|
|
for (i = 0; i < size_nibbles; ++i) {
|
|
const next_nibble = br.readBits(4)
|
|
if (
|
|
i + 1 === size_nibbles &&
|
|
size_nibbles > 4 &&
|
|
next_nibble === 0
|
|
) {
|
|
throw new Error('Invalid size nibble')
|
|
}
|
|
out.meta_block_length |= next_nibble << (i * 4)
|
|
}
|
|
}
|
|
++out.meta_block_length
|
|
if (!out.input_end && !out.is_metadata) {
|
|
out.is_uncompressed = br.readBits(1)
|
|
}
|
|
return out
|
|
}
|
|
|
|
function ReadSymbol (table, index, br) {
|
|
let nbits
|
|
br.fillBitWindow()
|
|
index += (br.val_ >>> br.bit_pos_) & HUFFMAN_TABLE_MASK
|
|
nbits = table[index].bits - HUFFMAN_TABLE_BITS
|
|
if (nbits > 0) {
|
|
br.bit_pos_ += HUFFMAN_TABLE_BITS
|
|
index += table[index].value
|
|
index += (br.val_ >>> br.bit_pos_) & ((1 << nbits) - 1)
|
|
}
|
|
br.bit_pos_ += table[index].bits
|
|
return table[index].value
|
|
}
|
|
|
|
function ReadHuffmanCodeLengths (
|
|
code_length_code_lengths,
|
|
num_symbols,
|
|
code_lengths,
|
|
br
|
|
) {
|
|
let symbol = 0
|
|
let prev_code_len = kDefaultCodeLength
|
|
let repeat = 0
|
|
let repeat_code_len = 0
|
|
let space = 32768
|
|
const table = []
|
|
for (let i = 0; i < 32; i++) table.push(new HuffmanCode(0, 0))
|
|
BrotliBuildHuffmanTable(
|
|
table,
|
|
0,
|
|
5,
|
|
code_length_code_lengths,
|
|
CODE_LENGTH_CODES
|
|
)
|
|
while (symbol < num_symbols && space > 0) {
|
|
let p = 0
|
|
var code_len
|
|
br.readMoreInput()
|
|
br.fillBitWindow()
|
|
p += (br.val_ >>> br.bit_pos_) & 31
|
|
br.bit_pos_ += table[p].bits
|
|
code_len = table[p].value & 255
|
|
if (code_len < kCodeLengthRepeatCode) {
|
|
repeat = 0
|
|
code_lengths[symbol++] = code_len
|
|
if (code_len !== 0) {
|
|
prev_code_len = code_len
|
|
space -= 32768 >> code_len
|
|
}
|
|
} else {
|
|
const extra_bits = code_len - 14
|
|
var old_repeat
|
|
var repeat_delta
|
|
let new_len = 0
|
|
if (code_len === kCodeLengthRepeatCode) {
|
|
new_len = prev_code_len
|
|
}
|
|
if (repeat_code_len !== new_len) {
|
|
repeat = 0
|
|
repeat_code_len = new_len
|
|
}
|
|
old_repeat = repeat
|
|
if (repeat > 0) {
|
|
repeat -= 2
|
|
repeat <<= extra_bits
|
|
}
|
|
repeat += br.readBits(extra_bits) + 3
|
|
repeat_delta = repeat - old_repeat
|
|
if (symbol + repeat_delta > num_symbols) {
|
|
throw new Error(
|
|
'[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols'
|
|
)
|
|
}
|
|
for (let x = 0; x < repeat_delta; x++) {
|
|
code_lengths[symbol + x] = repeat_code_len
|
|
}
|
|
symbol += repeat_delta
|
|
if (repeat_code_len !== 0) {
|
|
space -= repeat_delta << (15 - repeat_code_len)
|
|
}
|
|
}
|
|
}
|
|
if (space !== 0) {
|
|
throw new Error('[ReadHuffmanCodeLengths] space = ' + space)
|
|
}
|
|
for (; symbol < num_symbols; symbol++) code_lengths[symbol] = 0
|
|
}
|
|
|
|
function ReadHuffmanCode (alphabet_size, tables, table, br) {
|
|
let table_size = 0
|
|
let simple_code_or_skip
|
|
const code_lengths = new Uint8Array(alphabet_size)
|
|
br.readMoreInput()
|
|
simple_code_or_skip = br.readBits(2)
|
|
if (simple_code_or_skip === 1) {
|
|
var i
|
|
let max_bits_counter = alphabet_size - 1
|
|
let max_bits = 0
|
|
const symbols = new Int32Array(4)
|
|
const num_symbols = br.readBits(2) + 1
|
|
while (max_bits_counter) {
|
|
max_bits_counter >>= 1
|
|
++max_bits
|
|
}
|
|
for (i = 0; i < num_symbols; ++i) {
|
|
symbols[i] = br.readBits(max_bits) % alphabet_size
|
|
code_lengths[symbols[i]] = 2
|
|
}
|
|
code_lengths[symbols[0]] = 1
|
|
switch (num_symbols) {
|
|
case 1:
|
|
break
|
|
case 3:
|
|
if (
|
|
symbols[0] === symbols[1] ||
|
|
symbols[0] === symbols[2] ||
|
|
symbols[1] === symbols[2]
|
|
) {
|
|
throw new Error('[ReadHuffmanCode] invalid symbols')
|
|
}
|
|
break
|
|
case 2:
|
|
if (symbols[0] === symbols[1]) {
|
|
throw new Error('[ReadHuffmanCode] invalid symbols')
|
|
}
|
|
code_lengths[symbols[1]] = 1
|
|
break
|
|
case 4:
|
|
if (
|
|
symbols[0] === symbols[1] ||
|
|
symbols[0] === symbols[2] ||
|
|
symbols[0] === symbols[3] ||
|
|
symbols[1] === symbols[2] ||
|
|
symbols[1] === symbols[3] ||
|
|
symbols[2] === symbols[3]
|
|
) {
|
|
throw new Error('[ReadHuffmanCode] invalid symbols')
|
|
}
|
|
if (br.readBits(1)) {
|
|
code_lengths[symbols[2]] = 3
|
|
code_lengths[symbols[3]] = 3
|
|
} else {
|
|
code_lengths[symbols[0]] = 2
|
|
}
|
|
break
|
|
}
|
|
} else {
|
|
var i
|
|
const code_length_code_lengths = new Uint8Array(CODE_LENGTH_CODES)
|
|
let space = 32
|
|
let num_codes = 0
|
|
const huff = [
|
|
new HuffmanCode(2, 0),
|
|
new HuffmanCode(2, 4),
|
|
new HuffmanCode(2, 3),
|
|
new HuffmanCode(3, 2),
|
|
new HuffmanCode(2, 0),
|
|
new HuffmanCode(2, 4),
|
|
new HuffmanCode(2, 3),
|
|
new HuffmanCode(4, 1),
|
|
new HuffmanCode(2, 0),
|
|
new HuffmanCode(2, 4),
|
|
new HuffmanCode(2, 3),
|
|
new HuffmanCode(3, 2),
|
|
new HuffmanCode(2, 0),
|
|
new HuffmanCode(2, 4),
|
|
new HuffmanCode(2, 3),
|
|
new HuffmanCode(4, 5)
|
|
]
|
|
for (
|
|
i = simple_code_or_skip;
|
|
i < CODE_LENGTH_CODES && space > 0;
|
|
++i
|
|
) {
|
|
const code_len_idx = kCodeLengthCodeOrder[i]
|
|
let p = 0
|
|
var v
|
|
br.fillBitWindow()
|
|
p += (br.val_ >>> br.bit_pos_) & 15
|
|
br.bit_pos_ += huff[p].bits
|
|
v = huff[p].value
|
|
code_length_code_lengths[code_len_idx] = v
|
|
if (v !== 0) {
|
|
space -= 32 >> v
|
|
++num_codes
|
|
}
|
|
}
|
|
if (!(num_codes === 1 || space === 0)) {
|
|
throw new Error('[ReadHuffmanCode] invalid num_codes or space')
|
|
}
|
|
ReadHuffmanCodeLengths(
|
|
code_length_code_lengths,
|
|
alphabet_size,
|
|
code_lengths,
|
|
br
|
|
)
|
|
}
|
|
table_size = BrotliBuildHuffmanTable(
|
|
tables,
|
|
table,
|
|
HUFFMAN_TABLE_BITS,
|
|
code_lengths,
|
|
alphabet_size
|
|
)
|
|
if (table_size === 0) {
|
|
throw new Error('[ReadHuffmanCode] BuildHuffmanTable failed: ')
|
|
}
|
|
return table_size
|
|
}
|
|
|
|
function ReadBlockLength (table, index, br) {
|
|
let code
|
|
let nbits
|
|
code = ReadSymbol(table, index, br)
|
|
nbits = Prefix.kBlockLengthPrefixCode[code].nbits
|
|
return (
|
|
Prefix.kBlockLengthPrefixCode[code].offset + br.readBits(nbits)
|
|
)
|
|
}
|
|
|
|
function TranslateShortCodes (code, ringbuffer, index) {
|
|
let val
|
|
if (code < NUM_DISTANCE_SHORT_CODES) {
|
|
index += kDistanceShortCodeIndexOffset[code]
|
|
index &= 3
|
|
val = ringbuffer[index] + kDistanceShortCodeValueOffset[code]
|
|
} else {
|
|
val = code - NUM_DISTANCE_SHORT_CODES + 1
|
|
}
|
|
return val
|
|
}
|
|
|
|
function MoveToFront (v, index) {
|
|
const value = v[index]
|
|
let i = index
|
|
for (; i; --i) v[i] = v[i - 1]
|
|
v[0] = value
|
|
}
|
|
|
|
function InverseMoveToFrontTransform (v, v_len) {
|
|
const mtf = new Uint8Array(256)
|
|
let i
|
|
for (i = 0; i < 256; ++i) {
|
|
mtf[i] = i
|
|
}
|
|
for (i = 0; i < v_len; ++i) {
|
|
const index = v[i]
|
|
v[i] = mtf[index]
|
|
if (index) MoveToFront(mtf, index)
|
|
}
|
|
}
|
|
|
|
function HuffmanTreeGroup (alphabet_size, num_htrees) {
|
|
this.alphabet_size = alphabet_size
|
|
this.num_htrees = num_htrees
|
|
this.codes = new Array(
|
|
num_htrees +
|
|
num_htrees * kMaxHuffmanTableSize[(alphabet_size + 31) >>> 5]
|
|
)
|
|
this.htrees = new Uint32Array(num_htrees)
|
|
}
|
|
HuffmanTreeGroup.prototype.decode = function (br) {
|
|
let i
|
|
let table_size
|
|
let next = 0
|
|
for (i = 0; i < this.num_htrees; ++i) {
|
|
this.htrees[i] = next
|
|
table_size = ReadHuffmanCode(
|
|
this.alphabet_size,
|
|
this.codes,
|
|
next,
|
|
br
|
|
)
|
|
next += table_size
|
|
}
|
|
}
|
|
|
|
function DecodeContextMap (context_map_size, br) {
|
|
const out = {
|
|
num_htrees: null,
|
|
context_map: null
|
|
}
|
|
let use_rle_for_zeros
|
|
let max_run_length_prefix = 0
|
|
let table
|
|
let i
|
|
br.readMoreInput()
|
|
const num_htrees = (out.num_htrees = DecodeVarLenUint8(br) + 1)
|
|
const context_map = (out.context_map = new Uint8Array(
|
|
context_map_size
|
|
))
|
|
if (num_htrees <= 1) {
|
|
return out
|
|
}
|
|
use_rle_for_zeros = br.readBits(1)
|
|
if (use_rle_for_zeros) {
|
|
max_run_length_prefix = br.readBits(4) + 1
|
|
}
|
|
table = []
|
|
for (i = 0; i < HUFFMAN_MAX_TABLE_SIZE; i++) {
|
|
table[i] = new HuffmanCode(0, 0)
|
|
}
|
|
ReadHuffmanCode(num_htrees + max_run_length_prefix, table, 0, br)
|
|
for (i = 0; i < context_map_size;) {
|
|
var code
|
|
br.readMoreInput()
|
|
code = ReadSymbol(table, 0, br)
|
|
if (code === 0) {
|
|
context_map[i] = 0
|
|
++i
|
|
} else if (code <= max_run_length_prefix) {
|
|
let reps = 1 + (1 << code) + br.readBits(code)
|
|
while (--reps) {
|
|
if (i >= context_map_size) {
|
|
throw new Error('[DecodeContextMap] i >= context_map_size')
|
|
}
|
|
context_map[i] = 0
|
|
++i
|
|
}
|
|
} else {
|
|
context_map[i] = code - max_run_length_prefix
|
|
++i
|
|
}
|
|
}
|
|
if (br.readBits(1)) {
|
|
InverseMoveToFrontTransform(context_map, context_map_size)
|
|
}
|
|
return out
|
|
}
|
|
|
|
function DecodeBlockType (
|
|
max_block_type,
|
|
trees,
|
|
tree_type,
|
|
block_types,
|
|
ringbuffers,
|
|
indexes,
|
|
br
|
|
) {
|
|
const ringbuffer = tree_type * 2
|
|
const index = tree_type
|
|
const type_code = ReadSymbol(
|
|
trees,
|
|
tree_type * HUFFMAN_MAX_TABLE_SIZE,
|
|
br
|
|
)
|
|
let block_type
|
|
if (type_code === 0) {
|
|
block_type = ringbuffers[ringbuffer + (indexes[index] & 1)]
|
|
} else if (type_code === 1) {
|
|
block_type =
|
|
ringbuffers[ringbuffer + ((indexes[index] - 1) & 1)] + 1
|
|
} else {
|
|
block_type = type_code - 2
|
|
}
|
|
if (block_type >= max_block_type) {
|
|
block_type -= max_block_type
|
|
}
|
|
block_types[tree_type] = block_type
|
|
ringbuffers[ringbuffer + (indexes[index] & 1)] = block_type
|
|
++indexes[index]
|
|
}
|
|
|
|
function CopyUncompressedBlockToOutput (
|
|
output,
|
|
len,
|
|
pos,
|
|
ringbuffer,
|
|
ringbuffer_mask,
|
|
br
|
|
) {
|
|
const rb_size = ringbuffer_mask + 1
|
|
let rb_pos = pos & ringbuffer_mask
|
|
let br_pos = br.pos_ & BrotliBitReader.IBUF_MASK
|
|
let nbytes
|
|
if (len < 8 || br.bit_pos_ + (len << 3) < br.bit_end_pos_) {
|
|
while (len-- > 0) {
|
|
br.readMoreInput()
|
|
ringbuffer[rb_pos++] = br.readBits(8)
|
|
if (rb_pos === rb_size) {
|
|
output.write(ringbuffer, rb_size)
|
|
rb_pos = 0
|
|
}
|
|
}
|
|
return
|
|
}
|
|
if (br.bit_end_pos_ < 32) {
|
|
throw new Error(
|
|
'[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32'
|
|
)
|
|
}
|
|
while (br.bit_pos_ < 32) {
|
|
ringbuffer[rb_pos] = br.val_ >>> br.bit_pos_
|
|
br.bit_pos_ += 8
|
|
++rb_pos
|
|
--len
|
|
}
|
|
nbytes = (br.bit_end_pos_ - br.bit_pos_) >> 3
|
|
if (br_pos + nbytes > BrotliBitReader.IBUF_MASK) {
|
|
const tail = BrotliBitReader.IBUF_MASK + 1 - br_pos
|
|
for (var x = 0; x < tail; x++) {
|
|
ringbuffer[rb_pos + x] = br.buf_[br_pos + x]
|
|
}
|
|
nbytes -= tail
|
|
rb_pos += tail
|
|
len -= tail
|
|
br_pos = 0
|
|
}
|
|
for (var x = 0; x < nbytes; x++) {
|
|
ringbuffer[rb_pos + x] = br.buf_[br_pos + x]
|
|
}
|
|
rb_pos += nbytes
|
|
len -= nbytes
|
|
if (rb_pos >= rb_size) {
|
|
output.write(ringbuffer, rb_size)
|
|
rb_pos -= rb_size
|
|
for (var x = 0; x < rb_pos; x++) {
|
|
ringbuffer[x] = ringbuffer[rb_size + x]
|
|
}
|
|
}
|
|
while (rb_pos + len >= rb_size) {
|
|
nbytes = rb_size - rb_pos
|
|
if (br.input_.read(ringbuffer, rb_pos, nbytes) < nbytes) {
|
|
throw new Error(
|
|
'[CopyUncompressedBlockToOutput] not enough bytes'
|
|
)
|
|
}
|
|
output.write(ringbuffer, rb_size)
|
|
len -= nbytes
|
|
rb_pos = 0
|
|
}
|
|
if (br.input_.read(ringbuffer, rb_pos, len) < len) {
|
|
throw new Error(
|
|
'[CopyUncompressedBlockToOutput] not enough bytes'
|
|
)
|
|
}
|
|
br.reset()
|
|
}
|
|
|
|
function JumpToByteBoundary (br) {
|
|
const new_bit_pos = (br.bit_pos_ + 7) & ~7
|
|
const pad_bits = br.readBits(new_bit_pos - br.bit_pos_)
|
|
return pad_bits == 0
|
|
}
|
|
|
|
function BrotliDecompressedSize (buffer) {
|
|
const input = new BrotliInput(buffer)
|
|
const br = new BrotliBitReader(input)
|
|
DecodeWindowBits(br)
|
|
const out = DecodeMetaBlockLength(br)
|
|
return out.meta_block_length
|
|
}
|
|
exports.BrotliDecompressedSize = BrotliDecompressedSize
|
|
|
|
function BrotliDecompressBuffer (buffer, output_size) {
|
|
const input = new BrotliInput(buffer)
|
|
if (output_size == null) {
|
|
output_size = BrotliDecompressedSize(buffer)
|
|
}
|
|
const output_buffer = new Uint8Array(output_size)
|
|
const output = new BrotliOutput(output_buffer)
|
|
BrotliDecompress(input, output)
|
|
if (output.pos < output.buffer.length) {
|
|
output.buffer = output.buffer.subarray(0, output.pos)
|
|
}
|
|
return output.buffer
|
|
}
|
|
exports.BrotliDecompressBuffer = BrotliDecompressBuffer
|
|
|
|
function BrotliDecompress (input, output) {
|
|
let i
|
|
let pos = 0
|
|
let input_end = 0
|
|
let window_bits = 0
|
|
let max_backward_distance
|
|
let max_distance = 0
|
|
let ringbuffer_size
|
|
let ringbuffer_mask
|
|
let ringbuffer
|
|
let ringbuffer_end
|
|
const dist_rb = [16, 15, 11, 4]
|
|
let dist_rb_idx = 0
|
|
let prev_byte1 = 0
|
|
let prev_byte2 = 0
|
|
const hgroup = [
|
|
new HuffmanTreeGroup(0, 0),
|
|
new HuffmanTreeGroup(0, 0),
|
|
new HuffmanTreeGroup(0, 0)
|
|
]
|
|
let block_type_trees
|
|
let block_len_trees
|
|
let br
|
|
const kRingBufferWriteAheadSlack = 128 + BrotliBitReader.READ_SIZE
|
|
br = new BrotliBitReader(input)
|
|
window_bits = DecodeWindowBits(br)
|
|
max_backward_distance = (1 << window_bits) - 16
|
|
ringbuffer_size = 1 << window_bits
|
|
ringbuffer_mask = ringbuffer_size - 1
|
|
ringbuffer = new Uint8Array(
|
|
ringbuffer_size +
|
|
kRingBufferWriteAheadSlack +
|
|
BrotliDictionary.maxDictionaryWordLength
|
|
)
|
|
ringbuffer_end = ringbuffer_size
|
|
block_type_trees = []
|
|
block_len_trees = []
|
|
for (let x = 0; x < 3 * HUFFMAN_MAX_TABLE_SIZE; x++) {
|
|
block_type_trees[x] = new HuffmanCode(0, 0)
|
|
block_len_trees[x] = new HuffmanCode(0, 0)
|
|
}
|
|
while (!input_end) {
|
|
let meta_block_remaining_len = 0
|
|
var is_uncompressed
|
|
const block_length = [1 << 28, 1 << 28, 1 << 28]
|
|
const block_type = [0]
|
|
const num_block_types = [1, 1, 1]
|
|
const block_type_rb = [0, 1, 0, 1, 0, 1]
|
|
const block_type_rb_index = [0]
|
|
var distance_postfix_bits
|
|
var num_direct_distance_codes
|
|
var distance_postfix_mask
|
|
var num_distance_codes
|
|
let context_map = null
|
|
let context_modes = null
|
|
var num_literal_htrees
|
|
let dist_context_map = null
|
|
var num_dist_htrees
|
|
let context_offset = 0
|
|
let context_map_slice = null
|
|
let literal_htree_index = 0
|
|
let dist_context_offset = 0
|
|
let dist_context_map_slice = null
|
|
let dist_htree_index = 0
|
|
let context_lookup_offset1 = 0
|
|
let context_lookup_offset2 = 0
|
|
var context_mode
|
|
var htree_command
|
|
for (i = 0; i < 3; ++i) {
|
|
hgroup[i].codes = null
|
|
hgroup[i].htrees = null
|
|
}
|
|
br.readMoreInput()
|
|
const _out = DecodeMetaBlockLength(br)
|
|
meta_block_remaining_len = _out.meta_block_length
|
|
if (pos + meta_block_remaining_len > output.buffer.length) {
|
|
const tmp = new Uint8Array(pos + meta_block_remaining_len)
|
|
tmp.set(output.buffer)
|
|
output.buffer = tmp
|
|
}
|
|
input_end = _out.input_end
|
|
is_uncompressed = _out.is_uncompressed
|
|
if (_out.is_metadata) {
|
|
JumpToByteBoundary(br)
|
|
for (
|
|
;
|
|
meta_block_remaining_len > 0;
|
|
--meta_block_remaining_len
|
|
) {
|
|
br.readMoreInput()
|
|
br.readBits(8)
|
|
}
|
|
continue
|
|
}
|
|
if (meta_block_remaining_len === 0) {
|
|
continue
|
|
}
|
|
if (is_uncompressed) {
|
|
br.bit_pos_ = (br.bit_pos_ + 7) & ~7
|
|
CopyUncompressedBlockToOutput(
|
|
output,
|
|
meta_block_remaining_len,
|
|
pos,
|
|
ringbuffer,
|
|
ringbuffer_mask,
|
|
br
|
|
)
|
|
pos += meta_block_remaining_len
|
|
continue
|
|
}
|
|
for (i = 0; i < 3; ++i) {
|
|
num_block_types[i] = DecodeVarLenUint8(br) + 1
|
|
if (num_block_types[i] >= 2) {
|
|
ReadHuffmanCode(
|
|
num_block_types[i] + 2,
|
|
block_type_trees,
|
|
i * HUFFMAN_MAX_TABLE_SIZE,
|
|
br
|
|
)
|
|
ReadHuffmanCode(
|
|
kNumBlockLengthCodes,
|
|
block_len_trees,
|
|
i * HUFFMAN_MAX_TABLE_SIZE,
|
|
br
|
|
)
|
|
block_length[i] = ReadBlockLength(
|
|
block_len_trees,
|
|
i * HUFFMAN_MAX_TABLE_SIZE,
|
|
br
|
|
)
|
|
block_type_rb_index[i] = 1
|
|
}
|
|
}
|
|
br.readMoreInput()
|
|
distance_postfix_bits = br.readBits(2)
|
|
num_direct_distance_codes =
|
|
NUM_DISTANCE_SHORT_CODES +
|
|
(br.readBits(4) << distance_postfix_bits)
|
|
distance_postfix_mask = (1 << distance_postfix_bits) - 1
|
|
num_distance_codes =
|
|
num_direct_distance_codes + (48 << distance_postfix_bits)
|
|
context_modes = new Uint8Array(num_block_types[0])
|
|
for (i = 0; i < num_block_types[0]; ++i) {
|
|
br.readMoreInput()
|
|
context_modes[i] = br.readBits(2) << 1
|
|
}
|
|
const _o1 = DecodeContextMap(
|
|
num_block_types[0] << kLiteralContextBits,
|
|
br
|
|
)
|
|
num_literal_htrees = _o1.num_htrees
|
|
context_map = _o1.context_map
|
|
const _o2 = DecodeContextMap(
|
|
num_block_types[2] << kDistanceContextBits,
|
|
br
|
|
)
|
|
num_dist_htrees = _o2.num_htrees
|
|
dist_context_map = _o2.context_map
|
|
hgroup[0] = new HuffmanTreeGroup(
|
|
kNumLiteralCodes,
|
|
num_literal_htrees
|
|
)
|
|
hgroup[1] = new HuffmanTreeGroup(
|
|
kNumInsertAndCopyCodes,
|
|
num_block_types[1]
|
|
)
|
|
hgroup[2] = new HuffmanTreeGroup(
|
|
num_distance_codes,
|
|
num_dist_htrees
|
|
)
|
|
for (i = 0; i < 3; ++i) {
|
|
hgroup[i].decode(br)
|
|
}
|
|
context_map_slice = 0
|
|
dist_context_map_slice = 0
|
|
context_mode = context_modes[block_type[0]]
|
|
context_lookup_offset1 = Context.lookupOffsets[context_mode]
|
|
context_lookup_offset2 = Context.lookupOffsets[context_mode + 1]
|
|
htree_command = hgroup[1].htrees[0]
|
|
while (meta_block_remaining_len > 0) {
|
|
var cmd_code
|
|
var range_idx
|
|
var insert_code
|
|
var copy_code
|
|
var insert_length
|
|
var copy_length
|
|
var distance_code
|
|
var distance
|
|
var context
|
|
var j
|
|
var copy_dst
|
|
br.readMoreInput()
|
|
if (block_length[1] === 0) {
|
|
DecodeBlockType(
|
|
num_block_types[1],
|
|
block_type_trees,
|
|
1,
|
|
block_type,
|
|
block_type_rb,
|
|
block_type_rb_index,
|
|
br
|
|
)
|
|
block_length[1] = ReadBlockLength(
|
|
block_len_trees,
|
|
HUFFMAN_MAX_TABLE_SIZE,
|
|
br
|
|
)
|
|
htree_command = hgroup[1].htrees[block_type[1]]
|
|
}
|
|
--block_length[1]
|
|
cmd_code = ReadSymbol(hgroup[1].codes, htree_command, br)
|
|
range_idx = cmd_code >> 6
|
|
if (range_idx >= 2) {
|
|
range_idx -= 2
|
|
distance_code = -1
|
|
} else {
|
|
distance_code = 0
|
|
}
|
|
insert_code =
|
|
Prefix.kInsertRangeLut[range_idx] + ((cmd_code >> 3) & 7)
|
|
copy_code = Prefix.kCopyRangeLut[range_idx] + (cmd_code & 7)
|
|
insert_length =
|
|
Prefix.kInsertLengthPrefixCode[insert_code].offset +
|
|
br.readBits(Prefix.kInsertLengthPrefixCode[insert_code].nbits)
|
|
copy_length =
|
|
Prefix.kCopyLengthPrefixCode[copy_code].offset +
|
|
br.readBits(Prefix.kCopyLengthPrefixCode[copy_code].nbits)
|
|
prev_byte1 = ringbuffer[(pos - 1) & ringbuffer_mask]
|
|
prev_byte2 = ringbuffer[(pos - 2) & ringbuffer_mask]
|
|
for (j = 0; j < insert_length; ++j) {
|
|
br.readMoreInput()
|
|
if (block_length[0] === 0) {
|
|
DecodeBlockType(
|
|
num_block_types[0],
|
|
block_type_trees,
|
|
0,
|
|
block_type,
|
|
block_type_rb,
|
|
block_type_rb_index,
|
|
br
|
|
)
|
|
block_length[0] = ReadBlockLength(block_len_trees, 0, br)
|
|
context_offset = block_type[0] << kLiteralContextBits
|
|
context_map_slice = context_offset
|
|
context_mode = context_modes[block_type[0]]
|
|
context_lookup_offset1 = Context.lookupOffsets[context_mode]
|
|
context_lookup_offset2 =
|
|
Context.lookupOffsets[context_mode + 1]
|
|
}
|
|
context =
|
|
Context.lookup[context_lookup_offset1 + prev_byte1] |
|
|
Context.lookup[context_lookup_offset2 + prev_byte2]
|
|
literal_htree_index = context_map[context_map_slice + context]
|
|
--block_length[0]
|
|
prev_byte2 = prev_byte1
|
|
prev_byte1 = ReadSymbol(
|
|
hgroup[0].codes,
|
|
hgroup[0].htrees[literal_htree_index],
|
|
br
|
|
)
|
|
ringbuffer[pos & ringbuffer_mask] = prev_byte1
|
|
if ((pos & ringbuffer_mask) === ringbuffer_mask) {
|
|
output.write(ringbuffer, ringbuffer_size)
|
|
}
|
|
++pos
|
|
}
|
|
meta_block_remaining_len -= insert_length
|
|
if (meta_block_remaining_len <= 0) break
|
|
if (distance_code < 0) {
|
|
var context
|
|
br.readMoreInput()
|
|
if (block_length[2] === 0) {
|
|
DecodeBlockType(
|
|
num_block_types[2],
|
|
block_type_trees,
|
|
2,
|
|
block_type,
|
|
block_type_rb,
|
|
block_type_rb_index,
|
|
br
|
|
)
|
|
block_length[2] = ReadBlockLength(
|
|
block_len_trees,
|
|
2 * HUFFMAN_MAX_TABLE_SIZE,
|
|
br
|
|
)
|
|
dist_context_offset = block_type[2] << kDistanceContextBits
|
|
dist_context_map_slice = dist_context_offset
|
|
}
|
|
--block_length[2]
|
|
context = (copy_length > 4 ? 3 : copy_length - 2) & 255
|
|
dist_htree_index =
|
|
dist_context_map[dist_context_map_slice + context]
|
|
distance_code = ReadSymbol(
|
|
hgroup[2].codes,
|
|
hgroup[2].htrees[dist_htree_index],
|
|
br
|
|
)
|
|
if (distance_code >= num_direct_distance_codes) {
|
|
var nbits
|
|
var postfix
|
|
var offset
|
|
distance_code -= num_direct_distance_codes
|
|
postfix = distance_code & distance_postfix_mask
|
|
distance_code >>= distance_postfix_bits
|
|
nbits = (distance_code >> 1) + 1
|
|
offset = ((2 + (distance_code & 1)) << nbits) - 4
|
|
distance_code =
|
|
num_direct_distance_codes +
|
|
((offset + br.readBits(nbits)) << distance_postfix_bits) +
|
|
postfix
|
|
}
|
|
}
|
|
distance = TranslateShortCodes(
|
|
distance_code,
|
|
dist_rb,
|
|
dist_rb_idx
|
|
)
|
|
if (distance < 0) {
|
|
throw new Error('[BrotliDecompress] invalid distance')
|
|
}
|
|
if (
|
|
pos < max_backward_distance &&
|
|
max_distance !== max_backward_distance
|
|
) {
|
|
max_distance = pos
|
|
} else {
|
|
max_distance = max_backward_distance
|
|
}
|
|
copy_dst = pos & ringbuffer_mask
|
|
if (distance > max_distance) {
|
|
if (
|
|
copy_length >= BrotliDictionary.minDictionaryWordLength &&
|
|
copy_length <= BrotliDictionary.maxDictionaryWordLength
|
|
) {
|
|
var offset = BrotliDictionary.offsetsByLength[copy_length]
|
|
const word_id = distance - max_distance - 1
|
|
const shift = BrotliDictionary.sizeBitsByLength[copy_length]
|
|
const mask = (1 << shift) - 1
|
|
const word_idx = word_id & mask
|
|
const transform_idx = word_id >> shift
|
|
offset += word_idx * copy_length
|
|
if (transform_idx < Transform.kNumTransforms) {
|
|
const len = Transform.transformDictionaryWord(
|
|
ringbuffer,
|
|
copy_dst,
|
|
offset,
|
|
copy_length,
|
|
transform_idx
|
|
)
|
|
copy_dst += len
|
|
pos += len
|
|
meta_block_remaining_len -= len
|
|
if (copy_dst >= ringbuffer_end) {
|
|
output.write(ringbuffer, ringbuffer_size)
|
|
for (let _x = 0; _x < copy_dst - ringbuffer_end; _x++) {
|
|
ringbuffer[_x] = ringbuffer[ringbuffer_end + _x]
|
|
}
|
|
}
|
|
} else {
|
|
throw new Error(
|
|
'Invalid backward reference. pos: ' +
|
|
pos +
|
|
' distance: ' +
|
|
distance +
|
|
' len: ' +
|
|
copy_length +
|
|
' bytes left: ' +
|
|
meta_block_remaining_len
|
|
)
|
|
}
|
|
} else {
|
|
throw new Error(
|
|
'Invalid backward reference. pos: ' +
|
|
pos +
|
|
' distance: ' +
|
|
distance +
|
|
' len: ' +
|
|
copy_length +
|
|
' bytes left: ' +
|
|
meta_block_remaining_len
|
|
)
|
|
}
|
|
} else {
|
|
if (distance_code > 0) {
|
|
dist_rb[dist_rb_idx & 3] = distance
|
|
++dist_rb_idx
|
|
}
|
|
if (copy_length > meta_block_remaining_len) {
|
|
throw new Error(
|
|
'Invalid backward reference. pos: ' +
|
|
pos +
|
|
' distance: ' +
|
|
distance +
|
|
' len: ' +
|
|
copy_length +
|
|
' bytes left: ' +
|
|
meta_block_remaining_len
|
|
)
|
|
}
|
|
for (j = 0; j < copy_length; ++j) {
|
|
ringbuffer[pos & ringbuffer_mask] =
|
|
ringbuffer[(pos - distance) & ringbuffer_mask]
|
|
if ((pos & ringbuffer_mask) === ringbuffer_mask) {
|
|
output.write(ringbuffer, ringbuffer_size)
|
|
}
|
|
++pos
|
|
--meta_block_remaining_len
|
|
}
|
|
}
|
|
prev_byte1 = ringbuffer[(pos - 1) & ringbuffer_mask]
|
|
prev_byte2 = ringbuffer[(pos - 2) & ringbuffer_mask]
|
|
}
|
|
pos &= 1073741823
|
|
}
|
|
output.write(ringbuffer, pos & ringbuffer_mask)
|
|
}
|
|
exports.BrotliDecompress = BrotliDecompress
|
|
BrotliDictionary.init()
|
|
},
|
|
{
|
|
'./bit_reader': 1,
|
|
'./context': 2,
|
|
'./dictionary': 6,
|
|
'./huffman': 7,
|
|
'./prefix': 8,
|
|
'./streams': 9,
|
|
'./transform': 10
|
|
}
|
|
],
|
|
4: [
|
|
function (require, module, exports) {
|
|
const base64 = require('base64-js')
|
|
exports.init = function () {
|
|
const BrotliDecompressBuffer = require('./decode')
|
|
.BrotliDecompressBuffer
|
|
const compressed = base64.toByteArray(
|
|
require('./dictionary.bin.js')
|
|
)
|
|
return BrotliDecompressBuffer(compressed)
|
|
}
|
|
},
|
|
{
|
|
'./decode': 3,
|
|
'./dictionary.bin.js': 5,
|
|
'base64-js': 12
|
|
}
|
|
],
|
|
5: [
|
|
function (require, module, exports) {
|
|
module.exports =
|
|
'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'
|
|
},
|
|
{}
|
|
],
|
|
6: [
|
|
function (require, module, exports) {
|
|
const data = require('./dictionary-browser')
|
|
exports.init = function () {
|
|
exports.dictionary = data.init()
|
|
}
|
|
exports.offsetsByLength = new Uint32Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
4096,
|
|
9216,
|
|
21504,
|
|
35840,
|
|
44032,
|
|
53248,
|
|
63488,
|
|
74752,
|
|
87040,
|
|
93696,
|
|
100864,
|
|
104704,
|
|
106752,
|
|
108928,
|
|
113536,
|
|
115968,
|
|
118528,
|
|
119872,
|
|
121280,
|
|
122016
|
|
])
|
|
exports.sizeBitsByLength = new Uint8Array([
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
10,
|
|
10,
|
|
11,
|
|
11,
|
|
10,
|
|
10,
|
|
10,
|
|
10,
|
|
10,
|
|
9,
|
|
9,
|
|
8,
|
|
7,
|
|
7,
|
|
8,
|
|
7,
|
|
7,
|
|
6,
|
|
6,
|
|
5,
|
|
5
|
|
])
|
|
exports.minDictionaryWordLength = 4
|
|
exports.maxDictionaryWordLength = 24
|
|
},
|
|
{
|
|
'./dictionary-browser': 4
|
|
}
|
|
],
|
|
7: [
|
|
function (require, module, exports) {
|
|
function HuffmanCode (bits, value) {
|
|
this.bits = bits
|
|
this.value = value
|
|
}
|
|
exports.HuffmanCode = HuffmanCode
|
|
const MAX_LENGTH = 15
|
|
|
|
function GetNextKey (key, len) {
|
|
let step = 1 << (len - 1)
|
|
while (key & step) {
|
|
step >>= 1
|
|
}
|
|
return (key & (step - 1)) + step
|
|
}
|
|
|
|
function ReplicateValue (table, i, step, end, code) {
|
|
do {
|
|
end -= step
|
|
table[i + end] = new HuffmanCode(code.bits, code.value)
|
|
} while (end > 0)
|
|
}
|
|
|
|
function NextTableBitSize (count, len, root_bits) {
|
|
let left = 1 << (len - root_bits)
|
|
while (len < MAX_LENGTH) {
|
|
left -= count[len]
|
|
if (left <= 0) break
|
|
++len
|
|
left <<= 1
|
|
}
|
|
return len - root_bits
|
|
}
|
|
exports.BrotliBuildHuffmanTable = function (
|
|
root_table,
|
|
table,
|
|
root_bits,
|
|
code_lengths,
|
|
code_lengths_size
|
|
) {
|
|
const start_table = table
|
|
let code
|
|
let len
|
|
let symbol
|
|
let key
|
|
let step
|
|
let low
|
|
let mask
|
|
let table_bits
|
|
let table_size
|
|
let total_size
|
|
let sorted
|
|
const count = new Int32Array(MAX_LENGTH + 1)
|
|
const offset = new Int32Array(MAX_LENGTH + 1)
|
|
sorted = new Int32Array(code_lengths_size)
|
|
for (symbol = 0; symbol < code_lengths_size; symbol++) {
|
|
count[code_lengths[symbol]]++
|
|
}
|
|
offset[1] = 0
|
|
for (len = 1; len < MAX_LENGTH; len++) {
|
|
offset[len + 1] = offset[len] + count[len]
|
|
}
|
|
for (symbol = 0; symbol < code_lengths_size; symbol++) {
|
|
if (code_lengths[symbol] !== 0) {
|
|
sorted[offset[code_lengths[symbol]]++] = symbol
|
|
}
|
|
}
|
|
table_bits = root_bits
|
|
table_size = 1 << table_bits
|
|
total_size = table_size
|
|
if (offset[MAX_LENGTH] === 1) {
|
|
for (key = 0; key < total_size; ++key) {
|
|
root_table[table + key] = new HuffmanCode(0, sorted[0] & 65535)
|
|
}
|
|
return total_size
|
|
}
|
|
key = 0
|
|
symbol = 0
|
|
for (len = 1, step = 2; len <= root_bits; ++len, step <<= 1) {
|
|
for (; count[len] > 0; --count[len]) {
|
|
code = new HuffmanCode(len & 255, sorted[symbol++] & 65535)
|
|
ReplicateValue(root_table, table + key, step, table_size, code)
|
|
key = GetNextKey(key, len)
|
|
}
|
|
}
|
|
mask = total_size - 1
|
|
low = -1
|
|
for (
|
|
len = root_bits + 1, step = 2;
|
|
len <= MAX_LENGTH;
|
|
++len, step <<= 1
|
|
) {
|
|
for (; count[len] > 0; --count[len]) {
|
|
if ((key & mask) !== low) {
|
|
table += table_size
|
|
table_bits = NextTableBitSize(count, len, root_bits)
|
|
table_size = 1 << table_bits
|
|
total_size += table_size
|
|
low = key & mask
|
|
root_table[start_table + low] = new HuffmanCode(
|
|
(table_bits + root_bits) & 255,
|
|
(table - start_table - low) & 65535
|
|
)
|
|
}
|
|
code = new HuffmanCode(
|
|
(len - root_bits) & 255,
|
|
sorted[symbol++] & 65535
|
|
)
|
|
ReplicateValue(
|
|
root_table,
|
|
table + (key >> root_bits),
|
|
step,
|
|
table_size,
|
|
code
|
|
)
|
|
key = GetNextKey(key, len)
|
|
}
|
|
}
|
|
return total_size
|
|
}
|
|
},
|
|
{}
|
|
],
|
|
8: [
|
|
function (require, module, exports) {
|
|
function PrefixCodeRange (offset, nbits) {
|
|
this.offset = offset
|
|
this.nbits = nbits
|
|
}
|
|
exports.kBlockLengthPrefixCode = [
|
|
new PrefixCodeRange(1, 2),
|
|
new PrefixCodeRange(5, 2),
|
|
new PrefixCodeRange(9, 2),
|
|
new PrefixCodeRange(13, 2),
|
|
new PrefixCodeRange(17, 3),
|
|
new PrefixCodeRange(25, 3),
|
|
new PrefixCodeRange(33, 3),
|
|
new PrefixCodeRange(41, 3),
|
|
new PrefixCodeRange(49, 4),
|
|
new PrefixCodeRange(65, 4),
|
|
new PrefixCodeRange(81, 4),
|
|
new PrefixCodeRange(97, 4),
|
|
new PrefixCodeRange(113, 5),
|
|
new PrefixCodeRange(145, 5),
|
|
new PrefixCodeRange(177, 5),
|
|
new PrefixCodeRange(209, 5),
|
|
new PrefixCodeRange(241, 6),
|
|
new PrefixCodeRange(305, 6),
|
|
new PrefixCodeRange(369, 7),
|
|
new PrefixCodeRange(497, 8),
|
|
new PrefixCodeRange(753, 9),
|
|
new PrefixCodeRange(1265, 10),
|
|
new PrefixCodeRange(2289, 11),
|
|
new PrefixCodeRange(4337, 12),
|
|
new PrefixCodeRange(8433, 13),
|
|
new PrefixCodeRange(16625, 24)
|
|
]
|
|
exports.kInsertLengthPrefixCode = [
|
|
new PrefixCodeRange(0, 0),
|
|
new PrefixCodeRange(1, 0),
|
|
new PrefixCodeRange(2, 0),
|
|
new PrefixCodeRange(3, 0),
|
|
new PrefixCodeRange(4, 0),
|
|
new PrefixCodeRange(5, 0),
|
|
new PrefixCodeRange(6, 1),
|
|
new PrefixCodeRange(8, 1),
|
|
new PrefixCodeRange(10, 2),
|
|
new PrefixCodeRange(14, 2),
|
|
new PrefixCodeRange(18, 3),
|
|
new PrefixCodeRange(26, 3),
|
|
new PrefixCodeRange(34, 4),
|
|
new PrefixCodeRange(50, 4),
|
|
new PrefixCodeRange(66, 5),
|
|
new PrefixCodeRange(98, 5),
|
|
new PrefixCodeRange(130, 6),
|
|
new PrefixCodeRange(194, 7),
|
|
new PrefixCodeRange(322, 8),
|
|
new PrefixCodeRange(578, 9),
|
|
new PrefixCodeRange(1090, 10),
|
|
new PrefixCodeRange(2114, 12),
|
|
new PrefixCodeRange(6210, 14),
|
|
new PrefixCodeRange(22594, 24)
|
|
]
|
|
exports.kCopyLengthPrefixCode = [
|
|
new PrefixCodeRange(2, 0),
|
|
new PrefixCodeRange(3, 0),
|
|
new PrefixCodeRange(4, 0),
|
|
new PrefixCodeRange(5, 0),
|
|
new PrefixCodeRange(6, 0),
|
|
new PrefixCodeRange(7, 0),
|
|
new PrefixCodeRange(8, 0),
|
|
new PrefixCodeRange(9, 0),
|
|
new PrefixCodeRange(10, 1),
|
|
new PrefixCodeRange(12, 1),
|
|
new PrefixCodeRange(14, 2),
|
|
new PrefixCodeRange(18, 2),
|
|
new PrefixCodeRange(22, 3),
|
|
new PrefixCodeRange(30, 3),
|
|
new PrefixCodeRange(38, 4),
|
|
new PrefixCodeRange(54, 4),
|
|
new PrefixCodeRange(70, 5),
|
|
new PrefixCodeRange(102, 5),
|
|
new PrefixCodeRange(134, 6),
|
|
new PrefixCodeRange(198, 7),
|
|
new PrefixCodeRange(326, 8),
|
|
new PrefixCodeRange(582, 9),
|
|
new PrefixCodeRange(1094, 10),
|
|
new PrefixCodeRange(2118, 24)
|
|
]
|
|
exports.kInsertRangeLut = [0, 0, 8, 8, 0, 16, 8, 16, 16]
|
|
exports.kCopyRangeLut = [0, 8, 0, 8, 16, 0, 16, 8, 16]
|
|
},
|
|
{}
|
|
],
|
|
9: [
|
|
function (require, module, exports) {
|
|
function BrotliInput (buffer) {
|
|
this.buffer = buffer
|
|
this.pos = 0
|
|
}
|
|
BrotliInput.prototype.read = function (buf, i, count) {
|
|
if (this.pos + count > this.buffer.length) {
|
|
count = this.buffer.length - this.pos
|
|
}
|
|
for (let p = 0; p < count; p++) {
|
|
buf[i + p] = this.buffer[this.pos + p]
|
|
}
|
|
this.pos += count
|
|
return count
|
|
}
|
|
exports.BrotliInput = BrotliInput
|
|
|
|
function BrotliOutput (buf) {
|
|
this.buffer = buf
|
|
this.pos = 0
|
|
}
|
|
BrotliOutput.prototype.write = function (buf, count) {
|
|
if (this.pos + count > this.buffer.length) {
|
|
throw new Error('Output buffer is not large enough')
|
|
}
|
|
this.buffer.set(buf.subarray(0, count), this.pos)
|
|
this.pos += count
|
|
return count
|
|
}
|
|
exports.BrotliOutput = BrotliOutput
|
|
},
|
|
{}
|
|
],
|
|
10: [
|
|
function (require, module, exports) {
|
|
const BrotliDictionary = require('./dictionary')
|
|
const kIdentity = 0
|
|
const kOmitLast1 = 1
|
|
const kOmitLast2 = 2
|
|
const kOmitLast3 = 3
|
|
const kOmitLast4 = 4
|
|
const kOmitLast5 = 5
|
|
const kOmitLast6 = 6
|
|
const kOmitLast7 = 7
|
|
const kOmitLast8 = 8
|
|
const kOmitLast9 = 9
|
|
const kUppercaseFirst = 10
|
|
const kUppercaseAll = 11
|
|
const kOmitFirst1 = 12
|
|
const kOmitFirst2 = 13
|
|
const kOmitFirst3 = 14
|
|
const kOmitFirst4 = 15
|
|
const kOmitFirst5 = 16
|
|
const kOmitFirst6 = 17
|
|
const kOmitFirst7 = 18
|
|
const kOmitFirst9 = 20
|
|
|
|
function Transform (prefix, transform, suffix) {
|
|
this.prefix = new Uint8Array(prefix.length)
|
|
this.transform = transform
|
|
this.suffix = new Uint8Array(suffix.length)
|
|
for (var i = 0; i < prefix.length; i++) {
|
|
this.prefix[i] = prefix.charCodeAt(i)
|
|
}
|
|
for (var i = 0; i < suffix.length; i++) {
|
|
this.suffix[i] = suffix.charCodeAt(i)
|
|
}
|
|
}
|
|
const kTransforms = [
|
|
new Transform('', kIdentity, ''),
|
|
new Transform('', kIdentity, ' '),
|
|
new Transform(' ', kIdentity, ' '),
|
|
new Transform('', kOmitFirst1, ''),
|
|
new Transform('', kUppercaseFirst, ' '),
|
|
new Transform('', kIdentity, ' the '),
|
|
new Transform(' ', kIdentity, ''),
|
|
new Transform('s ', kIdentity, ' '),
|
|
new Transform('', kIdentity, ' of '),
|
|
new Transform('', kUppercaseFirst, ''),
|
|
new Transform('', kIdentity, ' and '),
|
|
new Transform('', kOmitFirst2, ''),
|
|
new Transform('', kOmitLast1, ''),
|
|
new Transform(', ', kIdentity, ' '),
|
|
new Transform('', kIdentity, ', '),
|
|
new Transform(' ', kUppercaseFirst, ' '),
|
|
new Transform('', kIdentity, ' in '),
|
|
new Transform('', kIdentity, ' to '),
|
|
new Transform('e ', kIdentity, ' '),
|
|
new Transform('', kIdentity, '"'),
|
|
new Transform('', kIdentity, '.'),
|
|
new Transform('', kIdentity, '">'),
|
|
new Transform('', kIdentity, '\n'),
|
|
new Transform('', kOmitLast3, ''),
|
|
new Transform('', kIdentity, ']'),
|
|
new Transform('', kIdentity, ' for '),
|
|
new Transform('', kOmitFirst3, ''),
|
|
new Transform('', kOmitLast2, ''),
|
|
new Transform('', kIdentity, ' a '),
|
|
new Transform('', kIdentity, ' that '),
|
|
new Transform(' ', kUppercaseFirst, ''),
|
|
new Transform('', kIdentity, '. '),
|
|
new Transform('.', kIdentity, ''),
|
|
new Transform(' ', kIdentity, ', '),
|
|
new Transform('', kOmitFirst4, ''),
|
|
new Transform('', kIdentity, ' with '),
|
|
new Transform('', kIdentity, "'"),
|
|
new Transform('', kIdentity, ' from '),
|
|
new Transform('', kIdentity, ' by '),
|
|
new Transform('', kOmitFirst5, ''),
|
|
new Transform('', kOmitFirst6, ''),
|
|
new Transform(' the ', kIdentity, ''),
|
|
new Transform('', kOmitLast4, ''),
|
|
new Transform('', kIdentity, '. The '),
|
|
new Transform('', kUppercaseAll, ''),
|
|
new Transform('', kIdentity, ' on '),
|
|
new Transform('', kIdentity, ' as '),
|
|
new Transform('', kIdentity, ' is '),
|
|
new Transform('', kOmitLast7, ''),
|
|
new Transform('', kOmitLast1, 'ing '),
|
|
new Transform('', kIdentity, '\n\t'),
|
|
new Transform('', kIdentity, ':'),
|
|
new Transform(' ', kIdentity, '. '),
|
|
new Transform('', kIdentity, 'ed '),
|
|
new Transform('', kOmitFirst9, ''),
|
|
new Transform('', kOmitFirst7, ''),
|
|
new Transform('', kOmitLast6, ''),
|
|
new Transform('', kIdentity, '('),
|
|
new Transform('', kUppercaseFirst, ', '),
|
|
new Transform('', kOmitLast8, ''),
|
|
new Transform('', kIdentity, ' at '),
|
|
new Transform('', kIdentity, 'ly '),
|
|
new Transform(' the ', kIdentity, ' of '),
|
|
new Transform('', kOmitLast5, ''),
|
|
new Transform('', kOmitLast9, ''),
|
|
new Transform(' ', kUppercaseFirst, ', '),
|
|
new Transform('', kUppercaseFirst, '"'),
|
|
new Transform('.', kIdentity, '('),
|
|
new Transform('', kUppercaseAll, ' '),
|
|
new Transform('', kUppercaseFirst, '">'),
|
|
new Transform('', kIdentity, '="'),
|
|
new Transform(' ', kIdentity, '.'),
|
|
new Transform('.com/', kIdentity, ''),
|
|
new Transform(' the ', kIdentity, ' of the '),
|
|
new Transform('', kUppercaseFirst, "'"),
|
|
new Transform('', kIdentity, '. This '),
|
|
new Transform('', kIdentity, ','),
|
|
new Transform('.', kIdentity, ' '),
|
|
new Transform('', kUppercaseFirst, '('),
|
|
new Transform('', kUppercaseFirst, '.'),
|
|
new Transform('', kIdentity, ' not '),
|
|
new Transform(' ', kIdentity, '="'),
|
|
new Transform('', kIdentity, 'er '),
|
|
new Transform(' ', kUppercaseAll, ' '),
|
|
new Transform('', kIdentity, 'al '),
|
|
new Transform(' ', kUppercaseAll, ''),
|
|
new Transform('', kIdentity, "='"),
|
|
new Transform('', kUppercaseAll, '"'),
|
|
new Transform('', kUppercaseFirst, '. '),
|
|
new Transform(' ', kIdentity, '('),
|
|
new Transform('', kIdentity, 'ful '),
|
|
new Transform(' ', kUppercaseFirst, '. '),
|
|
new Transform('', kIdentity, 'ive '),
|
|
new Transform('', kIdentity, 'less '),
|
|
new Transform('', kUppercaseAll, "'"),
|
|
new Transform('', kIdentity, 'est '),
|
|
new Transform(' ', kUppercaseFirst, '.'),
|
|
new Transform('', kUppercaseAll, '">'),
|
|
new Transform(' ', kIdentity, "='"),
|
|
new Transform('', kUppercaseFirst, ','),
|
|
new Transform('', kIdentity, 'ize '),
|
|
new Transform('', kUppercaseAll, '.'),
|
|
new Transform('Â ', kIdentity, ''),
|
|
new Transform(' ', kIdentity, ','),
|
|
new Transform('', kUppercaseFirst, '="'),
|
|
new Transform('', kUppercaseAll, '="'),
|
|
new Transform('', kIdentity, 'ous '),
|
|
new Transform('', kUppercaseAll, ', '),
|
|
new Transform('', kUppercaseFirst, "='"),
|
|
new Transform(' ', kUppercaseFirst, ','),
|
|
new Transform(' ', kUppercaseAll, '="'),
|
|
new Transform(' ', kUppercaseAll, ', '),
|
|
new Transform('', kUppercaseAll, ','),
|
|
new Transform('', kUppercaseAll, '('),
|
|
new Transform('', kUppercaseAll, '. '),
|
|
new Transform(' ', kUppercaseAll, '.'),
|
|
new Transform('', kUppercaseAll, "='"),
|
|
new Transform(' ', kUppercaseAll, '. '),
|
|
new Transform(' ', kUppercaseFirst, '="'),
|
|
new Transform(' ', kUppercaseAll, "='"),
|
|
new Transform(' ', kUppercaseFirst, "='")
|
|
]
|
|
exports.kTransforms = kTransforms
|
|
exports.kNumTransforms = kTransforms.length
|
|
|
|
function ToUpperCase (p, i) {
|
|
if (p[i] < 192) {
|
|
if (p[i] >= 97 && p[i] <= 122) {
|
|
p[i] ^= 32
|
|
}
|
|
return 1
|
|
}
|
|
if (p[i] < 224) {
|
|
p[i + 1] ^= 32
|
|
return 2
|
|
}
|
|
p[i + 2] ^= 5
|
|
return 3
|
|
}
|
|
exports.transformDictionaryWord = function (
|
|
dst,
|
|
idx,
|
|
word,
|
|
len,
|
|
transform
|
|
) {
|
|
const prefix = kTransforms[transform].prefix
|
|
const suffix = kTransforms[transform].suffix
|
|
const t = kTransforms[transform].transform
|
|
let skip = t < kOmitFirst1 ? 0 : t - (kOmitFirst1 - 1)
|
|
let i = 0
|
|
const start_idx = idx
|
|
let uppercase
|
|
if (skip > len) {
|
|
skip = len
|
|
}
|
|
let prefix_pos = 0
|
|
while (prefix_pos < prefix.length) {
|
|
dst[idx++] = prefix[prefix_pos++]
|
|
}
|
|
word += skip
|
|
len -= skip
|
|
if (t <= kOmitLast9) {
|
|
len -= t
|
|
}
|
|
for (i = 0; i < len; i++) {
|
|
dst[idx++] = BrotliDictionary.dictionary[word + i]
|
|
}
|
|
uppercase = idx - len
|
|
if (t === kUppercaseFirst) {
|
|
ToUpperCase(dst, uppercase)
|
|
} else if (t === kUppercaseAll) {
|
|
while (len > 0) {
|
|
const step = ToUpperCase(dst, uppercase)
|
|
uppercase += step
|
|
len -= step
|
|
}
|
|
}
|
|
let suffix_pos = 0
|
|
while (suffix_pos < suffix.length) {
|
|
dst[idx++] = suffix[suffix_pos++]
|
|
}
|
|
return idx - start_idx
|
|
}
|
|
},
|
|
{
|
|
'./dictionary': 6
|
|
}
|
|
],
|
|
11: [
|
|
function (require, module, exports) {
|
|
Module.BrotliDecode = require('./dec/decode').BrotliDecompressBuffer
|
|
},
|
|
{
|
|
'./dec/decode': 3
|
|
}
|
|
],
|
|
12: [
|
|
function (require, module, exports) {
|
|
null
|
|
exports.byteLength = byteLength
|
|
exports.toByteArray = toByteArray
|
|
exports.fromByteArray = fromByteArray
|
|
const lookup = []
|
|
const revLookup = []
|
|
const Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
|
|
const code =
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
for (let i = 0, len = code.length; i < len; ++i) {
|
|
lookup[i] = code[i]
|
|
revLookup[code.charCodeAt(i)] = i
|
|
}
|
|
revLookup['-'.charCodeAt(0)] = 62
|
|
revLookup['_'.charCodeAt(0)] = 63
|
|
|
|
function getLens (b64) {
|
|
const len = b64.length
|
|
if (len % 4 > 0) {
|
|
throw new Error('Invalid string. Length must be a multiple of 4')
|
|
}
|
|
let validLen = b64.indexOf('=')
|
|
if (validLen === -1) validLen = len
|
|
const placeHoldersLen = validLen === len ? 0 : 4 - (validLen % 4)
|
|
return [validLen, placeHoldersLen]
|
|
}
|
|
|
|
function byteLength (b64) {
|
|
const lens = getLens(b64)
|
|
const validLen = lens[0]
|
|
const placeHoldersLen = lens[1]
|
|
return ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen
|
|
}
|
|
|
|
function _byteLength (b64, validLen, placeHoldersLen) {
|
|
return ((validLen + placeHoldersLen) * 3) / 4 - placeHoldersLen
|
|
}
|
|
|
|
function toByteArray (b64) {
|
|
let tmp
|
|
const lens = getLens(b64)
|
|
const validLen = lens[0]
|
|
const placeHoldersLen = lens[1]
|
|
const arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
|
|
let curByte = 0
|
|
const len = placeHoldersLen > 0 ? validLen - 4 : validLen
|
|
let i
|
|
for (i = 0; i < len; i += 4) {
|
|
tmp =
|
|
(revLookup[b64.charCodeAt(i)] << 18) |
|
|
(revLookup[b64.charCodeAt(i + 1)] << 12) |
|
|
(revLookup[b64.charCodeAt(i + 2)] << 6) |
|
|
revLookup[b64.charCodeAt(i + 3)]
|
|
arr[curByte++] = (tmp >> 16) & 255
|
|
arr[curByte++] = (tmp >> 8) & 255
|
|
arr[curByte++] = tmp & 255
|
|
}
|
|
if (placeHoldersLen === 2) {
|
|
tmp =
|
|
(revLookup[b64.charCodeAt(i)] << 2) |
|
|
(revLookup[b64.charCodeAt(i + 1)] >> 4)
|
|
arr[curByte++] = tmp & 255
|
|
}
|
|
if (placeHoldersLen === 1) {
|
|
tmp =
|
|
(revLookup[b64.charCodeAt(i)] << 10) |
|
|
(revLookup[b64.charCodeAt(i + 1)] << 4) |
|
|
(revLookup[b64.charCodeAt(i + 2)] >> 2)
|
|
arr[curByte++] = (tmp >> 8) & 255
|
|
arr[curByte++] = tmp & 255
|
|
}
|
|
return arr
|
|
}
|
|
|
|
function tripletToBase64 (num) {
|
|
return (
|
|
lookup[(num >> 18) & 63] +
|
|
lookup[(num >> 12) & 63] +
|
|
lookup[(num >> 6) & 63] +
|
|
lookup[num & 63]
|
|
)
|
|
}
|
|
|
|
function encodeChunk (uint8, start, end) {
|
|
let tmp
|
|
const output = []
|
|
for (let i = start; i < end; i += 3) {
|
|
tmp =
|
|
((uint8[i] << 16) & 16711680) +
|
|
((uint8[i + 1] << 8) & 65280) +
|
|
(uint8[i + 2] & 255)
|
|
output.push(tripletToBase64(tmp))
|
|
}
|
|
return output.join('')
|
|
}
|
|
|
|
function fromByteArray (uint8) {
|
|
let tmp
|
|
const len = uint8.length
|
|
const extraBytes = len % 3
|
|
const parts = []
|
|
const maxChunkLength = 16383
|
|
for (
|
|
let i = 0, len2 = len - extraBytes;
|
|
i < len2;
|
|
i += maxChunkLength
|
|
) {
|
|
parts.push(
|
|
encodeChunk(
|
|
uint8,
|
|
i,
|
|
i + maxChunkLength > len2 ? len2 : i + maxChunkLength
|
|
)
|
|
)
|
|
}
|
|
if (extraBytes === 1) {
|
|
tmp = uint8[len - 1]
|
|
parts.push(lookup[tmp >> 2] + lookup[(tmp << 4) & 63] + '==')
|
|
} else if (extraBytes === 2) {
|
|
tmp = (uint8[len - 2] << 8) + uint8[len - 1]
|
|
parts.push(
|
|
lookup[tmp >> 10] +
|
|
lookup[(tmp >> 4) & 63] +
|
|
lookup[(tmp << 2) & 63] +
|
|
'='
|
|
)
|
|
}
|
|
return parts.join('')
|
|
}
|
|
},
|
|
{}
|
|
]
|
|
},
|
|
{},
|
|
[11]
|
|
)(11)
|
|
})
|
|
let moduleOverrides = {}
|
|
let key
|
|
for (key in Module) {
|
|
if (Module.hasOwnProperty(key)) {
|
|
moduleOverrides[key] = Module[key]
|
|
}
|
|
}
|
|
let arguments_ = []
|
|
let thisProgram = './this.program'
|
|
let quit_ = function (status, toThrow) {
|
|
throw toThrow
|
|
}
|
|
let ENVIRONMENT_IS_WEB = false
|
|
let ENVIRONMENT_IS_WORKER = false
|
|
let ENVIRONMENT_IS_NODE = false
|
|
let ENVIRONMENT_IS_SHELL = false
|
|
ENVIRONMENT_IS_WEB = typeof window === 'object'
|
|
ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'
|
|
ENVIRONMENT_IS_NODE =
|
|
typeof process === 'object' &&
|
|
typeof process.versions === 'object' &&
|
|
typeof process.versions.node === 'string'
|
|
ENVIRONMENT_IS_SHELL =
|
|
!ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER
|
|
let scriptDirectory = ''
|
|
|
|
function locateFile (path) {
|
|
if (Module.locateFile) {
|
|
return Module.locateFile(path, scriptDirectory)
|
|
}
|
|
return scriptDirectory + path
|
|
}
|
|
let read_, readAsync, readBinary, setWindowTitle
|
|
if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
|
|
if (ENVIRONMENT_IS_WORKER) {
|
|
scriptDirectory = self.location.href
|
|
} else if (document.currentScript) {
|
|
scriptDirectory = document.currentScript.src
|
|
}
|
|
if (scriptDirectory.indexOf('blob:') !== 0) {
|
|
scriptDirectory = scriptDirectory.substr(
|
|
0,
|
|
scriptDirectory.lastIndexOf('/') + 1
|
|
)
|
|
} else {
|
|
scriptDirectory = ''
|
|
}
|
|
{
|
|
read_ = function shell_read (url) {
|
|
const xhr = new XMLHttpRequest()
|
|
xhr.open('GET', url, false)
|
|
xhr.send(null)
|
|
return xhr.responseText
|
|
}
|
|
if (ENVIRONMENT_IS_WORKER) {
|
|
readBinary = function readBinary (url) {
|
|
const xhr = new XMLHttpRequest()
|
|
xhr.open('GET', url, false)
|
|
xhr.responseType = 'arraybuffer'
|
|
xhr.send(null)
|
|
return new Uint8Array(xhr.response)
|
|
}
|
|
}
|
|
readAsync = function readAsync (url, onload, onerror) {
|
|
const xhr = new XMLHttpRequest()
|
|
xhr.open('GET', url, true)
|
|
xhr.responseType = 'arraybuffer'
|
|
xhr.onload = function xhr_onload () {
|
|
if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {
|
|
onload(xhr.response)
|
|
return
|
|
}
|
|
onerror()
|
|
}
|
|
xhr.onerror = onerror
|
|
xhr.send(null)
|
|
}
|
|
}
|
|
setWindowTitle = function (title) {
|
|
document.title = title
|
|
}
|
|
} else {
|
|
}
|
|
const out = Module.print || console.log.bind(console)
|
|
var err = Module.printErr || console.warn.bind(console)
|
|
for (key in moduleOverrides) {
|
|
if (moduleOverrides.hasOwnProperty(key)) {
|
|
Module[key] = moduleOverrides[key]
|
|
}
|
|
}
|
|
moduleOverrides = null
|
|
if (Module.arguments) arguments_ = Module.arguments
|
|
if (Module.thisProgram) thisProgram = Module.thisProgram
|
|
if (Module.quit) quit_ = Module.quit
|
|
|
|
function dynamicAlloc (size) {
|
|
const ret = HEAP32[DYNAMICTOP_PTR >> 2]
|
|
const end = (ret + size + 15) & -16
|
|
HEAP32[DYNAMICTOP_PTR >> 2] = end
|
|
return ret
|
|
}
|
|
|
|
function warnOnce (text) {
|
|
if (!warnOnce.shown) warnOnce.shown = {}
|
|
if (!warnOnce.shown[text]) {
|
|
warnOnce.shown[text] = 1
|
|
err(text)
|
|
}
|
|
}
|
|
let tempRet0 = 0
|
|
const setTempRet0 = function (value) {
|
|
tempRet0 = value
|
|
}
|
|
const getTempRet0 = function () {
|
|
return tempRet0
|
|
}
|
|
let wasmBinary
|
|
if (Module.wasmBinary) wasmBinary = Module.wasmBinary
|
|
let noExitRuntime
|
|
if (Module.noExitRuntime) noExitRuntime = Module.noExitRuntime
|
|
if (typeof WebAssembly !== 'object') {
|
|
err('no native wasm support detected')
|
|
}
|
|
|
|
function getValue (ptr, type, noSafe) {
|
|
type = type || 'i8'
|
|
if (type.charAt(type.length - 1) === '*') type = 'i32'
|
|
switch (type) {
|
|
case 'i1':
|
|
return HEAP8[ptr >> 0]
|
|
case 'i8':
|
|
return HEAP8[ptr >> 0]
|
|
case 'i16':
|
|
return HEAP16[ptr >> 1]
|
|
case 'i32':
|
|
return HEAP32[ptr >> 2]
|
|
case 'i64':
|
|
return HEAP32[ptr >> 2]
|
|
case 'float':
|
|
return HEAPF32[ptr >> 2]
|
|
case 'double':
|
|
return HEAPF64[ptr >> 3]
|
|
default:
|
|
abort('invalid type for getValue: ' + type)
|
|
}
|
|
return null
|
|
}
|
|
let wasmMemory
|
|
const wasmTable = new WebAssembly.Table({
|
|
initial: 1014,
|
|
maximum: 1014 + 0,
|
|
element: 'anyfunc'
|
|
})
|
|
let ABORT = false
|
|
let EXITSTATUS = 0
|
|
|
|
function assert (condition, text) {
|
|
if (!condition) {
|
|
abort('Assertion failed: ' + text)
|
|
}
|
|
}
|
|
|
|
function getCFunc (ident) {
|
|
const func = Module['_' + ident]
|
|
assert(
|
|
func,
|
|
'Cannot call unknown function ' + ident + ', make sure it is exported'
|
|
)
|
|
return func
|
|
}
|
|
|
|
function ccall (ident, returnType, argTypes, args, opts) {
|
|
const toC = {
|
|
string: function (str) {
|
|
let ret = 0
|
|
if (str !== null && str !== undefined && str !== 0) {
|
|
const len = (str.length << 2) + 1
|
|
ret = stackAlloc(len)
|
|
stringToUTF8(str, ret, len)
|
|
}
|
|
return ret
|
|
},
|
|
array: function (arr) {
|
|
const ret = stackAlloc(arr.length)
|
|
writeArrayToMemory(arr, ret)
|
|
return ret
|
|
}
|
|
}
|
|
|
|
function convertReturnValue (ret) {
|
|
if (returnType === 'string') return UTF8ToString(ret)
|
|
if (returnType === 'boolean') return Boolean(ret)
|
|
return ret
|
|
}
|
|
const func = getCFunc(ident)
|
|
const cArgs = []
|
|
let stack = 0
|
|
if (args) {
|
|
for (let i = 0; i < args.length; i++) {
|
|
const converter = toC[argTypes[i]]
|
|
if (converter) {
|
|
if (stack === 0) stack = stackSave()
|
|
cArgs[i] = converter(args[i])
|
|
} else {
|
|
cArgs[i] = args[i]
|
|
}
|
|
}
|
|
}
|
|
let ret = func.apply(null, cArgs)
|
|
ret = convertReturnValue(ret)
|
|
if (stack !== 0) stackRestore(stack)
|
|
return ret
|
|
}
|
|
|
|
function cwrap (ident, returnType, argTypes, opts) {
|
|
argTypes = argTypes || []
|
|
const numericArgs = argTypes.every(function (type) {
|
|
return type === 'number'
|
|
})
|
|
const numericRet = returnType !== 'string'
|
|
if (numericRet && numericArgs && !opts) {
|
|
return getCFunc(ident)
|
|
}
|
|
return function () {
|
|
return ccall(ident, returnType, argTypes, arguments, opts)
|
|
}
|
|
}
|
|
|
|
function getMemory (size) {
|
|
if (!runtimeInitialized) return dynamicAlloc(size)
|
|
return _malloc(size)
|
|
}
|
|
const UTF8Decoder =
|
|
typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined
|
|
|
|
function UTF8ArrayToString (heap, idx, maxBytesToRead) {
|
|
const endIdx = idx + maxBytesToRead
|
|
let endPtr = idx
|
|
while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr
|
|
if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) {
|
|
return UTF8Decoder.decode(heap.subarray(idx, endPtr))
|
|
} else {
|
|
var str = ''
|
|
while (idx < endPtr) {
|
|
let u0 = heap[idx++]
|
|
if (!(u0 & 128)) {
|
|
str += String.fromCharCode(u0)
|
|
continue
|
|
}
|
|
const u1 = heap[idx++] & 63
|
|
if ((u0 & 224) == 192) {
|
|
str += String.fromCharCode(((u0 & 31) << 6) | u1)
|
|
continue
|
|
}
|
|
const u2 = heap[idx++] & 63
|
|
if ((u0 & 240) == 224) {
|
|
u0 = ((u0 & 15) << 12) | (u1 << 6) | u2
|
|
} else {
|
|
u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63)
|
|
}
|
|
if (u0 < 65536) {
|
|
str += String.fromCharCode(u0)
|
|
} else {
|
|
const ch = u0 - 65536
|
|
str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023))
|
|
}
|
|
}
|
|
}
|
|
return str
|
|
}
|
|
|
|
function UTF8ToString (ptr, maxBytesToRead) {
|
|
return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''
|
|
}
|
|
|
|
function stringToUTF8Array (str, heap, outIdx, maxBytesToWrite) {
|
|
if (!(maxBytesToWrite > 0)) return 0
|
|
const startIdx = outIdx
|
|
const endIdx = outIdx + maxBytesToWrite - 1
|
|
for (let i = 0; i < str.length; ++i) {
|
|
let u = str.charCodeAt(i)
|
|
if (u >= 55296 && u <= 57343) {
|
|
const u1 = str.charCodeAt(++i)
|
|
u = (65536 + ((u & 1023) << 10)) | (u1 & 1023)
|
|
}
|
|
if (u <= 127) {
|
|
if (outIdx >= endIdx) break
|
|
heap[outIdx++] = u
|
|
} else if (u <= 2047) {
|
|
if (outIdx + 1 >= endIdx) break
|
|
heap[outIdx++] = 192 | (u >> 6)
|
|
heap[outIdx++] = 128 | (u & 63)
|
|
} else if (u <= 65535) {
|
|
if (outIdx + 2 >= endIdx) break
|
|
heap[outIdx++] = 224 | (u >> 12)
|
|
heap[outIdx++] = 128 | ((u >> 6) & 63)
|
|
heap[outIdx++] = 128 | (u & 63)
|
|
} else {
|
|
if (outIdx + 3 >= endIdx) break
|
|
heap[outIdx++] = 240 | (u >> 18)
|
|
heap[outIdx++] = 128 | ((u >> 12) & 63)
|
|
heap[outIdx++] = 128 | ((u >> 6) & 63)
|
|
heap[outIdx++] = 128 | (u & 63)
|
|
}
|
|
}
|
|
heap[outIdx] = 0
|
|
return outIdx - startIdx
|
|
}
|
|
|
|
function stringToUTF8 (str, outPtr, maxBytesToWrite) {
|
|
return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)
|
|
}
|
|
|
|
function lengthBytesUTF8 (str) {
|
|
let len = 0
|
|
for (let i = 0; i < str.length; ++i) {
|
|
let u = str.charCodeAt(i)
|
|
if (u >= 55296 && u <= 57343) {
|
|
u = (65536 + ((u & 1023) << 10)) | (str.charCodeAt(++i) & 1023)
|
|
}
|
|
if (u <= 127) ++len
|
|
else if (u <= 2047) len += 2
|
|
else if (u <= 65535) len += 3
|
|
else len += 4
|
|
}
|
|
return len
|
|
}
|
|
|
|
function allocateUTF8OnStack (str) {
|
|
const size = lengthBytesUTF8(str) + 1
|
|
const ret = stackAlloc(size)
|
|
stringToUTF8Array(str, HEAP8, ret, size)
|
|
return ret
|
|
}
|
|
|
|
function writeArrayToMemory (array, buffer) {
|
|
HEAP8.set(array, buffer)
|
|
}
|
|
|
|
function writeAsciiToMemory (str, buffer, dontAddNull) {
|
|
for (let i = 0; i < str.length; ++i) {
|
|
HEAP8[buffer++ >> 0] = str.charCodeAt(i)
|
|
}
|
|
if (!dontAddNull) HEAP8[buffer >> 0] = 0
|
|
}
|
|
const WASM_PAGE_SIZE = 65536
|
|
|
|
function alignUp (x, multiple) {
|
|
if (x % multiple > 0) {
|
|
x += multiple - (x % multiple)
|
|
}
|
|
return x
|
|
}
|
|
let buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64
|
|
|
|
function updateGlobalBufferAndViews (buf) {
|
|
buffer = buf
|
|
Module.HEAP8 = HEAP8 = new Int8Array(buf)
|
|
Module.HEAP16 = HEAP16 = new Int16Array(buf)
|
|
Module.HEAP32 = HEAP32 = new Int32Array(buf)
|
|
Module.HEAPU8 = HEAPU8 = new Uint8Array(buf)
|
|
Module.HEAPU16 = HEAPU16 = new Uint16Array(buf)
|
|
Module.HEAPU32 = HEAPU32 = new Uint32Array(buf)
|
|
Module.HEAPF32 = HEAPF32 = new Float32Array(buf)
|
|
Module.HEAPF64 = HEAPF64 = new Float64Array(buf)
|
|
}
|
|
const DYNAMIC_BASE = 5888880
|
|
var DYNAMICTOP_PTR = 645840
|
|
let INITIAL_INITIAL_MEMORY = Module.INITIAL_MEMORY || 16777216
|
|
if (Module.wasmMemory) {
|
|
wasmMemory = Module.wasmMemory
|
|
} else {
|
|
wasmMemory = new WebAssembly.Memory({
|
|
initial: INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE,
|
|
maximum: 2147483648 / WASM_PAGE_SIZE
|
|
})
|
|
}
|
|
if (wasmMemory) {
|
|
buffer = wasmMemory.buffer
|
|
}
|
|
INITIAL_INITIAL_MEMORY = buffer.byteLength
|
|
updateGlobalBufferAndViews(buffer)
|
|
HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE
|
|
|
|
function callRuntimeCallbacks (callbacks) {
|
|
while (callbacks.length > 0) {
|
|
const callback = callbacks.shift()
|
|
if (typeof callback === 'function') {
|
|
callback(Module)
|
|
continue
|
|
}
|
|
const func = callback.func
|
|
if (typeof func === 'number') {
|
|
if (callback.arg === undefined) {
|
|
Module.dynCall_v(func)
|
|
} else {
|
|
Module.dynCall_vi(func, callback.arg)
|
|
}
|
|
} else {
|
|
func(callback.arg === undefined ? null : callback.arg)
|
|
}
|
|
}
|
|
}
|
|
const __ATPRERUN__ = []
|
|
const __ATINIT__ = []
|
|
const __ATMAIN__ = []
|
|
const __ATPOSTRUN__ = []
|
|
var runtimeInitialized = false
|
|
let runtimeExited = false
|
|
|
|
function preRun () {
|
|
if (Module.preRun) {
|
|
if (typeof Module.preRun === 'function') Module.preRun = [Module.preRun]
|
|
while (Module.preRun.length) {
|
|
addOnPreRun(Module.preRun.shift())
|
|
}
|
|
}
|
|
callRuntimeCallbacks(__ATPRERUN__)
|
|
}
|
|
|
|
function initRuntime () {
|
|
runtimeInitialized = true
|
|
if (!Module.noFSInit && !FS.init.initialized) FS.init()
|
|
TTY.init()
|
|
callRuntimeCallbacks(__ATINIT__)
|
|
}
|
|
|
|
function preMain () {
|
|
FS.ignorePermissions = false
|
|
callRuntimeCallbacks(__ATMAIN__)
|
|
}
|
|
|
|
function exitRuntime () {
|
|
runtimeExited = true
|
|
}
|
|
|
|
function postRun () {
|
|
if (Module.postRun) {
|
|
if (typeof Module.postRun === 'function') Module.postRun = [Module.postRun]
|
|
while (Module.postRun.length) {
|
|
addOnPostRun(Module.postRun.shift())
|
|
}
|
|
}
|
|
callRuntimeCallbacks(__ATPOSTRUN__)
|
|
}
|
|
|
|
function addOnPreRun (cb) {
|
|
__ATPRERUN__.unshift(cb)
|
|
}
|
|
|
|
function addOnPreMain (cb) {
|
|
__ATMAIN__.unshift(cb)
|
|
}
|
|
|
|
function addOnPostRun (cb) {
|
|
__ATPOSTRUN__.unshift(cb)
|
|
}
|
|
const Math_abs = Math.abs
|
|
const Math_ceil = Math.ceil
|
|
const Math_floor = Math.floor
|
|
const Math_min = Math.min
|
|
let runDependencies = 0
|
|
let runDependencyWatcher = null
|
|
let dependenciesFulfilled = null
|
|
|
|
function getUniqueRunDependency (id) {
|
|
return id
|
|
}
|
|
|
|
function addRunDependency (id) {
|
|
runDependencies++
|
|
if (Module.monitorRunDependencies) {
|
|
Module.monitorRunDependencies(runDependencies)
|
|
}
|
|
}
|
|
|
|
function removeRunDependency (id) {
|
|
runDependencies--
|
|
if (Module.monitorRunDependencies) {
|
|
Module.monitorRunDependencies(runDependencies)
|
|
}
|
|
if (runDependencies == 0) {
|
|
if (runDependencyWatcher !== null) {
|
|
clearInterval(runDependencyWatcher)
|
|
runDependencyWatcher = null
|
|
}
|
|
if (dependenciesFulfilled) {
|
|
const callback = dependenciesFulfilled
|
|
dependenciesFulfilled = null
|
|
callback()
|
|
}
|
|
}
|
|
}
|
|
Module.preloadedImages = {}
|
|
Module.preloadedAudios = {}
|
|
|
|
function abort (what) {
|
|
if (Module.onAbort) {
|
|
Module.onAbort(what)
|
|
}
|
|
what += ''
|
|
out(what)
|
|
err(what)
|
|
ABORT = true
|
|
EXITSTATUS = 1
|
|
what = 'abort(' + what + '). Build with -s ASSERTIONS=1 for more info.'
|
|
throw new WebAssembly.RuntimeError(what)
|
|
}
|
|
|
|
function hasPrefix (str, prefix) {
|
|
return String.prototype.startsWith
|
|
? str.startsWith(prefix)
|
|
: str.indexOf(prefix) === 0
|
|
}
|
|
const dataURIPrefix = 'data:application/octet-stream;base64,'
|
|
|
|
function isDataURI (filename) {
|
|
return hasPrefix(filename, dataURIPrefix)
|
|
}
|
|
const fileURIPrefix = 'file://'
|
|
|
|
function isFileURI (filename) {
|
|
return hasPrefix(filename, fileURIPrefix)
|
|
}
|
|
let wasmBinaryFile = 'subtitles-octopus-worker.wasm'
|
|
if (!isDataURI(wasmBinaryFile)) {
|
|
wasmBinaryFile = locateFile(wasmBinaryFile)
|
|
}
|
|
|
|
function getBinary () {
|
|
try {
|
|
if (wasmBinary) {
|
|
return new Uint8Array(wasmBinary)
|
|
}
|
|
if (readBinary) {
|
|
return readBinary(wasmBinaryFile)
|
|
} else {
|
|
throw 'both async and sync fetching of the wasm failed'
|
|
}
|
|
} catch (err) {
|
|
abort(err)
|
|
}
|
|
}
|
|
|
|
function getBinaryPromise () {
|
|
if (
|
|
!wasmBinary &&
|
|
(ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) &&
|
|
typeof fetch === 'function' &&
|
|
!isFileURI(wasmBinaryFile)
|
|
) {
|
|
return fetch(wasmBinaryFile, {
|
|
credentials: 'same-origin'
|
|
})
|
|
.then(function (response) {
|
|
if (!response.ok) {
|
|
throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"
|
|
}
|
|
return response.arrayBuffer()
|
|
})
|
|
.catch(function () {
|
|
return getBinary()
|
|
})
|
|
}
|
|
return new Promise(function (resolve, reject) {
|
|
resolve(getBinary())
|
|
})
|
|
}
|
|
|
|
function createWasm () {
|
|
const info = {
|
|
a: asmLibraryArg
|
|
}
|
|
|
|
function receiveInstance (instance, module) {
|
|
const exports = instance.exports
|
|
Module.asm = exports
|
|
removeRunDependency('wasm-instantiate')
|
|
}
|
|
addRunDependency('wasm-instantiate')
|
|
|
|
function receiveInstantiatedSource (output) {
|
|
receiveInstance(output.instance)
|
|
}
|
|
|
|
function instantiateArrayBuffer (receiver) {
|
|
return getBinaryPromise()
|
|
.then(function (binary) {
|
|
return WebAssembly.instantiate(binary, info)
|
|
})
|
|
.then(receiver, function (reason) {
|
|
err('failed to asynchronously prepare wasm: ' + reason)
|
|
abort(reason)
|
|
})
|
|
}
|
|
|
|
function instantiateAsync () {
|
|
if (
|
|
!wasmBinary &&
|
|
typeof WebAssembly.instantiateStreaming === 'function' &&
|
|
!isDataURI(wasmBinaryFile) &&
|
|
!isFileURI(wasmBinaryFile) &&
|
|
typeof fetch === 'function'
|
|
) {
|
|
fetch(wasmBinaryFile, {
|
|
credentials: 'same-origin'
|
|
}).then(function (response) {
|
|
const result = WebAssembly.instantiateStreaming(response, info)
|
|
return result.then(receiveInstantiatedSource, function (reason) {
|
|
err('wasm streaming compile failed: ' + reason)
|
|
err('falling back to ArrayBuffer instantiation')
|
|
instantiateArrayBuffer(receiveInstantiatedSource)
|
|
})
|
|
})
|
|
} else {
|
|
return instantiateArrayBuffer(receiveInstantiatedSource)
|
|
}
|
|
}
|
|
if (Module.instantiateWasm) {
|
|
try {
|
|
const exports = Module.instantiateWasm(info, receiveInstance)
|
|
return exports
|
|
} catch (e) {
|
|
err('Module.instantiateWasm callback failed with error: ' + e)
|
|
return false
|
|
}
|
|
}
|
|
instantiateAsync()
|
|
return {}
|
|
}
|
|
let tempDouble
|
|
let tempI64
|
|
__ATINIT__.push({
|
|
func: function () {
|
|
___wasm_call_ctors()
|
|
}
|
|
})
|
|
|
|
function _emscripten_set_main_loop_timing (mode, value) {
|
|
Browser.mainLoop.timingMode = mode
|
|
Browser.mainLoop.timingValue = value
|
|
if (!Browser.mainLoop.func) {
|
|
return 1
|
|
}
|
|
if (mode == 0) {
|
|
Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setTimeout () {
|
|
const timeUntilNextTick =
|
|
Math.max(
|
|
0,
|
|
Browser.mainLoop.tickStartTime + value - _emscripten_get_now()
|
|
) | 0
|
|
setTimeout(Browser.mainLoop.runner, timeUntilNextTick)
|
|
}
|
|
Browser.mainLoop.method = 'timeout'
|
|
} else if (mode == 1) {
|
|
Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_rAF () {
|
|
Browser.requestAnimationFrame(Browser.mainLoop.runner)
|
|
}
|
|
Browser.mainLoop.method = 'rAF'
|
|
} else if (mode == 2) {
|
|
if (typeof setImmediate === 'undefined') {
|
|
const setImmediates = []
|
|
const emscriptenMainLoopMessageId = 'setimmediate'
|
|
const Browser_setImmediate_messageHandler = function (event) {
|
|
if (
|
|
event.data === emscriptenMainLoopMessageId ||
|
|
event.data.target === emscriptenMainLoopMessageId
|
|
) {
|
|
event.stopPropagation()
|
|
setImmediates.shift()()
|
|
}
|
|
}
|
|
addEventListener('message', Browser_setImmediate_messageHandler, true)
|
|
setImmediate = function Browser_emulated_setImmediate (func) {
|
|
setImmediates.push(func)
|
|
if (ENVIRONMENT_IS_WORKER) {
|
|
if (Module.setImmediates === undefined) Module.setImmediates = []
|
|
Module.setImmediates.push(func)
|
|
postMessage({
|
|
target: emscriptenMainLoopMessageId
|
|
})
|
|
} else postMessage(emscriptenMainLoopMessageId, '*')
|
|
}
|
|
}
|
|
Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setImmediate () {
|
|
setImmediate(Browser.mainLoop.runner)
|
|
}
|
|
Browser.mainLoop.method = 'immediate'
|
|
}
|
|
return 0
|
|
}
|
|
let _emscripten_get_now
|
|
_emscripten_get_now = function () {
|
|
return performance.now()
|
|
}
|
|
|
|
function _emscripten_set_main_loop (
|
|
func,
|
|
fps,
|
|
simulateInfiniteLoop,
|
|
arg,
|
|
noSetTiming
|
|
) {
|
|
noExitRuntime = true
|
|
assert(
|
|
!Browser.mainLoop.func,
|
|
'emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.'
|
|
)
|
|
Browser.mainLoop.func = func
|
|
Browser.mainLoop.arg = arg
|
|
let browserIterationFunc
|
|
if (typeof arg !== 'undefined') {
|
|
browserIterationFunc = function () {
|
|
Module.dynCall_vi(func, arg)
|
|
}
|
|
} else {
|
|
browserIterationFunc = function () {
|
|
Module.dynCall_v(func)
|
|
}
|
|
}
|
|
const thisMainLoopId = Browser.mainLoop.currentlyRunningMainloop
|
|
Browser.mainLoop.runner = function Browser_mainLoop_runner () {
|
|
if (ABORT) return
|
|
if (Browser.mainLoop.queue.length > 0) {
|
|
const start = Date.now()
|
|
const blocker = Browser.mainLoop.queue.shift()
|
|
blocker.func(blocker.arg)
|
|
if (Browser.mainLoop.remainingBlockers) {
|
|
const remaining = Browser.mainLoop.remainingBlockers
|
|
let next = remaining % 1 == 0 ? remaining - 1 : Math.floor(remaining)
|
|
if (blocker.counted) {
|
|
Browser.mainLoop.remainingBlockers = next
|
|
} else {
|
|
next = next + 0.5
|
|
Browser.mainLoop.remainingBlockers = (8 * remaining + next) / 9
|
|
}
|
|
}
|
|
console.log(
|
|
'main loop blocker "' +
|
|
blocker.name +
|
|
'" took ' +
|
|
(Date.now() - start) +
|
|
' ms'
|
|
)
|
|
Browser.mainLoop.updateStatus()
|
|
if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return
|
|
setTimeout(Browser.mainLoop.runner, 0)
|
|
return
|
|
}
|
|
if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return
|
|
Browser.mainLoop.currentFrameNumber =
|
|
(Browser.mainLoop.currentFrameNumber + 1) | 0
|
|
if (
|
|
Browser.mainLoop.timingMode == 1 &&
|
|
Browser.mainLoop.timingValue > 1 &&
|
|
Browser.mainLoop.currentFrameNumber % Browser.mainLoop.timingValue != 0
|
|
) {
|
|
Browser.mainLoop.scheduler()
|
|
return
|
|
} else if (Browser.mainLoop.timingMode == 0) {
|
|
Browser.mainLoop.tickStartTime = _emscripten_get_now()
|
|
}
|
|
Browser.mainLoop.runIter(browserIterationFunc)
|
|
if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) return
|
|
if (typeof SDL === 'object' && SDL.audio && SDL.audio.queueNewAudioData) {
|
|
SDL.audio.queueNewAudioData()
|
|
}
|
|
Browser.mainLoop.scheduler()
|
|
}
|
|
if (!noSetTiming) {
|
|
if (fps && fps > 0) _emscripten_set_main_loop_timing(0, 1e3 / fps)
|
|
else _emscripten_set_main_loop_timing(1, 1)
|
|
Browser.mainLoop.scheduler()
|
|
}
|
|
if (simulateInfiniteLoop) {
|
|
throw 'unwind'
|
|
}
|
|
}
|
|
var Browser = {
|
|
mainLoop: {
|
|
scheduler: null,
|
|
method: '',
|
|
currentlyRunningMainloop: 0,
|
|
func: null,
|
|
arg: 0,
|
|
timingMode: 0,
|
|
timingValue: 0,
|
|
currentFrameNumber: 0,
|
|
queue: [],
|
|
pause: function () {
|
|
Browser.mainLoop.scheduler = null
|
|
Browser.mainLoop.currentlyRunningMainloop++
|
|
},
|
|
resume: function () {
|
|
Browser.mainLoop.currentlyRunningMainloop++
|
|
const timingMode = Browser.mainLoop.timingMode
|
|
const timingValue = Browser.mainLoop.timingValue
|
|
const func = Browser.mainLoop.func
|
|
Browser.mainLoop.func = null
|
|
_emscripten_set_main_loop(func, 0, false, Browser.mainLoop.arg, true)
|
|
_emscripten_set_main_loop_timing(timingMode, timingValue)
|
|
Browser.mainLoop.scheduler()
|
|
},
|
|
updateStatus: function () {
|
|
if (Module.setStatus) {
|
|
const message = Module.statusMessage || 'Please wait...'
|
|
const remaining = Browser.mainLoop.remainingBlockers
|
|
const expected = Browser.mainLoop.expectedBlockers
|
|
if (remaining) {
|
|
if (remaining < expected) {
|
|
Module.setStatus(
|
|
message + ' (' + (expected - remaining) + '/' + expected + ')'
|
|
)
|
|
} else {
|
|
Module.setStatus(message)
|
|
}
|
|
} else {
|
|
Module.setStatus('')
|
|
}
|
|
}
|
|
},
|
|
runIter: function (func) {
|
|
if (ABORT) return
|
|
if (Module.preMainLoop) {
|
|
const preRet = Module.preMainLoop()
|
|
if (preRet === false) {
|
|
return
|
|
}
|
|
}
|
|
try {
|
|
func()
|
|
} catch (e) {
|
|
if (e instanceof ExitStatus) {
|
|
return
|
|
} else {
|
|
if (e && typeof e === 'object' && e.stack) {
|
|
err('exception thrown: ' + [e, e.stack])
|
|
}
|
|
throw e
|
|
}
|
|
}
|
|
if (Module.postMainLoop) Module.postMainLoop()
|
|
}
|
|
},
|
|
isFullscreen: false,
|
|
pointerLock: false,
|
|
moduleContextCreatedCallbacks: [],
|
|
workers: [],
|
|
init: function () {
|
|
if (!Module.preloadPlugins) Module.preloadPlugins = []
|
|
if (Browser.initted) return
|
|
Browser.initted = true
|
|
try {
|
|
new Blob()
|
|
Browser.hasBlobConstructor = true
|
|
} catch (e) {
|
|
Browser.hasBlobConstructor = false
|
|
console.log(
|
|
'warning: no blob constructor, cannot create blobs with mimetypes'
|
|
)
|
|
}
|
|
Browser.BlobBuilder =
|
|
typeof MozBlobBuilder !== 'undefined'
|
|
? MozBlobBuilder
|
|
: typeof WebKitBlobBuilder !== 'undefined'
|
|
? WebKitBlobBuilder
|
|
: !Browser.hasBlobConstructor
|
|
? console.log('warning: no BlobBuilder')
|
|
: null
|
|
Browser.URLObject =
|
|
typeof window !== 'undefined'
|
|
? window.URL
|
|
? window.URL
|
|
: window.webkitURL
|
|
: undefined
|
|
if (!Module.noImageDecoding && !typeof Browser.URLObject === 'undefined') {
|
|
console.log(
|
|
'warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.'
|
|
)
|
|
Module.noImageDecoding = true
|
|
}
|
|
const imagePlugin = {}
|
|
imagePlugin.canHandle = function imagePlugin_canHandle (name) {
|
|
return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name)
|
|
}
|
|
imagePlugin.handle = function imagePlugin_handle (
|
|
byteArray,
|
|
name,
|
|
onload,
|
|
onerror
|
|
) {
|
|
let b = null
|
|
if (Browser.hasBlobConstructor) {
|
|
try {
|
|
b = new Blob([byteArray], {
|
|
type: Browser.getMimetype(name)
|
|
})
|
|
if (b.size !== byteArray.length) {
|
|
b = new Blob([new Uint8Array(byteArray).buffer], {
|
|
type: Browser.getMimetype(name)
|
|
})
|
|
}
|
|
} catch (e) {
|
|
warnOnce(
|
|
'Blob constructor present but fails: ' +
|
|
e +
|
|
'; falling back to blob builder'
|
|
)
|
|
}
|
|
}
|
|
if (!b) {
|
|
const bb = new Browser.BlobBuilder()
|
|
bb.append(new Uint8Array(byteArray).buffer)
|
|
b = bb.getBlob()
|
|
}
|
|
const url = Browser.URLObject.createObjectURL(b)
|
|
const img = new Image()
|
|
img.onload = function img_onload () {
|
|
assert(img.complete, 'Image ' + name + ' could not be decoded')
|
|
const canvas = document.createElement('canvas')
|
|
canvas.width = img.width
|
|
canvas.height = img.height
|
|
const ctx = canvas.getContext('2d')
|
|
ctx.drawImage(img, 0, 0)
|
|
Module.preloadedImages[name] = canvas
|
|
Browser.URLObject.revokeObjectURL(url)
|
|
if (onload) onload(byteArray)
|
|
}
|
|
img.onerror = function img_onerror (event) {
|
|
console.log('Image ' + url + ' could not be decoded')
|
|
if (onerror) onerror()
|
|
}
|
|
img.src = url
|
|
}
|
|
Module.preloadPlugins.push(imagePlugin)
|
|
const audioPlugin = {}
|
|
audioPlugin.canHandle = function audioPlugin_canHandle (name) {
|
|
return (
|
|
!Module.noAudioDecoding &&
|
|
name.substr(-4) in
|
|
{
|
|
'.ogg': 1,
|
|
'.wav': 1,
|
|
'.mp3': 1
|
|
}
|
|
)
|
|
}
|
|
audioPlugin.handle = function audioPlugin_handle (
|
|
byteArray,
|
|
name,
|
|
onload,
|
|
onerror
|
|
) {
|
|
let done = false
|
|
|
|
function finish (audio) {
|
|
if (done) return
|
|
done = true
|
|
Module.preloadedAudios[name] = audio
|
|
if (onload) onload(byteArray)
|
|
}
|
|
|
|
function fail () {
|
|
if (done) return
|
|
done = true
|
|
Module.preloadedAudios[name] = new Audio()
|
|
if (onerror) onerror()
|
|
}
|
|
if (Browser.hasBlobConstructor) {
|
|
try {
|
|
var b = new Blob([byteArray], {
|
|
type: Browser.getMimetype(name)
|
|
})
|
|
} catch (e) {
|
|
return fail()
|
|
}
|
|
const url = Browser.URLObject.createObjectURL(b)
|
|
const audio = new Audio()
|
|
audio.addEventListener(
|
|
'canplaythrough',
|
|
function () {
|
|
finish(audio)
|
|
},
|
|
false
|
|
)
|
|
audio.onerror = function audio_onerror (event) {
|
|
if (done) return
|
|
console.log(
|
|
'warning: browser could not fully decode audio ' +
|
|
name +
|
|
', trying slower base64 approach'
|
|
)
|
|
|
|
function encode64 (data) {
|
|
const BASE =
|
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
|
const PAD = '='
|
|
let ret = ''
|
|
let leftchar = 0
|
|
let leftbits = 0
|
|
for (let i = 0; i < data.length; i++) {
|
|
leftchar = (leftchar << 8) | data[i]
|
|
leftbits += 8
|
|
while (leftbits >= 6) {
|
|
const curr = (leftchar >> (leftbits - 6)) & 63
|
|
leftbits -= 6
|
|
ret += BASE[curr]
|
|
}
|
|
}
|
|
if (leftbits == 2) {
|
|
ret += BASE[(leftchar & 3) << 4]
|
|
ret += PAD + PAD
|
|
} else if (leftbits == 4) {
|
|
ret += BASE[(leftchar & 15) << 2]
|
|
ret += PAD
|
|
}
|
|
return ret
|
|
}
|
|
audio.src =
|
|
'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray)
|
|
finish(audio)
|
|
}
|
|
audio.src = url
|
|
Browser.safeSetTimeout(function () {
|
|
finish(audio)
|
|
}, 1e4)
|
|
} else {
|
|
return fail()
|
|
}
|
|
}
|
|
Module.preloadPlugins.push(audioPlugin)
|
|
|
|
function pointerLockChange () {
|
|
Browser.pointerLock =
|
|
document.pointerLockElement === Module.canvas ||
|
|
document.mozPointerLockElement === Module.canvas ||
|
|
document.webkitPointerLockElement === Module.canvas ||
|
|
document.msPointerLockElement === Module.canvas
|
|
}
|
|
const canvas = Module.canvas
|
|
if (canvas) {
|
|
canvas.requestPointerLock =
|
|
canvas.requestPointerLock ||
|
|
canvas.mozRequestPointerLock ||
|
|
canvas.webkitRequestPointerLock ||
|
|
canvas.msRequestPointerLock ||
|
|
function () {}
|
|
canvas.exitPointerLock =
|
|
document.exitPointerLock ||
|
|
document.mozExitPointerLock ||
|
|
document.webkitExitPointerLock ||
|
|
document.msExitPointerLock ||
|
|
function () {}
|
|
canvas.exitPointerLock = canvas.exitPointerLock.bind(document)
|
|
document.addEventListener('pointerlockchange', pointerLockChange, false)
|
|
document.addEventListener(
|
|
'mozpointerlockchange',
|
|
pointerLockChange,
|
|
false
|
|
)
|
|
document.addEventListener(
|
|
'webkitpointerlockchange',
|
|
pointerLockChange,
|
|
false
|
|
)
|
|
document.addEventListener('mspointerlockchange', pointerLockChange, false)
|
|
if (Module.elementPointerLock) {
|
|
canvas.addEventListener(
|
|
'click',
|
|
function (ev) {
|
|
if (!Browser.pointerLock && Module.canvas.requestPointerLock) {
|
|
Module.canvas.requestPointerLock()
|
|
ev.preventDefault()
|
|
}
|
|
},
|
|
false
|
|
)
|
|
}
|
|
}
|
|
},
|
|
createContext: function (
|
|
canvas,
|
|
useWebGL,
|
|
setInModule,
|
|
webGLContextAttributes
|
|
) {
|
|
if (useWebGL && Module.ctx && canvas == Module.canvas) return Module.ctx
|
|
let ctx
|
|
let contextHandle
|
|
if (useWebGL) {
|
|
const contextAttributes = {
|
|
antialias: false,
|
|
alpha: false,
|
|
majorVersion: 1
|
|
}
|
|
if (webGLContextAttributes) {
|
|
for (const attribute in webGLContextAttributes) {
|
|
contextAttributes[attribute] = webGLContextAttributes[attribute]
|
|
}
|
|
}
|
|
if (typeof GL !== 'undefined') {
|
|
contextHandle = GL.createContext(canvas, contextAttributes)
|
|
if (contextHandle) {
|
|
ctx = GL.getContext(contextHandle).GLctx
|
|
}
|
|
}
|
|
} else {
|
|
ctx = canvas.getContext('2d')
|
|
}
|
|
if (!ctx) return null
|
|
if (setInModule) {
|
|
if (!useWebGL) {
|
|
assert(
|
|
typeof GLctx === 'undefined',
|
|
'cannot set in module if GLctx is used, but we are a non-GL context that would replace it'
|
|
)
|
|
}
|
|
Module.ctx = ctx
|
|
if (useWebGL) GL.makeContextCurrent(contextHandle)
|
|
Module.useWebGL = useWebGL
|
|
Browser.moduleContextCreatedCallbacks.forEach(function (callback) {
|
|
callback()
|
|
})
|
|
Browser.init()
|
|
}
|
|
return ctx
|
|
},
|
|
destroyContext: function (canvas, useWebGL, setInModule) {},
|
|
fullscreenHandlersInstalled: false,
|
|
lockPointer: undefined,
|
|
resizeCanvas: undefined,
|
|
requestFullscreen: function (lockPointer, resizeCanvas) {
|
|
Browser.lockPointer = lockPointer
|
|
Browser.resizeCanvas = resizeCanvas
|
|
if (typeof Browser.lockPointer === 'undefined') Browser.lockPointer = true
|
|
if (typeof Browser.resizeCanvas === 'undefined') {
|
|
Browser.resizeCanvas = false
|
|
}
|
|
const canvas = Module.canvas
|
|
|
|
function fullscreenChange () {
|
|
Browser.isFullscreen = false
|
|
const canvasContainer = canvas.parentNode
|
|
if (
|
|
(document.fullscreenElement ||
|
|
document.mozFullScreenElement ||
|
|
document.msFullscreenElement ||
|
|
document.webkitFullscreenElement ||
|
|
document.webkitCurrentFullScreenElement) === canvasContainer
|
|
) {
|
|
canvas.exitFullscreen = Browser.exitFullscreen
|
|
if (Browser.lockPointer) canvas.requestPointerLock()
|
|
Browser.isFullscreen = true
|
|
if (Browser.resizeCanvas) {
|
|
Browser.setFullscreenCanvasSize()
|
|
} else {
|
|
Browser.updateCanvasDimensions(canvas)
|
|
}
|
|
} else {
|
|
canvasContainer.parentNode.insertBefore(canvas, canvasContainer)
|
|
canvasContainer.parentNode.removeChild(canvasContainer)
|
|
if (Browser.resizeCanvas) {
|
|
Browser.setWindowedCanvasSize()
|
|
} else {
|
|
Browser.updateCanvasDimensions(canvas)
|
|
}
|
|
}
|
|
if (Module.onFullScreen) Module.onFullScreen(Browser.isFullscreen)
|
|
if (Module.onFullscreen) Module.onFullscreen(Browser.isFullscreen)
|
|
}
|
|
if (!Browser.fullscreenHandlersInstalled) {
|
|
Browser.fullscreenHandlersInstalled = true
|
|
document.addEventListener('fullscreenchange', fullscreenChange, false)
|
|
document.addEventListener('mozfullscreenchange', fullscreenChange, false)
|
|
document.addEventListener(
|
|
'webkitfullscreenchange',
|
|
fullscreenChange,
|
|
false
|
|
)
|
|
document.addEventListener('MSFullscreenChange', fullscreenChange, false)
|
|
}
|
|
const canvasContainer = document.createElement('div')
|
|
canvas.parentNode.insertBefore(canvasContainer, canvas)
|
|
canvasContainer.appendChild(canvas)
|
|
canvasContainer.requestFullscreen =
|
|
canvasContainer.requestFullscreen ||
|
|
canvasContainer.mozRequestFullScreen ||
|
|
canvasContainer.msRequestFullscreen ||
|
|
(canvasContainer.webkitRequestFullscreen
|
|
? function () {
|
|
canvasContainer.webkitRequestFullscreen(
|
|
Element.ALLOW_KEYBOARD_INPUT
|
|
)
|
|
}
|
|
: null) ||
|
|
(canvasContainer.webkitRequestFullScreen
|
|
? function () {
|
|
canvasContainer.webkitRequestFullScreen(
|
|
Element.ALLOW_KEYBOARD_INPUT
|
|
)
|
|
}
|
|
: null)
|
|
canvasContainer.requestFullscreen()
|
|
},
|
|
exitFullscreen: function () {
|
|
if (!Browser.isFullscreen) {
|
|
return false
|
|
}
|
|
const CFS =
|
|
document.exitFullscreen ||
|
|
document.cancelFullScreen ||
|
|
document.mozCancelFullScreen ||
|
|
document.msExitFullscreen ||
|
|
document.webkitCancelFullScreen ||
|
|
function () {}
|
|
CFS.apply(document, [])
|
|
return true
|
|
},
|
|
nextRAF: 0,
|
|
fakeRequestAnimationFrame: function (func) {
|
|
const now = Date.now()
|
|
if (Browser.nextRAF === 0) {
|
|
Browser.nextRAF = now + 1e3 / 60
|
|
} else {
|
|
while (now + 2 >= Browser.nextRAF) {
|
|
Browser.nextRAF += 1e3 / 60
|
|
}
|
|
}
|
|
const delay = Math.max(Browser.nextRAF - now, 0)
|
|
setTimeout(func, delay)
|
|
},
|
|
requestAnimationFrame: function (func) {
|
|
if (typeof requestAnimationFrame === 'function') {
|
|
requestAnimationFrame(func)
|
|
return
|
|
}
|
|
const RAF = Browser.fakeRequestAnimationFrame
|
|
RAF(func)
|
|
},
|
|
safeCallback: function (func) {
|
|
return function () {
|
|
if (!ABORT) return func.apply(null, arguments)
|
|
}
|
|
},
|
|
allowAsyncCallbacks: true,
|
|
queuedAsyncCallbacks: [],
|
|
pauseAsyncCallbacks: function () {
|
|
Browser.allowAsyncCallbacks = false
|
|
},
|
|
resumeAsyncCallbacks: function () {
|
|
Browser.allowAsyncCallbacks = true
|
|
if (Browser.queuedAsyncCallbacks.length > 0) {
|
|
const callbacks = Browser.queuedAsyncCallbacks
|
|
Browser.queuedAsyncCallbacks = []
|
|
callbacks.forEach(function (func) {
|
|
func()
|
|
})
|
|
}
|
|
},
|
|
safeRequestAnimationFrame: function (func) {
|
|
return Browser.requestAnimationFrame(function () {
|
|
if (ABORT) return
|
|
if (Browser.allowAsyncCallbacks) {
|
|
func()
|
|
} else {
|
|
Browser.queuedAsyncCallbacks.push(func)
|
|
}
|
|
})
|
|
},
|
|
safeSetTimeout: function (func, timeout) {
|
|
noExitRuntime = true
|
|
return setTimeout(function () {
|
|
if (ABORT) return
|
|
if (Browser.allowAsyncCallbacks) {
|
|
func()
|
|
} else {
|
|
Browser.queuedAsyncCallbacks.push(func)
|
|
}
|
|
}, timeout)
|
|
},
|
|
safeSetInterval: function (func, timeout) {
|
|
noExitRuntime = true
|
|
return setInterval(function () {
|
|
if (ABORT) return
|
|
if (Browser.allowAsyncCallbacks) {
|
|
func()
|
|
}
|
|
}, timeout)
|
|
},
|
|
getMimetype: function (name) {
|
|
return {
|
|
jpg: 'image/jpeg',
|
|
jpeg: 'image/jpeg',
|
|
png: 'image/png',
|
|
bmp: 'image/bmp',
|
|
ogg: 'audio/ogg',
|
|
wav: 'audio/wav',
|
|
mp3: 'audio/mpeg'
|
|
}[name.substr(name.lastIndexOf('.') + 1)]
|
|
},
|
|
getUserMedia: function (func) {
|
|
if (!window.getUserMedia) {
|
|
window.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia
|
|
}
|
|
window.getUserMedia(func)
|
|
},
|
|
getMovementX: function (event) {
|
|
return event.movementX || event.mozMovementX || event.webkitMovementX || 0
|
|
},
|
|
getMovementY: function (event) {
|
|
return event.movementY || event.mozMovementY || event.webkitMovementY || 0
|
|
},
|
|
getMouseWheelDelta: function (event) {
|
|
let delta = 0
|
|
switch (event.type) {
|
|
case 'DOMMouseScroll':
|
|
delta = event.detail / 3
|
|
break
|
|
case 'mousewheel':
|
|
delta = event.wheelDelta / 120
|
|
break
|
|
case 'wheel':
|
|
delta = event.deltaY
|
|
switch (event.deltaMode) {
|
|
case 0:
|
|
delta /= 100
|
|
break
|
|
case 1:
|
|
delta /= 3
|
|
break
|
|
case 2:
|
|
delta *= 80
|
|
break
|
|
default:
|
|
throw 'unrecognized mouse wheel delta mode: ' + event.deltaMode
|
|
}
|
|
break
|
|
default:
|
|
throw 'unrecognized mouse wheel event: ' + event.type
|
|
}
|
|
return delta
|
|
},
|
|
mouseX: 0,
|
|
mouseY: 0,
|
|
mouseMovementX: 0,
|
|
mouseMovementY: 0,
|
|
touches: {},
|
|
lastTouches: {},
|
|
calculateMouseEvent: function (event) {
|
|
if (Browser.pointerLock) {
|
|
if (event.type != 'mousemove' && 'mozMovementX' in event) {
|
|
Browser.mouseMovementX = Browser.mouseMovementY = 0
|
|
} else {
|
|
Browser.mouseMovementX = Browser.getMovementX(event)
|
|
Browser.mouseMovementY = Browser.getMovementY(event)
|
|
}
|
|
if (typeof SDL !== 'undefined') {
|
|
Browser.mouseX = SDL.mouseX + Browser.mouseMovementX
|
|
Browser.mouseY = SDL.mouseY + Browser.mouseMovementY
|
|
} else {
|
|
Browser.mouseX += Browser.mouseMovementX
|
|
Browser.mouseY += Browser.mouseMovementY
|
|
}
|
|
} else {
|
|
const rect = Module.canvas.getBoundingClientRect()
|
|
const cw = Module.canvas.width
|
|
const ch = Module.canvas.height
|
|
const scrollX =
|
|
typeof window.scrollX !== 'undefined'
|
|
? window.scrollX
|
|
: window.pageXOffset
|
|
const scrollY =
|
|
typeof window.scrollY !== 'undefined'
|
|
? window.scrollY
|
|
: window.pageYOffset
|
|
if (
|
|
event.type === 'touchstart' ||
|
|
event.type === 'touchend' ||
|
|
event.type === 'touchmove'
|
|
) {
|
|
const touch = event.touch
|
|
if (touch === undefined) {
|
|
return
|
|
}
|
|
let adjustedX = touch.pageX - (scrollX + rect.left)
|
|
let adjustedY = touch.pageY - (scrollY + rect.top)
|
|
adjustedX = adjustedX * (cw / rect.width)
|
|
adjustedY = adjustedY * (ch / rect.height)
|
|
const coords = {
|
|
x: adjustedX,
|
|
y: adjustedY
|
|
}
|
|
if (event.type === 'touchstart') {
|
|
Browser.lastTouches[touch.identifier] = coords
|
|
Browser.touches[touch.identifier] = coords
|
|
} else if (event.type === 'touchend' || event.type === 'touchmove') {
|
|
let last = Browser.touches[touch.identifier]
|
|
if (!last) last = coords
|
|
Browser.lastTouches[touch.identifier] = last
|
|
Browser.touches[touch.identifier] = coords
|
|
}
|
|
return
|
|
}
|
|
let x = event.pageX - (scrollX + rect.left)
|
|
let y = event.pageY - (scrollY + rect.top)
|
|
x = x * (cw / rect.width)
|
|
y = y * (ch / rect.height)
|
|
Browser.mouseMovementX = x - Browser.mouseX
|
|
Browser.mouseMovementY = y - Browser.mouseY
|
|
Browser.mouseX = x
|
|
Browser.mouseY = y
|
|
}
|
|
},
|
|
asyncLoad: function (url, onload, onerror, noRunDep) {
|
|
const dep = !noRunDep ? getUniqueRunDependency('al ' + url) : ''
|
|
readAsync(
|
|
url,
|
|
function (arrayBuffer) {
|
|
assert(
|
|
arrayBuffer,
|
|
'Loading data file "' + url + '" failed (no arrayBuffer).'
|
|
)
|
|
onload(new Uint8Array(arrayBuffer))
|
|
if (dep) removeRunDependency(dep)
|
|
},
|
|
function (event) {
|
|
if (onerror) {
|
|
onerror()
|
|
} else {
|
|
throw 'Loading data file "' + url + '" failed.'
|
|
}
|
|
}
|
|
)
|
|
if (dep) addRunDependency(dep)
|
|
},
|
|
resizeListeners: [],
|
|
updateResizeListeners: function () {
|
|
const canvas = Module.canvas
|
|
Browser.resizeListeners.forEach(function (listener) {
|
|
listener(canvas.width, canvas.height)
|
|
})
|
|
},
|
|
setCanvasSize: function (width, height, noUpdates) {
|
|
const canvas = Module.canvas
|
|
Browser.updateCanvasDimensions(canvas, width, height)
|
|
if (!noUpdates) Browser.updateResizeListeners()
|
|
},
|
|
windowedWidth: 0,
|
|
windowedHeight: 0,
|
|
setFullscreenCanvasSize: function () {
|
|
if (typeof SDL !== 'undefined') {
|
|
let flags = HEAPU32[SDL.screen >> 2]
|
|
flags = flags | 8388608
|
|
HEAP32[SDL.screen >> 2] = flags
|
|
}
|
|
Browser.updateCanvasDimensions(Module.canvas)
|
|
Browser.updateResizeListeners()
|
|
},
|
|
setWindowedCanvasSize: function () {
|
|
if (typeof SDL !== 'undefined') {
|
|
let flags = HEAPU32[SDL.screen >> 2]
|
|
flags = flags & ~8388608
|
|
HEAP32[SDL.screen >> 2] = flags
|
|
}
|
|
Browser.updateCanvasDimensions(Module.canvas)
|
|
Browser.updateResizeListeners()
|
|
},
|
|
updateCanvasDimensions: function (canvas, wNative, hNative) {
|
|
if (wNative && hNative) {
|
|
canvas.widthNative = wNative
|
|
canvas.heightNative = hNative
|
|
} else {
|
|
wNative = canvas.widthNative
|
|
hNative = canvas.heightNative
|
|
}
|
|
let w = wNative
|
|
let h = hNative
|
|
if (Module.forcedAspectRatio && Module.forcedAspectRatio > 0) {
|
|
if (w / h < Module.forcedAspectRatio) {
|
|
w = Math.round(h * Module.forcedAspectRatio)
|
|
} else {
|
|
h = Math.round(w / Module.forcedAspectRatio)
|
|
}
|
|
}
|
|
if (
|
|
(document.fullscreenElement ||
|
|
document.mozFullScreenElement ||
|
|
document.msFullscreenElement ||
|
|
document.webkitFullscreenElement ||
|
|
document.webkitCurrentFullScreenElement) === canvas.parentNode &&
|
|
typeof screen !== 'undefined'
|
|
) {
|
|
const factor = Math.min(screen.width / w, screen.height / h)
|
|
w = Math.round(w * factor)
|
|
h = Math.round(h * factor)
|
|
}
|
|
if (Browser.resizeCanvas) {
|
|
if (canvas.width != w) canvas.width = w
|
|
if (canvas.height != h) canvas.height = h
|
|
if (typeof canvas.style !== 'undefined') {
|
|
canvas.style.removeProperty('width')
|
|
canvas.style.removeProperty('height')
|
|
}
|
|
} else {
|
|
if (canvas.width != wNative) canvas.width = wNative
|
|
if (canvas.height != hNative) canvas.height = hNative
|
|
if (typeof canvas.style !== 'undefined') {
|
|
if (w != wNative || h != hNative) {
|
|
canvas.style.setProperty('width', w + 'px', 'important')
|
|
canvas.style.setProperty('height', h + 'px', 'important')
|
|
} else {
|
|
canvas.style.removeProperty('width')
|
|
canvas.style.removeProperty('height')
|
|
}
|
|
}
|
|
}
|
|
},
|
|
wgetRequests: {},
|
|
nextWgetRequestHandle: 0,
|
|
getNextWgetRequestHandle: function () {
|
|
const handle = Browser.nextWgetRequestHandle
|
|
Browser.nextWgetRequestHandle++
|
|
return handle
|
|
}
|
|
}
|
|
|
|
function demangle (func) {
|
|
return func
|
|
}
|
|
|
|
function demangleAll (text) {
|
|
const regex = /\b_Z[\w\d_]+/g
|
|
return text.replace(regex, function (x) {
|
|
const y = demangle(x)
|
|
return x === y ? x : y + ' [' + x + ']'
|
|
})
|
|
}
|
|
|
|
function jsStackTrace () {
|
|
let err = new Error()
|
|
if (!err.stack) {
|
|
try {
|
|
throw new Error()
|
|
} catch (e) {
|
|
err = e
|
|
}
|
|
if (!err.stack) {
|
|
return '(no stack trace available)'
|
|
}
|
|
}
|
|
return err.stack.toString()
|
|
}
|
|
|
|
function stackTrace () {
|
|
let js = jsStackTrace()
|
|
if (Module.extraStackTrace) js += '\n' + Module.extraStackTrace()
|
|
return demangleAll(js)
|
|
}
|
|
|
|
function ___assert_fail (condition, filename, line, func) {
|
|
abort(
|
|
'Assertion failed: ' +
|
|
UTF8ToString(condition) +
|
|
', at: ' +
|
|
[
|
|
filename ? UTF8ToString(filename) : 'unknown filename',
|
|
line,
|
|
func ? UTF8ToString(func) : 'unknown function'
|
|
]
|
|
)
|
|
}
|
|
const _emscripten_get_now_is_monotonic = true
|
|
|
|
function setErrNo (value) {
|
|
HEAP32[___errno_location() >> 2] = value
|
|
return value
|
|
}
|
|
|
|
function _clock_gettime (clk_id, tp) {
|
|
let now
|
|
if (clk_id === 0) {
|
|
now = Date.now()
|
|
} else if (
|
|
(clk_id === 1 || clk_id === 4) &&
|
|
_emscripten_get_now_is_monotonic
|
|
) {
|
|
now = _emscripten_get_now()
|
|
} else {
|
|
setErrNo(28)
|
|
return -1
|
|
}
|
|
HEAP32[tp >> 2] = (now / 1e3) | 0
|
|
HEAP32[(tp + 4) >> 2] = ((now % 1e3) * 1e3 * 1e3) | 0
|
|
return 0
|
|
}
|
|
|
|
function ___clock_gettime (a0, a1) {
|
|
return _clock_gettime(a0, a1)
|
|
}
|
|
|
|
function ___map_file (pathname, size) {
|
|
setErrNo(63)
|
|
return -1
|
|
}
|
|
var PATH = {
|
|
splitPath: function (filename) {
|
|
const splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/
|
|
return splitPathRe.exec(filename).slice(1)
|
|
},
|
|
normalizeArray: function (parts, allowAboveRoot) {
|
|
let up = 0
|
|
for (let i = parts.length - 1; i >= 0; i--) {
|
|
const last = parts[i]
|
|
if (last === '.') {
|
|
parts.splice(i, 1)
|
|
} else if (last === '..') {
|
|
parts.splice(i, 1)
|
|
up++
|
|
} else if (up) {
|
|
parts.splice(i, 1)
|
|
up--
|
|
}
|
|
}
|
|
if (allowAboveRoot) {
|
|
for (; up; up--) {
|
|
parts.unshift('..')
|
|
}
|
|
}
|
|
return parts
|
|
},
|
|
normalize: function (path) {
|
|
const isAbsolute = path.charAt(0) === '/'
|
|
const trailingSlash = path.substr(-1) === '/'
|
|
path = PATH.normalizeArray(
|
|
path.split('/').filter(function (p) {
|
|
return !!p
|
|
}),
|
|
!isAbsolute
|
|
).join('/')
|
|
if (!path && !isAbsolute) {
|
|
path = '.'
|
|
}
|
|
if (path && trailingSlash) {
|
|
path += '/'
|
|
}
|
|
return (isAbsolute ? '/' : '') + path
|
|
},
|
|
dirname: function (path) {
|
|
const result = PATH.splitPath(path)
|
|
const root = result[0]
|
|
let dir = result[1]
|
|
if (!root && !dir) {
|
|
return '.'
|
|
}
|
|
if (dir) {
|
|
dir = dir.substr(0, dir.length - 1)
|
|
}
|
|
return root + dir
|
|
},
|
|
basename: function (path) {
|
|
if (path === '/') return '/'
|
|
const lastSlash = path.lastIndexOf('/')
|
|
if (lastSlash === -1) return path
|
|
return path.substr(lastSlash + 1)
|
|
},
|
|
extname: function (path) {
|
|
return PATH.splitPath(path)[3]
|
|
},
|
|
join: function () {
|
|
const paths = Array.prototype.slice.call(arguments, 0)
|
|
return PATH.normalize(paths.join('/'))
|
|
},
|
|
join2: function (l, r) {
|
|
return PATH.normalize(l + '/' + r)
|
|
}
|
|
}
|
|
var PATH_FS = {
|
|
resolve: function () {
|
|
let resolvedPath = ''
|
|
let resolvedAbsolute = false
|
|
for (let i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
|
|
const path = i >= 0 ? arguments[i] : FS.cwd()
|
|
if (typeof path !== 'string') {
|
|
throw new TypeError('Arguments to path.resolve must be strings')
|
|
} else if (!path) {
|
|
return ''
|
|
}
|
|
resolvedPath = path + '/' + resolvedPath
|
|
resolvedAbsolute = path.charAt(0) === '/'
|
|
}
|
|
resolvedPath = PATH.normalizeArray(
|
|
resolvedPath.split('/').filter(function (p) {
|
|
return !!p
|
|
}),
|
|
!resolvedAbsolute
|
|
).join('/')
|
|
return (resolvedAbsolute ? '/' : '') + resolvedPath || '.'
|
|
},
|
|
relative: function (from, to) {
|
|
from = PATH_FS.resolve(from).substr(1)
|
|
to = PATH_FS.resolve(to).substr(1)
|
|
|
|
function trim (arr) {
|
|
let start = 0
|
|
for (; start < arr.length; start++) {
|
|
if (arr[start] !== '') break
|
|
}
|
|
let end = arr.length - 1
|
|
for (; end >= 0; end--) {
|
|
if (arr[end] !== '') break
|
|
}
|
|
if (start > end) return []
|
|
return arr.slice(start, end - start + 1)
|
|
}
|
|
const fromParts = trim(from.split('/'))
|
|
const toParts = trim(to.split('/'))
|
|
const length = Math.min(fromParts.length, toParts.length)
|
|
let samePartsLength = length
|
|
for (var i = 0; i < length; i++) {
|
|
if (fromParts[i] !== toParts[i]) {
|
|
samePartsLength = i
|
|
break
|
|
}
|
|
}
|
|
let outputParts = []
|
|
for (var i = samePartsLength; i < fromParts.length; i++) {
|
|
outputParts.push('..')
|
|
}
|
|
outputParts = outputParts.concat(toParts.slice(samePartsLength))
|
|
return outputParts.join('/')
|
|
}
|
|
}
|
|
var TTY = {
|
|
ttys: [],
|
|
init: function () {},
|
|
shutdown: function () {},
|
|
register: function (dev, ops) {
|
|
TTY.ttys[dev] = {
|
|
input: [],
|
|
output: [],
|
|
ops: ops
|
|
}
|
|
FS.registerDevice(dev, TTY.stream_ops)
|
|
},
|
|
stream_ops: {
|
|
open: function (stream) {
|
|
const tty = TTY.ttys[stream.node.rdev]
|
|
if (!tty) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
stream.tty = tty
|
|
stream.seekable = false
|
|
},
|
|
close: function (stream) {
|
|
stream.tty.ops.flush(stream.tty)
|
|
},
|
|
flush: function (stream) {
|
|
stream.tty.ops.flush(stream.tty)
|
|
},
|
|
read: function (stream, buffer, offset, length, pos) {
|
|
if (!stream.tty || !stream.tty.ops.get_char) {
|
|
throw new FS.ErrnoError(60)
|
|
}
|
|
let bytesRead = 0
|
|
for (let i = 0; i < length; i++) {
|
|
var result
|
|
try {
|
|
result = stream.tty.ops.get_char(stream.tty)
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
if (result === undefined && bytesRead === 0) {
|
|
throw new FS.ErrnoError(6)
|
|
}
|
|
if (result === null || result === undefined) break
|
|
bytesRead++
|
|
buffer[offset + i] = result
|
|
}
|
|
if (bytesRead) {
|
|
stream.node.timestamp = Date.now()
|
|
}
|
|
return bytesRead
|
|
},
|
|
write: function (stream, buffer, offset, length, pos) {
|
|
if (!stream.tty || !stream.tty.ops.put_char) {
|
|
throw new FS.ErrnoError(60)
|
|
}
|
|
try {
|
|
for (var i = 0; i < length; i++) {
|
|
stream.tty.ops.put_char(stream.tty, buffer[offset + i])
|
|
}
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
if (length) {
|
|
stream.node.timestamp = Date.now()
|
|
}
|
|
return i
|
|
}
|
|
},
|
|
default_tty_ops: {
|
|
get_char: function (tty) {
|
|
if (!tty.input.length) {
|
|
let result = null
|
|
if (
|
|
typeof window !== 'undefined' &&
|
|
typeof window.prompt === 'function'
|
|
) {
|
|
result = window.prompt('Input: ')
|
|
if (result !== null) {
|
|
result += '\n'
|
|
}
|
|
} else if (typeof readline === 'function') {
|
|
result = readline()
|
|
if (result !== null) {
|
|
result += '\n'
|
|
}
|
|
}
|
|
if (!result) {
|
|
return null
|
|
}
|
|
tty.input = intArrayFromString(result, true)
|
|
}
|
|
return tty.input.shift()
|
|
},
|
|
put_char: function (tty, val) {
|
|
if (val === null || val === 10) {
|
|
out(UTF8ArrayToString(tty.output, 0))
|
|
tty.output = []
|
|
} else {
|
|
if (val != 0) tty.output.push(val)
|
|
}
|
|
},
|
|
flush: function (tty) {
|
|
if (tty.output && tty.output.length > 0) {
|
|
out(UTF8ArrayToString(tty.output, 0))
|
|
tty.output = []
|
|
}
|
|
}
|
|
},
|
|
default_tty1_ops: {
|
|
put_char: function (tty, val) {
|
|
if (val === null || val === 10) {
|
|
err(UTF8ArrayToString(tty.output, 0))
|
|
tty.output = []
|
|
} else {
|
|
if (val != 0) tty.output.push(val)
|
|
}
|
|
},
|
|
flush: function (tty) {
|
|
if (tty.output && tty.output.length > 0) {
|
|
err(UTF8ArrayToString(tty.output, 0))
|
|
tty.output = []
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var MEMFS = {
|
|
ops_table: null,
|
|
mount: function (mount) {
|
|
return MEMFS.createNode(null, '/', 16384 | 511, 0)
|
|
},
|
|
createNode: function (parent, name, mode, dev) {
|
|
if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
if (!MEMFS.ops_table) {
|
|
MEMFS.ops_table = {
|
|
dir: {
|
|
node: {
|
|
getattr: MEMFS.node_ops.getattr,
|
|
setattr: MEMFS.node_ops.setattr,
|
|
lookup: MEMFS.node_ops.lookup,
|
|
mknod: MEMFS.node_ops.mknod,
|
|
rename: MEMFS.node_ops.rename,
|
|
unlink: MEMFS.node_ops.unlink,
|
|
rmdir: MEMFS.node_ops.rmdir,
|
|
readdir: MEMFS.node_ops.readdir,
|
|
symlink: MEMFS.node_ops.symlink
|
|
},
|
|
stream: {
|
|
llseek: MEMFS.stream_ops.llseek
|
|
}
|
|
},
|
|
file: {
|
|
node: {
|
|
getattr: MEMFS.node_ops.getattr,
|
|
setattr: MEMFS.node_ops.setattr
|
|
},
|
|
stream: {
|
|
llseek: MEMFS.stream_ops.llseek,
|
|
read: MEMFS.stream_ops.read,
|
|
write: MEMFS.stream_ops.write,
|
|
allocate: MEMFS.stream_ops.allocate,
|
|
mmap: MEMFS.stream_ops.mmap,
|
|
msync: MEMFS.stream_ops.msync
|
|
}
|
|
},
|
|
link: {
|
|
node: {
|
|
getattr: MEMFS.node_ops.getattr,
|
|
setattr: MEMFS.node_ops.setattr,
|
|
readlink: MEMFS.node_ops.readlink
|
|
},
|
|
stream: {}
|
|
},
|
|
chrdev: {
|
|
node: {
|
|
getattr: MEMFS.node_ops.getattr,
|
|
setattr: MEMFS.node_ops.setattr
|
|
},
|
|
stream: FS.chrdev_stream_ops
|
|
}
|
|
}
|
|
}
|
|
const node = FS.createNode(parent, name, mode, dev)
|
|
if (FS.isDir(node.mode)) {
|
|
node.node_ops = MEMFS.ops_table.dir.node
|
|
node.stream_ops = MEMFS.ops_table.dir.stream
|
|
node.contents = {}
|
|
} else if (FS.isFile(node.mode)) {
|
|
node.node_ops = MEMFS.ops_table.file.node
|
|
node.stream_ops = MEMFS.ops_table.file.stream
|
|
node.usedBytes = 0
|
|
node.contents = null
|
|
} else if (FS.isLink(node.mode)) {
|
|
node.node_ops = MEMFS.ops_table.link.node
|
|
node.stream_ops = MEMFS.ops_table.link.stream
|
|
} else if (FS.isChrdev(node.mode)) {
|
|
node.node_ops = MEMFS.ops_table.chrdev.node
|
|
node.stream_ops = MEMFS.ops_table.chrdev.stream
|
|
}
|
|
node.timestamp = Date.now()
|
|
if (parent) {
|
|
parent.contents[name] = node
|
|
}
|
|
return node
|
|
},
|
|
getFileDataAsRegularArray: function (node) {
|
|
if (node.contents && node.contents.subarray) {
|
|
const arr = []
|
|
for (let i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i])
|
|
return arr
|
|
}
|
|
return node.contents
|
|
},
|
|
getFileDataAsTypedArray: function (node) {
|
|
if (!node.contents) return new Uint8Array(0)
|
|
if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes)
|
|
return new Uint8Array(node.contents)
|
|
},
|
|
expandFileStorage: function (node, newCapacity) {
|
|
const prevCapacity = node.contents ? node.contents.length : 0
|
|
if (prevCapacity >= newCapacity) return
|
|
const CAPACITY_DOUBLING_MAX = 1024 * 1024
|
|
newCapacity = Math.max(
|
|
newCapacity,
|
|
(prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) >>> 0
|
|
)
|
|
if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256)
|
|
const oldContents = node.contents
|
|
node.contents = new Uint8Array(newCapacity)
|
|
if (node.usedBytes > 0) {
|
|
node.contents.set(oldContents.subarray(0, node.usedBytes), 0)
|
|
}
|
|
},
|
|
resizeFileStorage: function (node, newSize) {
|
|
if (node.usedBytes == newSize) return
|
|
if (newSize == 0) {
|
|
node.contents = null
|
|
node.usedBytes = 0
|
|
return
|
|
}
|
|
if (!node.contents || node.contents.subarray) {
|
|
const oldContents = node.contents
|
|
node.contents = new Uint8Array(newSize)
|
|
if (oldContents) {
|
|
node.contents.set(
|
|
oldContents.subarray(0, Math.min(newSize, node.usedBytes))
|
|
)
|
|
}
|
|
node.usedBytes = newSize
|
|
return
|
|
}
|
|
if (!node.contents) node.contents = []
|
|
if (node.contents.length > newSize) node.contents.length = newSize
|
|
else {
|
|
while (node.contents.length < newSize) node.contents.push(0)
|
|
}
|
|
node.usedBytes = newSize
|
|
},
|
|
node_ops: {
|
|
getattr: function (node) {
|
|
const attr = {}
|
|
attr.dev = FS.isChrdev(node.mode) ? node.id : 1
|
|
attr.ino = node.id
|
|
attr.mode = node.mode
|
|
attr.nlink = 1
|
|
attr.uid = 0
|
|
attr.gid = 0
|
|
attr.rdev = node.rdev
|
|
if (FS.isDir(node.mode)) {
|
|
attr.size = 4096
|
|
} else if (FS.isFile(node.mode)) {
|
|
attr.size = node.usedBytes
|
|
} else if (FS.isLink(node.mode)) {
|
|
attr.size = node.link.length
|
|
} else {
|
|
attr.size = 0
|
|
}
|
|
attr.atime = new Date(node.timestamp)
|
|
attr.mtime = new Date(node.timestamp)
|
|
attr.ctime = new Date(node.timestamp)
|
|
attr.blksize = 4096
|
|
attr.blocks = Math.ceil(attr.size / attr.blksize)
|
|
return attr
|
|
},
|
|
setattr: function (node, attr) {
|
|
if (attr.mode !== undefined) {
|
|
node.mode = attr.mode
|
|
}
|
|
if (attr.timestamp !== undefined) {
|
|
node.timestamp = attr.timestamp
|
|
}
|
|
if (attr.size !== undefined) {
|
|
MEMFS.resizeFileStorage(node, attr.size)
|
|
}
|
|
},
|
|
lookup: function (parent, name) {
|
|
throw FS.genericErrors[44]
|
|
},
|
|
mknod: function (parent, name, mode, dev) {
|
|
return MEMFS.createNode(parent, name, mode, dev)
|
|
},
|
|
rename: function (old_node, new_dir, new_name) {
|
|
if (FS.isDir(old_node.mode)) {
|
|
let new_node
|
|
try {
|
|
new_node = FS.lookupNode(new_dir, new_name)
|
|
} catch (e) {}
|
|
if (new_node) {
|
|
for (const i in new_node.contents) {
|
|
throw new FS.ErrnoError(55)
|
|
}
|
|
}
|
|
}
|
|
delete old_node.parent.contents[old_node.name]
|
|
old_node.name = new_name
|
|
new_dir.contents[new_name] = old_node
|
|
old_node.parent = new_dir
|
|
},
|
|
unlink: function (parent, name) {
|
|
delete parent.contents[name]
|
|
},
|
|
rmdir: function (parent, name) {
|
|
const node = FS.lookupNode(parent, name)
|
|
for (const i in node.contents) {
|
|
throw new FS.ErrnoError(55)
|
|
}
|
|
delete parent.contents[name]
|
|
},
|
|
readdir: function (node) {
|
|
const entries = ['.', '..']
|
|
for (const key in node.contents) {
|
|
if (!node.contents.hasOwnProperty(key)) {
|
|
continue
|
|
}
|
|
entries.push(key)
|
|
}
|
|
return entries
|
|
},
|
|
symlink: function (parent, newname, oldpath) {
|
|
const node = MEMFS.createNode(parent, newname, 511 | 40960, 0)
|
|
node.link = oldpath
|
|
return node
|
|
},
|
|
readlink: function (node) {
|
|
if (!FS.isLink(node.mode)) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
return node.link
|
|
}
|
|
},
|
|
stream_ops: {
|
|
read: function (stream, buffer, offset, length, position) {
|
|
const contents = stream.node.contents
|
|
if (position >= stream.node.usedBytes) return 0
|
|
const size = Math.min(stream.node.usedBytes - position, length)
|
|
if (size > 8 && contents.subarray) {
|
|
buffer.set(contents.subarray(position, position + size), offset)
|
|
} else {
|
|
for (let i = 0; i < size; i++) {
|
|
buffer[offset + i] = contents[position + i]
|
|
}
|
|
}
|
|
return size
|
|
},
|
|
write: function (stream, buffer, offset, length, position, canOwn) {
|
|
if (buffer.buffer === HEAP8.buffer) {
|
|
canOwn = false
|
|
}
|
|
if (!length) return 0
|
|
const node = stream.node
|
|
node.timestamp = Date.now()
|
|
if (buffer.subarray && (!node.contents || node.contents.subarray)) {
|
|
if (canOwn) {
|
|
node.contents = buffer.subarray(offset, offset + length)
|
|
node.usedBytes = length
|
|
return length
|
|
} else if (node.usedBytes === 0 && position === 0) {
|
|
node.contents = buffer.slice(offset, offset + length)
|
|
node.usedBytes = length
|
|
return length
|
|
} else if (position + length <= node.usedBytes) {
|
|
node.contents.set(buffer.subarray(offset, offset + length), position)
|
|
return length
|
|
}
|
|
}
|
|
MEMFS.expandFileStorage(node, position + length)
|
|
if (node.contents.subarray && buffer.subarray) {
|
|
node.contents.set(buffer.subarray(offset, offset + length), position)
|
|
} else {
|
|
for (let i = 0; i < length; i++) {
|
|
node.contents[position + i] = buffer[offset + i]
|
|
}
|
|
}
|
|
node.usedBytes = Math.max(node.usedBytes, position + length)
|
|
return length
|
|
},
|
|
llseek: function (stream, offset, whence) {
|
|
let position = offset
|
|
if (whence === 1) {
|
|
position += stream.position
|
|
} else if (whence === 2) {
|
|
if (FS.isFile(stream.node.mode)) {
|
|
position += stream.node.usedBytes
|
|
}
|
|
}
|
|
if (position < 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
return position
|
|
},
|
|
allocate: function (stream, offset, length) {
|
|
MEMFS.expandFileStorage(stream.node, offset + length)
|
|
stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length)
|
|
},
|
|
mmap: function (stream, buffer, offset, length, position, prot, flags) {
|
|
if (!FS.isFile(stream.node.mode)) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
let ptr
|
|
let allocated
|
|
let contents = stream.node.contents
|
|
if (!(flags & 2) && contents.buffer === buffer.buffer) {
|
|
allocated = false
|
|
ptr = contents.byteOffset
|
|
} else {
|
|
if (position > 0 || position + length < contents.length) {
|
|
if (contents.subarray) {
|
|
contents = contents.subarray(position, position + length)
|
|
} else {
|
|
contents = Array.prototype.slice.call(
|
|
contents,
|
|
position,
|
|
position + length
|
|
)
|
|
}
|
|
}
|
|
allocated = true
|
|
const fromHeap = buffer.buffer == HEAP8.buffer
|
|
ptr = _malloc(length)
|
|
if (!ptr) {
|
|
throw new FS.ErrnoError(48)
|
|
}
|
|
;(fromHeap ? HEAP8 : buffer).set(contents, ptr)
|
|
}
|
|
return {
|
|
ptr: ptr,
|
|
allocated: allocated
|
|
}
|
|
},
|
|
msync: function (stream, buffer, offset, length, mmapFlags) {
|
|
if (!FS.isFile(stream.node.mode)) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
if (mmapFlags & 2) {
|
|
return 0
|
|
}
|
|
const bytesWritten = MEMFS.stream_ops.write(
|
|
stream,
|
|
buffer,
|
|
0,
|
|
length,
|
|
offset,
|
|
false
|
|
)
|
|
return 0
|
|
}
|
|
}
|
|
}
|
|
var FS = {
|
|
root: null,
|
|
mounts: [],
|
|
devices: {},
|
|
streams: [],
|
|
nextInode: 1,
|
|
nameTable: null,
|
|
currentPath: '/',
|
|
initialized: false,
|
|
ignorePermissions: true,
|
|
trackingDelegate: {},
|
|
tracking: {
|
|
openFlags: {
|
|
READ: 1,
|
|
WRITE: 2
|
|
}
|
|
},
|
|
ErrnoError: null,
|
|
genericErrors: {},
|
|
filesystems: null,
|
|
syncFSRequests: 0,
|
|
handleFSError: function (e) {
|
|
if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace()
|
|
return setErrNo(e.errno)
|
|
},
|
|
lookupPath: function (path, opts) {
|
|
path = PATH_FS.resolve(FS.cwd(), path)
|
|
opts = opts || {}
|
|
if (!path) {
|
|
return {
|
|
path: '',
|
|
node: null
|
|
}
|
|
}
|
|
const defaults = {
|
|
follow_mount: true,
|
|
recurse_count: 0
|
|
}
|
|
for (const key in defaults) {
|
|
if (opts[key] === undefined) {
|
|
opts[key] = defaults[key]
|
|
}
|
|
}
|
|
if (opts.recurse_count > 8) {
|
|
throw new FS.ErrnoError(32)
|
|
}
|
|
const parts = PATH.normalizeArray(
|
|
path.split('/').filter(function (p) {
|
|
return !!p
|
|
}),
|
|
false
|
|
)
|
|
let current = FS.root
|
|
let current_path = '/'
|
|
for (let i = 0; i < parts.length; i++) {
|
|
const islast = i === parts.length - 1
|
|
if (islast && opts.parent) {
|
|
break
|
|
}
|
|
current = FS.lookupNode(current, parts[i])
|
|
current_path = PATH.join2(current_path, parts[i])
|
|
if (FS.isMountpoint(current)) {
|
|
if (!islast || (islast && opts.follow_mount)) {
|
|
current = current.mounted.root
|
|
}
|
|
}
|
|
if (!islast || opts.follow) {
|
|
let count = 0
|
|
while (FS.isLink(current.mode)) {
|
|
const link = FS.readlink(current_path)
|
|
current_path = PATH_FS.resolve(PATH.dirname(current_path), link)
|
|
const lookup = FS.lookupPath(current_path, {
|
|
recurse_count: opts.recurse_count
|
|
})
|
|
current = lookup.node
|
|
if (count++ > 40) {
|
|
throw new FS.ErrnoError(32)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
path: current_path,
|
|
node: current
|
|
}
|
|
},
|
|
getPath: function (node) {
|
|
let path
|
|
while (true) {
|
|
if (FS.isRoot(node)) {
|
|
const mount = node.mount.mountpoint
|
|
if (!path) return mount
|
|
return mount[mount.length - 1] !== '/'
|
|
? mount + '/' + path
|
|
: mount + path
|
|
}
|
|
path = path ? node.name + '/' + path : node.name
|
|
node = node.parent
|
|
}
|
|
},
|
|
hashName: function (parentid, name) {
|
|
let hash = 0
|
|
for (let i = 0; i < name.length; i++) {
|
|
hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0
|
|
}
|
|
return ((parentid + hash) >>> 0) % FS.nameTable.length
|
|
},
|
|
hashAddNode: function (node) {
|
|
const hash = FS.hashName(node.parent.id, node.name)
|
|
node.name_next = FS.nameTable[hash]
|
|
FS.nameTable[hash] = node
|
|
},
|
|
hashRemoveNode: function (node) {
|
|
const hash = FS.hashName(node.parent.id, node.name)
|
|
if (FS.nameTable[hash] === node) {
|
|
FS.nameTable[hash] = node.name_next
|
|
} else {
|
|
let current = FS.nameTable[hash]
|
|
while (current) {
|
|
if (current.name_next === node) {
|
|
current.name_next = node.name_next
|
|
break
|
|
}
|
|
current = current.name_next
|
|
}
|
|
}
|
|
},
|
|
lookupNode: function (parent, name) {
|
|
const errCode = FS.mayLookup(parent)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode, parent)
|
|
}
|
|
const hash = FS.hashName(parent.id, name)
|
|
for (let node = FS.nameTable[hash]; node; node = node.name_next) {
|
|
const nodeName = node.name
|
|
if (node.parent.id === parent.id && nodeName === name) {
|
|
return node
|
|
}
|
|
}
|
|
return FS.lookup(parent, name)
|
|
},
|
|
createNode: function (parent, name, mode, rdev) {
|
|
const node = new FS.FSNode(parent, name, mode, rdev)
|
|
FS.hashAddNode(node)
|
|
return node
|
|
},
|
|
destroyNode: function (node) {
|
|
FS.hashRemoveNode(node)
|
|
},
|
|
isRoot: function (node) {
|
|
return node === node.parent
|
|
},
|
|
isMountpoint: function (node) {
|
|
return !!node.mounted
|
|
},
|
|
isFile: function (mode) {
|
|
return (mode & 61440) === 32768
|
|
},
|
|
isDir: function (mode) {
|
|
return (mode & 61440) === 16384
|
|
},
|
|
isLink: function (mode) {
|
|
return (mode & 61440) === 40960
|
|
},
|
|
isChrdev: function (mode) {
|
|
return (mode & 61440) === 8192
|
|
},
|
|
isBlkdev: function (mode) {
|
|
return (mode & 61440) === 24576
|
|
},
|
|
isFIFO: function (mode) {
|
|
return (mode & 61440) === 4096
|
|
},
|
|
isSocket: function (mode) {
|
|
return (mode & 49152) === 49152
|
|
},
|
|
flagModes: {
|
|
r: 0,
|
|
rs: 1052672,
|
|
'r+': 2,
|
|
w: 577,
|
|
wx: 705,
|
|
xw: 705,
|
|
'w+': 578,
|
|
'wx+': 706,
|
|
'xw+': 706,
|
|
a: 1089,
|
|
ax: 1217,
|
|
xa: 1217,
|
|
'a+': 1090,
|
|
'ax+': 1218,
|
|
'xa+': 1218
|
|
},
|
|
modeStringToFlags: function (str) {
|
|
const flags = FS.flagModes[str]
|
|
if (typeof flags === 'undefined') {
|
|
throw new Error('Unknown file open mode: ' + str)
|
|
}
|
|
return flags
|
|
},
|
|
flagsToPermissionString: function (flag) {
|
|
let perms = ['r', 'w', 'rw'][flag & 3]
|
|
if (flag & 512) {
|
|
perms += 'w'
|
|
}
|
|
return perms
|
|
},
|
|
nodePermissions: function (node, perms) {
|
|
if (FS.ignorePermissions) {
|
|
return 0
|
|
}
|
|
if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
|
|
return 2
|
|
} else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
|
|
return 2
|
|
} else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
|
|
return 2
|
|
}
|
|
return 0
|
|
},
|
|
mayLookup: function (dir) {
|
|
const errCode = FS.nodePermissions(dir, 'x')
|
|
if (errCode) return errCode
|
|
if (!dir.node_ops.lookup) return 2
|
|
return 0
|
|
},
|
|
mayCreate: function (dir, name) {
|
|
try {
|
|
const node = FS.lookupNode(dir, name)
|
|
return 20
|
|
} catch (e) {}
|
|
return FS.nodePermissions(dir, 'wx')
|
|
},
|
|
mayDelete: function (dir, name, isdir) {
|
|
let node
|
|
try {
|
|
node = FS.lookupNode(dir, name)
|
|
} catch (e) {
|
|
return e.errno
|
|
}
|
|
const errCode = FS.nodePermissions(dir, 'wx')
|
|
if (errCode) {
|
|
return errCode
|
|
}
|
|
if (isdir) {
|
|
if (!FS.isDir(node.mode)) {
|
|
return 54
|
|
}
|
|
if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
|
|
return 10
|
|
}
|
|
} else {
|
|
if (FS.isDir(node.mode)) {
|
|
return 31
|
|
}
|
|
}
|
|
return 0
|
|
},
|
|
mayOpen: function (node, flags) {
|
|
if (!node) {
|
|
return 44
|
|
}
|
|
if (FS.isLink(node.mode)) {
|
|
return 32
|
|
} else if (FS.isDir(node.mode)) {
|
|
if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) {
|
|
return 31
|
|
}
|
|
}
|
|
return FS.nodePermissions(node, FS.flagsToPermissionString(flags))
|
|
},
|
|
MAX_OPEN_FDS: 4096,
|
|
nextfd: function (fd_start, fd_end) {
|
|
fd_start = fd_start || 0
|
|
fd_end = fd_end || FS.MAX_OPEN_FDS
|
|
for (let fd = fd_start; fd <= fd_end; fd++) {
|
|
if (!FS.streams[fd]) {
|
|
return fd
|
|
}
|
|
}
|
|
throw new FS.ErrnoError(33)
|
|
},
|
|
getStream: function (fd) {
|
|
return FS.streams[fd]
|
|
},
|
|
createStream: function (stream, fd_start, fd_end) {
|
|
if (!FS.FSStream) {
|
|
FS.FSStream = function () {}
|
|
FS.FSStream.prototype = {
|
|
object: {
|
|
get: function () {
|
|
return this.node
|
|
},
|
|
set: function (val) {
|
|
this.node = val
|
|
}
|
|
},
|
|
isRead: {
|
|
get: function () {
|
|
return (this.flags & 2097155) !== 1
|
|
}
|
|
},
|
|
isWrite: {
|
|
get: function () {
|
|
return (this.flags & 2097155) !== 0
|
|
}
|
|
},
|
|
isAppend: {
|
|
get: function () {
|
|
return this.flags & 1024
|
|
}
|
|
}
|
|
}
|
|
}
|
|
const newStream = new FS.FSStream()
|
|
for (const p in stream) {
|
|
newStream[p] = stream[p]
|
|
}
|
|
stream = newStream
|
|
const fd = FS.nextfd(fd_start, fd_end)
|
|
stream.fd = fd
|
|
FS.streams[fd] = stream
|
|
return stream
|
|
},
|
|
closeStream: function (fd) {
|
|
FS.streams[fd] = null
|
|
},
|
|
chrdev_stream_ops: {
|
|
open: function (stream) {
|
|
const device = FS.getDevice(stream.node.rdev)
|
|
stream.stream_ops = device.stream_ops
|
|
if (stream.stream_ops.open) {
|
|
stream.stream_ops.open(stream)
|
|
}
|
|
},
|
|
llseek: function () {
|
|
throw new FS.ErrnoError(70)
|
|
}
|
|
},
|
|
major: function (dev) {
|
|
return dev >> 8
|
|
},
|
|
minor: function (dev) {
|
|
return dev & 255
|
|
},
|
|
makedev: function (ma, mi) {
|
|
return (ma << 8) | mi
|
|
},
|
|
registerDevice: function (dev, ops) {
|
|
FS.devices[dev] = {
|
|
stream_ops: ops
|
|
}
|
|
},
|
|
getDevice: function (dev) {
|
|
return FS.devices[dev]
|
|
},
|
|
getMounts: function (mount) {
|
|
const mounts = []
|
|
const check = [mount]
|
|
while (check.length) {
|
|
const m = check.pop()
|
|
mounts.push(m)
|
|
check.push.apply(check, m.mounts)
|
|
}
|
|
return mounts
|
|
},
|
|
syncfs: function (populate, callback) {
|
|
if (typeof populate === 'function') {
|
|
callback = populate
|
|
populate = false
|
|
}
|
|
FS.syncFSRequests++
|
|
if (FS.syncFSRequests > 1) {
|
|
err(
|
|
'warning: ' +
|
|
FS.syncFSRequests +
|
|
' FS.syncfs operations in flight at once, probably just doing extra work'
|
|
)
|
|
}
|
|
const mounts = FS.getMounts(FS.root.mount)
|
|
let completed = 0
|
|
|
|
function doCallback (errCode) {
|
|
FS.syncFSRequests--
|
|
return callback(errCode)
|
|
}
|
|
|
|
function done (errCode) {
|
|
if (errCode) {
|
|
if (!done.errored) {
|
|
done.errored = true
|
|
return doCallback(errCode)
|
|
}
|
|
return
|
|
}
|
|
if (++completed >= mounts.length) {
|
|
doCallback(null)
|
|
}
|
|
}
|
|
mounts.forEach(function (mount) {
|
|
if (!mount.type.syncfs) {
|
|
return done(null)
|
|
}
|
|
mount.type.syncfs(mount, populate, done)
|
|
})
|
|
},
|
|
mount: function (type, opts, mountpoint) {
|
|
const root = mountpoint === '/'
|
|
const pseudo = !mountpoint
|
|
let node
|
|
if (root && FS.root) {
|
|
throw new FS.ErrnoError(10)
|
|
} else if (!root && !pseudo) {
|
|
const lookup = FS.lookupPath(mountpoint, {
|
|
follow_mount: false
|
|
})
|
|
mountpoint = lookup.path
|
|
node = lookup.node
|
|
if (FS.isMountpoint(node)) {
|
|
throw new FS.ErrnoError(10)
|
|
}
|
|
if (!FS.isDir(node.mode)) {
|
|
throw new FS.ErrnoError(54)
|
|
}
|
|
}
|
|
const mount = {
|
|
type: type,
|
|
opts: opts,
|
|
mountpoint: mountpoint,
|
|
mounts: []
|
|
}
|
|
const mountRoot = type.mount(mount)
|
|
mountRoot.mount = mount
|
|
mount.root = mountRoot
|
|
if (root) {
|
|
FS.root = mountRoot
|
|
} else if (node) {
|
|
node.mounted = mount
|
|
if (node.mount) {
|
|
node.mount.mounts.push(mount)
|
|
}
|
|
}
|
|
return mountRoot
|
|
},
|
|
unmount: function (mountpoint) {
|
|
const lookup = FS.lookupPath(mountpoint, {
|
|
follow_mount: false
|
|
})
|
|
if (!FS.isMountpoint(lookup.node)) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
const node = lookup.node
|
|
const mount = node.mounted
|
|
const mounts = FS.getMounts(mount)
|
|
Object.keys(FS.nameTable).forEach(function (hash) {
|
|
let current = FS.nameTable[hash]
|
|
while (current) {
|
|
const next = current.name_next
|
|
if (mounts.indexOf(current.mount) !== -1) {
|
|
FS.destroyNode(current)
|
|
}
|
|
current = next
|
|
}
|
|
})
|
|
node.mounted = null
|
|
const idx = node.mount.mounts.indexOf(mount)
|
|
node.mount.mounts.splice(idx, 1)
|
|
},
|
|
lookup: function (parent, name) {
|
|
return parent.node_ops.lookup(parent, name)
|
|
},
|
|
mknod: function (path, mode, dev) {
|
|
const lookup = FS.lookupPath(path, {
|
|
parent: true
|
|
})
|
|
const parent = lookup.node
|
|
const name = PATH.basename(path)
|
|
if (!name || name === '.' || name === '..') {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
const errCode = FS.mayCreate(parent, name)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!parent.node_ops.mknod) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
return parent.node_ops.mknod(parent, name, mode, dev)
|
|
},
|
|
create: function (path, mode) {
|
|
mode = mode !== undefined ? mode : 438
|
|
mode &= 4095
|
|
mode |= 32768
|
|
return FS.mknod(path, mode, 0)
|
|
},
|
|
mkdir: function (path, mode) {
|
|
mode = mode !== undefined ? mode : 511
|
|
mode &= 511 | 512
|
|
mode |= 16384
|
|
return FS.mknod(path, mode, 0)
|
|
},
|
|
mkdirTree: function (path, mode) {
|
|
const dirs = path.split('/')
|
|
let d = ''
|
|
for (let i = 0; i < dirs.length; ++i) {
|
|
if (!dirs[i]) continue
|
|
d += '/' + dirs[i]
|
|
try {
|
|
FS.mkdir(d, mode)
|
|
} catch (e) {
|
|
if (e.errno != 20) throw e
|
|
}
|
|
}
|
|
},
|
|
mkdev: function (path, mode, dev) {
|
|
if (typeof dev === 'undefined') {
|
|
dev = mode
|
|
mode = 438
|
|
}
|
|
mode |= 8192
|
|
return FS.mknod(path, mode, dev)
|
|
},
|
|
symlink: function (oldpath, newpath) {
|
|
if (!PATH_FS.resolve(oldpath)) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
const lookup = FS.lookupPath(newpath, {
|
|
parent: true
|
|
})
|
|
const parent = lookup.node
|
|
if (!parent) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
const newname = PATH.basename(newpath)
|
|
const errCode = FS.mayCreate(parent, newname)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!parent.node_ops.symlink) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
return parent.node_ops.symlink(parent, newname, oldpath)
|
|
},
|
|
rename: function (old_path, new_path) {
|
|
const old_dirname = PATH.dirname(old_path)
|
|
const new_dirname = PATH.dirname(new_path)
|
|
const old_name = PATH.basename(old_path)
|
|
const new_name = PATH.basename(new_path)
|
|
let lookup, old_dir, new_dir
|
|
try {
|
|
lookup = FS.lookupPath(old_path, {
|
|
parent: true
|
|
})
|
|
old_dir = lookup.node
|
|
lookup = FS.lookupPath(new_path, {
|
|
parent: true
|
|
})
|
|
new_dir = lookup.node
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(10)
|
|
}
|
|
if (!old_dir || !new_dir) throw new FS.ErrnoError(44)
|
|
if (old_dir.mount !== new_dir.mount) {
|
|
throw new FS.ErrnoError(75)
|
|
}
|
|
const old_node = FS.lookupNode(old_dir, old_name)
|
|
let relative = PATH_FS.relative(old_path, new_dirname)
|
|
if (relative.charAt(0) !== '.') {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
relative = PATH_FS.relative(new_path, old_dirname)
|
|
if (relative.charAt(0) !== '.') {
|
|
throw new FS.ErrnoError(55)
|
|
}
|
|
let new_node
|
|
try {
|
|
new_node = FS.lookupNode(new_dir, new_name)
|
|
} catch (e) {}
|
|
if (old_node === new_node) {
|
|
return
|
|
}
|
|
const isdir = FS.isDir(old_node.mode)
|
|
let errCode = FS.mayDelete(old_dir, old_name, isdir)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
errCode = new_node
|
|
? FS.mayDelete(new_dir, new_name, isdir)
|
|
: FS.mayCreate(new_dir, new_name)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!old_dir.node_ops.rename) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
|
|
throw new FS.ErrnoError(10)
|
|
}
|
|
if (new_dir !== old_dir) {
|
|
errCode = FS.nodePermissions(old_dir, 'w')
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
}
|
|
try {
|
|
if (FS.trackingDelegate.willMovePath) {
|
|
FS.trackingDelegate.willMovePath(old_path, new_path)
|
|
}
|
|
} catch (e) {
|
|
err(
|
|
"FS.trackingDelegate['willMovePath']('" +
|
|
old_path +
|
|
"', '" +
|
|
new_path +
|
|
"') threw an exception: " +
|
|
e.message
|
|
)
|
|
}
|
|
FS.hashRemoveNode(old_node)
|
|
try {
|
|
old_dir.node_ops.rename(old_node, new_dir, new_name)
|
|
} catch (e) {
|
|
throw e
|
|
} finally {
|
|
FS.hashAddNode(old_node)
|
|
}
|
|
try {
|
|
if (FS.trackingDelegate.onMovePath) {
|
|
FS.trackingDelegate.onMovePath(old_path, new_path)
|
|
}
|
|
} catch (e) {
|
|
err(
|
|
"FS.trackingDelegate['onMovePath']('" +
|
|
old_path +
|
|
"', '" +
|
|
new_path +
|
|
"') threw an exception: " +
|
|
e.message
|
|
)
|
|
}
|
|
},
|
|
rmdir: function (path) {
|
|
const lookup = FS.lookupPath(path, {
|
|
parent: true
|
|
})
|
|
const parent = lookup.node
|
|
const name = PATH.basename(path)
|
|
const node = FS.lookupNode(parent, name)
|
|
const errCode = FS.mayDelete(parent, name, true)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!parent.node_ops.rmdir) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
if (FS.isMountpoint(node)) {
|
|
throw new FS.ErrnoError(10)
|
|
}
|
|
try {
|
|
if (FS.trackingDelegate.willDeletePath) {
|
|
FS.trackingDelegate.willDeletePath(path)
|
|
}
|
|
} catch (e) {
|
|
err(
|
|
"FS.trackingDelegate['willDeletePath']('" +
|
|
path +
|
|
"') threw an exception: " +
|
|
e.message
|
|
)
|
|
}
|
|
parent.node_ops.rmdir(parent, name)
|
|
FS.destroyNode(node)
|
|
try {
|
|
if (FS.trackingDelegate.onDeletePath) {
|
|
FS.trackingDelegate.onDeletePath(path)
|
|
}
|
|
} catch (e) {
|
|
err(
|
|
"FS.trackingDelegate['onDeletePath']('" +
|
|
path +
|
|
"') threw an exception: " +
|
|
e.message
|
|
)
|
|
}
|
|
},
|
|
readdir: function (path) {
|
|
const lookup = FS.lookupPath(path, {
|
|
follow: true
|
|
})
|
|
const node = lookup.node
|
|
if (!node.node_ops.readdir) {
|
|
throw new FS.ErrnoError(54)
|
|
}
|
|
return node.node_ops.readdir(node)
|
|
},
|
|
unlink: function (path) {
|
|
const lookup = FS.lookupPath(path, {
|
|
parent: true
|
|
})
|
|
const parent = lookup.node
|
|
const name = PATH.basename(path)
|
|
const node = FS.lookupNode(parent, name)
|
|
const errCode = FS.mayDelete(parent, name, false)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
if (!parent.node_ops.unlink) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
if (FS.isMountpoint(node)) {
|
|
throw new FS.ErrnoError(10)
|
|
}
|
|
try {
|
|
if (FS.trackingDelegate.willDeletePath) {
|
|
FS.trackingDelegate.willDeletePath(path)
|
|
}
|
|
} catch (e) {
|
|
err(
|
|
"FS.trackingDelegate['willDeletePath']('" +
|
|
path +
|
|
"') threw an exception: " +
|
|
e.message
|
|
)
|
|
}
|
|
parent.node_ops.unlink(parent, name)
|
|
FS.destroyNode(node)
|
|
try {
|
|
if (FS.trackingDelegate.onDeletePath) {
|
|
FS.trackingDelegate.onDeletePath(path)
|
|
}
|
|
} catch (e) {
|
|
err(
|
|
"FS.trackingDelegate['onDeletePath']('" +
|
|
path +
|
|
"') threw an exception: " +
|
|
e.message
|
|
)
|
|
}
|
|
},
|
|
readlink: function (path) {
|
|
const lookup = FS.lookupPath(path)
|
|
const link = lookup.node
|
|
if (!link) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
if (!link.node_ops.readlink) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
return PATH_FS.resolve(
|
|
FS.getPath(link.parent),
|
|
link.node_ops.readlink(link)
|
|
)
|
|
},
|
|
stat: function (path, dontFollow) {
|
|
const lookup = FS.lookupPath(path, {
|
|
follow: !dontFollow
|
|
})
|
|
const node = lookup.node
|
|
if (!node) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
if (!node.node_ops.getattr) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
return node.node_ops.getattr(node)
|
|
},
|
|
lstat: function (path) {
|
|
return FS.stat(path, true)
|
|
},
|
|
chmod: function (path, mode, dontFollow) {
|
|
let node
|
|
if (typeof path === 'string') {
|
|
const lookup = FS.lookupPath(path, {
|
|
follow: !dontFollow
|
|
})
|
|
node = lookup.node
|
|
} else {
|
|
node = path
|
|
}
|
|
if (!node.node_ops.setattr) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
node.node_ops.setattr(node, {
|
|
mode: (mode & 4095) | (node.mode & ~4095),
|
|
timestamp: Date.now()
|
|
})
|
|
},
|
|
lchmod: function (path, mode) {
|
|
FS.chmod(path, mode, true)
|
|
},
|
|
fchmod: function (fd, mode) {
|
|
const stream = FS.getStream(fd)
|
|
if (!stream) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
FS.chmod(stream.node, mode)
|
|
},
|
|
chown: function (path, uid, gid, dontFollow) {
|
|
let node
|
|
if (typeof path === 'string') {
|
|
const lookup = FS.lookupPath(path, {
|
|
follow: !dontFollow
|
|
})
|
|
node = lookup.node
|
|
} else {
|
|
node = path
|
|
}
|
|
if (!node.node_ops.setattr) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
node.node_ops.setattr(node, {
|
|
timestamp: Date.now()
|
|
})
|
|
},
|
|
lchown: function (path, uid, gid) {
|
|
FS.chown(path, uid, gid, true)
|
|
},
|
|
fchown: function (fd, uid, gid) {
|
|
const stream = FS.getStream(fd)
|
|
if (!stream) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
FS.chown(stream.node, uid, gid)
|
|
},
|
|
truncate: function (path, len) {
|
|
if (len < 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
let node
|
|
if (typeof path === 'string') {
|
|
const lookup = FS.lookupPath(path, {
|
|
follow: true
|
|
})
|
|
node = lookup.node
|
|
} else {
|
|
node = path
|
|
}
|
|
if (!node.node_ops.setattr) {
|
|
throw new FS.ErrnoError(63)
|
|
}
|
|
if (FS.isDir(node.mode)) {
|
|
throw new FS.ErrnoError(31)
|
|
}
|
|
if (!FS.isFile(node.mode)) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
const errCode = FS.nodePermissions(node, 'w')
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
node.node_ops.setattr(node, {
|
|
size: len,
|
|
timestamp: Date.now()
|
|
})
|
|
},
|
|
ftruncate: function (fd, len) {
|
|
const stream = FS.getStream(fd)
|
|
if (!stream) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if ((stream.flags & 2097155) === 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
FS.truncate(stream.node, len)
|
|
},
|
|
utime: function (path, atime, mtime) {
|
|
const lookup = FS.lookupPath(path, {
|
|
follow: true
|
|
})
|
|
const node = lookup.node
|
|
node.node_ops.setattr(node, {
|
|
timestamp: Math.max(atime, mtime)
|
|
})
|
|
},
|
|
open: function (path, flags, mode, fd_start, fd_end) {
|
|
if (path === '') {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags
|
|
mode = typeof mode === 'undefined' ? 438 : mode
|
|
if (flags & 64) {
|
|
mode = (mode & 4095) | 32768
|
|
} else {
|
|
mode = 0
|
|
}
|
|
let node
|
|
if (typeof path === 'object') {
|
|
node = path
|
|
} else {
|
|
path = PATH.normalize(path)
|
|
try {
|
|
const lookup = FS.lookupPath(path, {
|
|
follow: !(flags & 131072)
|
|
})
|
|
node = lookup.node
|
|
} catch (e) {}
|
|
}
|
|
let created = false
|
|
if (flags & 64) {
|
|
if (node) {
|
|
if (flags & 128) {
|
|
throw new FS.ErrnoError(20)
|
|
}
|
|
} else {
|
|
node = FS.mknod(path, mode, 0)
|
|
created = true
|
|
}
|
|
}
|
|
if (!node) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
if (FS.isChrdev(node.mode)) {
|
|
flags &= ~512
|
|
}
|
|
if (flags & 65536 && !FS.isDir(node.mode)) {
|
|
throw new FS.ErrnoError(54)
|
|
}
|
|
if (!created) {
|
|
const errCode = FS.mayOpen(node, flags)
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
}
|
|
if (flags & 512) {
|
|
FS.truncate(node, 0)
|
|
}
|
|
flags &= ~(128 | 512 | 131072)
|
|
const stream = FS.createStream(
|
|
{
|
|
node: node,
|
|
path: FS.getPath(node),
|
|
flags: flags,
|
|
seekable: true,
|
|
position: 0,
|
|
stream_ops: node.stream_ops,
|
|
ungotten: [],
|
|
error: false
|
|
},
|
|
fd_start,
|
|
fd_end
|
|
)
|
|
if (stream.stream_ops.open) {
|
|
stream.stream_ops.open(stream)
|
|
}
|
|
if (Module.logReadFiles && !(flags & 1)) {
|
|
if (!FS.readFiles) FS.readFiles = {}
|
|
if (!(path in FS.readFiles)) {
|
|
FS.readFiles[path] = 1
|
|
err('FS.trackingDelegate error on read file: ' + path)
|
|
}
|
|
}
|
|
try {
|
|
if (FS.trackingDelegate.onOpenFile) {
|
|
let trackingFlags = 0
|
|
if ((flags & 2097155) !== 1) {
|
|
trackingFlags |= FS.tracking.openFlags.READ
|
|
}
|
|
if ((flags & 2097155) !== 0) {
|
|
trackingFlags |= FS.tracking.openFlags.WRITE
|
|
}
|
|
FS.trackingDelegate.onOpenFile(path, trackingFlags)
|
|
}
|
|
} catch (e) {
|
|
err(
|
|
"FS.trackingDelegate['onOpenFile']('" +
|
|
path +
|
|
"', flags) threw an exception: " +
|
|
e.message
|
|
)
|
|
}
|
|
return stream
|
|
},
|
|
close: function (stream) {
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (stream.getdents) stream.getdents = null
|
|
try {
|
|
if (stream.stream_ops.close) {
|
|
stream.stream_ops.close(stream)
|
|
}
|
|
} catch (e) {
|
|
throw e
|
|
} finally {
|
|
FS.closeStream(stream.fd)
|
|
}
|
|
stream.fd = null
|
|
},
|
|
isClosed: function (stream) {
|
|
return stream.fd === null
|
|
},
|
|
llseek: function (stream, offset, whence) {
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (!stream.seekable || !stream.stream_ops.llseek) {
|
|
throw new FS.ErrnoError(70)
|
|
}
|
|
if (whence != 0 && whence != 1 && whence != 2) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
stream.position = stream.stream_ops.llseek(stream, offset, whence)
|
|
stream.ungotten = []
|
|
return stream.position
|
|
},
|
|
read: function (stream, buffer, offset, length, position) {
|
|
if (length < 0 || position < 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if ((stream.flags & 2097155) === 1) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (FS.isDir(stream.node.mode)) {
|
|
throw new FS.ErrnoError(31)
|
|
}
|
|
if (!stream.stream_ops.read) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
const seeking = typeof position !== 'undefined'
|
|
if (!seeking) {
|
|
position = stream.position
|
|
} else if (!stream.seekable) {
|
|
throw new FS.ErrnoError(70)
|
|
}
|
|
const bytesRead = stream.stream_ops.read(
|
|
stream,
|
|
buffer,
|
|
offset,
|
|
length,
|
|
position
|
|
)
|
|
if (!seeking) stream.position += bytesRead
|
|
return bytesRead
|
|
},
|
|
write: function (stream, buffer, offset, length, position, canOwn) {
|
|
if (length < 0 || position < 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if ((stream.flags & 2097155) === 0) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (FS.isDir(stream.node.mode)) {
|
|
throw new FS.ErrnoError(31)
|
|
}
|
|
if (!stream.stream_ops.write) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
if (stream.seekable && stream.flags & 1024) {
|
|
FS.llseek(stream, 0, 2)
|
|
}
|
|
const seeking = typeof position !== 'undefined'
|
|
if (!seeking) {
|
|
position = stream.position
|
|
} else if (!stream.seekable) {
|
|
throw new FS.ErrnoError(70)
|
|
}
|
|
const bytesWritten = stream.stream_ops.write(
|
|
stream,
|
|
buffer,
|
|
offset,
|
|
length,
|
|
position,
|
|
canOwn
|
|
)
|
|
if (!seeking) stream.position += bytesWritten
|
|
try {
|
|
if (stream.path && FS.trackingDelegate.onWriteToFile) {
|
|
FS.trackingDelegate.onWriteToFile(stream.path)
|
|
}
|
|
} catch (e) {
|
|
err(
|
|
"FS.trackingDelegate['onWriteToFile']('" +
|
|
stream.path +
|
|
"') threw an exception: " +
|
|
e.message
|
|
)
|
|
}
|
|
return bytesWritten
|
|
},
|
|
allocate: function (stream, offset, length) {
|
|
if (FS.isClosed(stream)) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (offset < 0 || length <= 0) {
|
|
throw new FS.ErrnoError(28)
|
|
}
|
|
if ((stream.flags & 2097155) === 0) {
|
|
throw new FS.ErrnoError(8)
|
|
}
|
|
if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
if (!stream.stream_ops.allocate) {
|
|
throw new FS.ErrnoError(138)
|
|
}
|
|
stream.stream_ops.allocate(stream, offset, length)
|
|
},
|
|
mmap: function (stream, buffer, offset, length, position, prot, flags) {
|
|
if (
|
|
(prot & 2) !== 0 &&
|
|
(flags & 2) === 0 &&
|
|
(stream.flags & 2097155) !== 2
|
|
) {
|
|
throw new FS.ErrnoError(2)
|
|
}
|
|
if ((stream.flags & 2097155) === 1) {
|
|
throw new FS.ErrnoError(2)
|
|
}
|
|
if (!stream.stream_ops.mmap) {
|
|
throw new FS.ErrnoError(43)
|
|
}
|
|
return stream.stream_ops.mmap(
|
|
stream,
|
|
buffer,
|
|
offset,
|
|
length,
|
|
position,
|
|
prot,
|
|
flags
|
|
)
|
|
},
|
|
msync: function (stream, buffer, offset, length, mmapFlags) {
|
|
if (!stream || !stream.stream_ops.msync) {
|
|
return 0
|
|
}
|
|
return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags)
|
|
},
|
|
munmap: function (stream) {
|
|
return 0
|
|
},
|
|
ioctl: function (stream, cmd, arg) {
|
|
if (!stream.stream_ops.ioctl) {
|
|
throw new FS.ErrnoError(59)
|
|
}
|
|
return stream.stream_ops.ioctl(stream, cmd, arg)
|
|
},
|
|
readFile: function (path, opts) {
|
|
opts = opts || {}
|
|
opts.flags = opts.flags || 'r'
|
|
opts.encoding = opts.encoding || 'binary'
|
|
if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
|
|
throw new Error('Invalid encoding type "' + opts.encoding + '"')
|
|
}
|
|
let ret
|
|
const stream = FS.open(path, opts.flags)
|
|
const stat = FS.stat(path)
|
|
const length = stat.size
|
|
const buf = new Uint8Array(length)
|
|
FS.read(stream, buf, 0, length, 0)
|
|
if (opts.encoding === 'utf8') {
|
|
ret = UTF8ArrayToString(buf, 0)
|
|
} else if (opts.encoding === 'binary') {
|
|
ret = buf
|
|
}
|
|
FS.close(stream)
|
|
return ret
|
|
},
|
|
writeFile: function (path, data, opts) {
|
|
opts = opts || {}
|
|
opts.flags = opts.flags || 'w'
|
|
const stream = FS.open(path, opts.flags, opts.mode)
|
|
if (typeof data === 'string') {
|
|
const buf = new Uint8Array(lengthBytesUTF8(data) + 1)
|
|
const actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length)
|
|
FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn)
|
|
} else if (ArrayBuffer.isView(data)) {
|
|
FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn)
|
|
} else {
|
|
throw new Error('Unsupported data type')
|
|
}
|
|
FS.close(stream)
|
|
},
|
|
cwd: function () {
|
|
return FS.currentPath
|
|
},
|
|
chdir: function (path) {
|
|
const lookup = FS.lookupPath(path, {
|
|
follow: true
|
|
})
|
|
if (lookup.node === null) {
|
|
throw new FS.ErrnoError(44)
|
|
}
|
|
if (!FS.isDir(lookup.node.mode)) {
|
|
throw new FS.ErrnoError(54)
|
|
}
|
|
const errCode = FS.nodePermissions(lookup.node, 'x')
|
|
if (errCode) {
|
|
throw new FS.ErrnoError(errCode)
|
|
}
|
|
FS.currentPath = lookup.path
|
|
},
|
|
createDefaultDirectories: function () {
|
|
FS.mkdir('/tmp')
|
|
FS.mkdir('/home')
|
|
FS.mkdir('/home/web_user')
|
|
},
|
|
createDefaultDevices: function () {
|
|
FS.mkdir('/dev')
|
|
FS.registerDevice(FS.makedev(1, 3), {
|
|
read: function () {
|
|
return 0
|
|
},
|
|
write: function (stream, buffer, offset, length, pos) {
|
|
return length
|
|
}
|
|
})
|
|
FS.mkdev('/dev/null', FS.makedev(1, 3))
|
|
TTY.register(FS.makedev(5, 0), TTY.default_tty_ops)
|
|
TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops)
|
|
FS.mkdev('/dev/tty', FS.makedev(5, 0))
|
|
FS.mkdev('/dev/tty1', FS.makedev(6, 0))
|
|
let random_device
|
|
if (
|
|
typeof crypto === 'object' &&
|
|
typeof crypto.getRandomValues === 'function'
|
|
) {
|
|
const randomBuffer = new Uint8Array(1)
|
|
random_device = function () {
|
|
crypto.getRandomValues(randomBuffer)
|
|
return randomBuffer[0]
|
|
}
|
|
} else {
|
|
}
|
|
if (!random_device) {
|
|
random_device = function () {
|
|
abort('random_device')
|
|
}
|
|
}
|
|
FS.createDevice('/dev', 'random', random_device)
|
|
FS.createDevice('/dev', 'urandom', random_device)
|
|
FS.mkdir('/dev/shm')
|
|
FS.mkdir('/dev/shm/tmp')
|
|
},
|
|
createSpecialDirectories: function () {
|
|
FS.mkdir('/proc')
|
|
FS.mkdir('/proc/self')
|
|
FS.mkdir('/proc/self/fd')
|
|
FS.mount(
|
|
{
|
|
mount: function () {
|
|
const node = FS.createNode('/proc/self', 'fd', 16384 | 511, 73)
|
|
node.node_ops = {
|
|
lookup: function (parent, name) {
|
|
const fd = +name
|
|
const stream = FS.getStream(fd)
|
|
if (!stream) throw new FS.ErrnoError(8)
|
|
const ret = {
|
|
parent: null,
|
|
mount: {
|
|
mountpoint: 'fake'
|
|
},
|
|
node_ops: {
|
|
readlink: function () {
|
|
return stream.path
|
|
}
|
|
}
|
|
}
|
|
ret.parent = ret
|
|
return ret
|
|
}
|
|
}
|
|
return node
|
|
}
|
|
},
|
|
{},
|
|
'/proc/self/fd'
|
|
)
|
|
},
|
|
createStandardStreams: function () {
|
|
if (Module.stdin) {
|
|
FS.createDevice('/dev', 'stdin', Module.stdin)
|
|
} else {
|
|
FS.symlink('/dev/tty', '/dev/stdin')
|
|
}
|
|
if (Module.stdout) {
|
|
FS.createDevice('/dev', 'stdout', null, Module.stdout)
|
|
} else {
|
|
FS.symlink('/dev/tty', '/dev/stdout')
|
|
}
|
|
if (Module.stderr) {
|
|
FS.createDevice('/dev', 'stderr', null, Module.stderr)
|
|
} else {
|
|
FS.symlink('/dev/tty1', '/dev/stderr')
|
|
}
|
|
const stdin = FS.open('/dev/stdin', 'r')
|
|
const stdout = FS.open('/dev/stdout', 'w')
|
|
const stderr = FS.open('/dev/stderr', 'w')
|
|
},
|
|
ensureErrnoError: function () {
|
|
if (FS.ErrnoError) return
|
|
FS.ErrnoError = function ErrnoError (errno, node) {
|
|
this.node = node
|
|
this.setErrno = function (errno) {
|
|
this.errno = errno
|
|
}
|
|
this.setErrno(errno)
|
|
this.message = 'FS error'
|
|
}
|
|
FS.ErrnoError.prototype = new Error()
|
|
FS.ErrnoError.prototype.constructor = FS.ErrnoError
|
|
;[44].forEach(function (code) {
|
|
FS.genericErrors[code] = new FS.ErrnoError(code)
|
|
FS.genericErrors[code].stack = '<generic error, no stack>'
|
|
})
|
|
},
|
|
staticInit: function () {
|
|
FS.ensureErrnoError()
|
|
FS.nameTable = new Array(4096)
|
|
FS.mount(MEMFS, {}, '/')
|
|
FS.createDefaultDirectories()
|
|
FS.createDefaultDevices()
|
|
FS.createSpecialDirectories()
|
|
FS.filesystems = {
|
|
MEMFS: MEMFS
|
|
}
|
|
},
|
|
init: function (input, output, error) {
|
|
FS.init.initialized = true
|
|
FS.ensureErrnoError()
|
|
Module.stdin = input || Module.stdin
|
|
Module.stdout = output || Module.stdout
|
|
Module.stderr = error || Module.stderr
|
|
FS.createStandardStreams()
|
|
},
|
|
quit: function () {
|
|
FS.init.initialized = false
|
|
const fflush = Module._fflush
|
|
if (fflush) fflush(0)
|
|
for (let i = 0; i < FS.streams.length; i++) {
|
|
const stream = FS.streams[i]
|
|
if (!stream) {
|
|
continue
|
|
}
|
|
FS.close(stream)
|
|
}
|
|
},
|
|
getMode: function (canRead, canWrite) {
|
|
let mode = 0
|
|
if (canRead) mode |= 292 | 73
|
|
if (canWrite) mode |= 146
|
|
return mode
|
|
},
|
|
joinPath: function (parts, forceRelative) {
|
|
let path = PATH.join.apply(null, parts)
|
|
if (forceRelative && path[0] == '/') path = path.substr(1)
|
|
return path
|
|
},
|
|
absolutePath: function (relative, base) {
|
|
return PATH_FS.resolve(base, relative)
|
|
},
|
|
standardizePath: function (path) {
|
|
return PATH.normalize(path)
|
|
},
|
|
findObject: function (path, dontResolveLastLink) {
|
|
const ret = FS.analyzePath(path, dontResolveLastLink)
|
|
if (ret.exists) {
|
|
return ret.object
|
|
} else {
|
|
setErrNo(ret.error)
|
|
return null
|
|
}
|
|
},
|
|
analyzePath: function (path, dontResolveLastLink) {
|
|
try {
|
|
var lookup = FS.lookupPath(path, {
|
|
follow: !dontResolveLastLink
|
|
})
|
|
path = lookup.path
|
|
} catch (e) {}
|
|
const ret = {
|
|
isRoot: false,
|
|
exists: false,
|
|
error: 0,
|
|
name: null,
|
|
path: null,
|
|
object: null,
|
|
parentExists: false,
|
|
parentPath: null,
|
|
parentObject: null
|
|
}
|
|
try {
|
|
var lookup = FS.lookupPath(path, {
|
|
parent: true
|
|
})
|
|
ret.parentExists = true
|
|
ret.parentPath = lookup.path
|
|
ret.parentObject = lookup.node
|
|
ret.name = PATH.basename(path)
|
|
lookup = FS.lookupPath(path, {
|
|
follow: !dontResolveLastLink
|
|
})
|
|
ret.exists = true
|
|
ret.path = lookup.path
|
|
ret.object = lookup.node
|
|
ret.name = lookup.node.name
|
|
ret.isRoot = lookup.path === '/'
|
|
} catch (e) {
|
|
ret.error = e.errno
|
|
}
|
|
return ret
|
|
},
|
|
createFolder: function (parent, name, canRead, canWrite) {
|
|
const path = PATH.join2(
|
|
typeof parent === 'string' ? parent : FS.getPath(parent),
|
|
name
|
|
)
|
|
const mode = FS.getMode(canRead, canWrite)
|
|
return FS.mkdir(path, mode)
|
|
},
|
|
createPath: function (parent, path, canRead, canWrite) {
|
|
parent = typeof parent === 'string' ? parent : FS.getPath(parent)
|
|
const parts = path.split('/').reverse()
|
|
while (parts.length) {
|
|
const part = parts.pop()
|
|
if (!part) continue
|
|
var current = PATH.join2(parent, part)
|
|
try {
|
|
FS.mkdir(current)
|
|
} catch (e) {}
|
|
parent = current
|
|
}
|
|
return current
|
|
},
|
|
createFile: function (parent, name, properties, canRead, canWrite) {
|
|
const path = PATH.join2(
|
|
typeof parent === 'string' ? parent : FS.getPath(parent),
|
|
name
|
|
)
|
|
const mode = FS.getMode(canRead, canWrite)
|
|
return FS.create(path, mode)
|
|
},
|
|
createDataFile: function (parent, name, data, canRead, canWrite, canOwn) {
|
|
const path = name
|
|
? PATH.join2(
|
|
typeof parent === 'string' ? parent : FS.getPath(parent),
|
|
name
|
|
)
|
|
: parent
|
|
const mode = FS.getMode(canRead, canWrite)
|
|
const node = FS.create(path, mode)
|
|
if (data) {
|
|
if (typeof data === 'string') {
|
|
const arr = new Array(data.length)
|
|
for (let i = 0, len = data.length; i < len; ++i) {
|
|
arr[i] = data.charCodeAt(i)
|
|
}
|
|
data = arr
|
|
}
|
|
FS.chmod(node, mode | 146)
|
|
const stream = FS.open(node, 'w')
|
|
FS.write(stream, data, 0, data.length, 0, canOwn)
|
|
FS.close(stream)
|
|
FS.chmod(node, mode)
|
|
}
|
|
return node
|
|
},
|
|
createDevice: function (parent, name, input, output) {
|
|
const path = PATH.join2(
|
|
typeof parent === 'string' ? parent : FS.getPath(parent),
|
|
name
|
|
)
|
|
const mode = FS.getMode(!!input, !!output)
|
|
if (!FS.createDevice.major) FS.createDevice.major = 64
|
|
const dev = FS.makedev(FS.createDevice.major++, 0)
|
|
FS.registerDevice(dev, {
|
|
open: function (stream) {
|
|
stream.seekable = false
|
|
},
|
|
close: function (stream) {
|
|
if (output && output.buffer && output.buffer.length) {
|
|
output(10)
|
|
}
|
|
},
|
|
read: function (stream, buffer, offset, length, pos) {
|
|
let bytesRead = 0
|
|
for (let i = 0; i < length; i++) {
|
|
var result
|
|
try {
|
|
result = input()
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
if (result === undefined && bytesRead === 0) {
|
|
throw new FS.ErrnoError(6)
|
|
}
|
|
if (result === null || result === undefined) break
|
|
bytesRead++
|
|
buffer[offset + i] = result
|
|
}
|
|
if (bytesRead) {
|
|
stream.node.timestamp = Date.now()
|
|
}
|
|
return bytesRead
|
|
},
|
|
write: function (stream, buffer, offset, length, pos) {
|
|
for (var i = 0; i < length; i++) {
|
|
try {
|
|
output(buffer[offset + i])
|
|
} catch (e) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
}
|
|
if (length) {
|
|
stream.node.timestamp = Date.now()
|
|
}
|
|
return i
|
|
}
|
|
})
|
|
return FS.mkdev(path, mode, dev)
|
|
},
|
|
createLink: function (parent, name, target, canRead, canWrite) {
|
|
const path = PATH.join2(
|
|
typeof parent === 'string' ? parent : FS.getPath(parent),
|
|
name
|
|
)
|
|
return FS.symlink(target, path)
|
|
},
|
|
forceLoadFile: function (obj) {
|
|
if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true
|
|
let success = true
|
|
if (typeof XMLHttpRequest !== 'undefined') {
|
|
throw new Error(
|
|
'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.'
|
|
)
|
|
} else if (read_) {
|
|
try {
|
|
obj.contents = intArrayFromString(read_(obj.url), true)
|
|
obj.usedBytes = obj.contents.length
|
|
} catch (e) {
|
|
success = false
|
|
}
|
|
} else {
|
|
throw new Error('Cannot load without read() or XMLHttpRequest.')
|
|
}
|
|
if (!success) setErrNo(29)
|
|
return success
|
|
},
|
|
createLazyFile: function (parent, name, url, canRead, canWrite) {
|
|
function LazyUint8Array () {
|
|
this.lengthKnown = false
|
|
this.chunks = []
|
|
}
|
|
LazyUint8Array.prototype.get = function LazyUint8Array_get (idx) {
|
|
if (idx > this.length - 1 || idx < 0) {
|
|
return undefined
|
|
}
|
|
const chunkOffset = idx % this.chunkSize
|
|
const chunkNum = (idx / this.chunkSize) | 0
|
|
return this.getter(chunkNum)[chunkOffset]
|
|
}
|
|
LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter (
|
|
getter
|
|
) {
|
|
this.getter = getter
|
|
}
|
|
LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength () {
|
|
const xhr = new XMLHttpRequest()
|
|
xhr.open('HEAD', url, false)
|
|
xhr.send(null)
|
|
if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)) {
|
|
throw new Error("Couldn't load " + url + '. Status: ' + xhr.status)
|
|
}
|
|
let datalength = Number(xhr.getResponseHeader('Content-length'))
|
|
let header
|
|
const hasByteServing =
|
|
(header = xhr.getResponseHeader('Accept-Ranges')) && header === 'bytes'
|
|
const usesGzip =
|
|
(header = xhr.getResponseHeader('Content-Encoding')) &&
|
|
header === 'gzip'
|
|
let chunkSize = 1024 * 1024
|
|
if (!hasByteServing) chunkSize = datalength
|
|
const doXHR = function (from, to) {
|
|
if (from > to) {
|
|
throw new Error(
|
|
'invalid range (' + from + ', ' + to + ') or no bytes requested!'
|
|
)
|
|
}
|
|
if (to > datalength - 1) {
|
|
throw new Error(
|
|
'only ' + datalength + ' bytes available! programmer error!'
|
|
)
|
|
}
|
|
const xhr = new XMLHttpRequest()
|
|
xhr.open('GET', url, false)
|
|
if (datalength !== chunkSize) {
|
|
xhr.setRequestHeader('Range', 'bytes=' + from + '-' + to)
|
|
}
|
|
if (typeof Uint8Array !== 'undefined') xhr.responseType = 'arraybuffer'
|
|
if (xhr.overrideMimeType) {
|
|
xhr.overrideMimeType('text/plain; charset=x-user-defined')
|
|
}
|
|
xhr.send(null)
|
|
if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304)) {
|
|
throw new Error("Couldn't load " + url + '. Status: ' + xhr.status)
|
|
}
|
|
if (xhr.response !== undefined) {
|
|
return new Uint8Array(xhr.response || [])
|
|
} else {
|
|
return intArrayFromString(xhr.responseText || '', true)
|
|
}
|
|
}
|
|
const lazyArray = this
|
|
lazyArray.setDataGetter(function (chunkNum) {
|
|
const start = chunkNum * chunkSize
|
|
let end = (chunkNum + 1) * chunkSize - 1
|
|
end = Math.min(end, datalength - 1)
|
|
if (typeof lazyArray.chunks[chunkNum] === 'undefined') {
|
|
lazyArray.chunks[chunkNum] = doXHR(start, end)
|
|
}
|
|
if (typeof lazyArray.chunks[chunkNum] === 'undefined') {
|
|
throw new Error('doXHR failed!')
|
|
}
|
|
return lazyArray.chunks[chunkNum]
|
|
})
|
|
if (usesGzip || !datalength) {
|
|
chunkSize = datalength = 1
|
|
datalength = this.getter(0).length
|
|
chunkSize = datalength
|
|
out(
|
|
'LazyFiles on gzip forces download of the whole file when length is accessed'
|
|
)
|
|
}
|
|
this._length = datalength
|
|
this._chunkSize = chunkSize
|
|
this.lengthKnown = true
|
|
}
|
|
if (typeof XMLHttpRequest !== 'undefined') {
|
|
if (!ENVIRONMENT_IS_WORKER) {
|
|
throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'
|
|
}
|
|
const lazyArray = new LazyUint8Array()
|
|
Object.defineProperties(lazyArray, {
|
|
length: {
|
|
get: function () {
|
|
if (!this.lengthKnown) {
|
|
this.cacheLength()
|
|
}
|
|
return this._length
|
|
}
|
|
},
|
|
chunkSize: {
|
|
get: function () {
|
|
if (!this.lengthKnown) {
|
|
this.cacheLength()
|
|
}
|
|
return this._chunkSize
|
|
}
|
|
}
|
|
})
|
|
var properties = {
|
|
isDevice: false,
|
|
contents: lazyArray
|
|
}
|
|
} else {
|
|
var properties = {
|
|
isDevice: false,
|
|
url: url
|
|
}
|
|
}
|
|
const node = FS.createFile(parent, name, properties, canRead, canWrite)
|
|
if (properties.contents) {
|
|
node.contents = properties.contents
|
|
} else if (properties.url) {
|
|
node.contents = null
|
|
node.url = properties.url
|
|
}
|
|
Object.defineProperties(node, {
|
|
usedBytes: {
|
|
get: function () {
|
|
return this.contents.length
|
|
}
|
|
}
|
|
})
|
|
const stream_ops = {}
|
|
const keys = Object.keys(node.stream_ops)
|
|
keys.forEach(function (key) {
|
|
const fn = node.stream_ops[key]
|
|
stream_ops[key] = function forceLoadLazyFile () {
|
|
if (!FS.forceLoadFile(node)) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
return fn.apply(null, arguments)
|
|
}
|
|
})
|
|
stream_ops.read = function stream_ops_read (
|
|
stream,
|
|
buffer,
|
|
offset,
|
|
length,
|
|
position
|
|
) {
|
|
if (!FS.forceLoadFile(node)) {
|
|
throw new FS.ErrnoError(29)
|
|
}
|
|
const contents = stream.node.contents
|
|
if (position >= contents.length) return 0
|
|
const size = Math.min(contents.length - position, length)
|
|
if (contents.slice) {
|
|
for (var i = 0; i < size; i++) {
|
|
buffer[offset + i] = contents[position + i]
|
|
}
|
|
} else {
|
|
for (var i = 0; i < size; i++) {
|
|
buffer[offset + i] = contents.get(position + i)
|
|
}
|
|
}
|
|
return size
|
|
}
|
|
node.stream_ops = stream_ops
|
|
return node
|
|
},
|
|
createPreloadedFile: function (
|
|
parent,
|
|
name,
|
|
url,
|
|
canRead,
|
|
canWrite,
|
|
onload,
|
|
onerror,
|
|
dontCreateFile,
|
|
canOwn,
|
|
preFinish
|
|
) {
|
|
Browser.init()
|
|
const fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent
|
|
const dep = getUniqueRunDependency('cp ' + fullname)
|
|
|
|
function processData (byteArray) {
|
|
function finish (byteArray) {
|
|
if (preFinish) preFinish()
|
|
if (!dontCreateFile) {
|
|
FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn)
|
|
}
|
|
if (onload) onload()
|
|
removeRunDependency(dep)
|
|
}
|
|
let handled = false
|
|
Module.preloadPlugins.forEach(function (plugin) {
|
|
if (handled) return
|
|
if (plugin.canHandle(fullname)) {
|
|
plugin.handle(byteArray, fullname, finish, function () {
|
|
if (onerror) onerror()
|
|
removeRunDependency(dep)
|
|
})
|
|
handled = true
|
|
}
|
|
})
|
|
if (!handled) finish(byteArray)
|
|
}
|
|
addRunDependency(dep)
|
|
if (typeof url === 'string') {
|
|
Browser.asyncLoad(
|
|
url,
|
|
function (byteArray) {
|
|
processData(byteArray)
|
|
},
|
|
onerror
|
|
)
|
|
} else {
|
|
processData(url)
|
|
}
|
|
},
|
|
indexedDB: function () {
|
|
return (
|
|
window.indexedDB ||
|
|
window.mozIndexedDB ||
|
|
window.webkitIndexedDB ||
|
|
window.msIndexedDB
|
|
)
|
|
},
|
|
DB_NAME: function () {
|
|
return 'EM_FS_' + window.location.pathname
|
|
},
|
|
DB_VERSION: 20,
|
|
DB_STORE_NAME: 'FILE_DATA',
|
|
saveFilesToDB: function (paths, onload, onerror) {
|
|
onload = onload || function () {}
|
|
onerror = onerror || function () {}
|
|
const indexedDB = FS.indexedDB()
|
|
try {
|
|
var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
|
|
} catch (e) {
|
|
return onerror(e)
|
|
}
|
|
openRequest.onupgradeneeded = function openRequest_onupgradeneeded () {
|
|
out('creating db')
|
|
const db = openRequest.result
|
|
db.createObjectStore(FS.DB_STORE_NAME)
|
|
}
|
|
openRequest.onsuccess = function openRequest_onsuccess () {
|
|
const db = openRequest.result
|
|
const transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite')
|
|
const files = transaction.objectStore(FS.DB_STORE_NAME)
|
|
let ok = 0
|
|
let fail = 0
|
|
const total = paths.length
|
|
|
|
function finish () {
|
|
if (fail == 0) onload()
|
|
else onerror()
|
|
}
|
|
paths.forEach(function (path) {
|
|
const putRequest = files.put(FS.analyzePath(path).object.contents, path)
|
|
putRequest.onsuccess = function putRequest_onsuccess () {
|
|
ok++
|
|
if (ok + fail == total) finish()
|
|
}
|
|
putRequest.onerror = function putRequest_onerror () {
|
|
fail++
|
|
if (ok + fail == total) finish()
|
|
}
|
|
})
|
|
transaction.onerror = onerror
|
|
}
|
|
openRequest.onerror = onerror
|
|
},
|
|
loadFilesFromDB: function (paths, onload, onerror) {
|
|
onload = onload || function () {}
|
|
onerror = onerror || function () {}
|
|
const indexedDB = FS.indexedDB()
|
|
try {
|
|
var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
|
|
} catch (e) {
|
|
return onerror(e)
|
|
}
|
|
openRequest.onupgradeneeded = onerror
|
|
openRequest.onsuccess = function openRequest_onsuccess () {
|
|
const db = openRequest.result
|
|
try {
|
|
var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly')
|
|
} catch (e) {
|
|
onerror(e)
|
|
return
|
|
}
|
|
const files = transaction.objectStore(FS.DB_STORE_NAME)
|
|
let ok = 0
|
|
let fail = 0
|
|
const total = paths.length
|
|
|
|
function finish () {
|
|
if (fail == 0) onload()
|
|
else onerror()
|
|
}
|
|
paths.forEach(function (path) {
|
|
const getRequest = files.get(path)
|
|
getRequest.onsuccess = function getRequest_onsuccess () {
|
|
if (FS.analyzePath(path).exists) {
|
|
FS.unlink(path)
|
|
}
|
|
FS.createDataFile(
|
|
PATH.dirname(path),
|
|
PATH.basename(path),
|
|
getRequest.result,
|
|
true,
|
|
true,
|
|
true
|
|
)
|
|
ok++
|
|
if (ok + fail == total) finish()
|
|
}
|
|
getRequest.onerror = function getRequest_onerror () {
|
|
fail++
|
|
if (ok + fail == total) finish()
|
|
}
|
|
})
|
|
transaction.onerror = onerror
|
|
}
|
|
openRequest.onerror = onerror
|
|
}
|
|
}
|
|
var SYSCALLS = {
|
|
mappings: {},
|
|
DEFAULT_POLLMASK: 5,
|
|
umask: 511,
|
|
calculateAt: function (dirfd, path) {
|
|
if (path[0] !== '/') {
|
|
let dir
|
|
if (dirfd === -100) {
|
|
dir = FS.cwd()
|
|
} else {
|
|
const dirstream = FS.getStream(dirfd)
|
|
if (!dirstream) throw new FS.ErrnoError(8)
|
|
dir = dirstream.path
|
|
}
|
|
path = PATH.join2(dir, path)
|
|
}
|
|
return path
|
|
},
|
|
doStat: function (func, path, buf) {
|
|
try {
|
|
var stat = func(path)
|
|
} catch (e) {
|
|
if (
|
|
e &&
|
|
e.node &&
|
|
PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))
|
|
) {
|
|
return -54
|
|
}
|
|
throw e
|
|
}
|
|
HEAP32[buf >> 2] = stat.dev
|
|
HEAP32[(buf + 4) >> 2] = 0
|
|
HEAP32[(buf + 8) >> 2] = stat.ino
|
|
HEAP32[(buf + 12) >> 2] = stat.mode
|
|
HEAP32[(buf + 16) >> 2] = stat.nlink
|
|
HEAP32[(buf + 20) >> 2] = stat.uid
|
|
HEAP32[(buf + 24) >> 2] = stat.gid
|
|
HEAP32[(buf + 28) >> 2] = stat.rdev
|
|
HEAP32[(buf + 32) >> 2] = 0
|
|
;(tempI64 = [
|
|
stat.size >>> 0,
|
|
((tempDouble = stat.size),
|
|
+Math_abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>>
|
|
0
|
|
: ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>>
|
|
0
|
|
: 0)
|
|
]),
|
|
(HEAP32[(buf + 40) >> 2] = tempI64[0]),
|
|
(HEAP32[(buf + 44) >> 2] = tempI64[1])
|
|
HEAP32[(buf + 48) >> 2] = 4096
|
|
HEAP32[(buf + 52) >> 2] = stat.blocks
|
|
HEAP32[(buf + 56) >> 2] = (stat.atime.getTime() / 1e3) | 0
|
|
HEAP32[(buf + 60) >> 2] = 0
|
|
HEAP32[(buf + 64) >> 2] = (stat.mtime.getTime() / 1e3) | 0
|
|
HEAP32[(buf + 68) >> 2] = 0
|
|
HEAP32[(buf + 72) >> 2] = (stat.ctime.getTime() / 1e3) | 0
|
|
HEAP32[(buf + 76) >> 2] = 0
|
|
;(tempI64 = [
|
|
stat.ino >>> 0,
|
|
((tempDouble = stat.ino),
|
|
+Math_abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>>
|
|
0
|
|
: ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>>
|
|
0
|
|
: 0)
|
|
]),
|
|
(HEAP32[(buf + 80) >> 2] = tempI64[0]),
|
|
(HEAP32[(buf + 84) >> 2] = tempI64[1])
|
|
return 0
|
|
},
|
|
doMsync: function (addr, stream, len, flags, offset) {
|
|
const buffer = HEAPU8.slice(addr, addr + len)
|
|
FS.msync(stream, buffer, offset, len, flags)
|
|
},
|
|
doMkdir: function (path, mode) {
|
|
path = PATH.normalize(path)
|
|
if (path[path.length - 1] === '/') path = path.substr(0, path.length - 1)
|
|
FS.mkdir(path, mode, 0)
|
|
return 0
|
|
},
|
|
doMknod: function (path, mode, dev) {
|
|
switch (mode & 61440) {
|
|
case 32768:
|
|
case 8192:
|
|
case 24576:
|
|
case 4096:
|
|
case 49152:
|
|
break
|
|
default:
|
|
return -28
|
|
}
|
|
FS.mknod(path, mode, dev)
|
|
return 0
|
|
},
|
|
doReadlink: function (path, buf, bufsize) {
|
|
if (bufsize <= 0) return -28
|
|
const ret = FS.readlink(path)
|
|
const len = Math.min(bufsize, lengthBytesUTF8(ret))
|
|
const endChar = HEAP8[buf + len]
|
|
stringToUTF8(ret, buf, bufsize + 1)
|
|
HEAP8[buf + len] = endChar
|
|
return len
|
|
},
|
|
doAccess: function (path, amode) {
|
|
if (amode & ~7) {
|
|
return -28
|
|
}
|
|
let node
|
|
const lookup = FS.lookupPath(path, {
|
|
follow: true
|
|
})
|
|
node = lookup.node
|
|
if (!node) {
|
|
return -44
|
|
}
|
|
let perms = ''
|
|
if (amode & 4) perms += 'r'
|
|
if (amode & 2) perms += 'w'
|
|
if (amode & 1) perms += 'x'
|
|
if (perms && FS.nodePermissions(node, perms)) {
|
|
return -2
|
|
}
|
|
return 0
|
|
},
|
|
doDup: function (path, flags, suggestFD) {
|
|
const suggest = FS.getStream(suggestFD)
|
|
if (suggest) FS.close(suggest)
|
|
return FS.open(path, flags, 0, suggestFD, suggestFD).fd
|
|
},
|
|
doReadv: function (stream, iov, iovcnt, offset) {
|
|
let ret = 0
|
|
for (let i = 0; i < iovcnt; i++) {
|
|
const ptr = HEAP32[(iov + i * 8) >> 2]
|
|
const len = HEAP32[(iov + (i * 8 + 4)) >> 2]
|
|
const curr = FS.read(stream, HEAP8, ptr, len, offset)
|
|
if (curr < 0) return -1
|
|
ret += curr
|
|
if (curr < len) break
|
|
}
|
|
return ret
|
|
},
|
|
doWritev: function (stream, iov, iovcnt, offset) {
|
|
let ret = 0
|
|
for (let i = 0; i < iovcnt; i++) {
|
|
const ptr = HEAP32[(iov + i * 8) >> 2]
|
|
const len = HEAP32[(iov + (i * 8 + 4)) >> 2]
|
|
const curr = FS.write(stream, HEAP8, ptr, len, offset)
|
|
if (curr < 0) return -1
|
|
ret += curr
|
|
}
|
|
return ret
|
|
},
|
|
varargs: undefined,
|
|
get: function () {
|
|
SYSCALLS.varargs += 4
|
|
const ret = HEAP32[(SYSCALLS.varargs - 4) >> 2]
|
|
return ret
|
|
},
|
|
getStr: function (ptr) {
|
|
const ret = UTF8ToString(ptr)
|
|
return ret
|
|
},
|
|
getStreamFromFD: function (fd) {
|
|
const stream = FS.getStream(fd)
|
|
if (!stream) throw new FS.ErrnoError(8)
|
|
return stream
|
|
},
|
|
get64: function (low, high) {
|
|
return low
|
|
}
|
|
}
|
|
|
|
function ___sys_access (path, amode) {
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
return SYSCALLS.doAccess(path, amode)
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_chmod (path, mode) {
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
FS.chmod(path, mode)
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_fcntl64 (fd, cmd, varargs) {
|
|
SYSCALLS.varargs = varargs
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
switch (cmd) {
|
|
case 0: {
|
|
var arg = SYSCALLS.get()
|
|
if (arg < 0) {
|
|
return -28
|
|
}
|
|
let newStream
|
|
newStream = FS.open(stream.path, stream.flags, 0, arg)
|
|
return newStream.fd
|
|
}
|
|
case 1:
|
|
case 2:
|
|
return 0
|
|
case 3:
|
|
return stream.flags
|
|
case 4: {
|
|
var arg = SYSCALLS.get()
|
|
stream.flags |= arg
|
|
return 0
|
|
}
|
|
case 12: {
|
|
var arg = SYSCALLS.get()
|
|
const offset = 0
|
|
HEAP16[(arg + offset) >> 1] = 2
|
|
return 0
|
|
}
|
|
case 13:
|
|
case 14:
|
|
return 0
|
|
case 16:
|
|
case 8:
|
|
return -28
|
|
case 9:
|
|
setErrNo(28)
|
|
return -1
|
|
default: {
|
|
return -28
|
|
}
|
|
}
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_fstat64 (fd, buf) {
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
return SYSCALLS.doStat(FS.stat, stream.path, buf)
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_getcwd (buf, size) {
|
|
try {
|
|
if (size === 0) return -28
|
|
const cwd = FS.cwd()
|
|
const cwdLengthInBytes = lengthBytesUTF8(cwd)
|
|
if (size < cwdLengthInBytes + 1) return -68
|
|
stringToUTF8(cwd, buf, size)
|
|
return buf
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_getdents64 (fd, dirp, count) {
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
if (!stream.getdents) {
|
|
stream.getdents = FS.readdir(stream.path)
|
|
}
|
|
const struct_size = 280
|
|
let pos = 0
|
|
const off = FS.llseek(stream, 0, 1)
|
|
let idx = Math.floor(off / struct_size)
|
|
while (idx < stream.getdents.length && pos + struct_size <= count) {
|
|
var id
|
|
var type
|
|
const name = stream.getdents[idx]
|
|
if (name[0] === '.') {
|
|
id = 1
|
|
type = 4
|
|
} else {
|
|
const child = FS.lookupNode(stream.node, name)
|
|
id = child.id
|
|
type = FS.isChrdev(child.mode)
|
|
? 2
|
|
: FS.isDir(child.mode)
|
|
? 4
|
|
: FS.isLink(child.mode)
|
|
? 10
|
|
: 8
|
|
}
|
|
;(tempI64 = [
|
|
id >>> 0,
|
|
((tempDouble = id),
|
|
+Math_abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) |
|
|
0) >>>
|
|
0
|
|
: ~~+Math_ceil(
|
|
(tempDouble - +(~~tempDouble >>> 0)) / 4294967296
|
|
) >>> 0
|
|
: 0)
|
|
]),
|
|
(HEAP32[(dirp + pos) >> 2] = tempI64[0]),
|
|
(HEAP32[(dirp + pos + 4) >> 2] = tempI64[1])
|
|
;(tempI64 = [
|
|
((idx + 1) * struct_size) >>> 0,
|
|
((tempDouble = (idx + 1) * struct_size),
|
|
+Math_abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) |
|
|
0) >>>
|
|
0
|
|
: ~~+Math_ceil(
|
|
(tempDouble - +(~~tempDouble >>> 0)) / 4294967296
|
|
) >>> 0
|
|
: 0)
|
|
]),
|
|
(HEAP32[(dirp + pos + 8) >> 2] = tempI64[0]),
|
|
(HEAP32[(dirp + pos + 12) >> 2] = tempI64[1])
|
|
HEAP16[(dirp + pos + 16) >> 1] = 280
|
|
HEAP8[(dirp + pos + 18) >> 0] = type
|
|
stringToUTF8(name, dirp + pos + 19, 256)
|
|
pos += struct_size
|
|
idx += 1
|
|
}
|
|
FS.llseek(stream, idx * struct_size, 0)
|
|
return pos
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_getpid () {
|
|
return 42
|
|
}
|
|
|
|
function ___sys_ioctl (fd, op, varargs) {
|
|
SYSCALLS.varargs = varargs
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
switch (op) {
|
|
case 21509:
|
|
case 21505: {
|
|
if (!stream.tty) return -59
|
|
return 0
|
|
}
|
|
case 21510:
|
|
case 21511:
|
|
case 21512:
|
|
case 21506:
|
|
case 21507:
|
|
case 21508: {
|
|
if (!stream.tty) return -59
|
|
return 0
|
|
}
|
|
case 21519: {
|
|
if (!stream.tty) return -59
|
|
var argp = SYSCALLS.get()
|
|
HEAP32[argp >> 2] = 0
|
|
return 0
|
|
}
|
|
case 21520: {
|
|
if (!stream.tty) return -59
|
|
return -28
|
|
}
|
|
case 21531: {
|
|
var argp = SYSCALLS.get()
|
|
return FS.ioctl(stream, op, argp)
|
|
}
|
|
case 21523: {
|
|
if (!stream.tty) return -59
|
|
return 0
|
|
}
|
|
case 21524: {
|
|
if (!stream.tty) return -59
|
|
return 0
|
|
}
|
|
default:
|
|
abort('bad ioctl syscall ' + op)
|
|
}
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_link (oldpath, newpath) {
|
|
return -34
|
|
}
|
|
|
|
function ___sys_lstat64 (path, buf) {
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
return SYSCALLS.doStat(FS.lstat, path, buf)
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_mkdir (path, mode) {
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
return SYSCALLS.doMkdir(path, mode)
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_mprotect (addr, len, size) {
|
|
return 0
|
|
}
|
|
|
|
function syscallMunmap (addr, len) {
|
|
if ((addr | 0) === -1 || len === 0) {
|
|
return -28
|
|
}
|
|
const info = SYSCALLS.mappings[addr]
|
|
if (!info) return 0
|
|
if (len === info.len) {
|
|
const stream = FS.getStream(info.fd)
|
|
if (info.prot & 2) {
|
|
SYSCALLS.doMsync(addr, stream, len, info.flags, info.offset)
|
|
}
|
|
FS.munmap(stream)
|
|
SYSCALLS.mappings[addr] = null
|
|
if (info.allocated) {
|
|
_free(info.malloc)
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
|
|
function ___sys_munmap (addr, len) {
|
|
try {
|
|
return syscallMunmap(addr, len)
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_open (path, flags, varargs) {
|
|
SYSCALLS.varargs = varargs
|
|
try {
|
|
const pathname = SYSCALLS.getStr(path)
|
|
const mode = SYSCALLS.get()
|
|
const stream = FS.open(pathname, flags, mode)
|
|
return stream.fd
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_read (fd, buf, count) {
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
return FS.read(stream, HEAP8, buf, count)
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_readlink (path, buf, bufsize) {
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
return SYSCALLS.doReadlink(path, buf, bufsize)
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_rename (old_path, new_path) {
|
|
try {
|
|
old_path = SYSCALLS.getStr(old_path)
|
|
new_path = SYSCALLS.getStr(new_path)
|
|
FS.rename(old_path, new_path)
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_rmdir (path) {
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
FS.rmdir(path)
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_stat64 (path, buf) {
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
return SYSCALLS.doStat(FS.stat, path, buf)
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_symlink (target, linkpath) {
|
|
try {
|
|
target = SYSCALLS.getStr(target)
|
|
linkpath = SYSCALLS.getStr(linkpath)
|
|
FS.symlink(target, linkpath)
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function ___sys_unlink (path) {
|
|
try {
|
|
path = SYSCALLS.getStr(path)
|
|
FS.unlink(path)
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return -e.errno
|
|
}
|
|
}
|
|
|
|
function _abort () {
|
|
abort()
|
|
}
|
|
let setjmpId = 0
|
|
|
|
function _saveSetjmp (env, label, table, size) {
|
|
env = env | 0
|
|
label = label | 0
|
|
table = table | 0
|
|
size = size | 0
|
|
let i = 0
|
|
setjmpId = (setjmpId + 1) | 0
|
|
HEAP32[env >> 2] = setjmpId
|
|
while ((i | 0) < (size | 0)) {
|
|
if ((HEAP32[(table + (i << 3)) >> 2] | 0) == 0) {
|
|
HEAP32[(table + (i << 3)) >> 2] = setjmpId
|
|
HEAP32[(table + ((i << 3) + 4)) >> 2] = label
|
|
HEAP32[(table + ((i << 3) + 8)) >> 2] = 0
|
|
setTempRet0(size | 0)
|
|
return table | 0
|
|
}
|
|
i = (i + 1) | 0
|
|
}
|
|
size = (size * 2) | 0
|
|
table = _realloc(table | 0, (8 * ((size + 1) | 0)) | 0) | 0
|
|
table = _saveSetjmp(env | 0, label | 0, table | 0, size | 0) | 0
|
|
setTempRet0(size | 0)
|
|
return table | 0
|
|
}
|
|
|
|
function _testSetjmp (id, table, size) {
|
|
id = id | 0
|
|
table = table | 0
|
|
size = size | 0
|
|
let i = 0
|
|
let curr = 0
|
|
while ((i | 0) < (size | 0)) {
|
|
curr = HEAP32[(table + (i << 3)) >> 2] | 0
|
|
if ((curr | 0) == 0) break
|
|
if ((curr | 0) == (id | 0)) {
|
|
return HEAP32[(table + ((i << 3) + 4)) >> 2] | 0
|
|
}
|
|
i = (i + 1) | 0
|
|
}
|
|
return 0
|
|
}
|
|
|
|
function _longjmp (env, value) {
|
|
_setThrew(env, value || 1)
|
|
throw 'longjmp'
|
|
}
|
|
|
|
function _emscripten_longjmp (env, value) {
|
|
_longjmp(env, value)
|
|
}
|
|
|
|
function _emscripten_memcpy_big (dest, src, num) {
|
|
HEAPU8.copyWithin(dest, src, src + num)
|
|
}
|
|
|
|
function _emscripten_get_heap_size () {
|
|
return HEAPU8.length
|
|
}
|
|
|
|
function emscripten_realloc_buffer (size) {
|
|
try {
|
|
wasmMemory.grow((size - buffer.byteLength + 65535) >>> 16)
|
|
updateGlobalBufferAndViews(wasmMemory.buffer)
|
|
return 1
|
|
} catch (e) {}
|
|
}
|
|
|
|
function _emscripten_resize_heap (requestedSize) {
|
|
requestedSize = requestedSize >>> 0
|
|
const oldSize = _emscripten_get_heap_size()
|
|
const PAGE_MULTIPLE = 65536
|
|
const maxHeapSize = 2147483648
|
|
if (requestedSize > maxHeapSize) {
|
|
return false
|
|
}
|
|
const minHeapSize = 16777216
|
|
for (let cutDown = 1; cutDown <= 4; cutDown *= 2) {
|
|
let overGrownHeapSize = oldSize * (1 + 0.2 / cutDown)
|
|
overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296)
|
|
const newSize = Math.min(
|
|
maxHeapSize,
|
|
alignUp(
|
|
Math.max(minHeapSize, requestedSize, overGrownHeapSize),
|
|
PAGE_MULTIPLE
|
|
)
|
|
)
|
|
const replacement = emscripten_realloc_buffer(newSize)
|
|
if (replacement) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
const ENV = {}
|
|
|
|
function __getExecutableName () {
|
|
return thisProgram || './this.program'
|
|
}
|
|
|
|
function getEnvStrings () {
|
|
if (!getEnvStrings.strings) {
|
|
const env = {
|
|
USER: 'web_user',
|
|
LOGNAME: 'web_user',
|
|
PATH: '/',
|
|
PWD: '/',
|
|
HOME: '/home/web_user',
|
|
LANG:
|
|
(
|
|
(typeof navigator === 'object' &&
|
|
navigator.languages &&
|
|
navigator.languages[0]) ||
|
|
'C'
|
|
).replace('-', '_') + '.UTF-8',
|
|
_: __getExecutableName()
|
|
}
|
|
for (var x in ENV) {
|
|
env[x] = ENV[x]
|
|
}
|
|
const strings = []
|
|
for (var x in env) {
|
|
strings.push(x + '=' + env[x])
|
|
}
|
|
getEnvStrings.strings = strings
|
|
}
|
|
return getEnvStrings.strings
|
|
}
|
|
|
|
function _environ_get (__environ, environ_buf) {
|
|
let bufSize = 0
|
|
getEnvStrings().forEach(function (string, i) {
|
|
const ptr = environ_buf + bufSize
|
|
HEAP32[(__environ + i * 4) >> 2] = ptr
|
|
writeAsciiToMemory(string, ptr)
|
|
bufSize += string.length + 1
|
|
})
|
|
return 0
|
|
}
|
|
|
|
function _environ_sizes_get (penviron_count, penviron_buf_size) {
|
|
const strings = getEnvStrings()
|
|
HEAP32[penviron_count >> 2] = strings.length
|
|
let bufSize = 0
|
|
strings.forEach(function (string) {
|
|
bufSize += string.length + 1
|
|
})
|
|
HEAP32[penviron_buf_size >> 2] = bufSize
|
|
return 0
|
|
}
|
|
|
|
function _exit (status) {
|
|
exit(status)
|
|
}
|
|
|
|
function _fd_close (fd) {
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
FS.close(stream)
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return e.errno
|
|
}
|
|
}
|
|
|
|
function _fd_fdstat_get (fd, pbuf) {
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
const type = stream.tty
|
|
? 2
|
|
: FS.isDir(stream.mode)
|
|
? 3
|
|
: FS.isLink(stream.mode)
|
|
? 7
|
|
: 4
|
|
HEAP8[pbuf >> 0] = type
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return e.errno
|
|
}
|
|
}
|
|
|
|
function _fd_read (fd, iov, iovcnt, pnum) {
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
const num = SYSCALLS.doReadv(stream, iov, iovcnt)
|
|
HEAP32[pnum >> 2] = num
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return e.errno
|
|
}
|
|
}
|
|
|
|
function _fd_seek (fd, offset_low, offset_high, whence, newOffset) {
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
const HIGH_OFFSET = 4294967296
|
|
const offset = offset_high * HIGH_OFFSET + (offset_low >>> 0)
|
|
const DOUBLE_LIMIT = 9007199254740992
|
|
if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) {
|
|
return -61
|
|
}
|
|
FS.llseek(stream, offset, whence)
|
|
;(tempI64 = [
|
|
stream.position >>> 0,
|
|
((tempDouble = stream.position),
|
|
+Math_abs(tempDouble) >= 1
|
|
? tempDouble > 0
|
|
? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>>
|
|
0
|
|
: ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>>
|
|
0
|
|
: 0)
|
|
]),
|
|
(HEAP32[newOffset >> 2] = tempI64[0]),
|
|
(HEAP32[(newOffset + 4) >> 2] = tempI64[1])
|
|
if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return e.errno
|
|
}
|
|
}
|
|
|
|
function _fd_write (fd, iov, iovcnt, pnum) {
|
|
try {
|
|
const stream = SYSCALLS.getStreamFromFD(fd)
|
|
const num = SYSCALLS.doWritev(stream, iov, iovcnt)
|
|
HEAP32[pnum >> 2] = num
|
|
return 0
|
|
} catch (e) {
|
|
if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
|
|
return e.errno
|
|
}
|
|
}
|
|
|
|
function _getTempRet0 () {
|
|
return getTempRet0() | 0
|
|
}
|
|
|
|
function _gettimeofday (ptr) {
|
|
const now = Date.now()
|
|
HEAP32[ptr >> 2] = (now / 1e3) | 0
|
|
HEAP32[(ptr + 4) >> 2] = ((now % 1e3) * 1e3) | 0
|
|
return 0
|
|
}
|
|
|
|
function _roundf (d) {
|
|
d = +d
|
|
return d >= +0 ? +Math_floor(d + +0.5) : +Math_ceil(d - +0.5)
|
|
}
|
|
|
|
function _setTempRet0 ($i) {
|
|
setTempRet0($i | 0)
|
|
}
|
|
|
|
function _sysconf (name) {
|
|
switch (name) {
|
|
case 30:
|
|
return 16384
|
|
case 85:
|
|
var maxHeapSize = 2147483648
|
|
return maxHeapSize / 16384
|
|
case 132:
|
|
case 133:
|
|
case 12:
|
|
case 137:
|
|
case 138:
|
|
case 15:
|
|
case 235:
|
|
case 16:
|
|
case 17:
|
|
case 18:
|
|
case 19:
|
|
case 20:
|
|
case 149:
|
|
case 13:
|
|
case 10:
|
|
case 236:
|
|
case 153:
|
|
case 9:
|
|
case 21:
|
|
case 22:
|
|
case 159:
|
|
case 154:
|
|
case 14:
|
|
case 77:
|
|
case 78:
|
|
case 139:
|
|
case 80:
|
|
case 81:
|
|
case 82:
|
|
case 68:
|
|
case 67:
|
|
case 164:
|
|
case 11:
|
|
case 29:
|
|
case 47:
|
|
case 48:
|
|
case 95:
|
|
case 52:
|
|
case 51:
|
|
case 46:
|
|
case 79:
|
|
return 200809
|
|
case 27:
|
|
case 246:
|
|
case 127:
|
|
case 128:
|
|
case 23:
|
|
case 24:
|
|
case 160:
|
|
case 161:
|
|
case 181:
|
|
case 182:
|
|
case 242:
|
|
case 183:
|
|
case 184:
|
|
case 243:
|
|
case 244:
|
|
case 245:
|
|
case 165:
|
|
case 178:
|
|
case 179:
|
|
case 49:
|
|
case 50:
|
|
case 168:
|
|
case 169:
|
|
case 175:
|
|
case 170:
|
|
case 171:
|
|
case 172:
|
|
case 97:
|
|
case 76:
|
|
case 32:
|
|
case 173:
|
|
case 35:
|
|
return -1
|
|
case 176:
|
|
case 177:
|
|
case 7:
|
|
case 155:
|
|
case 8:
|
|
case 157:
|
|
case 125:
|
|
case 126:
|
|
case 92:
|
|
case 93:
|
|
case 129:
|
|
case 130:
|
|
case 131:
|
|
case 94:
|
|
case 91:
|
|
return 1
|
|
case 74:
|
|
case 60:
|
|
case 69:
|
|
case 70:
|
|
case 4:
|
|
return 1024
|
|
case 31:
|
|
case 42:
|
|
case 72:
|
|
return 32
|
|
case 87:
|
|
case 26:
|
|
case 33:
|
|
return 2147483647
|
|
case 34:
|
|
case 1:
|
|
return 47839
|
|
case 38:
|
|
case 36:
|
|
return 99
|
|
case 43:
|
|
case 37:
|
|
return 2048
|
|
case 0:
|
|
return 2097152
|
|
case 3:
|
|
return 65536
|
|
case 28:
|
|
return 32768
|
|
case 44:
|
|
return 32767
|
|
case 75:
|
|
return 16384
|
|
case 39:
|
|
return 1e3
|
|
case 89:
|
|
return 700
|
|
case 71:
|
|
return 256
|
|
case 40:
|
|
return 255
|
|
case 2:
|
|
return 100
|
|
case 180:
|
|
return 64
|
|
case 25:
|
|
return 20
|
|
case 5:
|
|
return 16
|
|
case 6:
|
|
return 6
|
|
case 73:
|
|
return 4
|
|
case 84: {
|
|
if (typeof navigator === 'object') {
|
|
return navigator.hardwareConcurrency || 1
|
|
}
|
|
return 1
|
|
}
|
|
}
|
|
setErrNo(28)
|
|
return -1
|
|
}
|
|
|
|
function _time (ptr) {
|
|
const ret = (Date.now() / 1e3) | 0
|
|
if (ptr) {
|
|
HEAP32[ptr >> 2] = ret
|
|
}
|
|
return ret
|
|
}
|
|
Module.requestFullscreen = function Module_requestFullscreen (
|
|
lockPointer,
|
|
resizeCanvas
|
|
) {
|
|
Browser.requestFullscreen(lockPointer, resizeCanvas)
|
|
}
|
|
Module.requestAnimationFrame = function Module_requestAnimationFrame (func) {
|
|
Browser.requestAnimationFrame(func)
|
|
}
|
|
Module.setCanvasSize = function Module_setCanvasSize (
|
|
width,
|
|
height,
|
|
noUpdates
|
|
) {
|
|
Browser.setCanvasSize(width, height, noUpdates)
|
|
}
|
|
Module.pauseMainLoop = function Module_pauseMainLoop () {
|
|
Browser.mainLoop.pause()
|
|
}
|
|
Module.resumeMainLoop = function Module_resumeMainLoop () {
|
|
Browser.mainLoop.resume()
|
|
}
|
|
Module.getUserMedia = function Module_getUserMedia () {
|
|
Browser.getUserMedia()
|
|
}
|
|
Module.createContext = function Module_createContext (
|
|
canvas,
|
|
useWebGL,
|
|
setInModule,
|
|
webGLContextAttributes
|
|
) {
|
|
return Browser.createContext(
|
|
canvas,
|
|
useWebGL,
|
|
setInModule,
|
|
webGLContextAttributes
|
|
)
|
|
}
|
|
const FSNode = function (parent, name, mode, rdev) {
|
|
if (!parent) {
|
|
parent = this
|
|
}
|
|
this.parent = parent
|
|
this.mount = parent.mount
|
|
this.mounted = null
|
|
this.id = FS.nextInode++
|
|
this.name = name
|
|
this.mode = mode
|
|
this.node_ops = {}
|
|
this.stream_ops = {}
|
|
this.rdev = rdev
|
|
}
|
|
const readMode = 292 | 73
|
|
const writeMode = 146
|
|
Object.defineProperties(FSNode.prototype, {
|
|
read: {
|
|
get: function () {
|
|
return (this.mode & readMode) === readMode
|
|
},
|
|
set: function (val) {
|
|
val ? (this.mode |= readMode) : (this.mode &= ~readMode)
|
|
}
|
|
},
|
|
write: {
|
|
get: function () {
|
|
return (this.mode & writeMode) === writeMode
|
|
},
|
|
set: function (val) {
|
|
val ? (this.mode |= writeMode) : (this.mode &= ~writeMode)
|
|
}
|
|
},
|
|
isFolder: {
|
|
get: function () {
|
|
return FS.isDir(this.mode)
|
|
}
|
|
},
|
|
isDevice: {
|
|
get: function () {
|
|
return FS.isChrdev(this.mode)
|
|
}
|
|
}
|
|
})
|
|
FS.FSNode = FSNode
|
|
FS.staticInit()
|
|
Module.FS_createFolder = FS.createFolder
|
|
Module.FS_createPath = FS.createPath
|
|
Module.FS_createDataFile = FS.createDataFile
|
|
Module.FS_createPreloadedFile = FS.createPreloadedFile
|
|
Module.FS_createLazyFile = FS.createLazyFile
|
|
Module.FS_createLink = FS.createLink
|
|
Module.FS_createDevice = FS.createDevice
|
|
Module.FS_unlink = FS.unlink
|
|
|
|
function intArrayFromString (stringy, dontAddNull, length) {
|
|
const len = length > 0 ? length : lengthBytesUTF8(stringy) + 1
|
|
const u8array = new Array(len)
|
|
const numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length)
|
|
if (dontAddNull) u8array.length = numBytesWritten
|
|
return u8array
|
|
}
|
|
var asmLibraryArg = {
|
|
a: ___assert_fail,
|
|
G: ___clock_gettime,
|
|
S: ___map_file,
|
|
J: ___sys_access,
|
|
F: ___sys_chmod,
|
|
d: ___sys_fcntl64,
|
|
D: ___sys_fstat64,
|
|
M: ___sys_getcwd,
|
|
T: ___sys_getdents64,
|
|
j: ___sys_getpid,
|
|
R: ___sys_ioctl,
|
|
I: ___sys_link,
|
|
C: ___sys_lstat64,
|
|
E: ___sys_mkdir,
|
|
B: ___sys_mprotect,
|
|
A: ___sys_munmap,
|
|
k: ___sys_open,
|
|
K: ___sys_read,
|
|
H: ___sys_readlink,
|
|
P: ___sys_rename,
|
|
O: ___sys_rmdir,
|
|
p: ___sys_stat64,
|
|
N: ___sys_symlink,
|
|
L: ___sys_unlink,
|
|
m: _abort,
|
|
r: _emscripten_get_now,
|
|
h: _emscripten_longjmp,
|
|
v: _emscripten_memcpy_big,
|
|
w: _emscripten_resize_heap,
|
|
y: _environ_get,
|
|
z: _environ_sizes_get,
|
|
i: _exit,
|
|
g: _fd_close,
|
|
x: _fd_fdstat_get,
|
|
Q: _fd_read,
|
|
u: _fd_seek,
|
|
l: _fd_write,
|
|
e: _getTempRet0,
|
|
U: _gettimeofday,
|
|
t: invoke_iii,
|
|
q: invoke_iiii,
|
|
s: invoke_iiiii,
|
|
V: invoke_vii,
|
|
memory: wasmMemory,
|
|
b: _roundf,
|
|
o: _saveSetjmp,
|
|
c: _setTempRet0,
|
|
W: _sysconf,
|
|
table: wasmTable,
|
|
f: _testSetjmp,
|
|
n: _time
|
|
}
|
|
const asm = createWasm()
|
|
Module.asm = asm
|
|
var ___wasm_call_ctors = (Module.___wasm_call_ctors = function () {
|
|
return (___wasm_call_ctors = Module.___wasm_call_ctors = Module.asm.X).apply(
|
|
null,
|
|
arguments
|
|
)
|
|
})
|
|
var _main = (Module._main = function () {
|
|
return (_main = Module._main = Module.asm.Y).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_Start_0 = (Module._emscripten_bind_ASS_Event_get_Start_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_Start_0 = Module._emscripten_bind_ASS_Event_get_Start_0 =
|
|
Module.asm.Z).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_Start_1 = (Module._emscripten_bind_ASS_Event_set_Start_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_Start_1 = Module._emscripten_bind_ASS_Event_set_Start_1 =
|
|
Module.asm._).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_Duration_0 = (Module._emscripten_bind_ASS_Event_get_Duration_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_Duration_0 = Module._emscripten_bind_ASS_Event_get_Duration_0 =
|
|
Module.asm.$).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_Duration_1 = (Module._emscripten_bind_ASS_Event_set_Duration_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_Duration_1 = Module._emscripten_bind_ASS_Event_set_Duration_1 =
|
|
Module.asm.aa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_ReadOrder_0 = (Module._emscripten_bind_ASS_Event_get_ReadOrder_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_ReadOrder_0 = Module._emscripten_bind_ASS_Event_get_ReadOrder_0 =
|
|
Module.asm.ba).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_ReadOrder_1 = (Module._emscripten_bind_ASS_Event_set_ReadOrder_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_ReadOrder_1 = Module._emscripten_bind_ASS_Event_set_ReadOrder_1 =
|
|
Module.asm.ca).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_Layer_0 = (Module._emscripten_bind_ASS_Event_get_Layer_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_Layer_0 = Module._emscripten_bind_ASS_Event_get_Layer_0 =
|
|
Module.asm.da).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_Layer_1 = (Module._emscripten_bind_ASS_Event_set_Layer_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_Layer_1 = Module._emscripten_bind_ASS_Event_set_Layer_1 =
|
|
Module.asm.ea).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_Style_0 = (Module._emscripten_bind_ASS_Event_get_Style_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_Style_0 = Module._emscripten_bind_ASS_Event_get_Style_0 =
|
|
Module.asm.fa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_Style_1 = (Module._emscripten_bind_ASS_Event_set_Style_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_Style_1 = Module._emscripten_bind_ASS_Event_set_Style_1 =
|
|
Module.asm.ga).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_Name_0 = (Module._emscripten_bind_ASS_Event_get_Name_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_Name_0 = Module._emscripten_bind_ASS_Event_get_Name_0 =
|
|
Module.asm.ha).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_Name_1 = (Module._emscripten_bind_ASS_Event_set_Name_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_Name_1 = Module._emscripten_bind_ASS_Event_set_Name_1 =
|
|
Module.asm.ia).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_MarginL_0 = (Module._emscripten_bind_ASS_Event_get_MarginL_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_MarginL_0 = Module._emscripten_bind_ASS_Event_get_MarginL_0 =
|
|
Module.asm.ja).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_MarginL_1 = (Module._emscripten_bind_ASS_Event_set_MarginL_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_MarginL_1 = Module._emscripten_bind_ASS_Event_set_MarginL_1 =
|
|
Module.asm.ka).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_MarginR_0 = (Module._emscripten_bind_ASS_Event_get_MarginR_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_MarginR_0 = Module._emscripten_bind_ASS_Event_get_MarginR_0 =
|
|
Module.asm.la).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_MarginR_1 = (Module._emscripten_bind_ASS_Event_set_MarginR_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_MarginR_1 = Module._emscripten_bind_ASS_Event_set_MarginR_1 =
|
|
Module.asm.ma).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_MarginV_0 = (Module._emscripten_bind_ASS_Event_get_MarginV_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_MarginV_0 = Module._emscripten_bind_ASS_Event_get_MarginV_0 =
|
|
Module.asm.na).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_MarginV_1 = (Module._emscripten_bind_ASS_Event_set_MarginV_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_MarginV_1 = Module._emscripten_bind_ASS_Event_set_MarginV_1 =
|
|
Module.asm.oa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_Effect_0 = (Module._emscripten_bind_ASS_Event_get_Effect_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_Effect_0 = Module._emscripten_bind_ASS_Event_get_Effect_0 =
|
|
Module.asm.pa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_Effect_1 = (Module._emscripten_bind_ASS_Event_set_Effect_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_Effect_1 = Module._emscripten_bind_ASS_Event_set_Effect_1 =
|
|
Module.asm.qa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_get_Text_0 = (Module._emscripten_bind_ASS_Event_get_Text_0 = function () {
|
|
return (_emscripten_bind_ASS_Event_get_Text_0 = Module._emscripten_bind_ASS_Event_get_Text_0 =
|
|
Module.asm.ra).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Event_set_Text_1 = (Module._emscripten_bind_ASS_Event_set_Text_1 = function () {
|
|
return (_emscripten_bind_ASS_Event_set_Text_1 = Module._emscripten_bind_ASS_Event_set_Text_1 =
|
|
Module.asm.sa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendResult_get_changed_0 = (Module._emscripten_bind_RenderBlendResult_get_changed_0 = function () {
|
|
return (_emscripten_bind_RenderBlendResult_get_changed_0 = Module._emscripten_bind_RenderBlendResult_get_changed_0 =
|
|
Module.asm.ta).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendResult_set_changed_1 = (Module._emscripten_bind_RenderBlendResult_set_changed_1 = function () {
|
|
return (_emscripten_bind_RenderBlendResult_set_changed_1 = Module._emscripten_bind_RenderBlendResult_set_changed_1 =
|
|
Module.asm.ua).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendResult_get_blend_time_0 = (Module._emscripten_bind_RenderBlendResult_get_blend_time_0 = function () {
|
|
return (_emscripten_bind_RenderBlendResult_get_blend_time_0 = Module._emscripten_bind_RenderBlendResult_get_blend_time_0 =
|
|
Module.asm.va).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendResult_set_blend_time_1 = (Module._emscripten_bind_RenderBlendResult_set_blend_time_1 = function () {
|
|
return (_emscripten_bind_RenderBlendResult_set_blend_time_1 = Module._emscripten_bind_RenderBlendResult_set_blend_time_1 =
|
|
Module.asm.wa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendResult_get_part_0 = (Module._emscripten_bind_RenderBlendResult_get_part_0 = function () {
|
|
return (_emscripten_bind_RenderBlendResult_get_part_0 = Module._emscripten_bind_RenderBlendResult_get_part_0 =
|
|
Module.asm.xa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendResult_set_part_1 = (Module._emscripten_bind_RenderBlendResult_set_part_1 = function () {
|
|
return (_emscripten_bind_RenderBlendResult_set_part_1 = Module._emscripten_bind_RenderBlendResult_set_part_1 =
|
|
Module.asm.ya).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_SubtitleOctopus_0 = (Module._emscripten_bind_SubtitleOctopus_SubtitleOctopus_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_SubtitleOctopus_0 = Module._emscripten_bind_SubtitleOctopus_SubtitleOctopus_0 =
|
|
Module.asm.za).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_setLogLevel_1 = (Module._emscripten_bind_SubtitleOctopus_setLogLevel_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_setLogLevel_1 = Module._emscripten_bind_SubtitleOctopus_setLogLevel_1 =
|
|
Module.asm.Aa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_setDropAnimations_1 = (Module._emscripten_bind_SubtitleOctopus_setDropAnimations_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_setDropAnimations_1 = Module._emscripten_bind_SubtitleOctopus_setDropAnimations_1 =
|
|
Module.asm.Ba).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_getDropAnimations_0 = (Module._emscripten_bind_SubtitleOctopus_getDropAnimations_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_getDropAnimations_0 = Module._emscripten_bind_SubtitleOctopus_getDropAnimations_0 =
|
|
Module.asm.Ca).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_initLibrary_2 = (Module._emscripten_bind_SubtitleOctopus_initLibrary_2 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_initLibrary_2 = Module._emscripten_bind_SubtitleOctopus_initLibrary_2 =
|
|
Module.asm.Da).apply(null, arguments)
|
|
})
|
|
var _free = (Module._free = function () {
|
|
return (_free = Module._free = Module.asm.Ea).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_createTrack_1 = (Module._emscripten_bind_SubtitleOctopus_createTrack_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_createTrack_1 = Module._emscripten_bind_SubtitleOctopus_createTrack_1 =
|
|
Module.asm.Fa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_createTrackMem_2 = (Module._emscripten_bind_SubtitleOctopus_createTrackMem_2 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_createTrackMem_2 = Module._emscripten_bind_SubtitleOctopus_createTrackMem_2 =
|
|
Module.asm.Ga).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_removeTrack_0 = (Module._emscripten_bind_SubtitleOctopus_removeTrack_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_removeTrack_0 = Module._emscripten_bind_SubtitleOctopus_removeTrack_0 =
|
|
Module.asm.Ha).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_resizeCanvas_2 = (Module._emscripten_bind_SubtitleOctopus_resizeCanvas_2 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_resizeCanvas_2 = Module._emscripten_bind_SubtitleOctopus_resizeCanvas_2 =
|
|
Module.asm.Ia).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_renderImage_2 = (Module._emscripten_bind_SubtitleOctopus_renderImage_2 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_renderImage_2 = Module._emscripten_bind_SubtitleOctopus_renderImage_2 =
|
|
Module.asm.Ja).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_quitLibrary_0 = (Module._emscripten_bind_SubtitleOctopus_quitLibrary_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_quitLibrary_0 = Module._emscripten_bind_SubtitleOctopus_quitLibrary_0 =
|
|
Module.asm.Ka).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_reloadLibrary_0 = (Module._emscripten_bind_SubtitleOctopus_reloadLibrary_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_reloadLibrary_0 = Module._emscripten_bind_SubtitleOctopus_reloadLibrary_0 =
|
|
Module.asm.La).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_reloadFonts_0 = (Module._emscripten_bind_SubtitleOctopus_reloadFonts_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_reloadFonts_0 = Module._emscripten_bind_SubtitleOctopus_reloadFonts_0 =
|
|
Module.asm.Ma).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_setMargin_4 = (Module._emscripten_bind_SubtitleOctopus_setMargin_4 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_setMargin_4 = Module._emscripten_bind_SubtitleOctopus_setMargin_4 =
|
|
Module.asm.Na).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_getEventCount_0 = (Module._emscripten_bind_SubtitleOctopus_getEventCount_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_getEventCount_0 = Module._emscripten_bind_SubtitleOctopus_getEventCount_0 =
|
|
Module.asm.Oa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_allocEvent_0 = (Module._emscripten_bind_SubtitleOctopus_allocEvent_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_allocEvent_0 = Module._emscripten_bind_SubtitleOctopus_allocEvent_0 =
|
|
Module.asm.Pa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_allocStyle_0 = (Module._emscripten_bind_SubtitleOctopus_allocStyle_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_allocStyle_0 = Module._emscripten_bind_SubtitleOctopus_allocStyle_0 =
|
|
Module.asm.Qa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_removeEvent_1 = (Module._emscripten_bind_SubtitleOctopus_removeEvent_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_removeEvent_1 = Module._emscripten_bind_SubtitleOctopus_removeEvent_1 =
|
|
Module.asm.Ra).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_getStyleCount_0 = (Module._emscripten_bind_SubtitleOctopus_getStyleCount_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_getStyleCount_0 = Module._emscripten_bind_SubtitleOctopus_getStyleCount_0 =
|
|
Module.asm.Sa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_getStyleByName_1 = (Module._emscripten_bind_SubtitleOctopus_getStyleByName_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_getStyleByName_1 = Module._emscripten_bind_SubtitleOctopus_getStyleByName_1 =
|
|
Module.asm.Ta).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_removeStyle_1 = (Module._emscripten_bind_SubtitleOctopus_removeStyle_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_removeStyle_1 = Module._emscripten_bind_SubtitleOctopus_removeStyle_1 =
|
|
Module.asm.Ua).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_removeAllEvents_0 = (Module._emscripten_bind_SubtitleOctopus_removeAllEvents_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_removeAllEvents_0 = Module._emscripten_bind_SubtitleOctopus_removeAllEvents_0 =
|
|
Module.asm.Va).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_setMemoryLimits_2 = (Module._emscripten_bind_SubtitleOctopus_setMemoryLimits_2 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_setMemoryLimits_2 = Module._emscripten_bind_SubtitleOctopus_setMemoryLimits_2 =
|
|
Module.asm.Wa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_renderBlend_2 = (Module._emscripten_bind_SubtitleOctopus_renderBlend_2 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_renderBlend_2 = Module._emscripten_bind_SubtitleOctopus_renderBlend_2 =
|
|
Module.asm.Xa).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_findNextEventStart_1 = (Module._emscripten_bind_SubtitleOctopus_findNextEventStart_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_findNextEventStart_1 = Module._emscripten_bind_SubtitleOctopus_findNextEventStart_1 =
|
|
Module.asm.Ya).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_findEventStopTimes_1 = (Module._emscripten_bind_SubtitleOctopus_findEventStopTimes_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_findEventStopTimes_1 = Module._emscripten_bind_SubtitleOctopus_findEventStopTimes_1 =
|
|
Module.asm.Za).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_rescanAllAnimations_0 = (Module._emscripten_bind_SubtitleOctopus_rescanAllAnimations_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_rescanAllAnimations_0 = Module._emscripten_bind_SubtitleOctopus_rescanAllAnimations_0 =
|
|
Module.asm._a).apply(null, arguments)
|
|
})
|
|
var _malloc = (Module._malloc = function () {
|
|
return (_malloc = Module._malloc = Module.asm.$a).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_get_track_0 = (Module._emscripten_bind_SubtitleOctopus_get_track_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_get_track_0 = Module._emscripten_bind_SubtitleOctopus_get_track_0 =
|
|
Module.asm.ab).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_set_track_1 = (Module._emscripten_bind_SubtitleOctopus_set_track_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_set_track_1 = Module._emscripten_bind_SubtitleOctopus_set_track_1 =
|
|
Module.asm.bb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_get_ass_renderer_0 = (Module._emscripten_bind_SubtitleOctopus_get_ass_renderer_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_get_ass_renderer_0 = Module._emscripten_bind_SubtitleOctopus_get_ass_renderer_0 =
|
|
Module.asm.cb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_set_ass_renderer_1 = (Module._emscripten_bind_SubtitleOctopus_set_ass_renderer_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_set_ass_renderer_1 = Module._emscripten_bind_SubtitleOctopus_set_ass_renderer_1 =
|
|
Module.asm.db).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_get_ass_library_0 = (Module._emscripten_bind_SubtitleOctopus_get_ass_library_0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_get_ass_library_0 = Module._emscripten_bind_SubtitleOctopus_get_ass_library_0 =
|
|
Module.asm.eb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus_set_ass_library_1 = (Module._emscripten_bind_SubtitleOctopus_set_ass_library_1 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus_set_ass_library_1 = Module._emscripten_bind_SubtitleOctopus_set_ass_library_1 =
|
|
Module.asm.fb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_SubtitleOctopus___destroy___0 = (Module._emscripten_bind_SubtitleOctopus___destroy___0 = function () {
|
|
return (_emscripten_bind_SubtitleOctopus___destroy___0 = Module._emscripten_bind_SubtitleOctopus___destroy___0 =
|
|
Module.asm.gb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_n_styles_0 = (Module._emscripten_bind_ASS_Track_get_n_styles_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_n_styles_0 = Module._emscripten_bind_ASS_Track_get_n_styles_0 =
|
|
Module.asm.hb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_n_styles_1 = (Module._emscripten_bind_ASS_Track_set_n_styles_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_n_styles_1 = Module._emscripten_bind_ASS_Track_set_n_styles_1 =
|
|
Module.asm.ib).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_max_styles_0 = (Module._emscripten_bind_ASS_Track_get_max_styles_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_max_styles_0 = Module._emscripten_bind_ASS_Track_get_max_styles_0 =
|
|
Module.asm.jb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_max_styles_1 = (Module._emscripten_bind_ASS_Track_set_max_styles_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_max_styles_1 = Module._emscripten_bind_ASS_Track_set_max_styles_1 =
|
|
Module.asm.kb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_n_events_0 = (Module._emscripten_bind_ASS_Track_get_n_events_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_n_events_0 = Module._emscripten_bind_ASS_Track_get_n_events_0 =
|
|
Module.asm.lb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_n_events_1 = (Module._emscripten_bind_ASS_Track_set_n_events_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_n_events_1 = Module._emscripten_bind_ASS_Track_set_n_events_1 =
|
|
Module.asm.mb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_max_events_0 = (Module._emscripten_bind_ASS_Track_get_max_events_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_max_events_0 = Module._emscripten_bind_ASS_Track_get_max_events_0 =
|
|
Module.asm.nb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_max_events_1 = (Module._emscripten_bind_ASS_Track_set_max_events_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_max_events_1 = Module._emscripten_bind_ASS_Track_set_max_events_1 =
|
|
Module.asm.ob).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_styles_1 = (Module._emscripten_bind_ASS_Track_get_styles_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_styles_1 = Module._emscripten_bind_ASS_Track_get_styles_1 =
|
|
Module.asm.pb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_styles_2 = (Module._emscripten_bind_ASS_Track_set_styles_2 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_styles_2 = Module._emscripten_bind_ASS_Track_set_styles_2 =
|
|
Module.asm.qb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_events_1 = (Module._emscripten_bind_ASS_Track_get_events_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_events_1 = Module._emscripten_bind_ASS_Track_get_events_1 =
|
|
Module.asm.rb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_events_2 = (Module._emscripten_bind_ASS_Track_set_events_2 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_events_2 = Module._emscripten_bind_ASS_Track_set_events_2 =
|
|
Module.asm.sb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_style_format_0 = (Module._emscripten_bind_ASS_Track_get_style_format_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_style_format_0 = Module._emscripten_bind_ASS_Track_get_style_format_0 =
|
|
Module.asm.tb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_style_format_1 = (Module._emscripten_bind_ASS_Track_set_style_format_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_style_format_1 = Module._emscripten_bind_ASS_Track_set_style_format_1 =
|
|
Module.asm.ub).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_event_format_0 = (Module._emscripten_bind_ASS_Track_get_event_format_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_event_format_0 = Module._emscripten_bind_ASS_Track_get_event_format_0 =
|
|
Module.asm.vb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_event_format_1 = (Module._emscripten_bind_ASS_Track_set_event_format_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_event_format_1 = Module._emscripten_bind_ASS_Track_set_event_format_1 =
|
|
Module.asm.wb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_PlayResX_0 = (Module._emscripten_bind_ASS_Track_get_PlayResX_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_PlayResX_0 = Module._emscripten_bind_ASS_Track_get_PlayResX_0 =
|
|
Module.asm.xb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_PlayResX_1 = (Module._emscripten_bind_ASS_Track_set_PlayResX_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_PlayResX_1 = Module._emscripten_bind_ASS_Track_set_PlayResX_1 =
|
|
Module.asm.yb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_PlayResY_0 = (Module._emscripten_bind_ASS_Track_get_PlayResY_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_PlayResY_0 = Module._emscripten_bind_ASS_Track_get_PlayResY_0 =
|
|
Module.asm.zb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_PlayResY_1 = (Module._emscripten_bind_ASS_Track_set_PlayResY_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_PlayResY_1 = Module._emscripten_bind_ASS_Track_set_PlayResY_1 =
|
|
Module.asm.Ab).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_Timer_0 = (Module._emscripten_bind_ASS_Track_get_Timer_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_Timer_0 = Module._emscripten_bind_ASS_Track_get_Timer_0 =
|
|
Module.asm.Bb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_Timer_1 = (Module._emscripten_bind_ASS_Track_set_Timer_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_Timer_1 = Module._emscripten_bind_ASS_Track_set_Timer_1 =
|
|
Module.asm.Cb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_WrapStyle_0 = (Module._emscripten_bind_ASS_Track_get_WrapStyle_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_WrapStyle_0 = Module._emscripten_bind_ASS_Track_get_WrapStyle_0 =
|
|
Module.asm.Db).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_WrapStyle_1 = (Module._emscripten_bind_ASS_Track_set_WrapStyle_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_WrapStyle_1 = Module._emscripten_bind_ASS_Track_set_WrapStyle_1 =
|
|
Module.asm.Eb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_ScaledBorderAndShadow_0 = (Module._emscripten_bind_ASS_Track_get_ScaledBorderAndShadow_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_ScaledBorderAndShadow_0 = Module._emscripten_bind_ASS_Track_get_ScaledBorderAndShadow_0 =
|
|
Module.asm.Fb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_ScaledBorderAndShadow_1 = (Module._emscripten_bind_ASS_Track_set_ScaledBorderAndShadow_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_ScaledBorderAndShadow_1 = Module._emscripten_bind_ASS_Track_set_ScaledBorderAndShadow_1 =
|
|
Module.asm.Gb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_Kerning_0 = (Module._emscripten_bind_ASS_Track_get_Kerning_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_Kerning_0 = Module._emscripten_bind_ASS_Track_get_Kerning_0 =
|
|
Module.asm.Hb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_Kerning_1 = (Module._emscripten_bind_ASS_Track_set_Kerning_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_Kerning_1 = Module._emscripten_bind_ASS_Track_set_Kerning_1 =
|
|
Module.asm.Ib).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_Language_0 = (Module._emscripten_bind_ASS_Track_get_Language_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_Language_0 = Module._emscripten_bind_ASS_Track_get_Language_0 =
|
|
Module.asm.Jb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_Language_1 = (Module._emscripten_bind_ASS_Track_set_Language_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_Language_1 = Module._emscripten_bind_ASS_Track_set_Language_1 =
|
|
Module.asm.Kb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_default_style_0 = (Module._emscripten_bind_ASS_Track_get_default_style_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_default_style_0 = Module._emscripten_bind_ASS_Track_get_default_style_0 =
|
|
Module.asm.Lb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_default_style_1 = (Module._emscripten_bind_ASS_Track_set_default_style_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_default_style_1 = Module._emscripten_bind_ASS_Track_set_default_style_1 =
|
|
Module.asm.Mb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_get_name_0 = (Module._emscripten_bind_ASS_Track_get_name_0 = function () {
|
|
return (_emscripten_bind_ASS_Track_get_name_0 = Module._emscripten_bind_ASS_Track_get_name_0 =
|
|
Module.asm.Nb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Track_set_name_1 = (Module._emscripten_bind_ASS_Track_set_name_1 = function () {
|
|
return (_emscripten_bind_ASS_Track_set_name_1 = Module._emscripten_bind_ASS_Track_set_name_1 =
|
|
Module.asm.Ob).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Name_0 = (Module._emscripten_bind_ASS_Style_get_Name_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Name_0 = Module._emscripten_bind_ASS_Style_get_Name_0 =
|
|
Module.asm.Pb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Name_1 = (Module._emscripten_bind_ASS_Style_set_Name_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Name_1 = Module._emscripten_bind_ASS_Style_set_Name_1 =
|
|
Module.asm.Qb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_FontName_0 = (Module._emscripten_bind_ASS_Style_get_FontName_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_FontName_0 = Module._emscripten_bind_ASS_Style_get_FontName_0 =
|
|
Module.asm.Rb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_FontName_1 = (Module._emscripten_bind_ASS_Style_set_FontName_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_FontName_1 = Module._emscripten_bind_ASS_Style_set_FontName_1 =
|
|
Module.asm.Sb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_FontSize_0 = (Module._emscripten_bind_ASS_Style_get_FontSize_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_FontSize_0 = Module._emscripten_bind_ASS_Style_get_FontSize_0 =
|
|
Module.asm.Tb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_FontSize_1 = (Module._emscripten_bind_ASS_Style_set_FontSize_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_FontSize_1 = Module._emscripten_bind_ASS_Style_set_FontSize_1 =
|
|
Module.asm.Ub).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_PrimaryColour_0 = (Module._emscripten_bind_ASS_Style_get_PrimaryColour_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_PrimaryColour_0 = Module._emscripten_bind_ASS_Style_get_PrimaryColour_0 =
|
|
Module.asm.Vb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_PrimaryColour_1 = (Module._emscripten_bind_ASS_Style_set_PrimaryColour_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_PrimaryColour_1 = Module._emscripten_bind_ASS_Style_set_PrimaryColour_1 =
|
|
Module.asm.Wb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_SecondaryColour_0 = (Module._emscripten_bind_ASS_Style_get_SecondaryColour_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_SecondaryColour_0 = Module._emscripten_bind_ASS_Style_get_SecondaryColour_0 =
|
|
Module.asm.Xb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_SecondaryColour_1 = (Module._emscripten_bind_ASS_Style_set_SecondaryColour_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_SecondaryColour_1 = Module._emscripten_bind_ASS_Style_set_SecondaryColour_1 =
|
|
Module.asm.Yb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_OutlineColour_0 = (Module._emscripten_bind_ASS_Style_get_OutlineColour_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_OutlineColour_0 = Module._emscripten_bind_ASS_Style_get_OutlineColour_0 =
|
|
Module.asm.Zb).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_OutlineColour_1 = (Module._emscripten_bind_ASS_Style_set_OutlineColour_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_OutlineColour_1 = Module._emscripten_bind_ASS_Style_set_OutlineColour_1 =
|
|
Module.asm._b).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_BackColour_0 = (Module._emscripten_bind_ASS_Style_get_BackColour_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_BackColour_0 = Module._emscripten_bind_ASS_Style_get_BackColour_0 =
|
|
Module.asm.$b).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_BackColour_1 = (Module._emscripten_bind_ASS_Style_set_BackColour_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_BackColour_1 = Module._emscripten_bind_ASS_Style_set_BackColour_1 =
|
|
Module.asm.ac).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Bold_0 = (Module._emscripten_bind_ASS_Style_get_Bold_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Bold_0 = Module._emscripten_bind_ASS_Style_get_Bold_0 =
|
|
Module.asm.bc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Bold_1 = (Module._emscripten_bind_ASS_Style_set_Bold_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Bold_1 = Module._emscripten_bind_ASS_Style_set_Bold_1 =
|
|
Module.asm.cc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Italic_0 = (Module._emscripten_bind_ASS_Style_get_Italic_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Italic_0 = Module._emscripten_bind_ASS_Style_get_Italic_0 =
|
|
Module.asm.dc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Italic_1 = (Module._emscripten_bind_ASS_Style_set_Italic_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Italic_1 = Module._emscripten_bind_ASS_Style_set_Italic_1 =
|
|
Module.asm.ec).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Underline_0 = (Module._emscripten_bind_ASS_Style_get_Underline_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Underline_0 = Module._emscripten_bind_ASS_Style_get_Underline_0 =
|
|
Module.asm.fc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Underline_1 = (Module._emscripten_bind_ASS_Style_set_Underline_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Underline_1 = Module._emscripten_bind_ASS_Style_set_Underline_1 =
|
|
Module.asm.gc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_StrikeOut_0 = (Module._emscripten_bind_ASS_Style_get_StrikeOut_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_StrikeOut_0 = Module._emscripten_bind_ASS_Style_get_StrikeOut_0 =
|
|
Module.asm.hc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_StrikeOut_1 = (Module._emscripten_bind_ASS_Style_set_StrikeOut_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_StrikeOut_1 = Module._emscripten_bind_ASS_Style_set_StrikeOut_1 =
|
|
Module.asm.ic).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_ScaleX_0 = (Module._emscripten_bind_ASS_Style_get_ScaleX_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_ScaleX_0 = Module._emscripten_bind_ASS_Style_get_ScaleX_0 =
|
|
Module.asm.jc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_ScaleX_1 = (Module._emscripten_bind_ASS_Style_set_ScaleX_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_ScaleX_1 = Module._emscripten_bind_ASS_Style_set_ScaleX_1 =
|
|
Module.asm.kc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_ScaleY_0 = (Module._emscripten_bind_ASS_Style_get_ScaleY_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_ScaleY_0 = Module._emscripten_bind_ASS_Style_get_ScaleY_0 =
|
|
Module.asm.lc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_ScaleY_1 = (Module._emscripten_bind_ASS_Style_set_ScaleY_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_ScaleY_1 = Module._emscripten_bind_ASS_Style_set_ScaleY_1 =
|
|
Module.asm.mc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Spacing_0 = (Module._emscripten_bind_ASS_Style_get_Spacing_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Spacing_0 = Module._emscripten_bind_ASS_Style_get_Spacing_0 =
|
|
Module.asm.nc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Spacing_1 = (Module._emscripten_bind_ASS_Style_set_Spacing_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Spacing_1 = Module._emscripten_bind_ASS_Style_set_Spacing_1 =
|
|
Module.asm.oc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Angle_0 = (Module._emscripten_bind_ASS_Style_get_Angle_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Angle_0 = Module._emscripten_bind_ASS_Style_get_Angle_0 =
|
|
Module.asm.pc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Angle_1 = (Module._emscripten_bind_ASS_Style_set_Angle_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Angle_1 = Module._emscripten_bind_ASS_Style_set_Angle_1 =
|
|
Module.asm.qc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_BorderStyle_0 = (Module._emscripten_bind_ASS_Style_get_BorderStyle_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_BorderStyle_0 = Module._emscripten_bind_ASS_Style_get_BorderStyle_0 =
|
|
Module.asm.rc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_BorderStyle_1 = (Module._emscripten_bind_ASS_Style_set_BorderStyle_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_BorderStyle_1 = Module._emscripten_bind_ASS_Style_set_BorderStyle_1 =
|
|
Module.asm.sc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Outline_0 = (Module._emscripten_bind_ASS_Style_get_Outline_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Outline_0 = Module._emscripten_bind_ASS_Style_get_Outline_0 =
|
|
Module.asm.tc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Outline_1 = (Module._emscripten_bind_ASS_Style_set_Outline_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Outline_1 = Module._emscripten_bind_ASS_Style_set_Outline_1 =
|
|
Module.asm.uc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Shadow_0 = (Module._emscripten_bind_ASS_Style_get_Shadow_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Shadow_0 = Module._emscripten_bind_ASS_Style_get_Shadow_0 =
|
|
Module.asm.vc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Shadow_1 = (Module._emscripten_bind_ASS_Style_set_Shadow_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Shadow_1 = Module._emscripten_bind_ASS_Style_set_Shadow_1 =
|
|
Module.asm.wc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Alignment_0 = (Module._emscripten_bind_ASS_Style_get_Alignment_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Alignment_0 = Module._emscripten_bind_ASS_Style_get_Alignment_0 =
|
|
Module.asm.xc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Alignment_1 = (Module._emscripten_bind_ASS_Style_set_Alignment_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Alignment_1 = Module._emscripten_bind_ASS_Style_set_Alignment_1 =
|
|
Module.asm.yc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_MarginL_0 = (Module._emscripten_bind_ASS_Style_get_MarginL_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_MarginL_0 = Module._emscripten_bind_ASS_Style_get_MarginL_0 =
|
|
Module.asm.zc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_MarginL_1 = (Module._emscripten_bind_ASS_Style_set_MarginL_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_MarginL_1 = Module._emscripten_bind_ASS_Style_set_MarginL_1 =
|
|
Module.asm.Ac).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_MarginR_0 = (Module._emscripten_bind_ASS_Style_get_MarginR_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_MarginR_0 = Module._emscripten_bind_ASS_Style_get_MarginR_0 =
|
|
Module.asm.Bc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_MarginR_1 = (Module._emscripten_bind_ASS_Style_set_MarginR_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_MarginR_1 = Module._emscripten_bind_ASS_Style_set_MarginR_1 =
|
|
Module.asm.Cc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_MarginV_0 = (Module._emscripten_bind_ASS_Style_get_MarginV_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_MarginV_0 = Module._emscripten_bind_ASS_Style_get_MarginV_0 =
|
|
Module.asm.Dc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_MarginV_1 = (Module._emscripten_bind_ASS_Style_set_MarginV_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_MarginV_1 = Module._emscripten_bind_ASS_Style_set_MarginV_1 =
|
|
Module.asm.Ec).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Encoding_0 = (Module._emscripten_bind_ASS_Style_get_Encoding_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Encoding_0 = Module._emscripten_bind_ASS_Style_get_Encoding_0 =
|
|
Module.asm.Fc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Encoding_1 = (Module._emscripten_bind_ASS_Style_set_Encoding_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Encoding_1 = Module._emscripten_bind_ASS_Style_set_Encoding_1 =
|
|
Module.asm.Gc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_treat_fontname_as_pattern_0 = (Module._emscripten_bind_ASS_Style_get_treat_fontname_as_pattern_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_treat_fontname_as_pattern_0 = Module._emscripten_bind_ASS_Style_get_treat_fontname_as_pattern_0 =
|
|
Module.asm.Hc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_treat_fontname_as_pattern_1 = (Module._emscripten_bind_ASS_Style_set_treat_fontname_as_pattern_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_treat_fontname_as_pattern_1 = Module._emscripten_bind_ASS_Style_set_treat_fontname_as_pattern_1 =
|
|
Module.asm.Ic).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Blur_0 = (Module._emscripten_bind_ASS_Style_get_Blur_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Blur_0 = Module._emscripten_bind_ASS_Style_get_Blur_0 =
|
|
Module.asm.Jc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Blur_1 = (Module._emscripten_bind_ASS_Style_set_Blur_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Blur_1 = Module._emscripten_bind_ASS_Style_set_Blur_1 =
|
|
Module.asm.Kc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_get_Justify_0 = (Module._emscripten_bind_ASS_Style_get_Justify_0 = function () {
|
|
return (_emscripten_bind_ASS_Style_get_Justify_0 = Module._emscripten_bind_ASS_Style_get_Justify_0 =
|
|
Module.asm.Lc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Style_set_Justify_1 = (Module._emscripten_bind_ASS_Style_set_Justify_1 = function () {
|
|
return (_emscripten_bind_ASS_Style_set_Justify_1 = Module._emscripten_bind_ASS_Style_set_Justify_1 =
|
|
Module.asm.Mc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_EventStopTimesResult_get_eventFinish_0 = (Module._emscripten_bind_EventStopTimesResult_get_eventFinish_0 = function () {
|
|
return (_emscripten_bind_EventStopTimesResult_get_eventFinish_0 = Module._emscripten_bind_EventStopTimesResult_get_eventFinish_0 =
|
|
Module.asm.Nc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_EventStopTimesResult_set_eventFinish_1 = (Module._emscripten_bind_EventStopTimesResult_set_eventFinish_1 = function () {
|
|
return (_emscripten_bind_EventStopTimesResult_set_eventFinish_1 = Module._emscripten_bind_EventStopTimesResult_set_eventFinish_1 =
|
|
Module.asm.Oc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_EventStopTimesResult_get_emptyFinish_0 = (Module._emscripten_bind_EventStopTimesResult_get_emptyFinish_0 = function () {
|
|
return (_emscripten_bind_EventStopTimesResult_get_emptyFinish_0 = Module._emscripten_bind_EventStopTimesResult_get_emptyFinish_0 =
|
|
Module.asm.Pc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_EventStopTimesResult_set_emptyFinish_1 = (Module._emscripten_bind_EventStopTimesResult_set_emptyFinish_1 = function () {
|
|
return (_emscripten_bind_EventStopTimesResult_set_emptyFinish_1 = Module._emscripten_bind_EventStopTimesResult_set_emptyFinish_1 =
|
|
Module.asm.Qc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_EventStopTimesResult_get_is_animated_0 = (Module._emscripten_bind_EventStopTimesResult_get_is_animated_0 = function () {
|
|
return (_emscripten_bind_EventStopTimesResult_get_is_animated_0 = Module._emscripten_bind_EventStopTimesResult_get_is_animated_0 =
|
|
Module.asm.Rc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_EventStopTimesResult_set_is_animated_1 = (Module._emscripten_bind_EventStopTimesResult_set_is_animated_1 = function () {
|
|
return (_emscripten_bind_EventStopTimesResult_set_is_animated_1 = Module._emscripten_bind_EventStopTimesResult_set_is_animated_1 =
|
|
Module.asm.Sc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_get_w_0 = (Module._emscripten_bind_ASS_Image_get_w_0 = function () {
|
|
return (_emscripten_bind_ASS_Image_get_w_0 = Module._emscripten_bind_ASS_Image_get_w_0 =
|
|
Module.asm.Tc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_set_w_1 = (Module._emscripten_bind_ASS_Image_set_w_1 = function () {
|
|
return (_emscripten_bind_ASS_Image_set_w_1 = Module._emscripten_bind_ASS_Image_set_w_1 =
|
|
Module.asm.Uc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_get_h_0 = (Module._emscripten_bind_ASS_Image_get_h_0 = function () {
|
|
return (_emscripten_bind_ASS_Image_get_h_0 = Module._emscripten_bind_ASS_Image_get_h_0 =
|
|
Module.asm.Vc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_set_h_1 = (Module._emscripten_bind_ASS_Image_set_h_1 = function () {
|
|
return (_emscripten_bind_ASS_Image_set_h_1 = Module._emscripten_bind_ASS_Image_set_h_1 =
|
|
Module.asm.Wc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_get_stride_0 = (Module._emscripten_bind_ASS_Image_get_stride_0 = function () {
|
|
return (_emscripten_bind_ASS_Image_get_stride_0 = Module._emscripten_bind_ASS_Image_get_stride_0 =
|
|
Module.asm.Xc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_set_stride_1 = (Module._emscripten_bind_ASS_Image_set_stride_1 = function () {
|
|
return (_emscripten_bind_ASS_Image_set_stride_1 = Module._emscripten_bind_ASS_Image_set_stride_1 =
|
|
Module.asm.Yc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_get_bitmap_0 = (Module._emscripten_bind_ASS_Image_get_bitmap_0 = function () {
|
|
return (_emscripten_bind_ASS_Image_get_bitmap_0 = Module._emscripten_bind_ASS_Image_get_bitmap_0 =
|
|
Module.asm.Zc).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_set_bitmap_1 = (Module._emscripten_bind_ASS_Image_set_bitmap_1 = function () {
|
|
return (_emscripten_bind_ASS_Image_set_bitmap_1 = Module._emscripten_bind_ASS_Image_set_bitmap_1 =
|
|
Module.asm._c).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_get_color_0 = (Module._emscripten_bind_ASS_Image_get_color_0 = function () {
|
|
return (_emscripten_bind_ASS_Image_get_color_0 = Module._emscripten_bind_ASS_Image_get_color_0 =
|
|
Module.asm.$c).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_set_color_1 = (Module._emscripten_bind_ASS_Image_set_color_1 = function () {
|
|
return (_emscripten_bind_ASS_Image_set_color_1 = Module._emscripten_bind_ASS_Image_set_color_1 =
|
|
Module.asm.ad).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_get_dst_x_0 = (Module._emscripten_bind_ASS_Image_get_dst_x_0 = function () {
|
|
return (_emscripten_bind_ASS_Image_get_dst_x_0 = Module._emscripten_bind_ASS_Image_get_dst_x_0 =
|
|
Module.asm.bd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_set_dst_x_1 = (Module._emscripten_bind_ASS_Image_set_dst_x_1 = function () {
|
|
return (_emscripten_bind_ASS_Image_set_dst_x_1 = Module._emscripten_bind_ASS_Image_set_dst_x_1 =
|
|
Module.asm.cd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_get_dst_y_0 = (Module._emscripten_bind_ASS_Image_get_dst_y_0 = function () {
|
|
return (_emscripten_bind_ASS_Image_get_dst_y_0 = Module._emscripten_bind_ASS_Image_get_dst_y_0 =
|
|
Module.asm.dd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_set_dst_y_1 = (Module._emscripten_bind_ASS_Image_set_dst_y_1 = function () {
|
|
return (_emscripten_bind_ASS_Image_set_dst_y_1 = Module._emscripten_bind_ASS_Image_set_dst_y_1 =
|
|
Module.asm.ed).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_get_next_0 = (Module._emscripten_bind_ASS_Image_get_next_0 = function () {
|
|
return (_emscripten_bind_ASS_Image_get_next_0 = Module._emscripten_bind_ASS_Image_get_next_0 =
|
|
Module.asm.fd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_ASS_Image_set_next_1 = (Module._emscripten_bind_ASS_Image_set_next_1 = function () {
|
|
return (_emscripten_bind_ASS_Image_set_next_1 = Module._emscripten_bind_ASS_Image_set_next_1 =
|
|
Module.asm.gd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_VoidPtr___destroy___0 = (Module._emscripten_bind_VoidPtr___destroy___0 = function () {
|
|
return (_emscripten_bind_VoidPtr___destroy___0 = Module._emscripten_bind_VoidPtr___destroy___0 =
|
|
Module.asm.hd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_get_dest_x_0 = (Module._emscripten_bind_RenderBlendPart_get_dest_x_0 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_get_dest_x_0 = Module._emscripten_bind_RenderBlendPart_get_dest_x_0 =
|
|
Module.asm.id).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_set_dest_x_1 = (Module._emscripten_bind_RenderBlendPart_set_dest_x_1 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_set_dest_x_1 = Module._emscripten_bind_RenderBlendPart_set_dest_x_1 =
|
|
Module.asm.jd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_get_dest_y_0 = (Module._emscripten_bind_RenderBlendPart_get_dest_y_0 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_get_dest_y_0 = Module._emscripten_bind_RenderBlendPart_get_dest_y_0 =
|
|
Module.asm.kd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_set_dest_y_1 = (Module._emscripten_bind_RenderBlendPart_set_dest_y_1 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_set_dest_y_1 = Module._emscripten_bind_RenderBlendPart_set_dest_y_1 =
|
|
Module.asm.ld).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_get_dest_width_0 = (Module._emscripten_bind_RenderBlendPart_get_dest_width_0 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_get_dest_width_0 = Module._emscripten_bind_RenderBlendPart_get_dest_width_0 =
|
|
Module.asm.md).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_set_dest_width_1 = (Module._emscripten_bind_RenderBlendPart_set_dest_width_1 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_set_dest_width_1 = Module._emscripten_bind_RenderBlendPart_set_dest_width_1 =
|
|
Module.asm.nd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_get_dest_height_0 = (Module._emscripten_bind_RenderBlendPart_get_dest_height_0 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_get_dest_height_0 = Module._emscripten_bind_RenderBlendPart_get_dest_height_0 =
|
|
Module.asm.od).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_set_dest_height_1 = (Module._emscripten_bind_RenderBlendPart_set_dest_height_1 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_set_dest_height_1 = Module._emscripten_bind_RenderBlendPart_set_dest_height_1 =
|
|
Module.asm.pd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_get_image_0 = (Module._emscripten_bind_RenderBlendPart_get_image_0 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_get_image_0 = Module._emscripten_bind_RenderBlendPart_get_image_0 =
|
|
Module.asm.qd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_set_image_1 = (Module._emscripten_bind_RenderBlendPart_set_image_1 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_set_image_1 = Module._emscripten_bind_RenderBlendPart_set_image_1 =
|
|
Module.asm.rd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_get_next_0 = (Module._emscripten_bind_RenderBlendPart_get_next_0 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_get_next_0 = Module._emscripten_bind_RenderBlendPart_get_next_0 =
|
|
Module.asm.sd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_RenderBlendPart_set_next_1 = (Module._emscripten_bind_RenderBlendPart_set_next_1 = function () {
|
|
return (_emscripten_bind_RenderBlendPart_set_next_1 = Module._emscripten_bind_RenderBlendPart_set_next_1 =
|
|
Module.asm.td).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_libass_0 = (Module._emscripten_bind_libass_libass_0 = function () {
|
|
return (_emscripten_bind_libass_libass_0 = Module._emscripten_bind_libass_libass_0 =
|
|
Module.asm.ud).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_library_version_0 = (Module._emscripten_bind_libass_oct_library_version_0 = function () {
|
|
return (_emscripten_bind_libass_oct_library_version_0 = Module._emscripten_bind_libass_oct_library_version_0 =
|
|
Module.asm.vd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_library_init_0 = (Module._emscripten_bind_libass_oct_library_init_0 = function () {
|
|
return (_emscripten_bind_libass_oct_library_init_0 = Module._emscripten_bind_libass_oct_library_init_0 =
|
|
Module.asm.wd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_library_done_1 = (Module._emscripten_bind_libass_oct_library_done_1 = function () {
|
|
return (_emscripten_bind_libass_oct_library_done_1 = Module._emscripten_bind_libass_oct_library_done_1 =
|
|
Module.asm.xd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_fonts_dir_2 = (Module._emscripten_bind_libass_oct_set_fonts_dir_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_fonts_dir_2 = Module._emscripten_bind_libass_oct_set_fonts_dir_2 =
|
|
Module.asm.yd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_extract_fonts_2 = (Module._emscripten_bind_libass_oct_set_extract_fonts_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_extract_fonts_2 = Module._emscripten_bind_libass_oct_set_extract_fonts_2 =
|
|
Module.asm.zd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_style_overrides_2 = (Module._emscripten_bind_libass_oct_set_style_overrides_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_style_overrides_2 = Module._emscripten_bind_libass_oct_set_style_overrides_2 =
|
|
Module.asm.Ad).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_process_force_style_1 = (Module._emscripten_bind_libass_oct_process_force_style_1 = function () {
|
|
return (_emscripten_bind_libass_oct_process_force_style_1 = Module._emscripten_bind_libass_oct_process_force_style_1 =
|
|
Module.asm.Bd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_renderer_init_1 = (Module._emscripten_bind_libass_oct_renderer_init_1 = function () {
|
|
return (_emscripten_bind_libass_oct_renderer_init_1 = Module._emscripten_bind_libass_oct_renderer_init_1 =
|
|
Module.asm.Cd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_renderer_done_1 = (Module._emscripten_bind_libass_oct_renderer_done_1 = function () {
|
|
return (_emscripten_bind_libass_oct_renderer_done_1 = Module._emscripten_bind_libass_oct_renderer_done_1 =
|
|
Module.asm.Dd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_frame_size_3 = (Module._emscripten_bind_libass_oct_set_frame_size_3 = function () {
|
|
return (_emscripten_bind_libass_oct_set_frame_size_3 = Module._emscripten_bind_libass_oct_set_frame_size_3 =
|
|
Module.asm.Ed).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_storage_size_3 = (Module._emscripten_bind_libass_oct_set_storage_size_3 = function () {
|
|
return (_emscripten_bind_libass_oct_set_storage_size_3 = Module._emscripten_bind_libass_oct_set_storage_size_3 =
|
|
Module.asm.Fd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_shaper_2 = (Module._emscripten_bind_libass_oct_set_shaper_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_shaper_2 = Module._emscripten_bind_libass_oct_set_shaper_2 =
|
|
Module.asm.Gd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_margins_5 = (Module._emscripten_bind_libass_oct_set_margins_5 = function () {
|
|
return (_emscripten_bind_libass_oct_set_margins_5 = Module._emscripten_bind_libass_oct_set_margins_5 =
|
|
Module.asm.Hd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_use_margins_2 = (Module._emscripten_bind_libass_oct_set_use_margins_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_use_margins_2 = Module._emscripten_bind_libass_oct_set_use_margins_2 =
|
|
Module.asm.Id).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_pixel_aspect_2 = (Module._emscripten_bind_libass_oct_set_pixel_aspect_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_pixel_aspect_2 = Module._emscripten_bind_libass_oct_set_pixel_aspect_2 =
|
|
Module.asm.Jd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_aspect_ratio_3 = (Module._emscripten_bind_libass_oct_set_aspect_ratio_3 = function () {
|
|
return (_emscripten_bind_libass_oct_set_aspect_ratio_3 = Module._emscripten_bind_libass_oct_set_aspect_ratio_3 =
|
|
Module.asm.Kd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_font_scale_2 = (Module._emscripten_bind_libass_oct_set_font_scale_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_font_scale_2 = Module._emscripten_bind_libass_oct_set_font_scale_2 =
|
|
Module.asm.Ld).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_hinting_2 = (Module._emscripten_bind_libass_oct_set_hinting_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_hinting_2 = Module._emscripten_bind_libass_oct_set_hinting_2 =
|
|
Module.asm.Md).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_line_spacing_2 = (Module._emscripten_bind_libass_oct_set_line_spacing_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_line_spacing_2 = Module._emscripten_bind_libass_oct_set_line_spacing_2 =
|
|
Module.asm.Nd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_line_position_2 = (Module._emscripten_bind_libass_oct_set_line_position_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_line_position_2 = Module._emscripten_bind_libass_oct_set_line_position_2 =
|
|
Module.asm.Od).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_fonts_6 = (Module._emscripten_bind_libass_oct_set_fonts_6 = function () {
|
|
return (_emscripten_bind_libass_oct_set_fonts_6 = Module._emscripten_bind_libass_oct_set_fonts_6 =
|
|
Module.asm.Pd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_selective_style_override_enabled_2 = (Module._emscripten_bind_libass_oct_set_selective_style_override_enabled_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_selective_style_override_enabled_2 = Module._emscripten_bind_libass_oct_set_selective_style_override_enabled_2 =
|
|
Module.asm.Qd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_selective_style_override_2 = (Module._emscripten_bind_libass_oct_set_selective_style_override_2 = function () {
|
|
return (_emscripten_bind_libass_oct_set_selective_style_override_2 = Module._emscripten_bind_libass_oct_set_selective_style_override_2 =
|
|
Module.asm.Rd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_set_cache_limits_3 = (Module._emscripten_bind_libass_oct_set_cache_limits_3 = function () {
|
|
return (_emscripten_bind_libass_oct_set_cache_limits_3 = Module._emscripten_bind_libass_oct_set_cache_limits_3 =
|
|
Module.asm.Sd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_render_frame_4 = (Module._emscripten_bind_libass_oct_render_frame_4 = function () {
|
|
return (_emscripten_bind_libass_oct_render_frame_4 = Module._emscripten_bind_libass_oct_render_frame_4 =
|
|
Module.asm.Td).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_new_track_1 = (Module._emscripten_bind_libass_oct_new_track_1 = function () {
|
|
return (_emscripten_bind_libass_oct_new_track_1 = Module._emscripten_bind_libass_oct_new_track_1 =
|
|
Module.asm.Ud).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_free_track_1 = (Module._emscripten_bind_libass_oct_free_track_1 = function () {
|
|
return (_emscripten_bind_libass_oct_free_track_1 = Module._emscripten_bind_libass_oct_free_track_1 =
|
|
Module.asm.Vd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_alloc_style_1 = (Module._emscripten_bind_libass_oct_alloc_style_1 = function () {
|
|
return (_emscripten_bind_libass_oct_alloc_style_1 = Module._emscripten_bind_libass_oct_alloc_style_1 =
|
|
Module.asm.Wd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_alloc_event_1 = (Module._emscripten_bind_libass_oct_alloc_event_1 = function () {
|
|
return (_emscripten_bind_libass_oct_alloc_event_1 = Module._emscripten_bind_libass_oct_alloc_event_1 =
|
|
Module.asm.Xd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_free_style_2 = (Module._emscripten_bind_libass_oct_free_style_2 = function () {
|
|
return (_emscripten_bind_libass_oct_free_style_2 = Module._emscripten_bind_libass_oct_free_style_2 =
|
|
Module.asm.Yd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_free_event_2 = (Module._emscripten_bind_libass_oct_free_event_2 = function () {
|
|
return (_emscripten_bind_libass_oct_free_event_2 = Module._emscripten_bind_libass_oct_free_event_2 =
|
|
Module.asm.Zd).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_flush_events_1 = (Module._emscripten_bind_libass_oct_flush_events_1 = function () {
|
|
return (_emscripten_bind_libass_oct_flush_events_1 = Module._emscripten_bind_libass_oct_flush_events_1 =
|
|
Module.asm._d).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_read_file_3 = (Module._emscripten_bind_libass_oct_read_file_3 = function () {
|
|
return (_emscripten_bind_libass_oct_read_file_3 = Module._emscripten_bind_libass_oct_read_file_3 =
|
|
Module.asm.$d).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_add_font_4 = (Module._emscripten_bind_libass_oct_add_font_4 = function () {
|
|
return (_emscripten_bind_libass_oct_add_font_4 = Module._emscripten_bind_libass_oct_add_font_4 =
|
|
Module.asm.ae).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_clear_fonts_1 = (Module._emscripten_bind_libass_oct_clear_fonts_1 = function () {
|
|
return (_emscripten_bind_libass_oct_clear_fonts_1 = Module._emscripten_bind_libass_oct_clear_fonts_1 =
|
|
Module.asm.be).apply(null, arguments)
|
|
})
|
|
var _emscripten_bind_libass_oct_step_sub_3 = (Module._emscripten_bind_libass_oct_step_sub_3 = function () {
|
|
return (_emscripten_bind_libass_oct_step_sub_3 = Module._emscripten_bind_libass_oct_step_sub_3 =
|
|
Module.asm.ce).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_Hinting_ASS_HINTING_NONE = (Module._emscripten_enum_ASS_Hinting_ASS_HINTING_NONE = function () {
|
|
return (_emscripten_enum_ASS_Hinting_ASS_HINTING_NONE = Module._emscripten_enum_ASS_Hinting_ASS_HINTING_NONE =
|
|
Module.asm.de).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_Hinting_ASS_HINTING_LIGHT = (Module._emscripten_enum_ASS_Hinting_ASS_HINTING_LIGHT = function () {
|
|
return (_emscripten_enum_ASS_Hinting_ASS_HINTING_LIGHT = Module._emscripten_enum_ASS_Hinting_ASS_HINTING_LIGHT =
|
|
Module.asm.ee).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_Hinting_ASS_HINTING_NORMAL = (Module._emscripten_enum_ASS_Hinting_ASS_HINTING_NORMAL = function () {
|
|
return (_emscripten_enum_ASS_Hinting_ASS_HINTING_NORMAL = Module._emscripten_enum_ASS_Hinting_ASS_HINTING_NORMAL =
|
|
Module.asm.fe).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_Hinting_ASS_HINTING_NATIVE = (Module._emscripten_enum_ASS_Hinting_ASS_HINTING_NATIVE = function () {
|
|
return (_emscripten_enum_ASS_Hinting_ASS_HINTING_NATIVE = Module._emscripten_enum_ASS_Hinting_ASS_HINTING_NATIVE =
|
|
Module.asm.ge).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_SIMPLE = (Module._emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_SIMPLE = function () {
|
|
return (_emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_SIMPLE = Module._emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_SIMPLE =
|
|
Module.asm.he).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_COMPLEX = (Module._emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_COMPLEX = function () {
|
|
return (_emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_COMPLEX = Module._emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_COMPLEX =
|
|
Module.asm.ie).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_DEFAULT = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_DEFAULT = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_DEFAULT = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_DEFAULT =
|
|
Module.asm.je).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_STYLE = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_STYLE = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_STYLE = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_STYLE =
|
|
Module.asm.ke).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE =
|
|
Module.asm.le).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE =
|
|
Module.asm.me).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE_FIELDS = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE_FIELDS = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE_FIELDS = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE_FIELDS =
|
|
Module.asm.ne).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_NAME = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_NAME = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_NAME = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_NAME =
|
|
Module.asm.oe).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_COLORS = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_COLORS = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_COLORS = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_COLORS =
|
|
Module.asm.pe).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ATTRIBUTES = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ATTRIBUTES = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ATTRIBUTES = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ATTRIBUTES =
|
|
Module.asm.qe).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_BORDER = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_BORDER = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_BORDER = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_BORDER =
|
|
Module.asm.re).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ALIGNMENT = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ALIGNMENT = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ALIGNMENT = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ALIGNMENT =
|
|
Module.asm.se).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_MARGINS = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_MARGINS = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_MARGINS = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_MARGINS =
|
|
Module.asm.te).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_FULL_STYLE = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_FULL_STYLE = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_FULL_STYLE = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_FULL_STYLE =
|
|
Module.asm.ue).apply(null, arguments)
|
|
})
|
|
var _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_JUSTIFY = (Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_JUSTIFY = function () {
|
|
return (_emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_JUSTIFY = Module._emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_JUSTIFY =
|
|
Module.asm.ve).apply(null, arguments)
|
|
})
|
|
var _realloc = (Module._realloc = function () {
|
|
return (_realloc = Module._realloc = Module.asm.we).apply(null, arguments)
|
|
})
|
|
var ___errno_location = (Module.___errno_location = function () {
|
|
return (___errno_location = Module.___errno_location = Module.asm.xe).apply(
|
|
null,
|
|
arguments
|
|
)
|
|
})
|
|
var _setThrew = (Module._setThrew = function () {
|
|
return (_setThrew = Module._setThrew = Module.asm.ye).apply(null, arguments)
|
|
})
|
|
var dynCall_v = (Module.dynCall_v = function () {
|
|
return (dynCall_v = Module.dynCall_v = Module.asm.ze).apply(null, arguments)
|
|
})
|
|
var dynCall_vii = (Module.dynCall_vii = function () {
|
|
return (dynCall_vii = Module.dynCall_vii = Module.asm.Ae).apply(
|
|
null,
|
|
arguments
|
|
)
|
|
})
|
|
var dynCall_iii = (Module.dynCall_iii = function () {
|
|
return (dynCall_iii = Module.dynCall_iii = Module.asm.Be).apply(
|
|
null,
|
|
arguments
|
|
)
|
|
})
|
|
var dynCall_iiii = (Module.dynCall_iiii = function () {
|
|
return (dynCall_iiii = Module.dynCall_iiii = Module.asm.Ce).apply(
|
|
null,
|
|
arguments
|
|
)
|
|
})
|
|
var dynCall_iiiii = (Module.dynCall_iiiii = function () {
|
|
return (dynCall_iiiii = Module.dynCall_iiiii = Module.asm.De).apply(
|
|
null,
|
|
arguments
|
|
)
|
|
})
|
|
var stackSave = (Module.stackSave = function () {
|
|
return (stackSave = Module.stackSave = Module.asm.Ee).apply(null, arguments)
|
|
})
|
|
var stackAlloc = (Module.stackAlloc = function () {
|
|
return (stackAlloc = Module.stackAlloc = Module.asm.Fe).apply(null, arguments)
|
|
})
|
|
var stackRestore = (Module.stackRestore = function () {
|
|
return (stackRestore = Module.stackRestore = Module.asm.Ge).apply(
|
|
null,
|
|
arguments
|
|
)
|
|
})
|
|
var dynCall_vi = (Module.dynCall_vi = function () {
|
|
return (dynCall_vi = Module.dynCall_vi = Module.asm.He).apply(null, arguments)
|
|
})
|
|
|
|
function invoke_iii (index, a1, a2) {
|
|
const sp = stackSave()
|
|
try {
|
|
return dynCall_iii(index, a1, a2)
|
|
} catch (e) {
|
|
stackRestore(sp)
|
|
if (e !== e + 0 && e !== 'longjmp') throw e
|
|
_setThrew(1, 0)
|
|
}
|
|
}
|
|
|
|
function invoke_iiiii (index, a1, a2, a3, a4) {
|
|
const sp = stackSave()
|
|
try {
|
|
return dynCall_iiiii(index, a1, a2, a3, a4)
|
|
} catch (e) {
|
|
stackRestore(sp)
|
|
if (e !== e + 0 && e !== 'longjmp') throw e
|
|
_setThrew(1, 0)
|
|
}
|
|
}
|
|
|
|
function invoke_iiii (index, a1, a2, a3) {
|
|
const sp = stackSave()
|
|
try {
|
|
return dynCall_iiii(index, a1, a2, a3)
|
|
} catch (e) {
|
|
stackRestore(sp)
|
|
if (e !== e + 0 && e !== 'longjmp') throw e
|
|
_setThrew(1, 0)
|
|
}
|
|
}
|
|
|
|
function invoke_vii (index, a1, a2) {
|
|
const sp = stackSave()
|
|
try {
|
|
dynCall_vii(index, a1, a2)
|
|
} catch (e) {
|
|
stackRestore(sp)
|
|
if (e !== e + 0 && e !== 'longjmp') throw e
|
|
_setThrew(1, 0)
|
|
}
|
|
}
|
|
Module.asm = asm
|
|
Module.ccall = ccall
|
|
Module.cwrap = cwrap
|
|
Module.getValue = getValue
|
|
Module.getMemory = getMemory
|
|
Module.addRunDependency = addRunDependency
|
|
Module.removeRunDependency = removeRunDependency
|
|
Module.FS_createFolder = FS.createFolder
|
|
Module.FS_createPath = FS.createPath
|
|
Module.FS_createDataFile = FS.createDataFile
|
|
Module.FS_createPreloadedFile = FS.createPreloadedFile
|
|
Module.FS_createLazyFile = FS.createLazyFile
|
|
Module.FS_createLink = FS.createLink
|
|
Module.FS_createDevice = FS.createDevice
|
|
Module.FS_unlink = FS.unlink
|
|
let calledRun
|
|
|
|
function ExitStatus (status) {
|
|
this.name = 'ExitStatus'
|
|
this.message = 'Program terminated with exit(' + status + ')'
|
|
this.status = status
|
|
}
|
|
let calledMain = false
|
|
dependenciesFulfilled = function runCaller () {
|
|
if (!calledRun) run()
|
|
if (!calledRun) dependenciesFulfilled = runCaller
|
|
}
|
|
|
|
function callMain (args) {
|
|
const entryFunction = Module._main
|
|
args = args || []
|
|
const argc = args.length + 1
|
|
const argv = stackAlloc((argc + 1) * 4)
|
|
HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram)
|
|
for (let i = 1; i < argc; i++) {
|
|
HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1])
|
|
}
|
|
HEAP32[(argv >> 2) + argc] = 0
|
|
try {
|
|
const ret = entryFunction(argc, argv)
|
|
exit(ret, true)
|
|
} catch (e) {
|
|
if (e instanceof ExitStatus) {
|
|
return
|
|
} else if (e == 'unwind') {
|
|
noExitRuntime = true
|
|
return
|
|
} else {
|
|
let toLog = e
|
|
if (e && typeof e === 'object' && e.stack) {
|
|
toLog = [e, e.stack]
|
|
}
|
|
err('exception thrown: ' + toLog)
|
|
quit_(1, e)
|
|
}
|
|
} finally {
|
|
calledMain = true
|
|
}
|
|
}
|
|
|
|
function run (args) {
|
|
args = args || arguments_
|
|
if (runDependencies > 0) {
|
|
return
|
|
}
|
|
preRun()
|
|
if (runDependencies > 0) return
|
|
|
|
function doRun () {
|
|
if (calledRun) return
|
|
calledRun = true
|
|
Module.calledRun = true
|
|
if (ABORT) return
|
|
initRuntime()
|
|
preMain()
|
|
if (Module.onRuntimeInitialized) Module.onRuntimeInitialized()
|
|
if (shouldRunNow) callMain(args)
|
|
postRun()
|
|
}
|
|
if (Module.setStatus) {
|
|
Module.setStatus('Running...')
|
|
setTimeout(function () {
|
|
setTimeout(function () {
|
|
Module.setStatus('')
|
|
}, 1)
|
|
doRun()
|
|
}, 1)
|
|
} else {
|
|
doRun()
|
|
}
|
|
}
|
|
Module.run = run
|
|
|
|
function exit (status, implicit) {
|
|
if (implicit && noExitRuntime && status === 0) {
|
|
return
|
|
}
|
|
if (noExitRuntime) {
|
|
} else {
|
|
ABORT = true
|
|
EXITSTATUS = status
|
|
exitRuntime()
|
|
if (Module.onExit) Module.onExit(status)
|
|
}
|
|
quit_(status, new ExitStatus(status))
|
|
}
|
|
if (Module.preInit) {
|
|
if (typeof Module.preInit === 'function') Module.preInit = [Module.preInit]
|
|
while (Module.preInit.length > 0) {
|
|
Module.preInit.pop()()
|
|
}
|
|
}
|
|
var shouldRunNow = true
|
|
if (Module.noInitialRun) shouldRunNow = false
|
|
noExitRuntime = true
|
|
run()
|
|
|
|
function WrapperObject () {}
|
|
WrapperObject.prototype = Object.create(WrapperObject.prototype)
|
|
WrapperObject.prototype.constructor = WrapperObject
|
|
WrapperObject.prototype.__class__ = WrapperObject
|
|
WrapperObject.__cache__ = {}
|
|
Module.WrapperObject = WrapperObject
|
|
|
|
function getCache (__class__) {
|
|
return (__class__ || WrapperObject).__cache__
|
|
}
|
|
Module.getCache = getCache
|
|
|
|
function wrapPointer (ptr, __class__) {
|
|
const cache = getCache(__class__)
|
|
let ret = cache[ptr]
|
|
if (ret) return ret
|
|
ret = Object.create((__class__ || WrapperObject).prototype)
|
|
ret.ptr = ptr
|
|
return (cache[ptr] = ret)
|
|
}
|
|
Module.wrapPointer = wrapPointer
|
|
|
|
function castObject (obj, __class__) {
|
|
return wrapPointer(obj.ptr, __class__)
|
|
}
|
|
Module.castObject = castObject
|
|
Module.NULL = wrapPointer(0)
|
|
|
|
function destroy (obj) {
|
|
if (!obj.__destroy__) {
|
|
throw 'Error: Cannot destroy object. (Did you create it yourself?)'
|
|
}
|
|
obj.__destroy__()
|
|
delete getCache(obj.__class__)[obj.ptr]
|
|
}
|
|
Module.destroy = destroy
|
|
|
|
function compare (obj1, obj2) {
|
|
return obj1.ptr === obj2.ptr
|
|
}
|
|
Module.compare = compare
|
|
|
|
function getPointer (obj) {
|
|
return obj.ptr
|
|
}
|
|
Module.getPointer = getPointer
|
|
|
|
function getClass (obj) {
|
|
return obj.__class__
|
|
}
|
|
Module.getClass = getClass
|
|
var ensureCache = {
|
|
buffer: 0,
|
|
size: 0,
|
|
pos: 0,
|
|
temps: [],
|
|
needed: 0,
|
|
prepare: function () {
|
|
if (ensureCache.needed) {
|
|
for (let i = 0; i < ensureCache.temps.length; i++) {
|
|
Module._free(ensureCache.temps[i])
|
|
}
|
|
ensureCache.temps.length = 0
|
|
Module._free(ensureCache.buffer)
|
|
ensureCache.buffer = 0
|
|
ensureCache.size += ensureCache.needed
|
|
ensureCache.needed = 0
|
|
}
|
|
if (!ensureCache.buffer) {
|
|
ensureCache.size += 128
|
|
ensureCache.buffer = Module._malloc(ensureCache.size)
|
|
assert(ensureCache.buffer)
|
|
}
|
|
ensureCache.pos = 0
|
|
},
|
|
alloc: function (array, view) {
|
|
assert(ensureCache.buffer)
|
|
const bytes = view.BYTES_PER_ELEMENT
|
|
let len = array.length * bytes
|
|
len = (len + 7) & -8
|
|
let ret
|
|
if (ensureCache.pos + len >= ensureCache.size) {
|
|
assert(len > 0)
|
|
ensureCache.needed += len
|
|
ret = Module._malloc(len)
|
|
ensureCache.temps.push(ret)
|
|
} else {
|
|
ret = ensureCache.buffer + ensureCache.pos
|
|
ensureCache.pos += len
|
|
}
|
|
return ret
|
|
},
|
|
copy: function (array, view, offset) {
|
|
let offsetShifted = offset
|
|
const bytes = view.BYTES_PER_ELEMENT
|
|
switch (bytes) {
|
|
case 2:
|
|
offsetShifted >>= 1
|
|
break
|
|
case 4:
|
|
offsetShifted >>= 2
|
|
break
|
|
case 8:
|
|
offsetShifted >>= 3
|
|
break
|
|
}
|
|
for (let i = 0; i < array.length; i++) {
|
|
view[offsetShifted + i] = array[i]
|
|
}
|
|
}
|
|
}
|
|
|
|
function ensureString (value) {
|
|
if (typeof value === 'string') {
|
|
const intArray = intArrayFromString(value)
|
|
const offset = ensureCache.alloc(intArray, HEAP8)
|
|
ensureCache.copy(intArray, HEAP8, offset)
|
|
return offset
|
|
}
|
|
return value
|
|
}
|
|
|
|
function ASS_ParserPriv () {
|
|
throw 'cannot construct a ASS_ParserPriv, no constructor in IDL'
|
|
}
|
|
ASS_ParserPriv.prototype = Object.create(WrapperObject.prototype)
|
|
ASS_ParserPriv.prototype.constructor = ASS_ParserPriv
|
|
ASS_ParserPriv.prototype.__class__ = ASS_ParserPriv
|
|
ASS_ParserPriv.__cache__ = {}
|
|
Module.ASS_ParserPriv = ASS_ParserPriv
|
|
|
|
function ASS_Event () {
|
|
throw 'cannot construct a ASS_Event, no constructor in IDL'
|
|
}
|
|
ASS_Event.prototype = Object.create(WrapperObject.prototype)
|
|
ASS_Event.prototype.constructor = ASS_Event
|
|
ASS_Event.prototype.__class__ = ASS_Event
|
|
ASS_Event.__cache__ = {}
|
|
Module.ASS_Event = ASS_Event
|
|
ASS_Event.prototype.get_Start = ASS_Event.prototype.get_Start = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Event_get_Start_0(self)
|
|
}
|
|
ASS_Event.prototype.set_Start = ASS_Event.prototype.set_Start = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Event_set_Start_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'Start', {
|
|
get: ASS_Event.prototype.get_Start,
|
|
set: ASS_Event.prototype.set_Start
|
|
})
|
|
ASS_Event.prototype.get_Duration = ASS_Event.prototype.get_Duration = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Event_get_Duration_0(self)
|
|
}
|
|
ASS_Event.prototype.set_Duration = ASS_Event.prototype.set_Duration = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Event_set_Duration_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'Duration', {
|
|
get: ASS_Event.prototype.get_Duration,
|
|
set: ASS_Event.prototype.set_Duration
|
|
})
|
|
ASS_Event.prototype.get_ReadOrder = ASS_Event.prototype.get_ReadOrder = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Event_get_ReadOrder_0(self)
|
|
}
|
|
ASS_Event.prototype.set_ReadOrder = ASS_Event.prototype.set_ReadOrder = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Event_set_ReadOrder_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'ReadOrder', {
|
|
get: ASS_Event.prototype.get_ReadOrder,
|
|
set: ASS_Event.prototype.set_ReadOrder
|
|
})
|
|
ASS_Event.prototype.get_Layer = ASS_Event.prototype.get_Layer = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Event_get_Layer_0(self)
|
|
}
|
|
ASS_Event.prototype.set_Layer = ASS_Event.prototype.set_Layer = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Event_set_Layer_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'Layer', {
|
|
get: ASS_Event.prototype.get_Layer,
|
|
set: ASS_Event.prototype.set_Layer
|
|
})
|
|
ASS_Event.prototype.get_Style = ASS_Event.prototype.get_Style = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Event_get_Style_0(self)
|
|
}
|
|
ASS_Event.prototype.set_Style = ASS_Event.prototype.set_Style = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Event_set_Style_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'Style', {
|
|
get: ASS_Event.prototype.get_Style,
|
|
set: ASS_Event.prototype.set_Style
|
|
})
|
|
ASS_Event.prototype.get_Name = ASS_Event.prototype.get_Name = function () {
|
|
const self = this.ptr
|
|
return UTF8ToString(_emscripten_bind_ASS_Event_get_Name_0(self))
|
|
}
|
|
ASS_Event.prototype.set_Name = ASS_Event.prototype.set_Name = function (arg0) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Event_set_Name_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'Name', {
|
|
get: ASS_Event.prototype.get_Name,
|
|
set: ASS_Event.prototype.set_Name
|
|
})
|
|
ASS_Event.prototype.get_MarginL = ASS_Event.prototype.get_MarginL = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Event_get_MarginL_0(self)
|
|
}
|
|
ASS_Event.prototype.set_MarginL = ASS_Event.prototype.set_MarginL = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Event_set_MarginL_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'MarginL', {
|
|
get: ASS_Event.prototype.get_MarginL,
|
|
set: ASS_Event.prototype.set_MarginL
|
|
})
|
|
ASS_Event.prototype.get_MarginR = ASS_Event.prototype.get_MarginR = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Event_get_MarginR_0(self)
|
|
}
|
|
ASS_Event.prototype.set_MarginR = ASS_Event.prototype.set_MarginR = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Event_set_MarginR_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'MarginR', {
|
|
get: ASS_Event.prototype.get_MarginR,
|
|
set: ASS_Event.prototype.set_MarginR
|
|
})
|
|
ASS_Event.prototype.get_MarginV = ASS_Event.prototype.get_MarginV = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Event_get_MarginV_0(self)
|
|
}
|
|
ASS_Event.prototype.set_MarginV = ASS_Event.prototype.set_MarginV = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Event_set_MarginV_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'MarginV', {
|
|
get: ASS_Event.prototype.get_MarginV,
|
|
set: ASS_Event.prototype.set_MarginV
|
|
})
|
|
ASS_Event.prototype.get_Effect = ASS_Event.prototype.get_Effect = function () {
|
|
const self = this.ptr
|
|
return UTF8ToString(_emscripten_bind_ASS_Event_get_Effect_0(self))
|
|
}
|
|
ASS_Event.prototype.set_Effect = ASS_Event.prototype.set_Effect = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Event_set_Effect_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'Effect', {
|
|
get: ASS_Event.prototype.get_Effect,
|
|
set: ASS_Event.prototype.set_Effect
|
|
})
|
|
ASS_Event.prototype.get_Text = ASS_Event.prototype.get_Text = function () {
|
|
const self = this.ptr
|
|
return UTF8ToString(_emscripten_bind_ASS_Event_get_Text_0(self))
|
|
}
|
|
ASS_Event.prototype.set_Text = ASS_Event.prototype.set_Text = function (arg0) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Event_set_Text_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Event.prototype, 'Text', {
|
|
get: ASS_Event.prototype.get_Text,
|
|
set: ASS_Event.prototype.set_Text
|
|
})
|
|
|
|
function ASS_Renderer () {
|
|
throw 'cannot construct a ASS_Renderer, no constructor in IDL'
|
|
}
|
|
ASS_Renderer.prototype = Object.create(WrapperObject.prototype)
|
|
ASS_Renderer.prototype.constructor = ASS_Renderer
|
|
ASS_Renderer.prototype.__class__ = ASS_Renderer
|
|
ASS_Renderer.__cache__ = {}
|
|
Module.ASS_Renderer = ASS_Renderer
|
|
|
|
function RenderBlendResult () {
|
|
throw 'cannot construct a RenderBlendResult, no constructor in IDL'
|
|
}
|
|
RenderBlendResult.prototype = Object.create(WrapperObject.prototype)
|
|
RenderBlendResult.prototype.constructor = RenderBlendResult
|
|
RenderBlendResult.prototype.__class__ = RenderBlendResult
|
|
RenderBlendResult.__cache__ = {}
|
|
Module.RenderBlendResult = RenderBlendResult
|
|
RenderBlendResult.prototype.get_changed = RenderBlendResult.prototype.get_changed = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_RenderBlendResult_get_changed_0(self)
|
|
}
|
|
RenderBlendResult.prototype.set_changed = RenderBlendResult.prototype.set_changed = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_RenderBlendResult_set_changed_1(self, arg0)
|
|
}
|
|
Object.defineProperty(RenderBlendResult.prototype, 'changed', {
|
|
get: RenderBlendResult.prototype.get_changed,
|
|
set: RenderBlendResult.prototype.set_changed
|
|
})
|
|
RenderBlendResult.prototype.get_blend_time = RenderBlendResult.prototype.get_blend_time = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_RenderBlendResult_get_blend_time_0(self)
|
|
}
|
|
RenderBlendResult.prototype.set_blend_time = RenderBlendResult.prototype.set_blend_time = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_RenderBlendResult_set_blend_time_1(self, arg0)
|
|
}
|
|
Object.defineProperty(RenderBlendResult.prototype, 'blend_time', {
|
|
get: RenderBlendResult.prototype.get_blend_time,
|
|
set: RenderBlendResult.prototype.set_blend_time
|
|
})
|
|
RenderBlendResult.prototype.get_part = RenderBlendResult.prototype.get_part = function () {
|
|
const self = this.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_RenderBlendResult_get_part_0(self),
|
|
RenderBlendPart
|
|
)
|
|
}
|
|
RenderBlendResult.prototype.set_part = RenderBlendResult.prototype.set_part = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_RenderBlendResult_set_part_1(self, arg0)
|
|
}
|
|
Object.defineProperty(RenderBlendResult.prototype, 'part', {
|
|
get: RenderBlendResult.prototype.get_part,
|
|
set: RenderBlendResult.prototype.set_part
|
|
})
|
|
|
|
function SubtitleOctopus () {
|
|
this.ptr = _emscripten_bind_SubtitleOctopus_SubtitleOctopus_0()
|
|
getCache(SubtitleOctopus)[this.ptr] = this
|
|
}
|
|
SubtitleOctopus.prototype = Object.create(WrapperObject.prototype)
|
|
SubtitleOctopus.prototype.constructor = SubtitleOctopus
|
|
SubtitleOctopus.prototype.__class__ = SubtitleOctopus
|
|
SubtitleOctopus.__cache__ = {}
|
|
Module.SubtitleOctopus = SubtitleOctopus
|
|
SubtitleOctopus.prototype.setLogLevel = SubtitleOctopus.prototype.setLogLevel = function (
|
|
level
|
|
) {
|
|
const self = this.ptr
|
|
if (level && typeof level === 'object') level = level.ptr
|
|
_emscripten_bind_SubtitleOctopus_setLogLevel_1(self, level)
|
|
}
|
|
SubtitleOctopus.prototype.setDropAnimations = SubtitleOctopus.prototype.setDropAnimations = function (
|
|
value
|
|
) {
|
|
const self = this.ptr
|
|
if (value && typeof value === 'object') value = value.ptr
|
|
_emscripten_bind_SubtitleOctopus_setDropAnimations_1(self, value)
|
|
}
|
|
SubtitleOctopus.prototype.getDropAnimations = SubtitleOctopus.prototype.getDropAnimations = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_SubtitleOctopus_getDropAnimations_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.initLibrary = SubtitleOctopus.prototype.initLibrary = function (
|
|
frame_w,
|
|
frame_h
|
|
) {
|
|
const self = this.ptr
|
|
if (frame_w && typeof frame_w === 'object') frame_w = frame_w.ptr
|
|
if (frame_h && typeof frame_h === 'object') frame_h = frame_h.ptr
|
|
_emscripten_bind_SubtitleOctopus_initLibrary_2(self, frame_w, frame_h)
|
|
}
|
|
SubtitleOctopus.prototype.createTrack = SubtitleOctopus.prototype.createTrack = function (
|
|
subfile
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (subfile && typeof subfile === 'object') subfile = subfile.ptr
|
|
else subfile = ensureString(subfile)
|
|
_emscripten_bind_SubtitleOctopus_createTrack_1(self, subfile)
|
|
}
|
|
SubtitleOctopus.prototype.createTrackMem = SubtitleOctopus.prototype.createTrackMem = function (
|
|
buf,
|
|
bufsize
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (buf && typeof buf === 'object') buf = buf.ptr
|
|
else buf = ensureString(buf)
|
|
if (bufsize && typeof bufsize === 'object') bufsize = bufsize.ptr
|
|
_emscripten_bind_SubtitleOctopus_createTrackMem_2(self, buf, bufsize)
|
|
}
|
|
SubtitleOctopus.prototype.removeTrack = SubtitleOctopus.prototype.removeTrack = function () {
|
|
const self = this.ptr
|
|
_emscripten_bind_SubtitleOctopus_removeTrack_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.resizeCanvas = SubtitleOctopus.prototype.resizeCanvas = function (
|
|
frame_w,
|
|
frame_h
|
|
) {
|
|
const self = this.ptr
|
|
if (frame_w && typeof frame_w === 'object') frame_w = frame_w.ptr
|
|
if (frame_h && typeof frame_h === 'object') frame_h = frame_h.ptr
|
|
_emscripten_bind_SubtitleOctopus_resizeCanvas_2(self, frame_w, frame_h)
|
|
}
|
|
SubtitleOctopus.prototype.renderImage = SubtitleOctopus.prototype.renderImage = function (
|
|
time,
|
|
changed
|
|
) {
|
|
const self = this.ptr
|
|
if (time && typeof time === 'object') time = time.ptr
|
|
if (changed && typeof changed === 'object') changed = changed.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_SubtitleOctopus_renderImage_2(self, time, changed),
|
|
ASS_Image
|
|
)
|
|
}
|
|
SubtitleOctopus.prototype.quitLibrary = SubtitleOctopus.prototype.quitLibrary = function () {
|
|
const self = this.ptr
|
|
_emscripten_bind_SubtitleOctopus_quitLibrary_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.reloadLibrary = SubtitleOctopus.prototype.reloadLibrary = function () {
|
|
const self = this.ptr
|
|
_emscripten_bind_SubtitleOctopus_reloadLibrary_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.reloadFonts = SubtitleOctopus.prototype.reloadFonts = function () {
|
|
const self = this.ptr
|
|
_emscripten_bind_SubtitleOctopus_reloadFonts_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.setMargin = SubtitleOctopus.prototype.setMargin = function (
|
|
top,
|
|
bottom,
|
|
left,
|
|
right
|
|
) {
|
|
const self = this.ptr
|
|
if (top && typeof top === 'object') top = top.ptr
|
|
if (bottom && typeof bottom === 'object') bottom = bottom.ptr
|
|
if (left && typeof left === 'object') left = left.ptr
|
|
if (right && typeof right === 'object') right = right.ptr
|
|
_emscripten_bind_SubtitleOctopus_setMargin_4(self, top, bottom, left, right)
|
|
}
|
|
SubtitleOctopus.prototype.getEventCount = SubtitleOctopus.prototype.getEventCount = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_SubtitleOctopus_getEventCount_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.allocEvent = SubtitleOctopus.prototype.allocEvent = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_SubtitleOctopus_allocEvent_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.allocStyle = SubtitleOctopus.prototype.allocStyle = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_SubtitleOctopus_allocStyle_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.removeEvent = SubtitleOctopus.prototype.removeEvent = function (
|
|
eid
|
|
) {
|
|
const self = this.ptr
|
|
if (eid && typeof eid === 'object') eid = eid.ptr
|
|
_emscripten_bind_SubtitleOctopus_removeEvent_1(self, eid)
|
|
}
|
|
SubtitleOctopus.prototype.getStyleCount = SubtitleOctopus.prototype.getStyleCount = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_SubtitleOctopus_getStyleCount_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.getStyleByName = SubtitleOctopus.prototype.getStyleByName = function (
|
|
name
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (name && typeof name === 'object') name = name.ptr
|
|
else name = ensureString(name)
|
|
return _emscripten_bind_SubtitleOctopus_getStyleByName_1(self, name)
|
|
}
|
|
SubtitleOctopus.prototype.removeStyle = SubtitleOctopus.prototype.removeStyle = function (
|
|
eid
|
|
) {
|
|
const self = this.ptr
|
|
if (eid && typeof eid === 'object') eid = eid.ptr
|
|
_emscripten_bind_SubtitleOctopus_removeStyle_1(self, eid)
|
|
}
|
|
SubtitleOctopus.prototype.removeAllEvents = SubtitleOctopus.prototype.removeAllEvents = function () {
|
|
const self = this.ptr
|
|
_emscripten_bind_SubtitleOctopus_removeAllEvents_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.setMemoryLimits = SubtitleOctopus.prototype.setMemoryLimits = function (
|
|
glyph_limit,
|
|
bitmap_cache_limit
|
|
) {
|
|
const self = this.ptr
|
|
if (glyph_limit && typeof glyph_limit === 'object') {
|
|
glyph_limit = glyph_limit.ptr
|
|
}
|
|
if (bitmap_cache_limit && typeof bitmap_cache_limit === 'object') {
|
|
bitmap_cache_limit = bitmap_cache_limit.ptr
|
|
}
|
|
_emscripten_bind_SubtitleOctopus_setMemoryLimits_2(
|
|
self,
|
|
glyph_limit,
|
|
bitmap_cache_limit
|
|
)
|
|
}
|
|
SubtitleOctopus.prototype.renderBlend = SubtitleOctopus.prototype.renderBlend = function (
|
|
tm,
|
|
force
|
|
) {
|
|
const self = this.ptr
|
|
if (tm && typeof tm === 'object') tm = tm.ptr
|
|
if (force && typeof force === 'object') force = force.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_SubtitleOctopus_renderBlend_2(self, tm, force),
|
|
RenderBlendResult
|
|
)
|
|
}
|
|
SubtitleOctopus.prototype.findNextEventStart = SubtitleOctopus.prototype.findNextEventStart = function (
|
|
tm
|
|
) {
|
|
const self = this.ptr
|
|
if (tm && typeof tm === 'object') tm = tm.ptr
|
|
return _emscripten_bind_SubtitleOctopus_findNextEventStart_1(self, tm)
|
|
}
|
|
SubtitleOctopus.prototype.findEventStopTimes = SubtitleOctopus.prototype.findEventStopTimes = function (
|
|
tm
|
|
) {
|
|
const self = this.ptr
|
|
if (tm && typeof tm === 'object') tm = tm.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_SubtitleOctopus_findEventStopTimes_1(self, tm),
|
|
EventStopTimesResult
|
|
)
|
|
}
|
|
SubtitleOctopus.prototype.rescanAllAnimations = SubtitleOctopus.prototype.rescanAllAnimations = function () {
|
|
const self = this.ptr
|
|
_emscripten_bind_SubtitleOctopus_rescanAllAnimations_0(self)
|
|
}
|
|
SubtitleOctopus.prototype.get_track = SubtitleOctopus.prototype.get_track = function () {
|
|
const self = this.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_SubtitleOctopus_get_track_0(self),
|
|
ASS_Track
|
|
)
|
|
}
|
|
SubtitleOctopus.prototype.set_track = SubtitleOctopus.prototype.set_track = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_SubtitleOctopus_set_track_1(self, arg0)
|
|
}
|
|
Object.defineProperty(SubtitleOctopus.prototype, 'track', {
|
|
get: SubtitleOctopus.prototype.get_track,
|
|
set: SubtitleOctopus.prototype.set_track
|
|
})
|
|
SubtitleOctopus.prototype.get_ass_renderer = SubtitleOctopus.prototype.get_ass_renderer = function () {
|
|
const self = this.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_SubtitleOctopus_get_ass_renderer_0(self),
|
|
ASS_Renderer
|
|
)
|
|
}
|
|
SubtitleOctopus.prototype.set_ass_renderer = SubtitleOctopus.prototype.set_ass_renderer = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_SubtitleOctopus_set_ass_renderer_1(self, arg0)
|
|
}
|
|
Object.defineProperty(SubtitleOctopus.prototype, 'ass_renderer', {
|
|
get: SubtitleOctopus.prototype.get_ass_renderer,
|
|
set: SubtitleOctopus.prototype.set_ass_renderer
|
|
})
|
|
SubtitleOctopus.prototype.get_ass_library = SubtitleOctopus.prototype.get_ass_library = function () {
|
|
const self = this.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_SubtitleOctopus_get_ass_library_0(self),
|
|
ASS_Library
|
|
)
|
|
}
|
|
SubtitleOctopus.prototype.set_ass_library = SubtitleOctopus.prototype.set_ass_library = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_SubtitleOctopus_set_ass_library_1(self, arg0)
|
|
}
|
|
Object.defineProperty(SubtitleOctopus.prototype, 'ass_library', {
|
|
get: SubtitleOctopus.prototype.get_ass_library,
|
|
set: SubtitleOctopus.prototype.set_ass_library
|
|
})
|
|
SubtitleOctopus.prototype.__destroy__ = SubtitleOctopus.prototype.__destroy__ = function () {
|
|
const self = this.ptr
|
|
_emscripten_bind_SubtitleOctopus___destroy___0(self)
|
|
}
|
|
|
|
function ASS_Track () {
|
|
throw 'cannot construct a ASS_Track, no constructor in IDL'
|
|
}
|
|
ASS_Track.prototype = Object.create(WrapperObject.prototype)
|
|
ASS_Track.prototype.constructor = ASS_Track
|
|
ASS_Track.prototype.__class__ = ASS_Track
|
|
ASS_Track.__cache__ = {}
|
|
Module.ASS_Track = ASS_Track
|
|
ASS_Track.prototype.get_n_styles = ASS_Track.prototype.get_n_styles = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_n_styles_0(self)
|
|
}
|
|
ASS_Track.prototype.set_n_styles = ASS_Track.prototype.set_n_styles = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_n_styles_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'n_styles', {
|
|
get: ASS_Track.prototype.get_n_styles,
|
|
set: ASS_Track.prototype.set_n_styles
|
|
})
|
|
ASS_Track.prototype.get_max_styles = ASS_Track.prototype.get_max_styles = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_max_styles_0(self)
|
|
}
|
|
ASS_Track.prototype.set_max_styles = ASS_Track.prototype.set_max_styles = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_max_styles_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'max_styles', {
|
|
get: ASS_Track.prototype.get_max_styles,
|
|
set: ASS_Track.prototype.set_max_styles
|
|
})
|
|
ASS_Track.prototype.get_n_events = ASS_Track.prototype.get_n_events = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_n_events_0(self)
|
|
}
|
|
ASS_Track.prototype.set_n_events = ASS_Track.prototype.set_n_events = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_n_events_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'n_events', {
|
|
get: ASS_Track.prototype.get_n_events,
|
|
set: ASS_Track.prototype.set_n_events
|
|
})
|
|
ASS_Track.prototype.get_max_events = ASS_Track.prototype.get_max_events = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_max_events_0(self)
|
|
}
|
|
ASS_Track.prototype.set_max_events = ASS_Track.prototype.set_max_events = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_max_events_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'max_events', {
|
|
get: ASS_Track.prototype.get_max_events,
|
|
set: ASS_Track.prototype.set_max_events
|
|
})
|
|
ASS_Track.prototype.get_styles = ASS_Track.prototype.get_styles = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_ASS_Track_get_styles_1(self, arg0),
|
|
ASS_Style
|
|
)
|
|
}
|
|
ASS_Track.prototype.set_styles = ASS_Track.prototype.set_styles = function (
|
|
arg0,
|
|
arg1
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
if (arg1 && typeof arg1 === 'object') arg1 = arg1.ptr
|
|
_emscripten_bind_ASS_Track_set_styles_2(self, arg0, arg1)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'styles', {
|
|
get: ASS_Track.prototype.get_styles,
|
|
set: ASS_Track.prototype.set_styles
|
|
})
|
|
ASS_Track.prototype.get_events = ASS_Track.prototype.get_events = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_ASS_Track_get_events_1(self, arg0),
|
|
ASS_Event
|
|
)
|
|
}
|
|
ASS_Track.prototype.set_events = ASS_Track.prototype.set_events = function (
|
|
arg0,
|
|
arg1
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
if (arg1 && typeof arg1 === 'object') arg1 = arg1.ptr
|
|
_emscripten_bind_ASS_Track_set_events_2(self, arg0, arg1)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'events', {
|
|
get: ASS_Track.prototype.get_events,
|
|
set: ASS_Track.prototype.set_events
|
|
})
|
|
ASS_Track.prototype.get_style_format = ASS_Track.prototype.get_style_format = function () {
|
|
const self = this.ptr
|
|
return UTF8ToString(_emscripten_bind_ASS_Track_get_style_format_0(self))
|
|
}
|
|
ASS_Track.prototype.set_style_format = ASS_Track.prototype.set_style_format = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Track_set_style_format_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'style_format', {
|
|
get: ASS_Track.prototype.get_style_format,
|
|
set: ASS_Track.prototype.set_style_format
|
|
})
|
|
ASS_Track.prototype.get_event_format = ASS_Track.prototype.get_event_format = function () {
|
|
const self = this.ptr
|
|
return UTF8ToString(_emscripten_bind_ASS_Track_get_event_format_0(self))
|
|
}
|
|
ASS_Track.prototype.set_event_format = ASS_Track.prototype.set_event_format = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Track_set_event_format_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'event_format', {
|
|
get: ASS_Track.prototype.get_event_format,
|
|
set: ASS_Track.prototype.set_event_format
|
|
})
|
|
ASS_Track.prototype.get_PlayResX = ASS_Track.prototype.get_PlayResX = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_PlayResX_0(self)
|
|
}
|
|
ASS_Track.prototype.set_PlayResX = ASS_Track.prototype.set_PlayResX = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_PlayResX_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'PlayResX', {
|
|
get: ASS_Track.prototype.get_PlayResX,
|
|
set: ASS_Track.prototype.set_PlayResX
|
|
})
|
|
ASS_Track.prototype.get_PlayResY = ASS_Track.prototype.get_PlayResY = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_PlayResY_0(self)
|
|
}
|
|
ASS_Track.prototype.set_PlayResY = ASS_Track.prototype.set_PlayResY = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_PlayResY_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'PlayResY', {
|
|
get: ASS_Track.prototype.get_PlayResY,
|
|
set: ASS_Track.prototype.set_PlayResY
|
|
})
|
|
ASS_Track.prototype.get_Timer = ASS_Track.prototype.get_Timer = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_Timer_0(self)
|
|
}
|
|
ASS_Track.prototype.set_Timer = ASS_Track.prototype.set_Timer = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_Timer_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'Timer', {
|
|
get: ASS_Track.prototype.get_Timer,
|
|
set: ASS_Track.prototype.set_Timer
|
|
})
|
|
ASS_Track.prototype.get_WrapStyle = ASS_Track.prototype.get_WrapStyle = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_WrapStyle_0(self)
|
|
}
|
|
ASS_Track.prototype.set_WrapStyle = ASS_Track.prototype.set_WrapStyle = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_WrapStyle_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'WrapStyle', {
|
|
get: ASS_Track.prototype.get_WrapStyle,
|
|
set: ASS_Track.prototype.set_WrapStyle
|
|
})
|
|
ASS_Track.prototype.get_ScaledBorderAndShadow = ASS_Track.prototype.get_ScaledBorderAndShadow = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_ScaledBorderAndShadow_0(self)
|
|
}
|
|
ASS_Track.prototype.set_ScaledBorderAndShadow = ASS_Track.prototype.set_ScaledBorderAndShadow = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_ScaledBorderAndShadow_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'ScaledBorderAndShadow', {
|
|
get: ASS_Track.prototype.get_ScaledBorderAndShadow,
|
|
set: ASS_Track.prototype.set_ScaledBorderAndShadow
|
|
})
|
|
ASS_Track.prototype.get_Kerning = ASS_Track.prototype.get_Kerning = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_Kerning_0(self)
|
|
}
|
|
ASS_Track.prototype.set_Kerning = ASS_Track.prototype.set_Kerning = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_Kerning_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'Kerning', {
|
|
get: ASS_Track.prototype.get_Kerning,
|
|
set: ASS_Track.prototype.set_Kerning
|
|
})
|
|
ASS_Track.prototype.get_Language = ASS_Track.prototype.get_Language = function () {
|
|
const self = this.ptr
|
|
return UTF8ToString(_emscripten_bind_ASS_Track_get_Language_0(self))
|
|
}
|
|
ASS_Track.prototype.set_Language = ASS_Track.prototype.set_Language = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Track_set_Language_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'Language', {
|
|
get: ASS_Track.prototype.get_Language,
|
|
set: ASS_Track.prototype.set_Language
|
|
})
|
|
ASS_Track.prototype.get_default_style = ASS_Track.prototype.get_default_style = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Track_get_default_style_0(self)
|
|
}
|
|
ASS_Track.prototype.set_default_style = ASS_Track.prototype.set_default_style = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Track_set_default_style_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'default_style', {
|
|
get: ASS_Track.prototype.get_default_style,
|
|
set: ASS_Track.prototype.set_default_style
|
|
})
|
|
ASS_Track.prototype.get_name = ASS_Track.prototype.get_name = function () {
|
|
const self = this.ptr
|
|
return UTF8ToString(_emscripten_bind_ASS_Track_get_name_0(self))
|
|
}
|
|
ASS_Track.prototype.set_name = ASS_Track.prototype.set_name = function (arg0) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Track_set_name_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Track.prototype, 'name', {
|
|
get: ASS_Track.prototype.get_name,
|
|
set: ASS_Track.prototype.set_name
|
|
})
|
|
|
|
function ASS_RenderPriv () {
|
|
throw 'cannot construct a ASS_RenderPriv, no constructor in IDL'
|
|
}
|
|
ASS_RenderPriv.prototype = Object.create(WrapperObject.prototype)
|
|
ASS_RenderPriv.prototype.constructor = ASS_RenderPriv
|
|
ASS_RenderPriv.prototype.__class__ = ASS_RenderPriv
|
|
ASS_RenderPriv.__cache__ = {}
|
|
Module.ASS_RenderPriv = ASS_RenderPriv
|
|
|
|
function ASS_Style () {
|
|
throw 'cannot construct a ASS_Style, no constructor in IDL'
|
|
}
|
|
ASS_Style.prototype = Object.create(WrapperObject.prototype)
|
|
ASS_Style.prototype.constructor = ASS_Style
|
|
ASS_Style.prototype.__class__ = ASS_Style
|
|
ASS_Style.__cache__ = {}
|
|
Module.ASS_Style = ASS_Style
|
|
ASS_Style.prototype.get_Name = ASS_Style.prototype.get_Name = function () {
|
|
const self = this.ptr
|
|
return UTF8ToString(_emscripten_bind_ASS_Style_get_Name_0(self))
|
|
}
|
|
ASS_Style.prototype.set_Name = ASS_Style.prototype.set_Name = function (arg0) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Style_set_Name_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Name', {
|
|
get: ASS_Style.prototype.get_Name,
|
|
set: ASS_Style.prototype.set_Name
|
|
})
|
|
ASS_Style.prototype.get_FontName = ASS_Style.prototype.get_FontName = function () {
|
|
const self = this.ptr
|
|
return UTF8ToString(_emscripten_bind_ASS_Style_get_FontName_0(self))
|
|
}
|
|
ASS_Style.prototype.set_FontName = ASS_Style.prototype.set_FontName = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Style_set_FontName_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'FontName', {
|
|
get: ASS_Style.prototype.get_FontName,
|
|
set: ASS_Style.prototype.set_FontName
|
|
})
|
|
ASS_Style.prototype.get_FontSize = ASS_Style.prototype.get_FontSize = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_FontSize_0(self)
|
|
}
|
|
ASS_Style.prototype.set_FontSize = ASS_Style.prototype.set_FontSize = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_FontSize_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'FontSize', {
|
|
get: ASS_Style.prototype.get_FontSize,
|
|
set: ASS_Style.prototype.set_FontSize
|
|
})
|
|
ASS_Style.prototype.get_PrimaryColour = ASS_Style.prototype.get_PrimaryColour = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_PrimaryColour_0(self)
|
|
}
|
|
ASS_Style.prototype.set_PrimaryColour = ASS_Style.prototype.set_PrimaryColour = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_PrimaryColour_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'PrimaryColour', {
|
|
get: ASS_Style.prototype.get_PrimaryColour,
|
|
set: ASS_Style.prototype.set_PrimaryColour
|
|
})
|
|
ASS_Style.prototype.get_SecondaryColour = ASS_Style.prototype.get_SecondaryColour = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_SecondaryColour_0(self)
|
|
}
|
|
ASS_Style.prototype.set_SecondaryColour = ASS_Style.prototype.set_SecondaryColour = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_SecondaryColour_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'SecondaryColour', {
|
|
get: ASS_Style.prototype.get_SecondaryColour,
|
|
set: ASS_Style.prototype.set_SecondaryColour
|
|
})
|
|
ASS_Style.prototype.get_OutlineColour = ASS_Style.prototype.get_OutlineColour = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_OutlineColour_0(self)
|
|
}
|
|
ASS_Style.prototype.set_OutlineColour = ASS_Style.prototype.set_OutlineColour = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_OutlineColour_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'OutlineColour', {
|
|
get: ASS_Style.prototype.get_OutlineColour,
|
|
set: ASS_Style.prototype.set_OutlineColour
|
|
})
|
|
ASS_Style.prototype.get_BackColour = ASS_Style.prototype.get_BackColour = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_BackColour_0(self)
|
|
}
|
|
ASS_Style.prototype.set_BackColour = ASS_Style.prototype.set_BackColour = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_BackColour_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'BackColour', {
|
|
get: ASS_Style.prototype.get_BackColour,
|
|
set: ASS_Style.prototype.set_BackColour
|
|
})
|
|
ASS_Style.prototype.get_Bold = ASS_Style.prototype.get_Bold = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Bold_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Bold = ASS_Style.prototype.set_Bold = function (arg0) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Bold_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Bold', {
|
|
get: ASS_Style.prototype.get_Bold,
|
|
set: ASS_Style.prototype.set_Bold
|
|
})
|
|
ASS_Style.prototype.get_Italic = ASS_Style.prototype.get_Italic = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Italic_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Italic = ASS_Style.prototype.set_Italic = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Italic_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Italic', {
|
|
get: ASS_Style.prototype.get_Italic,
|
|
set: ASS_Style.prototype.set_Italic
|
|
})
|
|
ASS_Style.prototype.get_Underline = ASS_Style.prototype.get_Underline = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Underline_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Underline = ASS_Style.prototype.set_Underline = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Underline_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Underline', {
|
|
get: ASS_Style.prototype.get_Underline,
|
|
set: ASS_Style.prototype.set_Underline
|
|
})
|
|
ASS_Style.prototype.get_StrikeOut = ASS_Style.prototype.get_StrikeOut = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_StrikeOut_0(self)
|
|
}
|
|
ASS_Style.prototype.set_StrikeOut = ASS_Style.prototype.set_StrikeOut = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_StrikeOut_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'StrikeOut', {
|
|
get: ASS_Style.prototype.get_StrikeOut,
|
|
set: ASS_Style.prototype.set_StrikeOut
|
|
})
|
|
ASS_Style.prototype.get_ScaleX = ASS_Style.prototype.get_ScaleX = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_ScaleX_0(self)
|
|
}
|
|
ASS_Style.prototype.set_ScaleX = ASS_Style.prototype.set_ScaleX = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_ScaleX_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'ScaleX', {
|
|
get: ASS_Style.prototype.get_ScaleX,
|
|
set: ASS_Style.prototype.set_ScaleX
|
|
})
|
|
ASS_Style.prototype.get_ScaleY = ASS_Style.prototype.get_ScaleY = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_ScaleY_0(self)
|
|
}
|
|
ASS_Style.prototype.set_ScaleY = ASS_Style.prototype.set_ScaleY = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_ScaleY_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'ScaleY', {
|
|
get: ASS_Style.prototype.get_ScaleY,
|
|
set: ASS_Style.prototype.set_ScaleY
|
|
})
|
|
ASS_Style.prototype.get_Spacing = ASS_Style.prototype.get_Spacing = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Spacing_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Spacing = ASS_Style.prototype.set_Spacing = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Spacing_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Spacing', {
|
|
get: ASS_Style.prototype.get_Spacing,
|
|
set: ASS_Style.prototype.set_Spacing
|
|
})
|
|
ASS_Style.prototype.get_Angle = ASS_Style.prototype.get_Angle = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Angle_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Angle = ASS_Style.prototype.set_Angle = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Angle_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Angle', {
|
|
get: ASS_Style.prototype.get_Angle,
|
|
set: ASS_Style.prototype.set_Angle
|
|
})
|
|
ASS_Style.prototype.get_BorderStyle = ASS_Style.prototype.get_BorderStyle = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_BorderStyle_0(self)
|
|
}
|
|
ASS_Style.prototype.set_BorderStyle = ASS_Style.prototype.set_BorderStyle = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_BorderStyle_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'BorderStyle', {
|
|
get: ASS_Style.prototype.get_BorderStyle,
|
|
set: ASS_Style.prototype.set_BorderStyle
|
|
})
|
|
ASS_Style.prototype.get_Outline = ASS_Style.prototype.get_Outline = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Outline_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Outline = ASS_Style.prototype.set_Outline = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Outline_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Outline', {
|
|
get: ASS_Style.prototype.get_Outline,
|
|
set: ASS_Style.prototype.set_Outline
|
|
})
|
|
ASS_Style.prototype.get_Shadow = ASS_Style.prototype.get_Shadow = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Shadow_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Shadow = ASS_Style.prototype.set_Shadow = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Shadow_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Shadow', {
|
|
get: ASS_Style.prototype.get_Shadow,
|
|
set: ASS_Style.prototype.set_Shadow
|
|
})
|
|
ASS_Style.prototype.get_Alignment = ASS_Style.prototype.get_Alignment = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Alignment_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Alignment = ASS_Style.prototype.set_Alignment = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Alignment_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Alignment', {
|
|
get: ASS_Style.prototype.get_Alignment,
|
|
set: ASS_Style.prototype.set_Alignment
|
|
})
|
|
ASS_Style.prototype.get_MarginL = ASS_Style.prototype.get_MarginL = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_MarginL_0(self)
|
|
}
|
|
ASS_Style.prototype.set_MarginL = ASS_Style.prototype.set_MarginL = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_MarginL_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'MarginL', {
|
|
get: ASS_Style.prototype.get_MarginL,
|
|
set: ASS_Style.prototype.set_MarginL
|
|
})
|
|
ASS_Style.prototype.get_MarginR = ASS_Style.prototype.get_MarginR = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_MarginR_0(self)
|
|
}
|
|
ASS_Style.prototype.set_MarginR = ASS_Style.prototype.set_MarginR = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_MarginR_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'MarginR', {
|
|
get: ASS_Style.prototype.get_MarginR,
|
|
set: ASS_Style.prototype.set_MarginR
|
|
})
|
|
ASS_Style.prototype.get_MarginV = ASS_Style.prototype.get_MarginV = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_MarginV_0(self)
|
|
}
|
|
ASS_Style.prototype.set_MarginV = ASS_Style.prototype.set_MarginV = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_MarginV_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'MarginV', {
|
|
get: ASS_Style.prototype.get_MarginV,
|
|
set: ASS_Style.prototype.set_MarginV
|
|
})
|
|
ASS_Style.prototype.get_Encoding = ASS_Style.prototype.get_Encoding = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Encoding_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Encoding = ASS_Style.prototype.set_Encoding = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Encoding_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Encoding', {
|
|
get: ASS_Style.prototype.get_Encoding,
|
|
set: ASS_Style.prototype.set_Encoding
|
|
})
|
|
ASS_Style.prototype.get_treat_fontname_as_pattern = ASS_Style.prototype.get_treat_fontname_as_pattern = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_treat_fontname_as_pattern_0(self)
|
|
}
|
|
ASS_Style.prototype.set_treat_fontname_as_pattern = ASS_Style.prototype.set_treat_fontname_as_pattern = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_treat_fontname_as_pattern_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'treat_fontname_as_pattern', {
|
|
get: ASS_Style.prototype.get_treat_fontname_as_pattern,
|
|
set: ASS_Style.prototype.set_treat_fontname_as_pattern
|
|
})
|
|
ASS_Style.prototype.get_Blur = ASS_Style.prototype.get_Blur = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Blur_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Blur = ASS_Style.prototype.set_Blur = function (arg0) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Blur_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Blur', {
|
|
get: ASS_Style.prototype.get_Blur,
|
|
set: ASS_Style.prototype.set_Blur
|
|
})
|
|
ASS_Style.prototype.get_Justify = ASS_Style.prototype.get_Justify = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Style_get_Justify_0(self)
|
|
}
|
|
ASS_Style.prototype.set_Justify = ASS_Style.prototype.set_Justify = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Style_set_Justify_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Style.prototype, 'Justify', {
|
|
get: ASS_Style.prototype.get_Justify,
|
|
set: ASS_Style.prototype.set_Justify
|
|
})
|
|
|
|
function EventStopTimesResult () {
|
|
throw 'cannot construct a EventStopTimesResult, no constructor in IDL'
|
|
}
|
|
EventStopTimesResult.prototype = Object.create(WrapperObject.prototype)
|
|
EventStopTimesResult.prototype.constructor = EventStopTimesResult
|
|
EventStopTimesResult.prototype.__class__ = EventStopTimesResult
|
|
EventStopTimesResult.__cache__ = {}
|
|
Module.EventStopTimesResult = EventStopTimesResult
|
|
EventStopTimesResult.prototype.get_eventFinish = EventStopTimesResult.prototype.get_eventFinish = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_EventStopTimesResult_get_eventFinish_0(self)
|
|
}
|
|
EventStopTimesResult.prototype.set_eventFinish = EventStopTimesResult.prototype.set_eventFinish = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_EventStopTimesResult_set_eventFinish_1(self, arg0)
|
|
}
|
|
Object.defineProperty(EventStopTimesResult.prototype, 'eventFinish', {
|
|
get: EventStopTimesResult.prototype.get_eventFinish,
|
|
set: EventStopTimesResult.prototype.set_eventFinish
|
|
})
|
|
EventStopTimesResult.prototype.get_emptyFinish = EventStopTimesResult.prototype.get_emptyFinish = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_EventStopTimesResult_get_emptyFinish_0(self)
|
|
}
|
|
EventStopTimesResult.prototype.set_emptyFinish = EventStopTimesResult.prototype.set_emptyFinish = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_EventStopTimesResult_set_emptyFinish_1(self, arg0)
|
|
}
|
|
Object.defineProperty(EventStopTimesResult.prototype, 'emptyFinish', {
|
|
get: EventStopTimesResult.prototype.get_emptyFinish,
|
|
set: EventStopTimesResult.prototype.set_emptyFinish
|
|
})
|
|
EventStopTimesResult.prototype.get_is_animated = EventStopTimesResult.prototype.get_is_animated = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_EventStopTimesResult_get_is_animated_0(self)
|
|
}
|
|
EventStopTimesResult.prototype.set_is_animated = EventStopTimesResult.prototype.set_is_animated = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_EventStopTimesResult_set_is_animated_1(self, arg0)
|
|
}
|
|
Object.defineProperty(EventStopTimesResult.prototype, 'is_animated', {
|
|
get: EventStopTimesResult.prototype.get_is_animated,
|
|
set: EventStopTimesResult.prototype.set_is_animated
|
|
})
|
|
|
|
function ASS_Image () {
|
|
throw 'cannot construct a ASS_Image, no constructor in IDL'
|
|
}
|
|
ASS_Image.prototype = Object.create(WrapperObject.prototype)
|
|
ASS_Image.prototype.constructor = ASS_Image
|
|
ASS_Image.prototype.__class__ = ASS_Image
|
|
ASS_Image.__cache__ = {}
|
|
Module.ASS_Image = ASS_Image
|
|
ASS_Image.prototype.get_w = ASS_Image.prototype.get_w = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Image_get_w_0(self)
|
|
}
|
|
ASS_Image.prototype.set_w = ASS_Image.prototype.set_w = function (arg0) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Image_set_w_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Image.prototype, 'w', {
|
|
get: ASS_Image.prototype.get_w,
|
|
set: ASS_Image.prototype.set_w
|
|
})
|
|
ASS_Image.prototype.get_h = ASS_Image.prototype.get_h = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Image_get_h_0(self)
|
|
}
|
|
ASS_Image.prototype.set_h = ASS_Image.prototype.set_h = function (arg0) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Image_set_h_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Image.prototype, 'h', {
|
|
get: ASS_Image.prototype.get_h,
|
|
set: ASS_Image.prototype.set_h
|
|
})
|
|
ASS_Image.prototype.get_stride = ASS_Image.prototype.get_stride = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Image_get_stride_0(self)
|
|
}
|
|
ASS_Image.prototype.set_stride = ASS_Image.prototype.set_stride = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Image_set_stride_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Image.prototype, 'stride', {
|
|
get: ASS_Image.prototype.get_stride,
|
|
set: ASS_Image.prototype.set_stride
|
|
})
|
|
ASS_Image.prototype.get_bitmap = ASS_Image.prototype.get_bitmap = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Image_get_bitmap_0(self)
|
|
}
|
|
ASS_Image.prototype.set_bitmap = ASS_Image.prototype.set_bitmap = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_ASS_Image_set_bitmap_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Image.prototype, 'bitmap', {
|
|
get: ASS_Image.prototype.get_bitmap,
|
|
set: ASS_Image.prototype.set_bitmap
|
|
})
|
|
ASS_Image.prototype.get_color = ASS_Image.prototype.get_color = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Image_get_color_0(self)
|
|
}
|
|
ASS_Image.prototype.set_color = ASS_Image.prototype.set_color = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Image_set_color_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Image.prototype, 'color', {
|
|
get: ASS_Image.prototype.get_color,
|
|
set: ASS_Image.prototype.set_color
|
|
})
|
|
ASS_Image.prototype.get_dst_x = ASS_Image.prototype.get_dst_x = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Image_get_dst_x_0(self)
|
|
}
|
|
ASS_Image.prototype.set_dst_x = ASS_Image.prototype.set_dst_x = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Image_set_dst_x_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Image.prototype, 'dst_x', {
|
|
get: ASS_Image.prototype.get_dst_x,
|
|
set: ASS_Image.prototype.set_dst_x
|
|
})
|
|
ASS_Image.prototype.get_dst_y = ASS_Image.prototype.get_dst_y = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_ASS_Image_get_dst_y_0(self)
|
|
}
|
|
ASS_Image.prototype.set_dst_y = ASS_Image.prototype.set_dst_y = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Image_set_dst_y_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Image.prototype, 'dst_y', {
|
|
get: ASS_Image.prototype.get_dst_y,
|
|
set: ASS_Image.prototype.set_dst_y
|
|
})
|
|
ASS_Image.prototype.get_next = ASS_Image.prototype.get_next = function () {
|
|
const self = this.ptr
|
|
return wrapPointer(_emscripten_bind_ASS_Image_get_next_0(self), ASS_Image)
|
|
}
|
|
ASS_Image.prototype.set_next = ASS_Image.prototype.set_next = function (arg0) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_ASS_Image_set_next_1(self, arg0)
|
|
}
|
|
Object.defineProperty(ASS_Image.prototype, 'next', {
|
|
get: ASS_Image.prototype.get_next,
|
|
set: ASS_Image.prototype.set_next
|
|
})
|
|
|
|
function VoidPtr () {
|
|
throw 'cannot construct a VoidPtr, no constructor in IDL'
|
|
}
|
|
VoidPtr.prototype = Object.create(WrapperObject.prototype)
|
|
VoidPtr.prototype.constructor = VoidPtr
|
|
VoidPtr.prototype.__class__ = VoidPtr
|
|
VoidPtr.__cache__ = {}
|
|
Module.VoidPtr = VoidPtr
|
|
VoidPtr.prototype.__destroy__ = VoidPtr.prototype.__destroy__ = function () {
|
|
const self = this.ptr
|
|
_emscripten_bind_VoidPtr___destroy___0(self)
|
|
}
|
|
|
|
function ASS_Library () {
|
|
throw 'cannot construct a ASS_Library, no constructor in IDL'
|
|
}
|
|
ASS_Library.prototype = Object.create(WrapperObject.prototype)
|
|
ASS_Library.prototype.constructor = ASS_Library
|
|
ASS_Library.prototype.__class__ = ASS_Library
|
|
ASS_Library.__cache__ = {}
|
|
Module.ASS_Library = ASS_Library
|
|
|
|
function RenderBlendPart () {
|
|
throw 'cannot construct a RenderBlendPart, no constructor in IDL'
|
|
}
|
|
RenderBlendPart.prototype = Object.create(WrapperObject.prototype)
|
|
RenderBlendPart.prototype.constructor = RenderBlendPart
|
|
RenderBlendPart.prototype.__class__ = RenderBlendPart
|
|
RenderBlendPart.__cache__ = {}
|
|
Module.RenderBlendPart = RenderBlendPart
|
|
RenderBlendPart.prototype.get_dest_x = RenderBlendPart.prototype.get_dest_x = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_RenderBlendPart_get_dest_x_0(self)
|
|
}
|
|
RenderBlendPart.prototype.set_dest_x = RenderBlendPart.prototype.set_dest_x = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_RenderBlendPart_set_dest_x_1(self, arg0)
|
|
}
|
|
Object.defineProperty(RenderBlendPart.prototype, 'dest_x', {
|
|
get: RenderBlendPart.prototype.get_dest_x,
|
|
set: RenderBlendPart.prototype.set_dest_x
|
|
})
|
|
RenderBlendPart.prototype.get_dest_y = RenderBlendPart.prototype.get_dest_y = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_RenderBlendPart_get_dest_y_0(self)
|
|
}
|
|
RenderBlendPart.prototype.set_dest_y = RenderBlendPart.prototype.set_dest_y = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_RenderBlendPart_set_dest_y_1(self, arg0)
|
|
}
|
|
Object.defineProperty(RenderBlendPart.prototype, 'dest_y', {
|
|
get: RenderBlendPart.prototype.get_dest_y,
|
|
set: RenderBlendPart.prototype.set_dest_y
|
|
})
|
|
RenderBlendPart.prototype.get_dest_width = RenderBlendPart.prototype.get_dest_width = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_RenderBlendPart_get_dest_width_0(self)
|
|
}
|
|
RenderBlendPart.prototype.set_dest_width = RenderBlendPart.prototype.set_dest_width = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_RenderBlendPart_set_dest_width_1(self, arg0)
|
|
}
|
|
Object.defineProperty(RenderBlendPart.prototype, 'dest_width', {
|
|
get: RenderBlendPart.prototype.get_dest_width,
|
|
set: RenderBlendPart.prototype.set_dest_width
|
|
})
|
|
RenderBlendPart.prototype.get_dest_height = RenderBlendPart.prototype.get_dest_height = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_RenderBlendPart_get_dest_height_0(self)
|
|
}
|
|
RenderBlendPart.prototype.set_dest_height = RenderBlendPart.prototype.set_dest_height = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_RenderBlendPart_set_dest_height_1(self, arg0)
|
|
}
|
|
Object.defineProperty(RenderBlendPart.prototype, 'dest_height', {
|
|
get: RenderBlendPart.prototype.get_dest_height,
|
|
set: RenderBlendPart.prototype.set_dest_height
|
|
})
|
|
RenderBlendPart.prototype.get_image = RenderBlendPart.prototype.get_image = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_RenderBlendPart_get_image_0(self)
|
|
}
|
|
RenderBlendPart.prototype.set_image = RenderBlendPart.prototype.set_image = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
else arg0 = ensureString(arg0)
|
|
_emscripten_bind_RenderBlendPart_set_image_1(self, arg0)
|
|
}
|
|
Object.defineProperty(RenderBlendPart.prototype, 'image', {
|
|
get: RenderBlendPart.prototype.get_image,
|
|
set: RenderBlendPart.prototype.set_image
|
|
})
|
|
RenderBlendPart.prototype.get_next = RenderBlendPart.prototype.get_next = function () {
|
|
const self = this.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_RenderBlendPart_get_next_0(self),
|
|
RenderBlendPart
|
|
)
|
|
}
|
|
RenderBlendPart.prototype.set_next = RenderBlendPart.prototype.set_next = function (
|
|
arg0
|
|
) {
|
|
const self = this.ptr
|
|
if (arg0 && typeof arg0 === 'object') arg0 = arg0.ptr
|
|
_emscripten_bind_RenderBlendPart_set_next_1(self, arg0)
|
|
}
|
|
Object.defineProperty(RenderBlendPart.prototype, 'next', {
|
|
get: RenderBlendPart.prototype.get_next,
|
|
set: RenderBlendPart.prototype.set_next
|
|
})
|
|
|
|
function libass () {
|
|
this.ptr = _emscripten_bind_libass_libass_0()
|
|
getCache(libass)[this.ptr] = this
|
|
}
|
|
libass.prototype = Object.create(WrapperObject.prototype)
|
|
libass.prototype.constructor = libass
|
|
libass.prototype.__class__ = libass
|
|
libass.__cache__ = {}
|
|
Module.libass = libass
|
|
libass.prototype.oct_library_version = libass.prototype.oct_library_version = function () {
|
|
const self = this.ptr
|
|
return _emscripten_bind_libass_oct_library_version_0(self)
|
|
}
|
|
libass.prototype.oct_library_init = libass.prototype.oct_library_init = function () {
|
|
const self = this.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_libass_oct_library_init_0(self),
|
|
ASS_Library
|
|
)
|
|
}
|
|
libass.prototype.oct_library_done = libass.prototype.oct_library_done = function (
|
|
priv
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
_emscripten_bind_libass_oct_library_done_1(self, priv)
|
|
}
|
|
libass.prototype.oct_set_fonts_dir = libass.prototype.oct_set_fonts_dir = function (
|
|
priv,
|
|
fonts_dir
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (fonts_dir && typeof fonts_dir === 'object') fonts_dir = fonts_dir.ptr
|
|
else fonts_dir = ensureString(fonts_dir)
|
|
_emscripten_bind_libass_oct_set_fonts_dir_2(self, priv, fonts_dir)
|
|
}
|
|
libass.prototype.oct_set_extract_fonts = libass.prototype.oct_set_extract_fonts = function (
|
|
priv,
|
|
extract
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (extract && typeof extract === 'object') extract = extract.ptr
|
|
_emscripten_bind_libass_oct_set_extract_fonts_2(self, priv, extract)
|
|
}
|
|
libass.prototype.oct_set_style_overrides = libass.prototype.oct_set_style_overrides = function (
|
|
priv,
|
|
list
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
_emscripten_bind_libass_oct_set_style_overrides_2(self, priv, list)
|
|
}
|
|
libass.prototype.oct_process_force_style = libass.prototype.oct_process_force_style = function (
|
|
track
|
|
) {
|
|
const self = this.ptr
|
|
if (track && typeof track === 'object') track = track.ptr
|
|
_emscripten_bind_libass_oct_process_force_style_1(self, track)
|
|
}
|
|
libass.prototype.oct_renderer_init = libass.prototype.oct_renderer_init = function (
|
|
priv
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_libass_oct_renderer_init_1(self, priv),
|
|
ASS_Renderer
|
|
)
|
|
}
|
|
libass.prototype.oct_renderer_done = libass.prototype.oct_renderer_done = function (
|
|
priv
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
_emscripten_bind_libass_oct_renderer_done_1(self, priv)
|
|
}
|
|
libass.prototype.oct_set_frame_size = libass.prototype.oct_set_frame_size = function (
|
|
priv,
|
|
w,
|
|
h
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (w && typeof w === 'object') w = w.ptr
|
|
if (h && typeof h === 'object') h = h.ptr
|
|
_emscripten_bind_libass_oct_set_frame_size_3(self, priv, w, h)
|
|
}
|
|
libass.prototype.oct_set_storage_size = libass.prototype.oct_set_storage_size = function (
|
|
priv,
|
|
w,
|
|
h
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (w && typeof w === 'object') w = w.ptr
|
|
if (h && typeof h === 'object') h = h.ptr
|
|
_emscripten_bind_libass_oct_set_storage_size_3(self, priv, w, h)
|
|
}
|
|
libass.prototype.oct_set_shaper = libass.prototype.oct_set_shaper = function (
|
|
priv,
|
|
level
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (level && typeof level === 'object') level = level.ptr
|
|
_emscripten_bind_libass_oct_set_shaper_2(self, priv, level)
|
|
}
|
|
libass.prototype.oct_set_margins = libass.prototype.oct_set_margins = function (
|
|
priv,
|
|
t,
|
|
b,
|
|
l,
|
|
r
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (t && typeof t === 'object') t = t.ptr
|
|
if (b && typeof b === 'object') b = b.ptr
|
|
if (l && typeof l === 'object') l = l.ptr
|
|
if (r && typeof r === 'object') r = r.ptr
|
|
_emscripten_bind_libass_oct_set_margins_5(self, priv, t, b, l, r)
|
|
}
|
|
libass.prototype.oct_set_use_margins = libass.prototype.oct_set_use_margins = function (
|
|
priv,
|
|
use
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (use && typeof use === 'object') use = use.ptr
|
|
_emscripten_bind_libass_oct_set_use_margins_2(self, priv, use)
|
|
}
|
|
libass.prototype.oct_set_pixel_aspect = libass.prototype.oct_set_pixel_aspect = function (
|
|
priv,
|
|
par
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (par && typeof par === 'object') par = par.ptr
|
|
_emscripten_bind_libass_oct_set_pixel_aspect_2(self, priv, par)
|
|
}
|
|
libass.prototype.oct_set_aspect_ratio = libass.prototype.oct_set_aspect_ratio = function (
|
|
priv,
|
|
dar,
|
|
sar
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (dar && typeof dar === 'object') dar = dar.ptr
|
|
if (sar && typeof sar === 'object') sar = sar.ptr
|
|
_emscripten_bind_libass_oct_set_aspect_ratio_3(self, priv, dar, sar)
|
|
}
|
|
libass.prototype.oct_set_font_scale = libass.prototype.oct_set_font_scale = function (
|
|
priv,
|
|
font_scale
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (font_scale && typeof font_scale === 'object') font_scale = font_scale.ptr
|
|
_emscripten_bind_libass_oct_set_font_scale_2(self, priv, font_scale)
|
|
}
|
|
libass.prototype.oct_set_hinting = libass.prototype.oct_set_hinting = function (
|
|
priv,
|
|
ht
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (ht && typeof ht === 'object') ht = ht.ptr
|
|
_emscripten_bind_libass_oct_set_hinting_2(self, priv, ht)
|
|
}
|
|
libass.prototype.oct_set_line_spacing = libass.prototype.oct_set_line_spacing = function (
|
|
priv,
|
|
line_spacing
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (line_spacing && typeof line_spacing === 'object') {
|
|
line_spacing = line_spacing.ptr
|
|
}
|
|
_emscripten_bind_libass_oct_set_line_spacing_2(self, priv, line_spacing)
|
|
}
|
|
libass.prototype.oct_set_line_position = libass.prototype.oct_set_line_position = function (
|
|
priv,
|
|
line_position
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (line_position && typeof line_position === 'object') {
|
|
line_position = line_position.ptr
|
|
}
|
|
_emscripten_bind_libass_oct_set_line_position_2(self, priv, line_position)
|
|
}
|
|
libass.prototype.oct_set_fonts = libass.prototype.oct_set_fonts = function (
|
|
priv,
|
|
default_font,
|
|
default_family,
|
|
dfp,
|
|
config,
|
|
update
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (default_font && typeof default_font === 'object') {
|
|
default_font = default_font.ptr
|
|
} else default_font = ensureString(default_font)
|
|
if (default_family && typeof default_family === 'object') {
|
|
default_family = default_family.ptr
|
|
} else default_family = ensureString(default_family)
|
|
if (dfp && typeof dfp === 'object') dfp = dfp.ptr
|
|
if (config && typeof config === 'object') config = config.ptr
|
|
else config = ensureString(config)
|
|
if (update && typeof update === 'object') update = update.ptr
|
|
_emscripten_bind_libass_oct_set_fonts_6(
|
|
self,
|
|
priv,
|
|
default_font,
|
|
default_family,
|
|
dfp,
|
|
config,
|
|
update
|
|
)
|
|
}
|
|
libass.prototype.oct_set_selective_style_override_enabled = libass.prototype.oct_set_selective_style_override_enabled = function (
|
|
priv,
|
|
bits
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (bits && typeof bits === 'object') bits = bits.ptr
|
|
_emscripten_bind_libass_oct_set_selective_style_override_enabled_2(
|
|
self,
|
|
priv,
|
|
bits
|
|
)
|
|
}
|
|
libass.prototype.oct_set_selective_style_override = libass.prototype.oct_set_selective_style_override = function (
|
|
priv,
|
|
style
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (style && typeof style === 'object') style = style.ptr
|
|
_emscripten_bind_libass_oct_set_selective_style_override_2(self, priv, style)
|
|
}
|
|
libass.prototype.oct_set_cache_limits = libass.prototype.oct_set_cache_limits = function (
|
|
priv,
|
|
glyph_max,
|
|
bitmap_max_size
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (glyph_max && typeof glyph_max === 'object') glyph_max = glyph_max.ptr
|
|
if (bitmap_max_size && typeof bitmap_max_size === 'object') {
|
|
bitmap_max_size = bitmap_max_size.ptr
|
|
}
|
|
_emscripten_bind_libass_oct_set_cache_limits_3(
|
|
self,
|
|
priv,
|
|
glyph_max,
|
|
bitmap_max_size
|
|
)
|
|
}
|
|
libass.prototype.oct_render_frame = libass.prototype.oct_render_frame = function (
|
|
priv,
|
|
track,
|
|
now,
|
|
detect_change
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
if (track && typeof track === 'object') track = track.ptr
|
|
if (now && typeof now === 'object') now = now.ptr
|
|
if (detect_change && typeof detect_change === 'object') {
|
|
detect_change = detect_change.ptr
|
|
}
|
|
return wrapPointer(
|
|
_emscripten_bind_libass_oct_render_frame_4(
|
|
self,
|
|
priv,
|
|
track,
|
|
now,
|
|
detect_change
|
|
),
|
|
ASS_Image
|
|
)
|
|
}
|
|
libass.prototype.oct_new_track = libass.prototype.oct_new_track = function (
|
|
priv
|
|
) {
|
|
const self = this.ptr
|
|
if (priv && typeof priv === 'object') priv = priv.ptr
|
|
return wrapPointer(
|
|
_emscripten_bind_libass_oct_new_track_1(self, priv),
|
|
ASS_Track
|
|
)
|
|
}
|
|
libass.prototype.oct_free_track = libass.prototype.oct_free_track = function (
|
|
track
|
|
) {
|
|
const self = this.ptr
|
|
if (track && typeof track === 'object') track = track.ptr
|
|
_emscripten_bind_libass_oct_free_track_1(self, track)
|
|
}
|
|
libass.prototype.oct_alloc_style = libass.prototype.oct_alloc_style = function (
|
|
track
|
|
) {
|
|
const self = this.ptr
|
|
if (track && typeof track === 'object') track = track.ptr
|
|
return _emscripten_bind_libass_oct_alloc_style_1(self, track)
|
|
}
|
|
libass.prototype.oct_alloc_event = libass.prototype.oct_alloc_event = function (
|
|
track
|
|
) {
|
|
const self = this.ptr
|
|
if (track && typeof track === 'object') track = track.ptr
|
|
return _emscripten_bind_libass_oct_alloc_event_1(self, track)
|
|
}
|
|
libass.prototype.oct_free_style = libass.prototype.oct_free_style = function (
|
|
track,
|
|
sid
|
|
) {
|
|
const self = this.ptr
|
|
if (track && typeof track === 'object') track = track.ptr
|
|
if (sid && typeof sid === 'object') sid = sid.ptr
|
|
_emscripten_bind_libass_oct_free_style_2(self, track, sid)
|
|
}
|
|
libass.prototype.oct_free_event = libass.prototype.oct_free_event = function (
|
|
track,
|
|
eid
|
|
) {
|
|
const self = this.ptr
|
|
if (track && typeof track === 'object') track = track.ptr
|
|
if (eid && typeof eid === 'object') eid = eid.ptr
|
|
_emscripten_bind_libass_oct_free_event_2(self, track, eid)
|
|
}
|
|
libass.prototype.oct_flush_events = libass.prototype.oct_flush_events = function (
|
|
track
|
|
) {
|
|
const self = this.ptr
|
|
if (track && typeof track === 'object') track = track.ptr
|
|
_emscripten_bind_libass_oct_flush_events_1(self, track)
|
|
}
|
|
libass.prototype.oct_read_file = libass.prototype.oct_read_file = function (
|
|
library,
|
|
fname,
|
|
codepage
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (library && typeof library === 'object') library = library.ptr
|
|
if (fname && typeof fname === 'object') fname = fname.ptr
|
|
else fname = ensureString(fname)
|
|
if (codepage && typeof codepage === 'object') codepage = codepage.ptr
|
|
else codepage = ensureString(codepage)
|
|
return wrapPointer(
|
|
_emscripten_bind_libass_oct_read_file_3(self, library, fname, codepage),
|
|
ASS_Track
|
|
)
|
|
}
|
|
libass.prototype.oct_add_font = libass.prototype.oct_add_font = function (
|
|
library,
|
|
name,
|
|
data,
|
|
data_size
|
|
) {
|
|
const self = this.ptr
|
|
ensureCache.prepare()
|
|
if (library && typeof library === 'object') library = library.ptr
|
|
if (name && typeof name === 'object') name = name.ptr
|
|
else name = ensureString(name)
|
|
if (data && typeof data === 'object') data = data.ptr
|
|
else data = ensureString(data)
|
|
if (data_size && typeof data_size === 'object') data_size = data_size.ptr
|
|
_emscripten_bind_libass_oct_add_font_4(self, library, name, data, data_size)
|
|
}
|
|
libass.prototype.oct_clear_fonts = libass.prototype.oct_clear_fonts = function (
|
|
library
|
|
) {
|
|
const self = this.ptr
|
|
if (library && typeof library === 'object') library = library.ptr
|
|
_emscripten_bind_libass_oct_clear_fonts_1(self, library)
|
|
}
|
|
libass.prototype.oct_step_sub = libass.prototype.oct_step_sub = function (
|
|
track,
|
|
now,
|
|
movement
|
|
) {
|
|
const self = this.ptr
|
|
if (track && typeof track === 'object') track = track.ptr
|
|
if (now && typeof now === 'object') now = now.ptr
|
|
if (movement && typeof movement === 'object') movement = movement.ptr
|
|
return _emscripten_bind_libass_oct_step_sub_3(self, track, now, movement)
|
|
}
|
|
;(function () {
|
|
function setupEnums () {
|
|
Module.ASS_HINTING_NONE = _emscripten_enum_ASS_Hinting_ASS_HINTING_NONE()
|
|
Module.ASS_HINTING_LIGHT = _emscripten_enum_ASS_Hinting_ASS_HINTING_LIGHT()
|
|
Module.ASS_HINTING_NORMAL = _emscripten_enum_ASS_Hinting_ASS_HINTING_NORMAL()
|
|
Module.ASS_HINTING_NATIVE = _emscripten_enum_ASS_Hinting_ASS_HINTING_NATIVE()
|
|
Module.ASS_SHAPING_SIMPLE = _emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_SIMPLE()
|
|
Module.ASS_SHAPING_COMPLEX = _emscripten_enum_ASS_ShapingLevel_ASS_SHAPING_COMPLEX()
|
|
Module.ASS_OVERRIDE_DEFAULT = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_DEFAULT()
|
|
Module.ASS_OVERRIDE_BIT_STYLE = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_STYLE()
|
|
Module.ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_SELECTIVE_FONT_SCALE()
|
|
Module.ASS_OVERRIDE_BIT_FONT_SIZE = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE()
|
|
Module.ASS_OVERRIDE_BIT_FONT_SIZE_FIELDS = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_SIZE_FIELDS()
|
|
Module.ASS_OVERRIDE_BIT_FONT_NAME = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_FONT_NAME()
|
|
Module.ASS_OVERRIDE_BIT_COLORS = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_COLORS()
|
|
Module.ASS_OVERRIDE_BIT_ATTRIBUTES = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ATTRIBUTES()
|
|
Module.ASS_OVERRIDE_BIT_BORDER = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_BORDER()
|
|
Module.ASS_OVERRIDE_BIT_ALIGNMENT = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_ALIGNMENT()
|
|
Module.ASS_OVERRIDE_BIT_MARGINS = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_MARGINS()
|
|
Module.ASS_OVERRIDE_FULL_STYLE = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_FULL_STYLE()
|
|
Module.ASS_OVERRIDE_BIT_JUSTIFY = _emscripten_enum_ASS_OverrideBits_ASS_OVERRIDE_BIT_JUSTIFY()
|
|
}
|
|
if (runtimeInitialized) setupEnums()
|
|
else addOnPreMain(setupEnums)
|
|
})()
|
|
Module.FS = FS
|
|
self.delay = 0
|
|
self.lastCurrentTime = 0
|
|
self.rate = 1
|
|
self.rafId = null
|
|
self.nextIsRaf = false
|
|
self.lastCurrentTimeReceivedAt = Date.now()
|
|
self.targetFps = 30
|
|
self.libassMemoryLimit = 0
|
|
self.renderOnDemand = false
|
|
self.dropAllAnimations = false
|
|
self.width = 0
|
|
self.height = 0
|
|
self.fontMap_ = {}
|
|
self.fontId = 0
|
|
self.readDataUri = function (dataURI) {
|
|
if (typeof dataURI !== 'string') {
|
|
throw new Error('Invalid argument: dataURI must be a string')
|
|
}
|
|
dataURI = dataURI.split(',')
|
|
const type = dataURI[0].split(':')[1].split(';')[0]
|
|
const byteString = atob(dataURI[1])
|
|
const byteStringLength = byteString.length
|
|
const arrayBuffer = new ArrayBuffer(byteStringLength)
|
|
const intArray = new Uint8Array(arrayBuffer)
|
|
for (let i = 0; i < byteStringLength; i++) {
|
|
intArray[i] = byteString.charCodeAt(i)
|
|
}
|
|
return intArray
|
|
}
|
|
self.decodeASSFontEncoding = function (input) {
|
|
const output = new Uint8Array(input.length)
|
|
const grouping = new Uint8Array(4)
|
|
let offset = 0
|
|
let arrayOffset = 0
|
|
let writeOffset = 0
|
|
let charCode
|
|
while (offset < input.length) {
|
|
charCode = input.charCodeAt(offset++)
|
|
if (charCode >= 33 && charCode <= 96) {
|
|
grouping[arrayOffset++] = charCode - 33
|
|
if (arrayOffset === 4) {
|
|
output[writeOffset++] = (grouping[0] << 2) | (grouping[1] >> 4)
|
|
output[writeOffset++] = ((grouping[1] & 15) << 4) | (grouping[2] >> 2)
|
|
output[writeOffset++] = ((grouping[2] & 3) << 6) | grouping[3]
|
|
arrayOffset = 0
|
|
}
|
|
}
|
|
}
|
|
if (arrayOffset > 0) {
|
|
if (arrayOffset === 2) {
|
|
output[writeOffset++] = ((grouping[0] << 6) | grouping[1]) >> 4
|
|
} else if (arrayOffset === 3) {
|
|
const ix = ((grouping[0] << 12) | (grouping[1] << 6) | grouping[2]) >> 2
|
|
output[writeOffset++] = ix >> 8
|
|
output[writeOffset++] = ix & 255
|
|
}
|
|
}
|
|
return output.slice(0, writeOffset)
|
|
}
|
|
self.writeFontToFS = function (font) {
|
|
font = font.trim().toLowerCase()
|
|
if (font.startsWith('@')) {
|
|
font = font.substr(1)
|
|
}
|
|
if (self.fontMap_.hasOwnProperty(font)) return
|
|
self.fontMap_[font] = true
|
|
let content
|
|
let name
|
|
if (self.availableFonts.hasOwnProperty(font)) {
|
|
content = readBinary(self.availableFonts[font])
|
|
name = self.availableFonts[font].split('/').pop()
|
|
} else {
|
|
return
|
|
}
|
|
Module.FS.writeFile('/fonts/font' + self.fontId++ + '-' + name, content, {
|
|
encoding: 'binary'
|
|
})
|
|
}
|
|
self.writeAvailableFontsToFS = function (content) {
|
|
if (!self.availableFonts) return
|
|
const sections = parseAss(content)
|
|
for (let i = 0; i < sections.length; i++) {
|
|
for (let j = 0; j < sections[i].body.length; j++) {
|
|
if (sections[i].body[j].key === 'Style') {
|
|
self.writeFontToFS(sections[i].body[j].value.Fontname)
|
|
}
|
|
}
|
|
}
|
|
const regex = /\\fn([^\\}]*?)[\\}]/g
|
|
let matches
|
|
while ((matches = regex.exec(self.subContent))) {
|
|
self.writeFontToFS(matches[1])
|
|
}
|
|
}
|
|
self.getRenderMethod = function () {
|
|
return offscreenRender
|
|
}
|
|
|
|
self.setTrack = function (content) {
|
|
self.writeAvailableFontsToFS(content)
|
|
Module.FS.writeFile('/sub.ass', content)
|
|
self.octObj.createTrack('/sub.ass')
|
|
self.ass_track = self.octObj.track
|
|
if (!self.renderOnDemand) {
|
|
self.getRenderMethod()()
|
|
}
|
|
}
|
|
self.freeTrack = function () {
|
|
self.octObj.removeTrack()
|
|
if (!self.renderOnDemand) {
|
|
self.getRenderMethod()()
|
|
}
|
|
}
|
|
self.setTrackByUrl = function (url) {
|
|
let content = ''
|
|
if (url.endsWith('.br')) {
|
|
content = Module.BrotliDecode(readBinary(url))
|
|
} else {
|
|
content = read_(url)
|
|
}
|
|
self.setTrack(content)
|
|
}
|
|
self.resize = function (width, height) {
|
|
self.width = width
|
|
self.height = height
|
|
self.octObj.resizeCanvas(width, height)
|
|
}
|
|
self.getCurrentTime = function () {
|
|
const diff = (Date.now() - self.lastCurrentTimeReceivedAt) / 1e3
|
|
if (self._isPaused) {
|
|
return self.lastCurrentTime
|
|
} else {
|
|
if (diff > 5) {
|
|
console.error(
|
|
"Didn't received currentTime > 5 seconds. Assuming video was paused."
|
|
)
|
|
self.setIsPaused(true)
|
|
}
|
|
return self.lastCurrentTime + diff * self.rate
|
|
}
|
|
}
|
|
self.setCurrentTime = function (currentTime) {
|
|
self.lastCurrentTime = currentTime
|
|
self.lastCurrentTimeReceivedAt = Date.now()
|
|
if (!self.rafId) {
|
|
if (self.nextIsRaf) {
|
|
if (!self.renderOnDemand) {
|
|
self.rafId = self.requestAnimationFrame(self.getRenderMethod())
|
|
}
|
|
} else {
|
|
if (!self.renderOnDemand) {
|
|
self.getRenderMethod()()
|
|
}
|
|
setTimeout(function () {
|
|
self.nextIsRaf = false
|
|
}, 20)
|
|
}
|
|
}
|
|
}
|
|
self._isPaused = true
|
|
self.getIsPaused = function () {
|
|
return self._isPaused
|
|
}
|
|
self.setIsPaused = function (isPaused) {
|
|
if (isPaused != self._isPaused) {
|
|
self._isPaused = isPaused
|
|
if (isPaused) {
|
|
if (self.rafId) {
|
|
clearTimeout(self.rafId)
|
|
self.rafId = null
|
|
}
|
|
} else {
|
|
self.lastCurrentTimeReceivedAt = Date.now()
|
|
if (!self.renderOnDemand) {
|
|
self.rafId = self.requestAnimationFrame(self.getRenderMethod())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
self.offscreenRender = function (force) {
|
|
self.rafId = 0
|
|
self.renderPending = false
|
|
// const startTime = performance.now()
|
|
const result = self.octObj.renderImage(
|
|
self.getCurrentTime() + self.delay,
|
|
self.changed
|
|
)
|
|
const changed = Module.getValue(self.changed, 'i32')
|
|
if ((Number(changed) !== 0 || force) && self.offscreenCanvas) {
|
|
const images = self.buildResultImage(result)
|
|
// const newTime = performance.now()
|
|
// const libassTime = newTime - startTime
|
|
const promises = []
|
|
for (let i = 0; i < images.length; i++) {
|
|
promises[i] = createImageBitmap(images[i].image)
|
|
}
|
|
Promise.all(promises).then(function (bitmaps) {
|
|
// const decodeTime = performance.now() - newTime
|
|
function renderFastFrames () {
|
|
// const beforeDrawTime = performance.now()
|
|
self.offscreenCanvasCtx.clearRect(
|
|
0,
|
|
0,
|
|
self.offscreenCanvas.width,
|
|
self.offscreenCanvas.height
|
|
)
|
|
for (let i = 0; i < bitmaps.length; i++) {
|
|
self.offscreenCanvasCtx.drawImage(
|
|
bitmaps[i],
|
|
images[i].x,
|
|
images[i].y
|
|
)
|
|
}
|
|
// const drawTime = performance.now() - beforeDrawTime
|
|
// console.log(
|
|
// bitmaps.length +
|
|
// ' bitmaps, libass: ' +
|
|
// libassTime +
|
|
// 'ms, decode: ' +
|
|
// decodeTime +
|
|
// 'ms, draw: ' +
|
|
// drawTime +
|
|
// 'ms'
|
|
// )
|
|
}
|
|
self.requestAnimationFrame(renderFastFrames)
|
|
})
|
|
}
|
|
if (!self._isPaused) {
|
|
self.rafId = self.requestAnimationFrame(self.offscreenRender)
|
|
}
|
|
}
|
|
|
|
self.buildResultImage = function (ptr) {
|
|
const items = []
|
|
let item
|
|
while (Number(ptr.ptr) !== 0) {
|
|
item = self.buildResultImageItem(ptr)
|
|
if (item !== null) {
|
|
items.push(item)
|
|
}
|
|
ptr = ptr.next
|
|
}
|
|
return items
|
|
}
|
|
self.buildResultImageItem = function (ptr) {
|
|
const bitmap = ptr.bitmap
|
|
const stride = ptr.stride
|
|
const w = ptr.w
|
|
const h = ptr.h
|
|
const color = ptr.color
|
|
if (w === 0 || h === 0) {
|
|
return null
|
|
}
|
|
const a = (255 - (color & 255)) / 255
|
|
if (a === 0) {
|
|
return null
|
|
}
|
|
const c = ((color << 8) & 0xff0000) | ((color >> 8) & 0xff00) | ((color >> 24) & 0xff) // black magic
|
|
const buf = new ArrayBuffer(w * h * 4)
|
|
const buf8 = new Uint8ClampedArray(buf)
|
|
const data = new Uint32Array(buf) // operate on a single position, instead of 4 positions at once
|
|
let bitmapPosition = 0
|
|
let resultPosition = 0
|
|
for (let y = h; y--; bitmapPosition += stride) {
|
|
const offset = bitmap + bitmapPosition
|
|
for (let x = 0, z = w; z--; ++x, resultPosition++) {
|
|
const k = Module.HEAPU8[offset + x]
|
|
if (k !== 0) {
|
|
data[resultPosition] = ((a * k) << 24) | c // more black magic
|
|
}
|
|
}
|
|
}
|
|
const image = new ImageData(buf8, w, h)
|
|
x = ptr.dst_x
|
|
y = ptr.dst_y
|
|
return {
|
|
x: x,
|
|
y: y,
|
|
image: image
|
|
}
|
|
}
|
|
|
|
if (typeof SDL !== 'undefined') {
|
|
SDL.defaults.copyOnLock = false
|
|
SDL.defaults.discardOnLock = false
|
|
SDL.defaults.opaqueFrontBuffer = false
|
|
}
|
|
|
|
function FPSTracker (text) {
|
|
let last = 0
|
|
let mean = 0
|
|
let counter = 0
|
|
this.tick = function () {
|
|
const now = Date.now()
|
|
if (last > 0) {
|
|
const diff = now - last
|
|
mean = 0.99 * mean + 0.01 * diff
|
|
if (counter++ === 60) {
|
|
counter = 0
|
|
dump(text + ' fps: ' + (1000 / mean).toFixed(2) + '\n')
|
|
}
|
|
}
|
|
last = now
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Parse the content of an .ass file.
|
|
* @param {!string} content the content of the file
|
|
*/
|
|
function parseAss (content) {
|
|
let m, format, lastPart, parts, key, value, tmp, i, j, body
|
|
const sections = []
|
|
const lines = content.split(/[\r\n]+/g)
|
|
for (i = 0; i < lines.length; i++) {
|
|
m = lines[i].match(/^\[(.*)\]$/)
|
|
if (m) {
|
|
format = null
|
|
sections.push({
|
|
name: m[1],
|
|
body: []
|
|
})
|
|
} else {
|
|
if (/^\s*$/.test(lines[i])) continue
|
|
if (sections.length === 0) continue
|
|
body = sections[sections.length - 1].body
|
|
if (lines[i][0] === ';') {
|
|
body.push({
|
|
type: 'comment',
|
|
value: lines[i].substring(1)
|
|
})
|
|
} else {
|
|
parts = lines[i].split(':')
|
|
key = parts[0]
|
|
value = parts
|
|
.slice(1)
|
|
.join(':')
|
|
.trim()
|
|
if (format || key === 'Format') {
|
|
value = value.split(',')
|
|
if (format && value.length > format.length) {
|
|
lastPart = value.slice(format.length - 1).join(',')
|
|
value = value.slice(0, format.length - 1)
|
|
value.push(lastPart)
|
|
}
|
|
value = value.map(function (s) {
|
|
return s.trim()
|
|
})
|
|
if (format) {
|
|
tmp = {}
|
|
for (j = 0; j < value.length; j++) {
|
|
tmp[format[j]] = value[j]
|
|
}
|
|
value = tmp
|
|
}
|
|
}
|
|
if (key === 'Format') {
|
|
format = value
|
|
}
|
|
body.push({
|
|
key: key,
|
|
value: value
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
return sections
|
|
}
|
|
|
|
self.requestAnimationFrame = (function () {
|
|
// similar to Browser.requestAnimationFrame
|
|
let nextRAF = 0
|
|
return function (func) {
|
|
// try to keep target fps (30fps) between calls to here
|
|
const now = Date.now()
|
|
if (nextRAF === 0) {
|
|
nextRAF = now + 1000 / self.targetFps
|
|
} else {
|
|
while (now + 2 >= nextRAF) {
|
|
// fudge a little, to avoid timer jitter causing us to do lots of delay:0
|
|
nextRAF += 1000 / self.targetFps
|
|
}
|
|
}
|
|
const delay = Math.max(nextRAF - now, 0)
|
|
return setTimeout(func, delay)
|
|
// return setTimeout(func, 1);
|
|
}
|
|
})()
|
|
|
|
const screen = {
|
|
width: 0,
|
|
height: 0
|
|
}
|
|
|
|
Module.print = function Module_print (x) {
|
|
// dump('OUT: ' + x + '\n');
|
|
postMessage({
|
|
target: 'stdout',
|
|
content: x
|
|
})
|
|
}
|
|
Module.printErr = function Module_printErr (x) {
|
|
// dump('ERR: ' + x + '\n');
|
|
postMessage({
|
|
target: 'stderr',
|
|
content: x
|
|
})
|
|
}
|
|
|
|
// Frame throttling
|
|
|
|
let frameId = 0
|
|
let clientFrameId = 0
|
|
let commandBuffer = []
|
|
|
|
const postMainLoop = Module.postMainLoop
|
|
Module.postMainLoop = function () {
|
|
if (postMainLoop) postMainLoop()
|
|
// frame complete, send a frame id
|
|
postMessage({
|
|
target: 'tick',
|
|
id: frameId++
|
|
})
|
|
commandBuffer = []
|
|
}
|
|
|
|
// Wait to start running until we receive some info from the client
|
|
// addRunDependency('gl-prefetch');
|
|
addRunDependency('worker-init')
|
|
|
|
// buffer messages until the program starts to run
|
|
|
|
let messageBuffer = null
|
|
let messageResenderTimeout = null
|
|
|
|
function messageResender () {
|
|
if (calledMain) {
|
|
assert(messageBuffer && messageBuffer.length > 0)
|
|
messageResenderTimeout = null
|
|
messageBuffer.forEach(function (message) {
|
|
onmessage(message)
|
|
})
|
|
messageBuffer = null
|
|
} else {
|
|
messageResenderTimeout = setTimeout(messageResender, 50)
|
|
}
|
|
}
|
|
|
|
function _applyKeys (input, output) {
|
|
const vargs = Object.keys(input)
|
|
|
|
for (let i = 0; i < vargs.length; i++) {
|
|
output[vargs[i]] = input[vargs[i]]
|
|
}
|
|
}
|
|
|
|
function onMessageFromMainEmscriptenThread (message) {
|
|
if (!calledMain && !message.data.preMain) {
|
|
if (!messageBuffer) {
|
|
messageBuffer = []
|
|
messageResenderTimeout = setTimeout(messageResender, 50)
|
|
}
|
|
messageBuffer.push(message)
|
|
return
|
|
}
|
|
if (calledMain && messageResenderTimeout) {
|
|
clearTimeout(messageResenderTimeout)
|
|
messageResender()
|
|
}
|
|
// console.log('worker got ' + JSON.stringify(message.data).substr(0, 150) + '\n');
|
|
switch (message.data.target) {
|
|
case 'window': {
|
|
self.fireEvent(message.data.event)
|
|
break
|
|
}
|
|
case 'canvas': {
|
|
if (message.data.event) {
|
|
Module.canvas.fireEvent(message.data.event)
|
|
} else if (message.data.width) {
|
|
if (Module.canvas && message.data.boundingClientRect) {
|
|
Module.canvas.boundingClientRect = message.data.boundingClientRect
|
|
}
|
|
self.resize(message.data.width, message.data.height)
|
|
if (!self.renderOnDemand) {
|
|
self.getRenderMethod()()
|
|
}
|
|
} else throw new Error('ey?')
|
|
break
|
|
}
|
|
case 'offscreenCanvas': {
|
|
self.offscreenCanvas = message.data.canvas
|
|
self.offscreenCanvasCtx = self.offscreenCanvas.getContext('2d')
|
|
break
|
|
}
|
|
case 'video': {
|
|
if (message.data.currentTime !== undefined) {
|
|
self.setCurrentTime(message.data.currentTime)
|
|
}
|
|
if (message.data.isPaused !== undefined) {
|
|
self.setIsPaused(message.data.isPaused)
|
|
}
|
|
if (message.data.rate) {
|
|
self.rate = message.data.rate
|
|
}
|
|
break
|
|
}
|
|
case 'tock': {
|
|
clientFrameId = message.data.id
|
|
break
|
|
}
|
|
case 'worker-init': {
|
|
screen.width = self.width = message.data.width
|
|
screen.height = self.height = message.data.height
|
|
self.subUrl = message.data.subUrl
|
|
self.subContent = message.data.subContent
|
|
self.fontFiles = message.data.fonts
|
|
self.availableFonts = message.data.availableFonts
|
|
self.debug = message.data.debug
|
|
if (Module.canvas) {
|
|
Module.canvas.width_ = message.data.width
|
|
Module.canvas.height_ = message.data.height
|
|
if (message.data.boundingClientRect) {
|
|
Module.canvas.boundingClientRect = message.data.boundingClientRect
|
|
}
|
|
}
|
|
self.targetFps = message.data.targetFps || self.targetFps
|
|
self.libassMemoryLimit =
|
|
message.data.libassMemoryLimit || self.libassMemoryLimit
|
|
self.libassGlyphLimit = message.data.libassGlyphLimit || 0
|
|
self.renderOnDemand = message.data.renderOnDemand || false
|
|
self.dropAllAnimations = message.data.dropAllAnimations || false
|
|
removeRunDependency('worker-init')
|
|
break
|
|
}
|
|
case 'oneshot-render':
|
|
self.oneshotRender(
|
|
message.data.lastRendered,
|
|
message.data.renderNow || false,
|
|
message.data.iteration
|
|
)
|
|
break
|
|
case 'destroy':
|
|
self.octObj.quitLibrary()
|
|
break
|
|
case 'free-track':
|
|
self.freeTrack()
|
|
break
|
|
case 'set-track':
|
|
self.setTrack(message.data.content)
|
|
break
|
|
case 'set-track-by-url':
|
|
self.setTrackByUrl(message.data.url)
|
|
break
|
|
case 'create-event': {
|
|
const event = message.data.event
|
|
const vargs = Object.keys(event)
|
|
const evntPtr = self.octObj.track.get_events(self.octObj.allocEvent())
|
|
|
|
for (const varg of vargs) {
|
|
evntPtr[varg] = event[varg]
|
|
}
|
|
break
|
|
}
|
|
case 'get-events': {
|
|
const events = []
|
|
for (let i = 0; i < self.octObj.getEventCount(); i++) {
|
|
const evntPtr = self.octObj.track.get_events(i)
|
|
const event = {
|
|
Start: evntPtr.get_Start(),
|
|
Duration: evntPtr.get_Duration(),
|
|
ReadOrder: evntPtr.get_ReadOrder(),
|
|
Layer: evntPtr.get_Layer(),
|
|
Style: evntPtr.get_Style(),
|
|
Name: evntPtr.get_Name(),
|
|
MarginL: evntPtr.get_MarginL(),
|
|
MarginR: evntPtr.get_MarginR(),
|
|
MarginV: evntPtr.get_MarginV(),
|
|
Effect: evntPtr.get_Effect(),
|
|
Text: evntPtr.get_Text()
|
|
}
|
|
|
|
events.push(event)
|
|
}
|
|
postMessage({
|
|
target: 'get-events',
|
|
time: Date.now(),
|
|
events: events
|
|
})
|
|
break
|
|
}
|
|
case 'set-event': {
|
|
const event = message.data.event
|
|
const evntPtr = self.octObj.track.get_events(message.data.index)
|
|
|
|
for (const varg of Object.keys(event)) {
|
|
evntPtr[varg] = event[varg]
|
|
}
|
|
break
|
|
}
|
|
case 'remove-event':
|
|
self.octObj.removeEvent(message.data.index)
|
|
break
|
|
case 'create-style': {
|
|
const style = message.data.style
|
|
const stylPtr = self.octObj.track.get_styles(iself.octObj.allocStyle())
|
|
|
|
for (const varg of Object.keys(style)) {
|
|
stylPtr[varg] = style[varg]
|
|
}
|
|
break
|
|
}
|
|
case 'get-styles': {
|
|
const styles = []
|
|
for (let i = 0; i < self.octObj.getStyleCount(); i++) {
|
|
const stylPtr = self.octObj.track.get_styles(i)
|
|
const style = {
|
|
Name: stylPtr.get_Name(),
|
|
FontName: stylPtr.get_FontName(),
|
|
FontSize: stylPtr.get_FontSize(),
|
|
PrimaryColour: stylPtr.get_PrimaryColour(),
|
|
SecondaryColour: stylPtr.get_SecondaryColour(),
|
|
OutlineColour: stylPtr.get_OutlineColour(),
|
|
BackColour: stylPtr.get_BackColour(),
|
|
Bold: stylPtr.get_Bold(),
|
|
Italic: stylPtr.get_Italic(),
|
|
Underline: stylPtr.get_Underline(),
|
|
StrikeOut: stylPtr.get_StrikeOut(),
|
|
ScaleX: stylPtr.get_ScaleX(),
|
|
ScaleY: stylPtr.get_ScaleY(),
|
|
Spacing: stylPtr.get_Spacing(),
|
|
Angle: stylPtr.get_Angle(),
|
|
BorderStyle: stylPtr.get_BorderStyle(),
|
|
Outline: stylPtr.get_Outline(),
|
|
Shadow: stylPtr.get_Shadow(),
|
|
Alignment: stylPtr.get_Alignment(),
|
|
MarginL: stylPtr.get_MarginL(),
|
|
MarginR: stylPtr.get_MarginR(),
|
|
MarginV: stylPtr.get_MarginV(),
|
|
Encoding: stylPtr.get_Encoding(),
|
|
treat_fontname_as_pattern: stylPtr.get_treat_fontname_as_pattern(),
|
|
Blur: stylPtr.get_Blur(),
|
|
Justify: stylPtr.get_Justify()
|
|
}
|
|
styles.push(style)
|
|
}
|
|
postMessage({
|
|
target: 'get-styles',
|
|
time: Date.now(),
|
|
styles: styles
|
|
})
|
|
break
|
|
}
|
|
case 'set-style': {
|
|
const style = message.data.style
|
|
const stylPtr = self.octObj.track.get_styles(message.data.index)
|
|
const vargs = Object.keys(style)
|
|
|
|
for (const varg of vargs) {
|
|
stylPtr[varg] = style[varg]
|
|
}
|
|
break
|
|
}
|
|
case 'remove-style':
|
|
self.octObj.removeStyle(message.data.index)
|
|
break
|
|
case 'runBenchmark': {
|
|
self.runBenchmark()
|
|
break
|
|
}
|
|
case 'custom': {
|
|
if (Module.onCustomMessage) {
|
|
Module.onCustomMessage(message)
|
|
} else {
|
|
console.error(
|
|
'Custom message received but worker Module.onCustomMessage not implemented.'
|
|
)
|
|
}
|
|
break
|
|
}
|
|
case 'setimmediate': {
|
|
if (Module.setImmediates) Module.setImmediates.shift()()
|
|
break
|
|
}
|
|
default:
|
|
throw new Error('wha? ' + message.data.target)
|
|
}
|
|
}
|
|
|
|
onmessage = onMessageFromMainEmscriptenThread
|
|
|
|
function postCustomMessage (data) {
|
|
postMessage({
|
|
target: 'custom',
|
|
userData: data
|
|
})
|
|
}
|
|
|
|
self.runBenchmark = function (seconds, pos, async) {
|
|
let totalTime = 0
|
|
let i = 0
|
|
pos = pos || 0
|
|
seconds = seconds || 60
|
|
const count = seconds * self.targetFps
|
|
const start = performance.now()
|
|
let longestFrame = 0
|
|
const run = function () {
|
|
const t0 = performance.now()
|
|
|
|
pos += 1 / self.targetFps
|
|
self.setCurrentTime(pos)
|
|
|
|
const t1 = performance.now()
|
|
const diff = t1 - t0
|
|
totalTime += diff
|
|
if (diff > longestFrame) {
|
|
longestFrame = diff
|
|
}
|
|
|
|
if (i < count) {
|
|
i++
|
|
|
|
if (async) {
|
|
self.requestAnimationFrame(run)
|
|
return false
|
|
} else {
|
|
return true
|
|
}
|
|
} else {
|
|
console.log(
|
|
'Performance fps: ' + Math.round(1000 / (totalTime / count)) + ''
|
|
)
|
|
console.log('Real fps: ' + Math.round(1000 / ((t1 - start) / count)) + '')
|
|
console.log('Total time: ' + totalTime)
|
|
console.log(
|
|
'Longest frame: ' +
|
|
Math.ceil(longestFrame) +
|
|
'ms (' +
|
|
Math.floor(1000 / longestFrame) +
|
|
' fps)'
|
|
)
|
|
|
|
return false
|
|
}
|
|
}
|
|
|
|
while (true) {
|
|
if (!run()) {
|
|
break
|
|
}
|
|
}
|
|
}
|