Skip to content

Instantly share code, notes, and snippets.

@Last-Order
Created October 16, 2018 15:43
Show Gist options
  • Save Last-Order/82dba13f3696062697f415f0249a149c to your computer and use it in GitHub Desktop.
Save Last-Order/82dba13f3696062697f415f0249a149c to your computer and use it in GitHub Desktop.
test
var hexcase = 0
, b64pad = "=";
function b64_hmac_sha1(k, d) {
return rstr2b64(rstr_hmac_sha1(str2rstr_utf8(k), str2rstr_utf8(d)))
}
function rstr_sha1(s) {
return binb2rstr(binb_sha1(rstr2binb(s), 8 * s.length))
}
function rstr_hmac_sha1(key, data) {
var bkey = rstr2binb(key);
16 < bkey.length && (bkey = binb_sha1(bkey, 8 * key.length));
for (var ipad = Array(16), opad = Array(16), i = 0; i < 16; i++)
ipad[i] = 909522486 ^ bkey[i],
opad[i] = 1549556828 ^ bkey[i];
var hash = binb_sha1(ipad.concat(rstr2binb(data)), 512 + 8 * data.length);
return binb2rstr(binb_sha1(opad.concat(hash), 672))
}
function rstr2hex(input) {
for (var x, hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef", output = "", i = 0; i < input.length; i++)
x = input.charCodeAt(i),
output += hex_tab.charAt(x >>> 4 & 15) + hex_tab.charAt(15 & x);
return output
}
function rstr2b64(input) {
for (var output = "", len = input.length, i = 0; i < len; i += 3)
for (var triplet = input.charCodeAt(i) << 16 | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0), j = 0; j < 4; j++)
8 * i + 6 * j > 8 * input.length ? output += b64pad : output += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(triplet >>> 6 * (3 - j) & 63);
return output
}
function rstr2any(input, encoding) {
var i, q, x, quotient, divisor = encoding.length, remainders = Array(), dividend = Array(Math.ceil(input.length / 2));
for (i = 0; i < dividend.length; i++)
dividend[i] = input.charCodeAt(2 * i) << 8 | input.charCodeAt(2 * i + 1);
for (; 0 < dividend.length; ) {
for (quotient = Array(),
i = x = 0; i < dividend.length; i++)
x = (x << 16) + dividend[i],
x -= (q = Math.floor(x / divisor)) * divisor,
(0 < quotient.length || 0 < q) && (quotient[quotient.length] = q);
remainders[remainders.length] = x,
dividend = quotient
}
var output = "";
for (i = remainders.length - 1; 0 <= i; i--)
output += encoding.charAt(remainders[i]);
var full_length = Math.ceil(8 * input.length / (Math.log(encoding.length) / Math.log(2)));
for (i = output.length; i < full_length; i++)
output = encoding[0] + output;
return output
}
function str2rstr_utf8(input) {
for (var x, y, output = "", i = -1; ++i < input.length; )
x = input.charCodeAt(i),
y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0,
55296 <= x && x <= 56319 && 56320 <= y && y <= 57343 && (x = 65536 + ((1023 & x) << 10) + (1023 & y),
i++),
x <= 127 ? output += String.fromCharCode(x) : x <= 2047 ? output += String.fromCharCode(192 | x >>> 6 & 31, 128 | 63 & x) : x <= 65535 ? output += String.fromCharCode(224 | x >>> 12 & 15, 128 | x >>> 6 & 63, 128 | 63 & x) : x <= 2097151 && (output += String.fromCharCode(240 | x >>> 18 & 7, 128 | x >>> 12 & 63, 128 | x >>> 6 & 63, 128 | 63 & x));
return output
}
function str2rstr_utf16le(input) {
for (var output = "", i = 0; i < input.length; i++)
output += String.fromCharCode(255 & input.charCodeAt(i), input.charCodeAt(i) >>> 8 & 255);
return output
}
function str2rstr_utf16be(input) {
for (var output = "", i = 0; i < input.length; i++)
output += String.fromCharCode(input.charCodeAt(i) >>> 8 & 255, 255 & input.charCodeAt(i));
return output
}
function rstr2binb(input) {
for (var output = Array(input.length >> 2), i = 0; i < output.length; i++)
output[i] = 0;
for (i = 0; i < 8 * input.length; i += 8)
output[i >> 5] |= (255 & input.charCodeAt(i / 8)) << 24 - i % 32;
return output
}
function binb2rstr(input) {
for (var output = "", i = 0; i < 32 * input.length; i += 8)
output += String.fromCharCode(input[i >> 5] >>> 24 - i % 32 & 255);
return output
}
function binb_sha1(x, len) {
x[len >> 5] |= 128 << 24 - len % 32,
x[15 + (len + 64 >> 9 << 4)] = len;
for (var w = Array(80), a = 1732584193, b = -271733879, c = -1732584194, d = 271733878, e = -1009589776, i = 0; i < x.length; i += 16) {
for (var olda = a, oldb = b, oldc = c, oldd = d, olde = e, j = 0; j < 80; j++) {
w[j] = j < 16 ? x[i + j] : bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
var t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
e = d,
d = c,
c = bit_rol(b, 30),
b = a,
a = t
}
a = safe_add(a, olda),
b = safe_add(b, oldb),
c = safe_add(c, oldc),
d = safe_add(d, oldd),
e = safe_add(e, olde)
}
return Array(a, b, c, d, e)
}
function sha1_ft(t, b, c, d) {
return t < 20 ? b & c | ~b & d : t < 40 ? b ^ c ^ d : t < 60 ? b & c | b & d | c & d : b ^ c ^ d
}
function sha1_kt(t) {
return t < 20 ? 1518500249 : t < 40 ? 1859775393 : t < 60 ? -1894007588 : -899497514
}
function safe_add(x, y) {
var lsw = (65535 & x) + (65535 & y);
return (x >> 16) + (y >> 16) + (lsw >> 16) << 16 | 65535 & lsw
}
function bit_rol(num, cnt) {
return num << cnt | num >>> 32 - cnt
}
!function(f) {
if ("object" == typeof exports && "undefined" != typeof module)
module.exports = f();
else if ("function" == typeof define && define.amd)
define([], f);
else {
("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).baidubce = f()
}
}(function() {
return function e(t, n, r) {
function s(o, u) {
if (!n[o]) {
if (!t[o]) {
var a = "function" == typeof require && require;
if (!u && a)
return a(o, !0);
if (i)
return i(o, !0);
var f = new Error("Cannot find module '" + o + "'");
throw f.code = "MODULE_NOT_FOUND",
f
}
var l = n[o] = {
exports: {}
};
t[o][0].call(l.exports, function(e) {
var n = t[o][1][e];
return s(n || e)
}, l, l.exports, e, t, n, r)
}
return n[o].exports
}
for (var i = "function" == typeof require && require, o = 0; o < r.length; o++)
s(r[o]);
return s
}({
1: [function(require, module, exports) {
var Q = require(44)
, BosClient = require(17)
, Auth = require(15)
, Uploader = require(31)
, utils = require(32);
module.exports = {
bos: {
Uploader: Uploader
},
utils: utils,
sdk: {
Q: Q,
BosClient: BosClient,
Auth: Auth
}
}
}
, {
15: 15,
17: 17,
31: 31,
32: 32,
44: 44
}],
2: [function(require, module, exports) {
"use strict";
var mapAsync = require(9)
, doParallelLimit = require(3);
module.exports = doParallelLimit(mapAsync)
}
, {
3: 3,
9: 9
}],
3: [function(require, module, exports) {
"use strict";
var eachOfLimit = require(4);
module.exports = function(fn) {
return function(obj, limit, iterator, cb) {
return fn(eachOfLimit(limit), obj, iterator, cb)
}
}
}
, {
4: 4
}],
4: [function(require, module, exports) {
var once = require(11)
, noop = require(10)
, onlyOnce = require(12)
, keyIterator = require(7);
module.exports = function(limit) {
return function(obj, iterator, cb) {
cb = once(cb || noop);
var nextKey = keyIterator(obj = obj || []);
if (limit <= 0)
return cb(null);
var done = !1
, running = 0
, errored = !1;
!function replenish() {
if (done && running <= 0)
return cb(null);
for (; running < limit && !errored; ) {
var key = nextKey();
if (null === key)
return done = !0,
void (running <= 0 && cb(null));
running += 1,
iterator(obj[key], key, onlyOnce(function(err) {
running -= 1,
err ? (cb(err),
errored = !0) : replenish()
}))
}
}()
}
}
}
, {
10: 10,
11: 11,
12: 12,
7: 7
}],
5: [function(require, module, exports) {
"use strict";
module.exports = Array.isArray || function(obj) {
return "[object Array]" === Object.prototype.toString.call(obj)
}
}
, {}],
6: [function(require, module, exports) {
"use strict";
var isArray = require(5);
module.exports = function(arr) {
return isArray(arr) || "number" == typeof arr.length && 0 <= arr.length && arr.length % 1 == 0
}
}
, {
5: 5
}],
7: [function(require, module, exports) {
"use strict";
var _keys = require(8)
, isArrayLike = require(6);
module.exports = function(coll) {
var len, keys, i = -1;
return isArrayLike(coll) ? (len = coll.length,
function() {
return ++i < len ? i : null
}
) : (keys = _keys(coll),
len = keys.length,
function() {
return ++i < len ? keys[i] : null
}
)
}
}
, {
6: 6,
8: 8
}],
8: [function(require, module, exports) {
"use strict";
module.exports = Object.keys || function(obj) {
var _keys = [];
for (var k in obj)
obj.hasOwnProperty(k) && _keys.push(k);
return _keys
}
}
, {}],
9: [function(require, module, exports) {
"use strict";
var once = require(11)
, noop = require(10)
, isArrayLike = require(6);
module.exports = function(eachfn, arr, iterator, cb) {
cb = once(cb || noop);
var results = isArrayLike(arr = arr || []) ? [] : {};
eachfn(arr, function(value, index, cb) {
iterator(value, function(err, v) {
results[index] = v,
cb(err)
})
}, function(err) {
cb(err, results)
})
}
}
, {
10: 10,
11: 11,
6: 6
}],
10: [function(require, module, exports) {
"use strict";
module.exports = function() {}
}
, {}],
11: [function(require, module, exports) {
"use strict";
module.exports = function(fn) {
return function() {
null !== fn && (fn.apply(this, arguments),
fn = null)
}
}
}
, {}],
12: [function(require, module, exports) {
"use strict";
module.exports = function(fn) {
return function() {
if (null === fn)
throw new Error("Callback was already called.");
fn.apply(this, arguments),
fn = null
}
}
}
, {}],
13: [function(require, module, exports) {
var objectToString = Object.prototype.toString;
module.exports = function(value) {
return "number" == typeof value || function(value) {
return !!value && "object" == typeof value
}(value) && "[object Number]" == objectToString.call(value)
}
}
, {}],
14: [function(require, module, exports) {
module.exports = function(value) {
var type = typeof value;
return !!value && ("object" == type || "function" == type)
}
}
, {}],
15: [function(require, module, exports) {
var helper = require(42)
, util = require(47)
, u = require(46)
, H = require(19)
, strings = require(22);
function Auth(ak, sk) {
this.ak = ak,
this.sk = sk
}
Auth.prototype.generateAuthorization = function(method, resource, params, headers, timestamp, expirationInSeconds, headersToSign) {
var now = timestamp ? new Date(1e3 * timestamp) : new Date
, rawSessionKey = util.format("bce-auth-v1/%s/%s/%d", this.ak, helper.toUTCString(now), expirationInSeconds || 1800)
, sessionKey = this.hash(rawSessionKey, this.sk)
, canonicalUri = this.uriCanonicalization(resource)
, canonicalQueryString = this.queryStringCanonicalization(params || {})
, rv = this.headersCanonicalization(headers || {}, headersToSign)
, canonicalHeaders = rv[0]
, signedHeaders = rv[1]
, rawSignature = util.format("%s\n%s\n%s\n%s", method, canonicalUri, canonicalQueryString, canonicalHeaders)
, signature = this.hash(rawSignature, sessionKey);
return signedHeaders.length ? util.format("%s/%s/%s", rawSessionKey, signedHeaders.join(";"), signature) : util.format("%s//%s", rawSessionKey, signature)
}
,
Auth.prototype.uriCanonicalization = function(uri) {
return uri
}
,
Auth.prototype.queryStringCanonicalization = function(params) {
var canonicalQueryString = [];
return u.each(u.keys(params), function(key) {
if (key.toLowerCase() !== H.AUTHORIZATION.toLowerCase()) {
var value = null == params[key] ? "" : params[key];
canonicalQueryString.push(key + "=" + strings.normalize(value))
}
}),
canonicalQueryString.sort(),
canonicalQueryString.join("&")
}
,
Auth.prototype.headersCanonicalization = function(headers, headersToSign) {
headersToSign && headersToSign.length || (headersToSign = [H.HOST, H.CONTENT_MD5, H.CONTENT_LENGTH, H.CONTENT_TYPE]);
var headersMap = {};
u.each(headersToSign, function(item) {
headersMap[item.toLowerCase()] = !0
});
var canonicalHeaders = [];
u.each(u.keys(headers), function(key) {
var value = headers[key];
null != (value = u.isString(value) ? strings.trim(value) : value) && "" !== value && (key = key.toLowerCase(),
(/^x\-bce\-/.test(key) || !0 === headersMap[key]) && canonicalHeaders.push(util.format("%s:%s", strings.normalize(key), strings.normalize(value))))
}),
canonicalHeaders.sort();
var signedHeaders = [];
return u.each(canonicalHeaders, function(item) {
signedHeaders.push(item.split(":")[0])
}),
[canonicalHeaders.join("\n"), signedHeaders]
}
,
Auth.prototype.hash = function(data, key) {
var sha256Hmac = require(40).createHmac("sha256", key);
return sha256Hmac.update(data),
sha256Hmac.digest("hex")
}
,
module.exports = Auth
}
, {
19: 19,
22: 22,
40: 40,
42: 42,
46: 46,
47: 47
}],
16: [function(require, module, exports) {
var EventEmitter = require(41).EventEmitter
, util = require(47)
, Q = require(44)
, u = require(46)
, config = require(18)
, Auth = require(15);
function BceBaseClient(clientConfig, serviceId, regionSupported) {
EventEmitter.call(this),
this.config = u.extend({}, config.DEFAULT_CONFIG, clientConfig),
this.serviceId = serviceId,
this.regionSupported = !!regionSupported,
this.config.endpoint = this._computeEndpoint(),
this._httpAgent = null
}
util.inherits(BceBaseClient, EventEmitter),
BceBaseClient.prototype._computeEndpoint = function() {
return this.config.endpoint ? this.config.endpoint : this.regionSupported ? util.format("%s://%s.%s.%s", this.config.protocol, this.serviceId, this.config.region, config.DEFAULT_SERVICE_DOMAIN) : util.format("%s://%s.%s", this.config.protocol, this.serviceId, config.DEFAULT_SERVICE_DOMAIN)
}
,
BceBaseClient.prototype.createSignature = function(credentials, httpMethod, path, params, headers) {
return Q.fcall(function() {
return new Auth(credentials.ak,credentials.sk).generateAuthorization(httpMethod, path, params, headers)
})
}
,
module.exports = BceBaseClient
}
, {
15: 15,
18: 18,
41: 41,
44: 44,
46: 46,
47: 47
}],
17: [function(require, module, exports) {
var path = require(43)
, util = require(47)
, u = require(46)
, Buffer = require(33)
, H = require(19)
, strings = require(22)
, HttpClient = require(20)
, BceBaseClient = require(16)
, MimeType = require(21);
function BosClient(config) {
BceBaseClient.call(this, config, "bos", !0),
this._httpAgent = null
}
util.inherits(BosClient, BceBaseClient),
BosClient.prototype.deleteObject = function(bucketName, key, options) {
return options = options || {},
this.sendRequest("DELETE", {
bucketName: bucketName,
key: key,
config: options.config
})
}
,
BosClient.prototype.putObject = function(bucketName, key, data, options) {
if (!key)
throw new TypeError("key should not be empty.");
return options = this._checkOptions(options || {}),
this.sendRequest("PUT", {
bucketName: bucketName,
key: key,
body: data,
headers: options.headers,
config: options.config
})
}
,
BosClient.prototype.putObjectFromBlob = function(bucketName, key, blob, options) {
var headers = {};
return headers[H.CONTENT_LENGTH] = blob.size,
options = u.extend(headers, options),
this.putObject(bucketName, key, blob, options)
}
,
BosClient.prototype.getObjectMetadata = function(bucketName, key, options) {
return options = options || {},
this.sendRequest("HEAD", {
bucketName: bucketName,
key: key,
config: options.config
})
}
,
BosClient.prototype.initiateMultipartUpload = function(bucketName, key, options) {
options = options || {};
var headers = {};
return headers[H.CONTENT_TYPE] = options[H.CONTENT_TYPE] || MimeType.guess(path.extname(key)),
this.sendRequest("POST", {
bucketName: bucketName,
key: key,
params: {
uploads: ""
},
headers: headers,
config: options.config
})
}
,
BosClient.prototype.abortMultipartUpload = function(bucketName, key, uploadId, options) {
return options = options || {},
this.sendRequest("DELETE", {
bucketName: bucketName,
key: key,
params: {
uploadId: uploadId
},
config: options.config
})
}
,
BosClient.prototype.completeMultipartUpload = function(bucketName, key, uploadId, partList, options) {
var headers = {};
return headers[H.CONTENT_TYPE] = "application/json; charset=UTF-8",
options = this._checkOptions(u.extend(headers, options)),
this.sendRequest("POST", {
bucketName: bucketName,
key: key,
body: JSON.stringify({
parts: partList
}),
headers: options.headers,
params: {
uploadId: uploadId
},
config: options.config
})
}
,
BosClient.prototype.uploadPartFromBlob = function(bucketName, key, uploadId, partNumber, partSize, blob, options) {
if (blob.size !== partSize)
throw new TypeError(util.format("Invalid partSize %d and data length %d", partSize, blob.size));
var headers = {};
return headers[H.CONTENT_LENGTH] = partSize,
headers[H.CONTENT_TYPE] = "application/octet-stream",
options = this._checkOptions(u.extend(headers, options)),
this.sendRequest("PUT", {
bucketName: bucketName,
key: key,
body: blob,
headers: options.headers,
params: {
partNumber: partNumber,
uploadId: uploadId
},
config: options.config
})
}
,
BosClient.prototype.listParts = function(bucketName, key, uploadId, options) {
if (!uploadId)
throw new TypeError("uploadId should not empty");
return (options = this._checkOptions(options || {}, ["maxParts", "partNumberMarker", "uploadId"])).params.uploadId = uploadId,
this.sendRequest("GET", {
bucketName: bucketName,
key: key,
params: options.params,
config: options.config
})
}
,
BosClient.prototype.listMultipartUploads = function(bucketName, options) {
return (options = this._checkOptions(options || {}, ["delimiter", "maxUploads", "keyMarker", "prefix", "uploads"])).params.uploads = "",
this.sendRequest("GET", {
bucketName: bucketName,
params: options.params,
config: options.config
})
}
,
BosClient.prototype.appendObject = function(bucketName, key, data, offset, options) {
if (!key)
throw new TypeError("key should not be empty.");
options = this._checkOptions(options || {});
var params = {
append: ""
};
return u.isNumber(offset) && (params.offset = offset),
this.sendRequest("POST", {
bucketName: bucketName,
key: key,
body: data,
headers: options.headers,
params: params,
config: options.config
})
}
,
BosClient.prototype.appendObjectFromBlob = function(bucketName, key, blob, offset, options) {
var headers = {};
return headers[H.CONTENT_LENGTH] = blob.size,
options = u.extend(headers, options),
this.appendObject(bucketName, key, blob, offset, options)
}
,
BosClient.prototype.sendRequest = function(httpMethod, varArgs) {
var args = u.extend({
bucketName: null,
key: null,
body: null,
headers: {},
params: {},
config: {},
outputStream: null
}, varArgs)
, config = u.extend({}, this.config, args.config)
, resource = ["/v1", strings.normalize(args.bucketName || ""), strings.normalize(args.key || "", !1)].join("/");
return config.sessionToken && (args.headers[H.SESSION_TOKEN] = config.sessionToken),
this.sendHTTPRequest(httpMethod, resource, args, config)
}
,
BosClient.prototype.sendHTTPRequest = function(httpMethod, resource, args, config) {
var client = this
, agent = this._httpAgent = new HttpClient(config)
, httpContext = {
httpMethod: httpMethod,
resource: resource,
args: args,
config: config
};
u.each(["progress", "error", "abort"], function(eventName) {
agent.on(eventName, function(evt) {
client.emit(eventName, evt, httpContext)
})
});
var promise = this._httpAgent.sendRequest(httpMethod, resource, args.body, args.headers, args.params, u.bind(this.createSignature, this), args.outputStream);
return promise.abort = function() {
agent._req && agent._req.xhr && agent._req.xhr.abort()
}
,
promise
}
,
BosClient.prototype._checkOptions = function(options, allowedParams) {
var rv = {};
return rv.config = options.config || {},
rv.headers = this._prepareObjectHeaders(options),
rv.params = u.pick(options, allowedParams || []),
rv
}
,
BosClient.prototype._prepareObjectHeaders = function(options) {
var allowedHeaders = {};
u.each([H.CONTENT_LENGTH, H.CONTENT_ENCODING, H.CONTENT_MD5, H.X_BCE_CONTENT_SHA256, H.CONTENT_TYPE, H.CONTENT_DISPOSITION, H.ETAG, H.SESSION_TOKEN, H.CACHE_CONTROL, H.EXPIRES, H.X_BCE_OBJECT_ACL, H.X_BCE_OBJECT_GRANT_READ], function(header) {
allowedHeaders[header] = !0
});
var metaSize = 0
, headers = u.pick(options, function(value, key) {
return !!allowedHeaders[key] || (/^x\-bce\-meta\-/.test(key) ? (metaSize += Buffer.byteLength(key) + Buffer.byteLength("" + value),
!0) : void 0)
});
if (2048 < metaSize)
throw new TypeError("Metadata size should not be greater than 2048.");
if (headers.hasOwnProperty(H.CONTENT_LENGTH)) {
var contentLength = headers[H.CONTENT_LENGTH];
if (contentLength < 0)
throw new TypeError("content_length should not be negative.");
if (5368709120 < contentLength)
throw new TypeError("Object length should be less than 5368709120. Use multi-part upload instead.")
}
if (headers.hasOwnProperty("ETag")) {
var etag = headers.ETag;
/^"/.test(etag) || (headers.ETag = util.format('"%s"', etag))
}
return headers.hasOwnProperty(H.CONTENT_TYPE) || (headers[H.CONTENT_TYPE] = "application/octet-stream"),
headers
}
,
module.exports = BosClient
}
, {
16: 16,
19: 19,
20: 20,
21: 21,
22: 22,
33: 33,
43: 43,
46: 46,
47: 47
}],
18: [function(require, module, exports) {
exports.DEFAULT_SERVICE_DOMAIN = "baidubce.com",
exports.DEFAULT_CONFIG = {
protocol: "http",
region: "bj"
}
}
, {}],
19: [function(require, module, exports) {
exports.CONTENT_TYPE = "Content-Type",
exports.CONTENT_LENGTH = "Content-Length",
exports.CONTENT_MD5 = "Content-MD5",
exports.CONTENT_ENCODING = "Content-Encoding",
exports.CONTENT_DISPOSITION = "Content-Disposition",
exports.ETAG = "ETag",
exports.CONNECTION = "Connection",
exports.HOST = "Host",
exports.USER_AGENT = "User-Agent",
exports.CACHE_CONTROL = "Cache-Control",
exports.EXPIRES = "Expires",
exports.AUTHORIZATION = "Authorization",
exports.X_BCE_DATE = "x-bce-date",
exports.X_BCE_ACL = "x-bce-acl",
exports.X_BCE_REQUEST_ID = "x-bce-request-id",
exports.X_BCE_CONTENT_SHA256 = "x-bce-content-sha256",
exports.X_BCE_OBJECT_ACL = "x-bce-object-acl",
exports.X_BCE_OBJECT_GRANT_READ = "x-bce-object-grant-read",
exports.X_HTTP_HEADERS = "http_headers",
exports.X_BODY = "body",
exports.X_STATUS_CODE = "status_code",
exports.X_MESSAGE = "message",
exports.X_CODE = "code",
exports.X_REQUEST_ID = "request_id",
exports.SESSION_TOKEN = "x-bce-security-token",
exports.X_VOD_MEDIA_TITLE = "x-vod-media-title",
exports.X_VOD_MEDIA_DESCRIPTION = "x-vod-media-description",
exports.ACCEPT_ENCODING = "accept-encoding",
exports.ACCEPT = "accept"
}
, {}],
20: [function(require, module, exports) {
var EventEmitter = require(41).EventEmitter
, Buffer = require(33)
, Q = require(44)
, helper = require(42)
, u = require(46)
, util = require(47)
, H = require(19);
function HttpClient(config) {
EventEmitter.call(this),
this.config = config,
this._req = null
}
util.inherits(HttpClient, EventEmitter),
HttpClient.prototype.sendRequest = function(httpMethod, path, body, headers, params, signFunction, outputStream) {
var requestUrl = this._getRequestUrl(path, params)
, defaultHeaders = {};
defaultHeaders[H.X_BCE_DATE] = helper.toUTCString(new Date),
defaultHeaders[H.CONTENT_TYPE] = "application/json; charset=UTF-8",
defaultHeaders[H.HOST] = /^\w+:\/\/([^\/]+)/.exec(this.config.endpoint)[1];
var requestHeaders = u.extend(defaultHeaders, headers);
if (!requestHeaders.hasOwnProperty(H.CONTENT_LENGTH)) {
var contentLength = this._guessContentLength(body);
0 === contentLength && /GET|HEAD/i.test(httpMethod) || (requestHeaders[H.CONTENT_LENGTH] = contentLength)
}
var self = this
, createSignature = signFunction || u.noop;
try {
return Q.resolve(createSignature(this.config.credentials, httpMethod, path, params, requestHeaders)).then(function(authorization, xbceDate) {
return authorization && (requestHeaders[H.AUTHORIZATION] = authorization),
xbceDate && (requestHeaders[H.X_BCE_DATE] = xbceDate),
self._doRequest(httpMethod, requestUrl, u.omit(requestHeaders, H.CONTENT_LENGTH, H.HOST), body, outputStream)
})
} catch (ex) {
return Q.reject(ex)
}
}
,
HttpClient.prototype._doRequest = function(httpMethod, requestUrl, requestHeaders, body, outputStream) {
var deferred = Q.defer()
, self = this
, xhr = new XMLHttpRequest;
for (var header in xhr.open(httpMethod, requestUrl, !0),
requestHeaders)
if (requestHeaders.hasOwnProperty(header)) {
var value = requestHeaders[header];
xhr.setRequestHeader(header, value)
}
return xhr.onerror = function(error) {
deferred.reject(error)
}
,
xhr.onabort = function() {
deferred.reject(new Error("xhr aborted"))
}
,
xhr.onreadystatechange = function() {
if (4 === xhr.readyState) {
var status = xhr.status;
1223 === status && (status = 204);
var contentType = xhr.getResponseHeader("Content-Type")
, responseBody = /application\/json/.test(contentType) ? JSON.parse(xhr.responseText) : xhr.responseText;
if (responseBody || (responseBody = {
location: requestUrl
}),
200 <= status && status < 300 || 304 === status) {
var headers = self._fixHeaders(xhr.getAllResponseHeaders());
deferred.resolve({
http_headers: headers,
body: responseBody
})
} else
deferred.reject({
status_code: status,
message: responseBody.message || "<message>",
code: responseBody.code || "<code>",
request_id: responseBody.requestId || "<request_id>"
})
}
}
,
xhr.upload && u.each(["progress", "error", "abort"], function(eventName) {
xhr.upload.addEventListener(eventName, function(evt) {
"function" == typeof self.emit && self.emit(eventName, evt)
}, !1)
}),
xhr.send(body),
self._req = {
xhr: xhr
},
deferred.promise
}
,
HttpClient.prototype._guessContentLength = function(data) {
if (null == data || "" === data)
return 0;
if (u.isString(data))
return Buffer.byteLength(data);
if ("undefined" != typeof Blob && data instanceof Blob)
return data.size;
if ("undefined" != typeof ArrayBuffer && data instanceof ArrayBuffer)
return data.byteLength;
throw new Error("No Content-Length is specified.")
}
,
HttpClient.prototype._fixHeaders = function(headers) {
var fixedHeaders = {};
return headers && u.each(headers.split(/\r?\n/), function(line) {
var idx = line.indexOf(":");
if (-1 !== idx) {
var key = line.substring(0, idx).toLowerCase()
, value = line.substring(idx + 1).replace(/^\s+|\s+$/, "");
"etag" === key && (value = value.replace(/"/g, "")),
fixedHeaders[key] = value
}
}),
fixedHeaders
}
,
HttpClient.prototype.buildQueryString = function(params) {
return require(45).stringify(params).replace(/[()'!~.*\-_]/g, function(char) {
return "%" + char.charCodeAt().toString(16)
})
}
,
HttpClient.prototype._getRequestUrl = function(path, params) {
var uri = path
, qs = this.buildQueryString(params);
return qs && (uri += "?" + qs),
this.config.endpoint + uri
}
,
module.exports = HttpClient
}
, {
19: 19,
33: 33,
41: 41,
42: 42,
44: 44,
45: 45,
46: 46,
47: 47
}],
21: [function(require, module, exports) {
var mimeTypes = {};
exports.guess = function(ext) {
return ext && ext.length ? ("." === ext[0] && (ext = ext.substr(1)),
mimeTypes[ext.toLowerCase()] || "application/octet-stream") : "application/octet-stream"
}
}
, {}],
22: [function(require, module, exports) {
var kEscapedMap = {
"!": "%21",
"'": "%27",
"(": "%28",
")": "%29",
"*": "%2A"
};
exports.normalize = function(string, encodingSlash) {
var result = encodeURIComponent(string);
return result = result.replace(/[!'\(\)\*]/g, function($1) {
return kEscapedMap[$1]
}),
!1 === encodingSlash && (result = result.replace(/%2F/gi, "/")),
result
}
,
exports.trim = function(string) {
return (string || "").replace(/^\s+|\s+$/g, "")
}
}
, {}],
23: [function(require, module, exports) {
module.exports = {
runtimes: "html5",
bos_endpoint: "http://bj.bcebos.com",
bos_ak: null,
bos_sk: null,
bos_credentials: null,
bos_appendable: !1,
bos_relay_server: "https://relay.efe.tech",
multi_selection: !1,
max_retries: 0,
retry_interval: 1e3,
auto_start: !1,
max_file_size: "100mb",
bos_multipart_min_size: "10mb",
bos_multipart_parallel: 1,
bos_task_parallel: 3,
auth_stripped_headers: ["User-Agent", "Connection"],
chunk_size: "4mb",
bos_multipart_auto_continue: !1,
bos_multipart_local_key_generator: "default",
dir_selection: !1,
get_new_uptoken: !0,
uptoken_via_jsonp: !0,
uptoken_timeout: 5e3,
uptoken_jsonp_timeout: 5e3,
tracker_id: null
}
}
, {}],
24: [function(require, module, exports) {
module.exports = {
kPostInit: "PostInit",
kKey: "Key",
kListParts: "ListParts",
kObjectMetas: "ObjectMetas",
kFileFiltered: "FileFiltered",
kFilesAdded: "FilesAdded",
kFilesFilter: "FilesFilter",
kNetworkSpeed: "NetworkSpeed",
kBeforeUpload: "BeforeUpload",
kUploadProgress: "UploadProgress",
kFileUploaded: "FileUploaded",
kUploadPartProgress: "UploadPartProgress",
kChunkUploaded: "ChunkUploaded",
kUploadResume: "UploadResume",
kUploadResumeError: "UploadResumeError",
kUploadComplete: "UploadComplete",
kError: "Error",
kAborted: "Aborted"
}
}
, {}],
25: [function(require, module, exports) {
var Q = require(44)
, async = require(35)
, u = require(46)
, utils = require(32)
, events = require(24)
, Task = require(30);
function MultipartTask() {
Task.apply(this, arguments),
this.xhrPools = []
}
utils.inherits(MultipartTask, Task),
MultipartTask.prototype.start = function() {
if (this.aborted)
return Q.resolve();
var self = this
, dispatcher = this.eventDispatcher
, file = this.options.file
, bucket = this.options.bucket
, object = this.options.object
, metas = this.options.metas
, chunkSize = this.options.chunk_size
, multipartParallel = this.options.bos_multipart_parallel
, options = {
"Content-Type": utils.guessContentType(file)
}
, uploadId = null;
return this._initiateMultipartUpload(file, chunkSize, bucket, object, options).then(function(response) {
uploadId = response.body.uploadId;
var parts = response.body.parts || []
, deferred = Q.defer()
, tasks = utils.getTasks(file, uploadId, chunkSize, bucket, object);
utils.filterTasks(tasks, parts);
var loaded = parts.length
, state = {
lengthComputable: !0,
loaded: loaded,
total: tasks.length
};
if (file._previousLoaded = loaded * chunkSize,
loaded) {
var progress = file._previousLoaded / file.size;
dispatcher.dispatchEvent(events.kUploadProgress, [file, progress, null])
}
return async.mapLimit(tasks, multipartParallel, self._uploadPart(state), function(err, results) {
err ? deferred.reject(err) : deferred.resolve(results)
}),
deferred.promise
}).then(function(responses) {
var partList = [];
return u.each(responses, function(response, index) {
partList.push({
partNumber: index + 1,
eTag: response.http_headers.etag
})
}),
self._generateLocalKey({
blob: file,
chunkSize: chunkSize,
bucket: bucket,
object: object
}).then(function(key) {
utils.removeUploadId(key)
}),
self.client.completeMultipartUpload(bucket, object, uploadId, partList, metas)
}).then(function(response) {
dispatcher.dispatchEvent(events.kUploadProgress, [file, 1]),
response.body.bucket = bucket,
response.body.object = object,
dispatcher.dispatchEvent(events.kFileUploaded, [file, response])
}).catch(function(error) {
var eventType = self.aborted ? events.kAborted : events.kError;
dispatcher.dispatchEvent(eventType, [error, file])
})
}
,
MultipartTask.prototype._initiateMultipartUpload = function(file, chunkSize, bucket, object, options) {
var uploadId, localSaveKey, self = this, dispatcher = this.eventDispatcher;
function initNewMultipartUpload() {
return self.client.initiateMultipartUpload(bucket, object, options).then(function(response) {
return localSaveKey && utils.setUploadId(localSaveKey, response.body.uploadId),
response.body.parts = [],
response
})
}
var keyOptions = {
blob: file,
chunkSize: chunkSize,
bucket: bucket,
object: object
};
return (this.options.bos_multipart_auto_continue ? this._generateLocalKey(keyOptions) : Q.resolve(null)).then(function(key) {
return (localSaveKey = key) && (uploadId = utils.getUploadId(localSaveKey)) ? self._listParts(file, bucket, object, uploadId) : initNewMultipartUpload()
}).then(function(response) {
if (uploadId && localSaveKey) {
var parts = response.body.parts;
dispatcher.dispatchEvent(events.kUploadResume, [file, parts, null]),
response.body.uploadId = uploadId
}
return response
}).catch(function(error) {
if (uploadId && localSaveKey)
return dispatcher.dispatchEvent(events.kUploadResumeError, [file, error, null]),
utils.removeUploadId(localSaveKey),
initNewMultipartUpload();
throw error
})
}
,
MultipartTask.prototype._generateLocalKey = function(options) {
var generator = this.options.bos_multipart_local_key_generator;
return utils.generateLocalKey(options, generator)
}
,
MultipartTask.prototype._listParts = function(file, bucket, object, uploadId) {
var self = this
, localParts = this.eventDispatcher.dispatchEvent(events.kListParts, [file, uploadId]);
return Q.resolve(localParts).then(function(parts) {
return u.isArray(parts) && parts.length ? {
http_headers: {},
body: {
parts: parts
}
} : self._listAllParts(bucket, object, uploadId)
})
}
,
MultipartTask.prototype._listAllParts = function(bucket, object, uploadId) {
var self = this
, deferred = Q.defer()
, parts = []
, payload = null
, maxParts = 1e3
, partNumberMarker = 0;
return function listParts() {
var options = {
maxParts: maxParts,
partNumberMarker: partNumberMarker
};
self.client.listParts(bucket, object, uploadId, options).then(function(response) {
null == payload && (payload = response),
parts.push.apply(parts, response.body.parts),
partNumberMarker = response.body.nextPartNumberMarker,
!1 === response.body.isTruncated ? (payload.body.parts = parts,
deferred.resolve(payload)) : listParts()
}).catch(function(error) {
deferred.reject(error)
})
}(),
deferred.promise
}
,
MultipartTask.prototype._uploadPart = function(state) {
var self = this
, dispatcher = this.eventDispatcher;
return function(item, callback) {
(function uploadPartInner(item, opt_maxRetries) {
if (item.etag)
return self.networkInfo.loadedBytes += item.partSize,
Q.resolve({
http_headers: {
etag: item.etag
},
body: {}
});
var maxRetries = null == opt_maxRetries ? self.options.max_retries : opt_maxRetries
, retryInterval = self.options.retry_interval
, blob = item.file.slice(item.start, item.stop + 1);
blob._parentUUID = item.file.uuid,
blob._previousLoaded = 0;
var uploadPartXhr = self.client.uploadPartFromBlob(item.bucket, item.object, item.uploadId, item.partNumber, item.partSize, blob)
, xhrPoolIndex = self.xhrPools.push(uploadPartXhr);
return uploadPartXhr.then(function(response) {
++state.loaded;
var result = {
uploadId: item.uploadId,
partNumber: item.partNumber,
partSize: item.partSize,
bucket: item.bucket,
object: item.object,
offset: item.start,
total: blob.size,
response: response
};
return dispatcher.dispatchEvent(events.kChunkUploaded, [item.file, result]),
self.xhrPools[xhrPoolIndex - 1] = null,
response
}).catch(function(error) {
if (0 < maxRetries && !self.aborted)
return utils.delay(retryInterval).then(function() {
return uploadPartInner(item, maxRetries - 1)
});
throw error
})
}
)(item).then(function(response) {
callback(null, response)
}, function(error) {
callback(error)
})
}
}
,
MultipartTask.prototype.abort = function() {
this.aborted = !0,
this.xhrRequesting = null;
for (var i = 0; i < this.xhrPools.length; i++) {
var xhr = this.xhrPools[i];
xhr && "function" == typeof xhr.abort && xhr.abort()
}
}
,
module.exports = MultipartTask
}
, {
24: 24,
30: 30,
32: 32,
35: 35,
44: 44,
46: 46
}],
26: [function(require, module, exports) {
var utils = require(32);
function NetworkInfo() {
this.loadedBytes = 0,
this.totalBytes = 0,
this._startTime = utils.now(),
this.reset()
}
NetworkInfo.prototype.dump = function() {
return [this.loadedBytes, utils.now() - this._startTime, this.totalBytes - this.loadedBytes]
}
,
NetworkInfo.prototype.reset = function() {
this.loadedBytes = 0,
this._startTime = utils.now()
}
,
module.exports = NetworkInfo
}
, {
32: 32
}],
27: [function(require, module, exports) {
var Q = require(44)
, u = require(46)
, utils = require(32)
, events = require(24)
, Task = require(30);
function PutObjectTask() {
Task.apply(this, arguments)
}
utils.inherits(PutObjectTask, Task),
PutObjectTask.prototype.start = function(opt_maxRetries) {
if (this.aborted)
return Q.resolve();
var self = this
, dispatcher = this.eventDispatcher
, file = this.options.file
, bucket = this.options.bucket
, object = this.options.object
, metas = this.options.metas
, maxRetries = null == opt_maxRetries ? this.options.max_retries : opt_maxRetries
, retryInterval = this.options.retry_interval
, contentType = utils.guessContentType(file)
, options = u.extend({
"Content-Type": contentType
}, metas);
return this.xhrRequesting = this.client.putObjectFromBlob(bucket, object, file, options),
this.xhrRequesting.then(function(response) {
dispatcher.dispatchEvent(events.kUploadProgress, [file, 1]),
response.body.bucket = bucket,
response.body.key = object,
dispatcher.dispatchEvent(events.kFileUploaded, [file, response])
}).catch(function(error) {
var eventType = self.aborted ? events.kAborted : events.kError;
return dispatcher.dispatchEvent(eventType, [error, file]),
error.status_code && error.code && error.request_id ? Q.resolve() : 0 < maxRetries && !self.aborted ? utils.delay(retryInterval).then(function() {
return self.start(maxRetries - 1)
}) : Q.resolve()
})
}
,
module.exports = PutObjectTask
}
, {
24: 24,
30: 30,
32: 32,
44: 44,
46: 46
}],
28: [function(require, module, exports) {
function Queue(collection) {
this.collection = collection
}
Queue.prototype.isEmpty = function() {
return this.collection.length <= 0
}
,
Queue.prototype.size = function() {
return this.collection.length
}
,
Queue.prototype.dequeue = function() {
return this.collection.shift()
}
,
module.exports = Queue
}
, {}],
29: [function(require, module, exports) {
var Q = require(44)
, utils = require(32);
function StsTokenManager(options) {
this.options = options,
this._cache = {}
}
StsTokenManager.prototype.get = function(bucket) {
var self = this;
return null != self._cache[bucket] ? self._cache[bucket] : Q.resolve(this._getImpl.apply(this, arguments)).then(function(payload) {
return self._cache[bucket] = payload
})
}
,
StsTokenManager.prototype._getImpl = function(bucket) {
var options = this.options
, uptoken_url = options.uptoken_url
, timeout = options.uptoken_timeout || options.uptoken_jsonp_timeout
, viaJsonp = options.uptoken_via_jsonp
, deferred = Q.defer();
return $.ajax({
url: uptoken_url,
jsonp: !!viaJsonp && "callback",
dataType: viaJsonp ? "jsonp" : "json",
timeout: timeout,
data: {
sts: JSON.stringify(utils.getDefaultACL(bucket))
},
success: function(payload) {
deferred.resolve(payload)
},
error: function() {
deferred.reject(new Error("Get sts token timeout (" + timeout + "ms)."))
}
}),
deferred.promise
}
,
module.exports = StsTokenManager
}
, {
32: 32,
44: 44
}],
30: [function(require, module, exports) {
function Task(client, eventDispatcher, options) {
this.xhrRequesting = null,
this.aborted = !1,
this.networkInfo = null,
this.client = client,
this.eventDispatcher = eventDispatcher,
this.options = options
}
function abstractMethod() {
throw new Error("unimplemented method.")
}
Task.prototype.start = abstractMethod,
Task.prototype.pause = abstractMethod,
Task.prototype.resume = abstractMethod,
Task.prototype.setNetworkInfo = function(networkInfo) {
this.networkInfo = networkInfo
}
,
Task.prototype.abort = function() {
this.xhrRequesting && "function" == typeof this.xhrRequesting.abort && (this.aborted = !0,
this.xhrRequesting.abort(),
this.xhrRequesting = null)
}
,
module.exports = Task
}
, {}],
31: [function(require, module, exports) {
var Q = require(44)
, u = require(46)
, utils = require(32)
, events = require(24)
, kDefaultOptions = require(23)
, PutObjectTask = require(27)
, MultipartTask = require(25)
, StsTokenManager = require(29)
, NetworkInfo = require(26)
, Auth = require(15)
, BosClient = require(17);
function Uploader(options) {
u.isString(options) && (options = u.extend({
browse_button: options,
auto_start: !0
}, $(options).data()));
this.options = u.extend({}, kDefaultOptions, {}, options),
this.options.max_file_size = utils.parseSize(this.options.max_file_size),
this.options.bos_multipart_min_size = utils.parseSize(this.options.bos_multipart_min_size),
this.options.chunk_size = utils.parseSize(this.options.chunk_size),
!this.options.bos_credentials && this.options.bos_ak && this.options.bos_sk && (this.options.bos_credentials = {
ak: this.options.bos_ak,
sk: this.options.bos_sk
}),
this.client = new BosClient({
endpoint: utils.normalizeEndpoint(this.options.bos_endpoint),
credentials: this.options.bos_credentials,
sessionToken: this.options.uptoken
}),
this._files = [],
this._uploadingFiles = {},
this._abort = !1,
this._working = !1,
this._xhr2Supported = utils.isXhr2Supported(),
this._networkInfo = new NetworkInfo,
this._init()
}
Uploader.prototype._getCustomizedSignature = function(uptokenUrl) {
var options = this.options
, timeout = options.uptoken_timeout || options.uptoken_jsonp_timeout
, viaJsonp = options.uptoken_via_jsonp;
return function(_, httpMethod, path, params, headers) {
/\bed=([\w\.]+)\b/.test(location.search) && (headers.Host = RegExp.$1),
u.isArray(options.auth_stripped_headers) && (headers = u.omit(headers, options.auth_stripped_headers));
var deferred = Q.defer();
return $.ajax({
url: uptokenUrl,
jsonp: !!viaJsonp && "callback",
dataType: viaJsonp ? "jsonp" : "json",
timeout: timeout,
data: {
httpMethod: httpMethod,
path: path,
queries: JSON.stringify(params || {}),
headers: JSON.stringify(headers || {})
},
error: function() {
deferred.reject(new Error("Get authorization timeout (" + timeout + "ms)."))
},
success: function(payload) {
200 === payload.statusCode && payload.signature ? deferred.resolve(payload.signature, payload.xbceDate) : deferred.reject(new Error("createSignature failed, statusCode = " + payload.statusCode))
}
}),
deferred.promise
}
}
,
Uploader.prototype._invoke = function(methodName, args, throwErrors) {
var init = this.options.init || this.options.Init;
if (init) {
var method = init[methodName];
if ("function" == typeof method)
try {
var up = null;
return args = null == args ? [up] : [up].concat(args),
method.apply(null, args)
} catch (ex) {
if (!0 === throwErrors)
return Q.reject(ex)
}
}
}
,
Uploader.prototype._init = function() {
var options = this.options
, accept = options.accept
, btnElement = $(options.browse_button);
if ("INPUT" !== btnElement.prop("nodeName")) {
var elementContainer = btnElement
, inputElementContainer = (elementContainer.outerWidth(),
elementContainer.outerHeight(),
$('<div class="bce-bos-uploader-input-container"><input type="file" /></div>'));
inputElementContainer.css({
visibility: "hidden",
position: "absolute",
top: 0,
left: 0,
width: 0,
height: 0,
overflow: "hidden",
"z-index": 0
}),
inputElementContainer.find("input").css({
visibility: "hidden",
position: "absolute",
top: 0,
left: 0,
width: "100%",
height: "100%",
"font-size": "999px",
opacity: 0
}),
elementContainer.css({
position: "relative",
"z-index": 1
}),
elementContainer.after(inputElementContainer),
elementContainer.parent().css("position", "relative"),
options.browse_button = inputElementContainer.find("input"),
this._xhr2Supported && elementContainer.click(function() {
options.browse_button.click()
})
}
var self = this;
if (!this._xhr2Supported && "undefined" != typeof mOxie && u.isFunction(mOxie.FileInput)) {
var fileInput = new mOxie.FileInput({
runtime_order: "flash,html4",
browse_button: $(options.browse_button).get(0),
swf_url: options.flash_swf_url,
accept: utils.expandAcceptToArray(accept),
multiple: options.multi_selection,
directory: options.dir_selection,
file: "file"
});
fileInput.onchange = u.bind(this._onFilesAdded, this),
fileInput.onready = function() {
self._initEvents(),
self._invoke(events.kPostInit)
}
,
fileInput.init()
}
(options.bos_credentials ? Q.resolve() : self.refreshStsToken()).then(function() {
options.bos_credentials ? self.client.createSignature = function(_, httpMethod, path, params, headers) {
var credentials = _ || this.config.credentials;
return Q.fcall(function() {
return new Auth(credentials.ak,credentials.sk).generateAuthorization(httpMethod, path, params, headers)
})
}
: options.uptoken_url && !0 === options.get_new_uptoken && (self.client.createSignature = self._getCustomizedSignature(options.uptoken_url)),
self._xhr2Supported && (self._initEvents(),
self._invoke(events.kPostInit))
}).catch(function(error) {
self._invoke(events.kError, [error])
})
}
,
Uploader.prototype._initEvents = function() {
var options = this.options;
if (this._xhr2Supported) {
var btn = $(options.browse_button);
null == btn.attr("multiple") && btn.attr("multiple", !!options.multi_selection),
btn.on("change", u.bind(this._onFilesAdded, this));
var accept = options.accept;
if (null != accept) {
var exts = utils.expandAccept(accept);
/Safari/.test(navigator.userAgent) && /Apple Computer/.test(navigator.vendor) && (exts = utils.extToMimeType(exts)),
btn.attr("accept", exts)
}
options.dir_selection && (btn.attr("directory", !0),
btn.attr("mozdirectory", !0),
btn.attr("webkitdirectory", !0))
}
this.client.on("progress", u.bind(this._onUploadProgress, this)),
this.client.on("error", u.bind(this._onError, this)),
this._xhr2Supported || (this.client.sendHTTPRequest = u.bind(utils.fixXhr(this.options, !0), this.client))
}
,
Uploader.prototype._filterFiles = function(candidates) {
var self = this
, maxFileSize = this.options.max_file_size
, files = u.filter(candidates, function(file) {
return 1 || !(0 < maxFileSize && file.size > maxFileSize) || (self._invoke(events.kFileFiltered, [file]),
!1)
});
return this._invoke(events.kFilesFilter, [files]) || files
}
,
Uploader.prototype._onFilesAdded = function(e) {
var files = e.target.files;
files || (files = [{
name: e.target.value.split(/[\/\\]/).pop(),
size: 0
}]);
files = this._filterFiles(files),
u.isArray(files) && files.length && this.addFiles(files),
this.options.auto_start && this.start()
}
,
Uploader.prototype._onError = function(e) {}
,
Uploader.prototype._onUploadProgress = function(e, httpContext) {
var args = httpContext.args
, file = args.body;
if (utils.isBlob(file)) {
var progress = e.lengthComputable ? e.loaded / e.total : 0
, delta = e.loaded - file._previousLoaded;
this._networkInfo.loadedBytes += delta,
this._invoke(events.kNetworkSpeed, this._networkInfo.dump()),
file._previousLoaded = e.loaded;
var eventType = events.kUploadProgress;
if (args.params.partNumber && args.params.uploadId) {
eventType = events.kUploadPartProgress,
this._invoke(eventType, [file, progress, e]);
var uuid = file._parentUUID
, originalFile = this._uploadingFiles[uuid]
, originalFileProgress = 0;
originalFile && (originalFile._previousLoaded += delta,
originalFileProgress = Math.min(originalFile._previousLoaded / originalFile.size, 1),
this._invoke(events.kUploadProgress, [originalFile, originalFileProgress, null]))
} else
this._invoke(eventType, [file, progress, e])
}
}
,
Uploader.prototype.addFiles = function(files) {
function buildAbortHandler(item, self) {
return function() {
item._aborted = !0,
self._invoke(events.kAborted, [null, item])
}
}
for (var totalBytes = 0, i = 0; i < files.length; i++) {
var item = files[i];
item.abort = buildAbortHandler(item, this),
item.uuid = utils.uuid(),
totalBytes += item.size
}
this._networkInfo.totalBytes += totalBytes,
this._files.push.apply(this._files, files),
this._invoke(events.kFilesAdded, [files])
}
,
Uploader.prototype.addFile = function(file) {
this.addFiles([file])
}
,
Uploader.prototype.remove = function(item) {
"string" == typeof item && (item = this._uploadingFiles[item] || u.find(this._files, function(file) {
return file.uuid === item
})),
item && "function" == typeof item.abort && item.abort()
}
,
Uploader.prototype.start = function() {
var self = this;
if (!this._working && this._files.length) {
this._working = !0,
this._abort = !1,
this._networkInfo.reset();
var taskParallel = this.options.bos_task_parallel;
utils.eachLimit(this._files, taskParallel, function(file, callback) {
file._previousLoaded = 0,
self._uploadNext(file).then(function() {
delete self._uploadingFiles[file.uuid],
callback(null, file)
}).catch(function() {
delete self._uploadingFiles[file.uuid],
callback(null, file)
})
}, function(error) {
self._working = !1,
self._files.length = 0,
self._networkInfo.totalBytes = 0,
self._invoke(events.kUploadComplete)
})
}
}
,
Uploader.prototype.stop = function() {
this._abort = !0,
this._working = !1
}
,
Uploader.prototype.setOptions = function(options) {
var supportedOptions = u.pick(options, "bos_credentials", "bos_ak", "bos_sk", "uptoken", "bos_bucket", "bos_endpoint");
this.options = u.extend(this.options, supportedOptions);
var config = this.client && this.client.config;
if (config) {
var credentials = null;
options.bos_credentials ? credentials = options.bos_credentials : options.bos_ak && options.bos_sk && (credentials = {
ak: options.bos_ak,
sk: options.bos_sk
}),
credentials && (this.options.bos_credentials = credentials,
config.credentials = credentials),
options.uptoken && (config.sessionToken = options.uptoken),
options.bos_endpoint && (config.endpoint = utils.normalizeEndpoint(options.bos_endpoint))
}
}
,
Uploader.prototype.refreshStsToken = function() {
var self = this
, options = self.options;
return options.bos_bucket && options.uptoken_url && !1 === options.get_new_uptoken ? new StsTokenManager(options).get(options.bos_bucket).then(function(payload) {
return self.setOptions({
bos_ak: payload.AccessKeyId,
bos_sk: payload.SecretAccessKey,
uptoken: payload.SessionToken
})
}) : Q.resolve()
}
,
Uploader.prototype._uploadNext = function(file) {
if (this._abort)
return this._working = !1,
Q.resolve();
if (!0 === file._aborted)
return Q.resolve();
var returnValue = this._invoke(events.kBeforeUpload, [file], !0);
if (!1 === returnValue)
return Q.resolve();
var self = this;
return Q.resolve(returnValue).then(function() {
return self._uploadNextImpl(file)
}).catch(function(error) {
self._invoke(events.kError, [error, file])
})
}
,
Uploader.prototype._uploadNextImpl = function(file) {
var self = this
, options = this.options
, object = file.name
, defaultTaskOptions = u.pick(options, "flash_swf_url", "max_retries", "chunk_size", "retry_interval", "bos_multipart_parallel", "bos_multipart_auto_continue", "bos_multipart_local_key_generator");
return Q.all([this._invoke(events.kKey, [file], !0), this._invoke(events.kObjectMetas, [file])]).then(function(array) {
var bucket = options.bos_bucket
, result = array[0]
, objectMetas = array[1]
, multipart = "auto";
u.isString(result) ? object = result : u.isObject(result) && (bucket = result.bucket || bucket,
object = result.key || object,
multipart = result.multipart || multipart);
var client = self.client
, eventDispatcher = self
, taskOptions = u.extend(defaultTaskOptions, {
file: file,
bucket: bucket,
object: object,
metas: objectMetas
})
, TaskConstructor = PutObjectTask;
"auto" === multipart && self._xhr2Supported && file.size > options.bos_multipart_min_size && (TaskConstructor = MultipartTask);
var task = new TaskConstructor(client,eventDispatcher,taskOptions);
return (self._uploadingFiles[file.uuid] = file).abort = function() {
return file._aborted = !0,
task.abort()
}
,
task.setNetworkInfo(self._networkInfo),
task.start()
})
}
,
Uploader.prototype.dispatchEvent = function(eventName, eventArguments, throwErrors) {
if (eventName === events.kAborted && eventArguments && eventArguments[1]) {
var file = eventArguments[1];
if (0 < file.size) {
var loadedSize = file._previousLoaded || 0;
this._networkInfo.totalBytes -= file.size - loadedSize,
this._invoke(events.kNetworkSpeed, this._networkInfo.dump())
}
}
return this._invoke(eventName, eventArguments, throwErrors)
}
,
module.exports = Uploader
}
, {
15: 15,
17: 17,
23: 23,
24: 24,
25: 25,
26: 26,
27: 27,
29: 29,
32: 32,
44: 44,
46: 46
}],
32: [function(require, module, exports) {
var qsModule = require(45)
, Q = require(44)
, u = require(46)
, helper = require(42)
, Queue = require(28)
, MimeType = require(21);
function parseHost(url) {
var match = /^\w+:\/\/([^\/]+)/.exec(url);
return match && match[1]
}
exports.getTasks = function(file, uploadId, chunkSize, bucket, object) {
for (var leftSize = file.size, offset = 0, partNumber = 1, tasks = []; 0 < leftSize; ) {
var partSize = Math.min(leftSize, chunkSize);
tasks.push({
file: file,
uploadId: uploadId,
bucket: bucket,
object: object,
partNumber: partNumber,
partSize: partSize,
start: offset,
stop: offset + partSize - 1
}),
leftSize -= partSize,
offset += partSize,
partNumber += 1
}
return tasks
}
,
exports.getAppendableTasks = function(fileSize, offset, chunkSize) {
for (var leftSize = fileSize - offset, tasks = []; leftSize; ) {
var partSize = Math.min(leftSize, chunkSize);
tasks.push({
partSize: partSize,
start: offset,
stop: offset + partSize - 1
}),
leftSize -= partSize,
offset += partSize
}
return tasks
}
,
exports.parseSize = function(size) {
if ("number" == typeof size)
return size;
var match = /^([\d\.]+)([mkg]?b?)$/i.exec(size);
if (!match)
return 0;
var $1 = match[1]
, $2 = match[2];
return /^k/i.test($2) ? 1024 * $1 : /^m/i.test($2) ? 1024 * $1 * 1024 : /^g/i.test($2) ? 1024 * $1 * 1024 * 1024 : +$1
}
,
exports.isXhr2Supported = function() {
return "XMLHttpRequest"in window && "withCredentials"in new XMLHttpRequest
}
,
exports.isAppendable = function(headers) {
return "Appendable" === headers["x-bce-object-type"]
}
,
exports.delay = function(ms) {
var deferred = Q.defer();
return setTimeout(function() {
deferred.resolve()
}, ms),
deferred.promise
}
,
exports.normalizeEndpoint = function(endpoint) {
return endpoint.replace(/(\/+)$/, "")
}
,
exports.getDefaultACL = function(bucket) {
return {
accessControlList: [{
service: "bce:bos",
region: "*",
effect: "Allow",
resource: [bucket + "/*"],
permission: ["READ", "WRITE"]
}]
}
}
,
exports.uuid = function() {
var random = (Math.random() * Math.pow(2, 32)).toString(36);
return "u-" + (new Date).getTime() + "-" + random
}
,
exports.generateLocalKey = function(option, generator) {
return "default" === generator ? Q.resolve([option.blob.name, option.blob.size, option.chunkSize, option.bucket, option.object].join("&")) : Q.resolve(null)
}
,
exports.getDefaultPolicy = function(bucket) {
if (null == bucket)
return null;
var now = (new Date).getTime()
, expiration = new Date(now + 864e5);
return {
expiration: helper.toUTCString(expiration),
conditions: [{
bucket: bucket
}]
}
}
,
exports.getUploadId = function(key) {
return localStorage.getItem(key)
}
,
exports.setUploadId = function(key, uploadId) {
localStorage.setItem(key, uploadId)
}
,
exports.removeUploadId = function(key) {
localStorage.removeItem(key)
}
,
exports.filterTasks = function(tasks, parts) {
u.each(tasks, function(task) {
var etag = function(partNumber, existParts) {
var matchParts = u.filter(existParts || [], function(part) {
return +part.partNumber === partNumber
});
return matchParts.length ? matchParts[0].eTag : null
}(task.partNumber, parts);
etag && (task.etag = etag)
})
}
,
exports.expandAccept = function(accept) {
var exts = [];
return u.isArray(accept) ? u.each(accept, function(item) {
item.extensions && exts.push.apply(exts, item.extensions.split(","))
}) : u.isString(accept) && (exts = accept.split(",")),
(exts = u.map(exts, function(ext) {
return /^\./.test(ext) ? ext : "." + ext
})).join(",")
}
,
exports.extToMimeType = function(exts) {
return u.map(exts.split(","), function(ext) {
return -1 !== ext.indexOf("/") ? ext : MimeType.guess(ext)
}).join(",")
}
,
exports.expandAcceptToArray = function(accept) {
return !accept || u.isArray(accept) ? accept : u.isString(accept) ? [{
title: "All files",
extensions: accept
}] : []
}
,
exports.transformUrl = function(url) {
return url.replace(/(https?:)\/\/([^\/]+)\/([^\/]+)\/([^\/]+)/, function(_, protocol, host, $3, $4) {
return /^v\d$/.test($3) ? protocol + "//" + $4 + "." + host + "/" + $3 : protocol + "//" + $3 + "." + host + "/" + $4
})
}
,
exports.isBlob = function(body) {
var blobCtor = null;
if ("undefined" != typeof Blob)
blobCtor = Blob;
else {
if ("undefined" == typeof mOxie || !u.isFunction(mOxie.Blob))
return !1;
blobCtor = mOxie.Blob
}
return body instanceof blobCtor
}
,
exports.now = function() {
return (new Date).getTime()
}
,
exports.toDHMS = function(seconds) {
var days = 0
, hours = 0
, minutes = 0;
return 60 <= seconds && (seconds -= 60 * (minutes = ~~(seconds / 60))),
60 <= minutes && (minutes -= 60 * (hours = ~~(minutes / 60))),
24 <= hours && (hours -= 24 * (days = ~~(hours / 24))),
{
DD: days,
HH: hours,
MM: minutes,
SS: seconds
}
}
,
exports.fixXhr = function(options, isBos) {
return function(httpMethod, resource, args, config) {
var client = this
, endpointHost = parseHost(config.endpoint);
args.headers["x-bce-date"] = helper.toUTCString(new Date),
args.headers.host = endpointHost,
args.params[".stamp"] = (new Date).getTime();
var xhrUri, originalHttpMethod = httpMethod;
"PUT" === httpMethod && (httpMethod = "POST");
var xhrMethod = httpMethod
, xhrBody = args.body;
if ("HEAD" === httpMethod) {
var relayServer = exports.normalizeEndpoint(options.bos_relay_server);
xhrUri = relayServer + "/" + endpointHost + resource,
args.params.httpMethod = httpMethod,
xhrMethod = "POST"
} else
!0 === isBos ? (xhrUri = exports.transformUrl(config.endpoint + resource),
resource = xhrUri.replace(/^\w+:\/\/[^\/]+\//, "/"),
args.headers.host = parseHost(xhrUri)) : xhrUri = config.endpoint + resource;
"POST" !== xhrMethod || xhrBody || (xhrBody = '{"FORCE_POST": true}');
var deferred = Q.defer()
, xhr = new mOxie.XMLHttpRequest;
return xhr.onload = function() {
var response = null;
try {
(response = JSON.parse(xhr.response || "{}")).location = xhrUri
} catch (ex) {
response = {
location: xhrUri
}
}
200 <= xhr.status && xhr.status < 300 ? "HEAD" === httpMethod ? deferred.resolve(response) : deferred.resolve({
http_headers: {},
body: response
}) : deferred.reject({
status_code: xhr.status,
message: response.message || "",
code: response.code || "",
request_id: response.requestId || ""
})
}
,
xhr.onerror = function(error) {
deferred.reject(error)
}
,
xhr.upload && (xhr.upload.onprogress = function(e) {
if ("PUT" === originalHttpMethod) {
e.lengthComputable = !0;
var httpContext = {
httpMethod: originalHttpMethod,
resource: resource,
args: args,
config: config,
xhr: xhr
};
client.emit("progress", e, httpContext)
}
}
),
client.createSignature(client.config.credentials, httpMethod, resource, args.params, args.headers).then(function(authorization, xbceDate) {
authorization && (args.headers.authorization = authorization),
xbceDate && (args.headers["x-bce-date"] = xbceDate);
var qs = qsModule.stringify(args.params);
for (var key in qs && (xhrUri += "?" + qs),
xhr.open(xhrMethod, xhrUri, !0),
args.headers)
if (args.headers.hasOwnProperty(key) && !/(host|content\-length)/i.test(key)) {
var value = args.headers[key];
xhr.setRequestHeader(key, value)
}
xhr.send(xhrBody, {
runtime_order: "flash",
swf_url: options.flash_swf_url
})
}).catch(function(error) {
deferred.reject(error)
}),
deferred.promise
}
}
,
exports.eachLimit = function(tasks, taskParallel, executer, done) {
var runningCount = 0
, aborted = !1
, fin = !1
, queue = new Queue(tasks);
function infiniteLoop() {
var task = queue.dequeue();
task && (runningCount++,
executer(task, function(error) {
runningCount--,
error ? (fin = aborted = !0,
done(error)) : queue.isEmpty() || aborted ? runningCount <= 0 && (fin || (fin = !0,
done())) : setTimeout(infiniteLoop, 0)
}))
}
taskParallel = Math.min(taskParallel, queue.size());
for (var i = 0; i < taskParallel; i++)
infiniteLoop()
}
,
exports.inherits = function(ChildCtor, ParentCtor) {
return require(47).inherits(ChildCtor, ParentCtor)
}
,
exports.guessContentType = function(file, opt_ignoreCharset) {
var contentType = file.type;
if (!contentType) {
var ext = file.name.split(/\./g).pop();
contentType = MimeType.guess(ext)
}
return opt_ignoreCharset || /charset=/.test(contentType) || (contentType += "; charset=UTF-8"),
contentType
}
}
, {
21: 21,
28: 28,
42: 42,
44: 44,
45: 45,
46: 46,
47: 47
}],
33: [function(require, module, exports) {
function Buffer() {}
Buffer.byteLength = function(data) {
var m = encodeURIComponent(data).match(/%[89ABab]/g);
return data.length + (m ? m.length : 0)
}
,
module.exports = Buffer
}
, {}],
34: [function(require, module, exports) {
!function(root) {
var setTimeoutFunc = setTimeout;
function noop() {}
function Promise(fn) {
if ("object" != typeof this)
throw new TypeError("Promises must be constructed via new");
if ("function" != typeof fn)
throw new TypeError("not a function");
this._state = 0,
this._handled = !1,
this._value = void 0,
this._deferreds = [],
doResolve(fn, this)
}
function handle(self, deferred) {
for (; 3 === self._state; )
self = self._value;
0 !== self._state ? (self._handled = !0,
Promise._immediateFn(function() {
var cb = 1 === self._state ? deferred.onFulfilled : deferred.onRejected;
if (null !== cb) {
var ret;
try {
ret = cb(self._value)
} catch (e) {
return void reject(deferred.promise, e)
}
resolve(deferred.promise, ret)
} else
(1 === self._state ? resolve : reject)(deferred.promise, self._value)
})) : self._deferreds.push(deferred)
}
function resolve(self, newValue) {
try {
if (newValue === self)
throw new TypeError("A promise cannot be resolved with itself.");
if (newValue && ("object" == typeof newValue || "function" == typeof newValue)) {
var then = newValue.then;
if (newValue instanceof Promise)
return self._state = 3,
self._value = newValue,
void finale(self);
if ("function" == typeof then)
return void doResolve((fn = then,
thisArg = newValue,
function() {
fn.apply(thisArg, arguments)
}
), self)
}
self._state = 1,
self._value = newValue,
finale(self)
} catch (e) {
reject(self, e)
}
var fn, thisArg
}
function reject(self, newValue) {
self._state = 2,
self._value = newValue,
finale(self)
}
function finale(self) {
2 === self._state && 0 === self._deferreds.length && Promise._immediateFn(function() {
self._handled || Promise._unhandledRejectionFn(self._value)
});
for (var i = 0, len = self._deferreds.length; i < len; i++)
handle(self, self._deferreds[i]);
self._deferreds = null
}
function Handler(onFulfilled, onRejected, promise) {
this.onFulfilled = "function" == typeof onFulfilled ? onFulfilled : null,
this.onRejected = "function" == typeof onRejected ? onRejected : null,
this.promise = promise
}
function doResolve(fn, self) {
var done = !1;
try {
fn(function(value) {
done || (done = !0,
resolve(self, value))
}, function(reason) {
done || (done = !0,
reject(self, reason))
})
} catch (ex) {
if (done)
return;
done = !0,
reject(self, ex)
}
}
Promise.prototype.catch = function(onRejected) {
return this.then(null, onRejected)
}
,
Promise.prototype.then = function(onFulfilled, onRejected) {
var prom = new this.constructor(noop);
return handle(this, new Handler(onFulfilled,onRejected,prom)),
prom
}
,
Promise.all = function(arr) {
var args = Array.prototype.slice.call(arr);
return new Promise(function(resolve, reject) {
if (0 === args.length)
return resolve([]);
var remaining = args.length;
function res(i, val) {
try {
if (val && ("object" == typeof val || "function" == typeof val)) {
var then = val.then;
if ("function" == typeof then)
return void then.call(val, function(val) {
res(i, val)
}, reject)
}
args[i] = val,
0 == --remaining && resolve(args)
} catch (ex) {
reject(ex)
}
}
for (var i = 0; i < args.length; i++)
res(i, args[i])
}
)
}
,
Promise.resolve = function(value) {
return value && "object" == typeof value && value.constructor === Promise ? value : new Promise(function(resolve) {
resolve(value)
}
)
}
,
Promise.reject = function(value) {
return new Promise(function(resolve, reject) {
reject(value)
}
)
}
,
Promise.race = function(values) {
return new Promise(function(resolve, reject) {
for (var i = 0, len = values.length; i < len; i++)
values[i].then(resolve, reject)
}
)
}
,
Promise._immediateFn = "function" == typeof setImmediate && function(fn) {
setImmediate(fn)
}
|| function(fn) {
setTimeoutFunc(fn, 0)
}
,
Promise._unhandledRejectionFn = function(err) {
"undefined" != typeof console && console && console.warn("Possible Unhandled Promise Rejection:", err)
}
,
Promise._setImmediateFn = function(fn) {
Promise._immediateFn = fn
}
,
Promise._setUnhandledRejectionFn = function(fn) {
Promise._unhandledRejectionFn = fn
}
,
void 0 !== module && module.exports ? module.exports = Promise : root.Promise || (root.Promise = Promise)
}(this)
}
, {}],
35: [function(require, module, exports) {
exports.mapLimit = require(2)
}
, {
2: 2
}],
36: [function(require, module, exports) {
var create = Object.create || function() {
function F() {}
return function(obj) {
var subtype;
return F.prototype = obj,
subtype = new F,
F.prototype = null,
subtype
}
}()
, C = {}
, C_algo = C.algo = {}
, C_lib = C.lib = {}
, Base = C_lib.Base = {
extend: function(overrides) {
var subtype = create(this);
return overrides && subtype.mixIn(overrides),
subtype.hasOwnProperty("init") && this.init !== subtype.init || (subtype.init = function() {
subtype.$super.init.apply(this, arguments)
}
),
(subtype.init.prototype = subtype).$super = this,
subtype
},
create: function() {
var instance = this.extend();
return instance.init.apply(instance, arguments),
instance
},
init: function() {},
mixIn: function(properties) {
for (var propertyName in properties)
properties.hasOwnProperty(propertyName) && (this[propertyName] = properties[propertyName]);
properties.hasOwnProperty("toString") && (this.toString = properties.toString)
},
clone: function() {
return this.init.prototype.extend(this)
}
}
, WordArray = C_lib.WordArray = Base.extend({
init: function(words, sigBytes) {
words = this.words = words || [],
this.sigBytes = null != sigBytes ? sigBytes : 4 * words.length
},
toString: function(encoder) {
return (encoder || Hex).stringify(this)
},
concat: function(wordArray) {
var i, thisWords = this.words, thatWords = wordArray.words, thisSigBytes = this.sigBytes, thatSigBytes = wordArray.sigBytes;
if (this.clamp(),
thisSigBytes % 4)
for (i = 0; i < thatSigBytes; i++) {
var thatByte = thatWords[i >>> 2] >>> 24 - i % 4 * 8 & 255;
thisWords[thisSigBytes + i >>> 2] |= thatByte << 24 - (thisSigBytes + i) % 4 * 8
}
else
for (i = 0; i < thatSigBytes; i += 4)
thisWords[thisSigBytes + i >>> 2] = thatWords[i >>> 2];
return this.sigBytes += thatSigBytes,
this
},
clamp: function() {
var words = this.words
, sigBytes = this.sigBytes;
words[sigBytes >>> 2] &= 4294967295 << 32 - sigBytes % 4 * 8,
words.length = Math.ceil(sigBytes / 4)
},
clone: function() {
var clone = Base.clone.call(this);
return clone.words = this.words.slice(0),
clone
},
random: function(nBytes) {
for (var rcache, words = [], r = function(m_w) {
var m_z = 987654321
, mask = 4294967295;
return function() {
var result = ((m_z = 36969 * (65535 & m_z) + (m_z >> 16) & mask) << 16) + (m_w = 18e3 * (65535 & m_w) + (m_w >> 16) & mask) & mask;
return result /= 4294967296,
(result += .5) * (.5 < Math.random() ? 1 : -1)
}
}, i = 0; i < nBytes; i += 4) {
var _r = r(4294967296 * (rcache || Math.random()));
rcache = 987654071 * _r(),
words.push(4294967296 * _r() | 0)
}
return new WordArray.init(words,nBytes)
}
})
, C_enc = C.enc = {}
, Hex = C_enc.Hex = {
stringify: function(wordArray) {
for (var words = wordArray.words, sigBytes = wordArray.sigBytes, hexChars = [], i = 0; i < sigBytes; i++) {
var bite = words[i >>> 2] >>> 24 - i % 4 * 8 & 255;
hexChars.push((bite >>> 4).toString(16)),
hexChars.push((15 & bite).toString(16))
}
return hexChars.join("")
},
parse: function(hexStr) {
for (var hexStrLength = hexStr.length, words = [], i = 0; i < hexStrLength; i += 2)
words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << 24 - i % 8 * 4;
return new WordArray.init(words,hexStrLength / 2)
}
}
, Latin1 = C_enc.Latin1 = {
stringify: function(wordArray) {
for (var words = wordArray.words, sigBytes = wordArray.sigBytes, latin1Chars = [], i = 0; i < sigBytes; i++) {
var bite = words[i >>> 2] >>> 24 - i % 4 * 8 & 255;
latin1Chars.push(String.fromCharCode(bite))
}
return latin1Chars.join("")
},
parse: function(latin1Str) {
for (var latin1StrLength = latin1Str.length, words = [], i = 0; i < latin1StrLength; i++)
words[i >>> 2] |= (255 & latin1Str.charCodeAt(i)) << 24 - i % 4 * 8;
return new WordArray.init(words,latin1StrLength)
}
}
, Utf8 = C_enc.Utf8 = {
stringify: function(wordArray) {
try {
return decodeURIComponent(escape(Latin1.stringify(wordArray)))
} catch (e) {
throw new Error("Malformed UTF-8 data")
}
},
parse: function(utf8Str) {
return Latin1.parse(unescape(encodeURIComponent(utf8Str)))
}
}
, BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
reset: function() {
this._data = new WordArray.init,
this._nDataBytes = 0
},
_append: function(data) {
"string" == typeof data && (data = Utf8.parse(data)),
this._data.concat(data),
this._nDataBytes += data.sigBytes
},
_process: function(doFlush) {
var data = this._data
, dataWords = data.words
, dataSigBytes = data.sigBytes
, blockSize = this.blockSize
, nBlocksReady = dataSigBytes / (4 * blockSize)
, nWordsReady = (nBlocksReady = doFlush ? Math.ceil(nBlocksReady) : Math.max((0 | nBlocksReady) - this._minBufferSize, 0)) * blockSize
, nBytesReady = Math.min(4 * nWordsReady, dataSigBytes);
if (nWordsReady) {
for (var offset = 0; offset < nWordsReady; offset += blockSize)
this._doProcessBlock(dataWords, offset);
var processedWords = dataWords.splice(0, nWordsReady);
data.sigBytes -= nBytesReady
}
return new WordArray.init(processedWords,nBytesReady)
},
clone: function() {
var clone = Base.clone.call(this);
return clone._data = this._data.clone(),
clone
},
_minBufferSize: 0
});
C_lib.Hasher = BufferedBlockAlgorithm.extend({
cfg: Base.extend(),
init: function(cfg) {
this.cfg = this.cfg.extend(cfg),
this.reset()
},
reset: function() {
BufferedBlockAlgorithm.reset.call(this),
this._doReset()
},
update: function(messageUpdate) {
return this._append(messageUpdate),
this._process(),
this
},
finalize: function(messageUpdate) {
return messageUpdate && this._append(messageUpdate),
this._doFinalize()
},
blockSize: 16,
_createHelper: function(hasher) {
return function(message, cfg) {
return new hasher.init(cfg).finalize(message)
}
},
_createHmacHelper: function(hasher) {
return function(message, key) {
return new C_algo.HMAC.init(hasher,key).finalize(message)
}
}
}),
module.exports = C
}
, {}],
37: [function(require, module, exports) {
require(39),
require(38);
var CryptoJS = require(36);
module.exports = CryptoJS.HmacSHA256
}
, {
36: 36,
38: 38,
39: 39
}],
38: [function(require, module, exports) {
var C = require(36)
, Base = C.lib.Base
, Utf8 = C.enc.Utf8;
C.algo.HMAC = Base.extend({
init: function(hasher, key) {
hasher = this._hasher = new hasher.init,
"string" == typeof key && (key = Utf8.parse(key));
var hasherBlockSize = hasher.blockSize
, hasherBlockSizeBytes = 4 * hasherBlockSize;
key.sigBytes > hasherBlockSizeBytes && (key = hasher.finalize(key)),
key.clamp();
for (var oKey = this._oKey = key.clone(), iKey = this._iKey = key.clone(), oKeyWords = oKey.words, iKeyWords = iKey.words, i = 0; i < hasherBlockSize; i++)
oKeyWords[i] ^= 1549556828,
iKeyWords[i] ^= 909522486;
oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes,
this.reset()
},
reset: function() {
var hasher = this._hasher;
hasher.reset(),
hasher.update(this._iKey)
},
update: function(messageUpdate) {
return this._hasher.update(messageUpdate),
this
},
finalize: function(messageUpdate) {
var hasher = this._hasher
, innerHash = hasher.finalize(messageUpdate);
return hasher.reset(),
hasher.finalize(this._oKey.clone().concat(innerHash))
}
})
}
, {
36: 36
}],
39: [function(require, module, exports) {
var CryptoJS = require(36)
, C = CryptoJS
, C_lib = C.lib
, WordArray = C_lib.WordArray
, Hasher = C_lib.Hasher
, C_algo = C.algo
, H = []
, K = [];
!function() {
function isPrime(n) {
for (var sqrtN = Math.sqrt(n), factor = 2; factor <= sqrtN; factor++)
if (!(n % factor))
return !1;
return !0
}
function getFractionalBits(n) {
return 4294967296 * (n - (0 | n)) | 0
}
for (var n = 2, nPrime = 0; nPrime < 64; )
isPrime(n) && (nPrime < 8 && (H[nPrime] = getFractionalBits(Math.pow(n, .5))),
K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3)),
nPrime++),
n++
}();
var W = []
, SHA256 = C_algo.SHA256 = Hasher.extend({
_doReset: function() {
this._hash = new WordArray.init(H.slice(0))
},
_doProcessBlock: function(M, offset) {
for (var H = this._hash.words, a = H[0], b = H[1], c = H[2], d = H[3], e = H[4], f = H[5], g = H[6], h = H[7], i = 0; i < 64; i++) {
if (i < 16)
W[i] = 0 | M[offset + i];
else {
var gamma0x = W[i - 15]
, gamma0 = (gamma0x << 25 | gamma0x >>> 7) ^ (gamma0x << 14 | gamma0x >>> 18) ^ gamma0x >>> 3
, gamma1x = W[i - 2]
, gamma1 = (gamma1x << 15 | gamma1x >>> 17) ^ (gamma1x << 13 | gamma1x >>> 19) ^ gamma1x >>> 10;
W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
}
var maj = a & b ^ a & c ^ b & c
, sigma0 = (a << 30 | a >>> 2) ^ (a << 19 | a >>> 13) ^ (a << 10 | a >>> 22)
, t1 = h + ((e << 26 | e >>> 6) ^ (e << 21 | e >>> 11) ^ (e << 7 | e >>> 25)) + (e & f ^ ~e & g) + K[i] + W[i];
h = g,
g = f,
f = e,
e = d + t1 | 0,
d = c,
c = b,
b = a,
a = t1 + (sigma0 + maj) | 0
}
H[0] = H[0] + a | 0,
H[1] = H[1] + b | 0,
H[2] = H[2] + c | 0,
H[3] = H[3] + d | 0,
H[4] = H[4] + e | 0,
H[5] = H[5] + f | 0,
H[6] = H[6] + g | 0,
H[7] = H[7] + h | 0
},
_doFinalize: function() {
var data = this._data
, dataWords = data.words
, nBitsTotal = 8 * this._nDataBytes
, nBitsLeft = 8 * data.sigBytes;
return dataWords[nBitsLeft >>> 5] |= 128 << 24 - nBitsLeft % 32,
dataWords[14 + (nBitsLeft + 64 >>> 9 << 4)] = Math.floor(nBitsTotal / 4294967296),
dataWords[15 + (nBitsLeft + 64 >>> 9 << 4)] = nBitsTotal,
data.sigBytes = 4 * dataWords.length,
this._process(),
this._hash
},
clone: function() {
var clone = Hasher.clone.call(this);
return clone._hash = this._hash.clone(),
clone
}
});
C.SHA256 = Hasher._createHelper(SHA256),
C.HmacSHA256 = Hasher._createHmacHelper(SHA256),
module.exports = CryptoJS.SHA256
}
, {
36: 36
}],
40: [function(require, module, exports) {
var HmacSHA256 = require(37)
, Hex = require(36).enc.Hex;
exports.createHmac = function(type, key) {
if ("sha256" === type) {
var result = null;
return {
update: function(data) {
result = HmacSHA256(data, key).toString(Hex)
},
digest: function() {
return result
}
}
}
}
}
, {
36: 36,
37: 37
}],
41: [function(require, module, exports) {
function EventEmitter() {
this.__events = {}
}
EventEmitter.prototype.emit = function(eventName, var_args) {
var handlers = this.__events[eventName];
if (!handlers)
return !1;
for (var args = [].slice.call(arguments, 1), i = 0; i < handlers.length; i++) {
var handler = handlers[i];
try {
handler.apply(this, args)
} catch (ex) {}
}
return !0
}
,
EventEmitter.prototype.on = function(eventName, listener) {
this.__events[eventName] ? this.__events[eventName].push(listener) : this.__events[eventName] = [listener]
}
,
exports.EventEmitter = EventEmitter
}
, {}],
42: [function(require, module, exports) {
function pad(number) {
return number < 10 ? "0" + number : number
}
exports.toISOString = function(date) {
return date.toISOString ? date.toISOString() : date.getUTCFullYear() + "-" + pad(date.getUTCMonth() + 1) + "-" + pad(date.getUTCDate()) + "T" + pad(date.getUTCHours()) + ":" + pad(date.getUTCMinutes()) + ":" + pad(date.getUTCSeconds()) + "." + (date.getUTCMilliseconds() / 1e3).toFixed(3).slice(2, 5) + "Z"
}
,
exports.toUTCString = function(date) {
return exports.toISOString(date).replace(/\.\d+Z$/, "Z")
}
}
, {}],
43: [function(require, module, exports) {
var u = require(46)
, splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var substr = "b" === "ab".substr(-1) ? function(str, start, len) {
return str.substr(start, len)
}
: function(str, start, len) {
return start < 0 && (start = str.length + start),
str.substr(start, len)
}
;
exports.extname = function(path) {
return (filename = path,
splitPathRe.exec(filename).slice(1))[3];
var filename
}
,
exports.join = function() {
var paths = Array.prototype.slice.call(arguments, 0);
return exports.normalize(u.filter(paths, function(p, index) {
if ("string" != typeof p)
throw new TypeError("Arguments to path.join must be strings");
return p
}).join("/"))
}
,
exports.normalize = function(path) {
var isAbsolute = "/" === path.charAt(0)
, trailingSlash = "/" === substr(path, -1);
return (path = function(parts, allowAboveRoot) {
for (var up = 0, i = parts.length - 1; 0 <= i; i--) {
var last = parts[i];
"." === last ? parts.splice(i, 1) : ".." === last ? (parts.splice(i, 1),
up++) : up && (parts.splice(i, 1),
up--)
}
if (allowAboveRoot)
for (; up--; up)
parts.unshift("..");
return parts
}(u.filter(path.split("/"), function(p) {
return !!p
}), !isAbsolute).join("/")) || isAbsolute || (path = "."),
path && trailingSlash && (path += "/"),
(isAbsolute ? "/" : "") + path
}
}
, {
46: 46
}],
44: [function(require, module, exports) {
var Promise = require(34);
exports.resolve = function() {
return Promise.resolve.apply(Promise, arguments)
}
,
exports.reject = function() {
return Promise.reject.apply(Promise, arguments)
}
,
exports.all = function() {
return Promise.all.apply(Promise, arguments)
}
,
exports.fcall = function(fn) {
try {
return Promise.resolve(fn())
} catch (ex) {
return Promise.reject(ex)
}
}
,
exports.defer = function() {
var deferred = {};
return deferred.promise = new Promise(function(resolve, reject) {
deferred.resolve = function() {
resolve.apply(null, arguments)
}
,
deferred.reject = function() {
reject.apply(null, arguments)
}
}
),
deferred
}
}
, {
34: 34
}],
45: [function(require, module, exports) {
var u = require(46);
function stringifyPrimitive(v) {
return "string" == typeof v ? v : "number" == typeof v && isFinite(v) ? "" + v : "boolean" == typeof v ? v ? "true" : "false" : ""
}
exports.stringify = function(obj, sep, eq, options) {
sep = sep || "&",
eq = eq || "=";
var encode = encodeURIComponent;
if (options && "function" == typeof options.encodeURIComponent && (encode = options.encodeURIComponent),
null !== obj && "object" == typeof obj) {
for (var keys = u.keys(obj), len = keys.length, flast = len - 1, fields = "", i = 0; i < len; ++i) {
var k = keys[i]
, v = obj[k]
, ks = encode(stringifyPrimitive(k)) + eq;
if (u.isArray(v)) {
for (var vlen = v.length, vlast = vlen - 1, j = 0; j < vlen; ++j)
fields += ks + encode(stringifyPrimitive(v[j])),
j < vlast && (fields += sep);
vlen && i < flast && (fields += sep)
} else
fields += ks + encode(stringifyPrimitive(v)),
i < flast && (fields += sep)
}
return fields
}
return ""
}
}
, {
46: 46
}],
46: [function(require, module, exports) {
var isArray = require(5)
, noop = require(10)
, isNumber = require(13)
, isObject = require(14)
, objectToString = Object.prototype.toString;
function isFunction(value) {
return "function" == typeof value
}
function indexOf(array, value) {
for (var i = 0; i < array.length; i++)
if (array[i] === value)
return i;
return -1
}
var hasOwnProperty = Object.prototype.hasOwnProperty
, hasDontEnumBug = !{
toString: null
}.propertyIsEnumerable("toString")
, dontEnums = ["toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "constructor"];
function keys(obj) {
var prop, i, result = [];
for (prop in obj)
hasOwnProperty.call(obj, prop) && result.push(prop);
if (hasDontEnumBug)
for (i = 0; i < dontEnums.length; i++)
hasOwnProperty.call(obj, dontEnums[i]) && result.push(dontEnums[i]);
return result
}
exports.bind = function(fn, context) {
return function() {
return fn.apply(context, [].slice.call(arguments))
}
}
,
exports.each = function(array, callback, context) {
for (var i = 0; i < array.length; i++)
callback.call(context, array[i], i, array)
}
,
exports.extend = function(source, var_args) {
for (var i = 1; i < arguments.length; i++) {
var item = arguments[i];
if (item && isObject(item))
for (var oKeys = keys(item), j = 0; j < oKeys.length; j++) {
var key = oKeys[j]
, value = item[key];
source[key] = value
}
}
return source
}
,
exports.filter = function(array, callback, context) {
for (var res = [], i = 0; i < array.length; i++) {
var value = array[i];
callback.call(context, value, i, array) && res.push(value)
}
return res
}
,
exports.find = function(array, callback, context) {
for (var i = 0; i < array.length; i++) {
var value = array[i];
if (callback.call(context, value, i, array))
return value
}
}
,
exports.isArray = isArray,
exports.isFunction = isFunction,
exports.isNumber = isNumber,
exports.isObject = isObject,
exports.isString = function(value) {
return "string" == typeof value || "[object String]" === objectToString.call(value)
}
,
exports.map = function(array, callback, context) {
for (var result = [], i = 0; i < array.length; i++)
result[i] = callback.call(context, array[i], i, array);
return result
}
,
exports.omit = function(object, var_args) {
for (var args = isArray(var_args) ? var_args : [].slice.call(arguments, 1), result = {}, oKeys = keys(object), i = 0; i < oKeys.length; i++) {
var key = oKeys[i];
-1 === indexOf(args, key) && (result[key] = object[key])
}
return result
}
,
exports.pick = function(object, var_args, context) {
var i, key, value, result = {};
if (isFunction(var_args)) {
var callback = var_args
, oKeys = keys(object);
for (i = 0; i < oKeys.length; i++)
value = object[key = oKeys[i]],
callback.call(context, value, key, object) && (result[key] = value)
} else {
var args = isArray(var_args) ? var_args : [].slice.call(arguments, 1);
for (i = 0; i < args.length; i++)
key = args[i],
object.hasOwnProperty(key) && (result[key] = object[key])
}
return result
}
,
exports.keys = keys,
exports.noop = noop
}
, {
10: 10,
13: 13,
14: 14,
5: 5
}],
47: [function(require, module, exports) {
var u = require(46);
exports.inherits = function(subClass, superClass) {
var subClassProto = subClass.prototype
, F = new Function;
F.prototype = superClass.prototype,
subClass.prototype = new F,
subClass.prototype.constructor = subClass,
u.extend(subClass.prototype, subClassProto)
}
,
exports.format = function(f) {
var argLen = arguments.length;
if (1 === argLen)
return f;
for (var str = "", a = 1, lastPos = 0, i = 0; i < f.length; ) {
if (37 === f.charCodeAt(i) && i + 1 < f.length)
switch (f.charCodeAt(i + 1)) {
case 100:
if (argLen <= a)
break;
lastPos < i && (str += f.slice(lastPos, i)),
str += Number(arguments[a++]),
lastPos = i += 2;
continue;
case 115:
if (argLen <= a)
break;
lastPos < i && (str += f.slice(lastPos, i)),
str += String(arguments[a++]),
lastPos = i += 2;
continue;
case 37:
lastPos < i && (str += f.slice(lastPos, i)),
str += "%",
lastPos = i += 2;
continue
}
++i
}
return 0 === lastPos ? str = f : lastPos < f.length && (str += f.slice(lastPos)),
str
}
}
, {
46: 46
}]
}, {}, [1])(1)
}),
function(a) {
if ("object" == typeof exports && "undefined" != typeof module)
module.exports = a();
else if ("function" == typeof define && define.amd)
define([], a);
else {
("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).Raven = a()
}
}(function() {
return function a(b, c, d) {
function e(g, h) {
if (!c[g]) {
if (!b[g]) {
var i = "function" == typeof require && require;
if (!h && i)
return i(g, !0);
if (f)
return f(g, !0);
var j = new Error("Cannot find module '" + g + "'");
throw j.code = "MODULE_NOT_FOUND",
j
}
var k = c[g] = {
exports: {}
};
b[g][0].call(k.exports, function(a) {
var c = b[g][1][a];
return e(c || a)
}, k, k.exports, a, b, c, d)
}
return c[g].exports
}
for (var f = "function" == typeof require && require, g = 0; g < d.length; g++)
e(d[g]);
return e
}({
1: [function(a, b, c) {
function d(a) {
this.name = "RavenConfigError",
this.message = a
}
(d.prototype = new Error).constructor = d,
b.exports = d
}
, {}],
2: [function(a, b, c) {
b.exports = {
wrapMethod: function(a, b, c) {
var d = a[b]
, e = a;
if (b in a) {
var f = "warn" === b ? "warning" : b;
a[b] = function() {
var a = [].slice.call(arguments)
, g = "" + a.join(" ")
, h = {
level: f,
logger: "console",
extra: {
arguments: a
}
};
"assert" === b ? !1 === a[0] && (g = "Assertion failed: " + (a.slice(1).join(" ") || "console.assert"),
h.extra.arguments = a.slice(1),
c && c(g, h)) : c && c(g, h),
d && Function.prototype.apply.call(d, e, a)
}
}
}
}
}
, {}],
3: [function(a, b, c) {
(function(c) {
function d() {
return +new Date
}
function e(a, b) {
return h(b) ? function(c) {
return b(c, a)
}
: b
}
function f() {
for (var a in this.a = !("object" != typeof JSON || !JSON.stringify),
this.b = !g(J),
this.c = !g(K),
this.d = null,
this.e = null,
this.f = null,
this.g = null,
this.h = null,
this.i = null,
this.j = {},
this.k = {
logger: "javascript",
ignoreErrors: [],
ignoreUrls: [],
whitelistUrls: [],
includePaths: [],
collectWindowErrors: !0,
maxMessageLength: 0,
maxUrlLength: 250,
stackTraceLimit: 50,
autoBreadcrumbs: !0,
instrument: !0,
sampleRate: 1
},
this.l = 0,
this.m = !1,
this.n = Error.stackTraceLimit,
this.o = I.console || {},
this.p = {},
this.q = [],
this.r = d(),
this.s = [],
this.t = [],
this.u = null,
this.v = I.location,
this.w = this.v && this.v.href,
this.x(),
this.o)
this.p[a] = this.o[a]
}
function g(a) {
return void 0 === a
}
function h(a) {
return "function" == typeof a
}
function i(a) {
return "[object String]" === L.toString.call(a)
}
function j(a) {
for (var b in a)
return !1;
return !0
}
function k(a, b) {
var c, d;
if (g(a.length))
for (c in a)
o(a, c) && b.call(null, c, a[c]);
else if (d = a.length)
for (c = 0; c < d; c++)
b.call(null, c, a[c])
}
function l(a, b) {
return b && k(b, function(b, c) {
a[b] = c
}),
a
}
function m(a) {
return !!Object.isFrozen && Object.isFrozen(a)
}
function n(a, b) {
return !b || a.length <= b ? a : a.substr(0, b) + "…"
}
function o(a, b) {
return L.hasOwnProperty.call(a, b)
}
function p(a) {
for (var b, c = [], d = 0, e = a.length; d < e; d++)
i(b = a[d]) ? c.push(b.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1")) : b && b.source && c.push(b.source);
return new RegExp(c.join("|"),"i")
}
function r(a) {
var b = a.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);
if (!b)
return {};
var c = b[6] || ""
, d = b[8] || "";
return {
protocol: b[2],
host: b[4],
path: b[5],
relative: b[5] + c + d
}
}
function u(a) {
var b, c, d, e, f, g = [];
if (!a || !a.tagName)
return "";
if (g.push(a.tagName.toLowerCase()),
a.id && g.push("#" + a.id),
(b = a.className) && i(b))
for (c = b.split(/\s+/),
f = 0; f < c.length; f++)
g.push("." + c[f]);
var h = ["type", "name", "title", "alt"];
for (f = 0; f < h.length; f++)
d = h[f],
(e = a.getAttribute(d)) && g.push("[" + d + '="' + e + '"]');
return g.join("")
}
function v(a, b) {
return !!(!!a ^ !!b)
}
function x(a, b) {
if (v(a, b))
return !1;
var c = a.frames
, d = b.frames;
if (c.length !== d.length)
return !1;
for (var e, f, g = 0; g < c.length; g++)
if (e = c[g],
f = d[g],
e.filename !== f.filename || e.lineno !== f.lineno || e.colno !== f.colno || e.function !== f.function)
return !1;
return !0
}
function y(a, b, c, d) {
var e = a[b];
a[b] = c(e),
d && d.push([a, b, e])
}
var z = a(6)
, A = a(7)
, B = a(1)
, C = a(5)
, D = C.isError
, E = C.isObject
, F = a(2).wrapMethod
, G = "source protocol user pass host port path".split(" ")
, H = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/
, I = "undefined" != typeof window ? window : void 0 !== c ? c : "undefined" != typeof self ? self : {}
, J = I.document
, K = I.navigator;
f.prototype = {
VERSION: "3.18.1",
debug: !1,
TraceKit: z,
config: function(a, b) {
var c = this;
if (c.g)
return this.y("error", "Error: Raven has already been configured"),
c;
if (!a)
return c;
var d = c.k;
b && k(b, function(a, b) {
"tags" === a || "extra" === a || "user" === a ? c.j[a] = b : d[a] = b
}),
c.setDSN(a),
d.ignoreErrors.push(/^Script error\.?$/),
d.ignoreErrors.push(/^Javascript error: Script error\.? on line 0$/),
d.ignoreErrors = p(d.ignoreErrors),
d.ignoreUrls = !!d.ignoreUrls.length && p(d.ignoreUrls),
d.whitelistUrls = !!d.whitelistUrls.length && p(d.whitelistUrls),
d.includePaths = p(d.includePaths),
d.maxBreadcrumbs = Math.max(0, Math.min(d.maxBreadcrumbs || 100, 100));
var e = {
xhr: !0,
console: !0,
dom: !0,
location: !0
}
, f = d.autoBreadcrumbs;
"[object Object]" === {}.toString.call(f) ? f = l(e, f) : !1 !== f && (f = e),
d.autoBreadcrumbs = f;
var g = {
tryCatch: !0
}
, h = d.instrument;
return "[object Object]" === {}.toString.call(h) ? h = l(g, h) : !1 !== h && (h = g),
d.instrument = h,
z.collectWindowErrors = !!d.collectWindowErrors,
c
},
install: function() {
var a = this;
return a.isSetup() && !a.m && (z.report.subscribe(function() {
a.z.apply(a, arguments)
}),
a.k.instrument && a.k.instrument.tryCatch && a.A(),
a.k.autoBreadcrumbs && a.B(),
a.C(),
a.m = !0),
Error.stackTraceLimit = a.k.stackTraceLimit,
this
},
setDSN: function(a) {
var b = this
, c = b.D(a)
, d = c.path.lastIndexOf("/")
, e = c.path.substr(1, d);
b.E = a,
b.h = c.user,
b.F = c.pass && c.pass.substr(1),
b.i = c.path.substr(d + 1),
b.g = b.G(c),
b.H = b.g + "/" + e + "api/" + b.i + "/store/",
this.x()
},
context: function(a, b, c) {
return h(a) && (c = b || [],
b = a,
a = void 0),
this.wrap(a, b).apply(this, c)
},
wrap: function(a, b, c) {
function d() {
var d = []
, f = arguments.length
, g = !a || a && !1 !== a.deep;
for (c && h(c) && c.apply(this, arguments); f--; )
d[f] = g ? e.wrap(a, arguments[f]) : arguments[f];
try {
return b.apply(this, d)
} catch (i) {
throw e.I(),
e.captureException(i, a),
i
}
}
var e = this;
if (g(b) && !h(a))
return a;
if (h(a) && (b = a,
a = void 0),
!h(b))
return b;
try {
if (b.J)
return b;
if (b.K)
return b.K
} catch (f) {
return b
}
for (var i in b)
o(b, i) && (d[i] = b[i]);
return d.prototype = b.prototype,
(b.K = d).J = !0,
d.L = b,
d
},
uninstall: function() {
return z.report.uninstall(),
this.M(),
Error.stackTraceLimit = this.n,
this.m = !1,
this
},
captureException: function(a, b) {
if (!D(a))
return this.captureMessage(a, l({
trimHeadFrames: 1,
stacktrace: !0
}, b));
this.d = a;
try {
var c = z.computeStackTrace(a);
this.N(c, b)
} catch (d) {
if (a !== d)
throw d
}
return this
},
captureMessage: function(a, b) {
if (!this.k.ignoreErrors.test || !this.k.ignoreErrors.test(a)) {
var c = l({
message: a + ""
}, b = b || {});
if (this.k.stacktrace || b && b.stacktrace) {
var d;
try {
throw new Error(a)
} catch (e) {
d = e
}
d.name = null,
b = l({
fingerprint: a,
trimHeadFrames: (b.trimHeadFrames || 0) + 1
}, b);
var f = z.computeStackTrace(d)
, g = this.O(f, b);
c.stacktrace = {
frames: g.reverse()
}
}
return this.P(c),
this
}
},
captureBreadcrumb: function(a) {
var b = l({
timestamp: d() / 1e3
}, a);
if (h(this.k.breadcrumbCallback)) {
var c = this.k.breadcrumbCallback(b);
if (E(c) && !j(c))
b = c;
else if (!1 === c)
return this
}
return this.t.push(b),
this.t.length > this.k.maxBreadcrumbs && this.t.shift(),
this
},
addPlugin: function(a) {
var b = [].slice.call(arguments, 1);
return this.q.push([a, b]),
this.m && this.C(),
this
},
setUserContext: function(a) {
return this.j.user = a,
this
},
setExtraContext: function(a) {
return this.Q("extra", a),
this
},
setTagsContext: function(a) {
return this.Q("tags", a),
this
},
clearContext: function() {
return this.j = {},
this
},
getContext: function() {
return JSON.parse(A(this.j))
},
setEnvironment: function(a) {
return this.k.environment = a,
this
},
setRelease: function(a) {
return this.k.release = a,
this
},
setDataCallback: function(a) {
var b = this.k.dataCallback;
return this.k.dataCallback = e(b, a),
this
},
setBreadcrumbCallback: function(a) {
var b = this.k.breadcrumbCallback;
return this.k.breadcrumbCallback = e(b, a),
this
},
setShouldSendCallback: function(a) {
var b = this.k.shouldSendCallback;
return this.k.shouldSendCallback = e(b, a),
this
},
setTransport: function(a) {
return this.k.transport = a,
this
},
lastException: function() {
return this.d
},
lastEventId: function() {
return this.f
},
isSetup: function() {
return !(!this.a || !this.g && (this.ravenNotConfiguredError || (this.ravenNotConfiguredError = !0,
this.y("error", "Error: Raven has not been configured.")),
1))
},
afterLoad: function() {
var a = I.RavenConfig;
a && this.config(a.dsn, a.config).install()
},
showReportDialog: function(a) {
if (J) {
var b = (a = a || {}).eventId || this.lastEventId();
if (!b)
throw new B("Missing eventId");
var c = a.dsn || this.E;
if (!c)
throw new B("Missing DSN");
var d = encodeURIComponent
, e = "";
e += "?eventId=" + d(b),
e += "&dsn=" + d(c);
var f = a.user || this.j.user;
f && (f.name && (e += "&name=" + d(f.name)),
f.email && (e += "&email=" + d(f.email)));
var g = this.G(this.D(c))
, h = J.createElement("script");
h.async = !0,
h.src = g + "/api/embed/error-page/" + e,
(J.head || J.body).appendChild(h)
}
},
I: function() {
var a = this;
this.l += 1,
setTimeout(function() {
a.l -= 1
})
},
R: function(a, b) {
var c, d;
if (this.b) {
for (d in b = b || {},
a = "raven" + a.substr(0, 1).toUpperCase() + a.substr(1),
J.createEvent ? (c = J.createEvent("HTMLEvents")).initEvent(a, !0, !0) : (c = J.createEventObject()).eventType = a,
b)
o(b, d) && (c[d] = b[d]);
if (J.createEvent)
J.dispatchEvent(c);
else
try {
J.fireEvent("on" + c.eventType.toLowerCase(), c)
} catch (e) {}
}
},
S: function(a) {
var b = this;
return function(c) {
if (b.T = null,
b.u !== c) {
var d;
b.u = c;
try {
d = function(a) {
for (var b, e = [], f = 0, g = 0, i = " > ".length; a && f++ < 5 && !("html" === (b = u(a)) || 1 < f && 80 <= g + e.length * i + b.length); )
e.push(b),
g += b.length,
a = a.parentNode;
return e.reverse().join(" > ")
}(c.target)
} catch (e) {
d = "<unknown>"
}
b.captureBreadcrumb({
category: "ui." + a,
message: d
})
}
}
},
U: function() {
var a = this;
return function(c) {
var d;
try {
d = c.target
} catch (e) {
return
}
var f = d && d.tagName;
if (f && ("INPUT" === f || "TEXTAREA" === f || d.isContentEditable)) {
var g = a.T;
g || a.S("input")(c),
clearTimeout(g),
a.T = setTimeout(function() {
a.T = null
}, 1e3)
}
}
},
V: function(a, b) {
var c = r(this.v.href)
, d = r(b)
, e = r(a);
this.w = b,
c.protocol === d.protocol && c.host === d.host && (b = d.relative),
c.protocol === e.protocol && c.host === e.host && (a = e.relative),
this.captureBreadcrumb({
category: "navigation",
data: {
to: b,
from: a
}
})
},
A: function() {
function a(a) {
return function(b, d) {
for (var e = new Array(arguments.length), f = 0; f < e.length; ++f)
e[f] = arguments[f];
var g = e[0];
return h(g) && (e[0] = c.wrap(g)),
a.apply ? a.apply(this, e) : a(e[0], e[1])
}
}
function b(a) {
var b = I[a] && I[a].prototype;
b && b.hasOwnProperty && b.hasOwnProperty("addEventListener") && (y(b, "addEventListener", function(b) {
return function(d, f, g, h) {
try {
f && f.handleEvent && (f.handleEvent = c.wrap(f.handleEvent))
} catch (i) {}
var j, k, l;
return e && e.dom && ("EventTarget" === a || "Node" === a) && (k = c.S("click"),
l = c.U(),
j = function(a) {
if (a) {
var b;
try {
b = a.type
} catch (c) {
return
}
return "click" === b ? k(a) : "keypress" === b ? l(a) : void 0
}
}
),
b.call(this, d, c.wrap(f, void 0, j), g, h)
}
}, d),
y(b, "removeEventListener", function(a) {
return function(b, c, d, e) {
try {
c = c && (c.K ? c.K : c)
} catch (f) {}
return a.call(this, b, c, d, e)
}
}, d))
}
var c = this
, d = c.s
, e = this.k.autoBreadcrumbs;
y(I, "setTimeout", a, d),
y(I, "setInterval", a, d),
I.requestAnimationFrame && y(I, "requestAnimationFrame", function(a) {
return function(b) {
return a(c.wrap(b))
}
}, d);
for (var f = ["EventTarget", "Window", "Node", "ApplicationCache", "AudioTrackList", "ChannelMergerNode", "CryptoOperation", "EventSource", "FileReader", "HTMLUnknownElement", "IDBDatabase", "IDBRequest", "IDBTransaction", "KeyOperation", "MediaController", "MessagePort", "ModalWindow", "Notification", "SVGElementInstance", "Screen", "TextTrack", "TextTrackCue", "TextTrackList", "WebSocket", "WebSocketWorker", "Worker", "XMLHttpRequest", "XMLHttpRequestEventTarget", "XMLHttpRequestUpload"], g = 0; g < f.length; g++)
b(f[g])
},
B: function() {
function a(a, c) {
a in c && h(c[a]) && y(c, a, function(a) {
return b.wrap(a)
})
}
var b = this
, c = this.k.autoBreadcrumbs
, d = b.s;
if (c.xhr && "XMLHttpRequest"in I) {
var e = XMLHttpRequest.prototype;
y(e, "open", function(a) {
return function(c, d) {
return i(d) && -1 === d.indexOf(b.h) && (this.W = {
method: c,
url: d,
status_code: null
}),
a.apply(this, arguments)
}
}, d),
y(e, "send", function(c) {
return function(d) {
function e() {
if (f.W && 4 === f.readyState) {
try {
f.W.status_code = f.status
} catch (a) {}
b.captureBreadcrumb({
type: "http",
category: "xhr",
data: f.W
})
}
}
for (var f = this, g = ["onload", "onerror", "onprogress"], i = 0; i < g.length; i++)
a(g[i], f);
return "onreadystatechange"in f && h(f.onreadystatechange) ? y(f, "onreadystatechange", function(a) {
return b.wrap(a, void 0, e)
}) : f.onreadystatechange = e,
c.apply(this, arguments)
}
}, d)
}
c.xhr && "fetch"in I && y(I, "fetch", function(a) {
return function(c, d) {
for (var e = new Array(arguments.length), f = 0; f < e.length; ++f)
e[f] = arguments[f];
var g, h = e[0], i = "GET";
"string" == typeof h ? g = h : (g = h.url,
h.method && (i = h.method)),
e[1] && e[1].method && (i = e[1].method);
var j = {
method: i,
url: g,
status_code: null
};
return b.captureBreadcrumb({
type: "http",
category: "fetch",
data: j
}),
a.apply(this, e).then(function(a) {
return j.status_code = a.status,
a
})
}
}, d),
c.dom && this.b && (J.addEventListener ? (J.addEventListener("click", b.S("click"), !1),
J.addEventListener("keypress", b.U(), !1)) : (J.attachEvent("onclick", b.S("click")),
J.attachEvent("onkeypress", b.U())));
var f = I.chrome
, j = !(f && f.app && f.app.runtime) && I.history && history.pushState;
if (c.location && j) {
var l = I.onpopstate;
I.onpopstate = function() {
var a = b.v.href;
if (b.V(b.w, a),
l)
return l.apply(this, arguments)
}
,
y(history, "pushState", function(a) {
return function() {
var c = 2 < arguments.length ? arguments[2] : void 0;
return c && b.V(b.w, c + ""),
a.apply(this, arguments)
}
}, d)
}
if (c.console && "console"in I && console.log) {
var m = function(a, c) {
b.captureBreadcrumb({
message: a,
level: c.level,
category: "console"
})
};
k(["debug", "info", "warn", "error", "log"], function(a, b) {
F(console, b, m)
})
}
},
M: function() {
for (var a; this.s.length; ) {
var b = (a = this.s.shift())[0]
, c = a[1]
, d = a[2];
b[c] = d
}
},
C: function() {
var a = this;
k(this.q, function(b, c) {
var d = c[0]
, e = c[1];
d.apply(a, [a].concat(e))
})
},
D: function(a) {
var b = H.exec(a)
, c = {}
, d = 7;
try {
for (; d--; )
c[G[d]] = b[d] || ""
} catch (e) {
throw new B("Invalid DSN: " + a)
}
if (c.pass && !this.k.allowSecretKey)
throw new B("Do not specify your secret key in the DSN. See: http://bit.ly/raven-secret-key");
return c
},
G: function(a) {
var b = "//" + a.host + (a.port ? ":" + a.port : "");
return a.protocol && (b = a.protocol + ":" + b),
b
},
z: function() {
this.l || this.N.apply(this, arguments)
},
N: function(a, b) {
var c = this.O(a, b);
this.R("handle", {
stackInfo: a,
options: b
}),
this.X(a.name, a.message, a.url, a.lineno, c, b)
},
O: function(a, b) {
var c = this
, d = [];
if (a.stack && a.stack.length && (k(a.stack, function(b, e) {
var f = c.Y(e, a.url);
f && d.push(f)
}),
b && b.trimHeadFrames))
for (var e = 0; e < b.trimHeadFrames && e < d.length; e++)
d[e].in_app = !1;
return d = d.slice(0, this.k.stackTraceLimit)
},
Y: function(a, b) {
var c = {
filename: a.url,
lineno: a.line,
colno: a.column,
function: a.func || "?"
};
return a.url || (c.filename = b),
c.in_app = !(this.k.includePaths.test && !this.k.includePaths.test(c.filename) || /(Raven|TraceKit)\./.test(c.function) || /raven\.(min\.)?js$/.test(c.filename)),
c
},
X: function(a, b, c, d, e, f) {
var h, g = (a || "") + ": " + (b || "");
if ((!this.k.ignoreErrors.test || !this.k.ignoreErrors.test(g)) && (e && e.length ? (c = e[0].filename || c,
e.reverse(),
h = {
frames: e
}) : c && (h = {
frames: [{
filename: c,
lineno: d,
in_app: !0
}]
}),
(!this.k.ignoreUrls.test || !this.k.ignoreUrls.test(c)) && (!this.k.whitelistUrls.test || this.k.whitelistUrls.test(c)))) {
var i = l({
exception: {
values: [{
type: a,
value: b,
stacktrace: h
}]
},
culprit: c
}, f);
this.P(i)
}
},
Z: function(a) {
var b = this.k.maxMessageLength;
if (a.message && (a.message = n(a.message, b)),
a.exception) {
var c = a.exception.values[0];
c.value = n(c.value, b)
}
var d = a.request;
return d && (d.url && (d.url = n(d.url, this.k.maxUrlLength)),
d.Referer && (d.Referer = n(d.Referer, this.k.maxUrlLength))),
a.breadcrumbs && a.breadcrumbs.values && this.$(a.breadcrumbs),
a
},
$: function(a) {
for (var b, c, d, e = ["to", "from", "url"], f = 0; f < a.values.length; ++f)
if ((c = a.values[f]).hasOwnProperty("data") && E(c.data) && !m(c.data)) {
d = l({}, c.data);
for (var g = 0; g < e.length; ++g)
b = e[g],
d.hasOwnProperty(b) && d[b] && (d[b] = n(d[b], this.k.maxUrlLength));
a.values[f].data = d
}
},
_: function() {
if (this.c || this.b) {
var a = {};
return this.c && K.userAgent && (a.headers = {
"User-Agent": navigator.userAgent
}),
this.b && (J.location && J.location.href && (a.url = J.location.href),
J.referrer && (a.headers || (a.headers = {}),
a.headers.Referer = J.referrer)),
a
}
},
x: function() {
this.aa = 0,
this.ba = null
},
ca: function() {
return this.aa && d() - this.ba < this.aa
},
da: function(a) {
var b = this.e;
return !(!b || a.message !== b.message || a.culprit !== b.culprit) && (a.stacktrace || b.stacktrace ? x(a.stacktrace, b.stacktrace) : !a.exception && !b.exception || function(a, b) {
return !v(a, b) && (a = a.values[0],
b = b.values[0],
a.type === b.type && a.value === b.value && x(a.stacktrace, b.stacktrace))
}(a.exception, b.exception))
},
ea: function(a) {
if (!this.ca()) {
var b = a.status;
if (400 === b || 401 === b || 429 === b) {
var c;
try {
c = a.getResponseHeader("Retry-After"),
c = 1e3 * parseInt(c, 10)
} catch (e) {}
this.aa = c || (2 * this.aa || 1e3),
this.ba = d()
}
}
},
P: function(a) {
var b = this.k
, c = {
project: this.i,
logger: b.logger,
platform: "javascript"
}
, e = this._();
if (e && (c.request = e),
a.trimHeadFrames && delete a.trimHeadFrames,
(a = l(c, a)).tags = l(l({}, this.j.tags), a.tags),
a.extra = l(l({}, this.j.extra), a.extra),
a.extra["session:duration"] = d() - this.r,
this.t && 0 < this.t.length && (a.breadcrumbs = {
values: [].slice.call(this.t, 0)
}),
j(a.tags) && delete a.tags,
this.j.user && (a.user = this.j.user),
b.environment && (a.environment = b.environment),
b.release && (a.release = b.release),
b.serverName && (a.server_name = b.serverName),
h(b.dataCallback) && (a = b.dataCallback(a) || a),
a && !j(a) && (!h(b.shouldSendCallback) || b.shouldSendCallback(a)))
return this.ca() ? void this.y("warn", "Raven dropped error due to backoff: ", a) : void ("number" == typeof b.sampleRate ? Math.random() < b.sampleRate && this.fa(a) : this.fa(a))
},
ga: function() {
return function() {
var a = I.crypto || I.msCrypto;
if (!g(a) && a.getRandomValues) {
var b = new Uint16Array(8);
a.getRandomValues(b),
b[3] = 4095 & b[3] | 16384,
b[4] = 16383 & b[4] | 32768;
var c = function(a) {
for (var b = a.toString(16); b.length < 4; )
b = "0" + b;
return b
};
return c(b[0]) + c(b[1]) + c(b[2]) + c(b[3]) + c(b[4]) + c(b[5]) + c(b[6]) + c(b[7])
}
return "xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, function(a) {
var b = 16 * Math.random() | 0;
return ("x" === a ? b : 3 & b | 8).toString(16)
})
}()
},
fa: function(a, b) {
var c = this
, d = this.k;
if (this.isSetup()) {
if (a = this.Z(a),
!this.k.allowDuplicates && this.da(a))
return void this.y("warn", "Raven dropped repeat event: ", a);
this.f = a.event_id || (a.event_id = this.ga()),
this.e = a,
this.y("debug", "Raven about to send:", a);
var e = {
sentry_version: "7",
sentry_client: "raven-js/" + this.VERSION,
sentry_key: this.h
};
this.F && (e.sentry_secret = this.F);
var f = a.exception && a.exception.values[0];
this.captureBreadcrumb({
category: "sentry",
message: f ? (f.type ? f.type + ": " : "") + f.value : a.message,
event_id: a.event_id,
level: a.level || "error"
});
var g = this.H;
(d.transport || this.ha).call(this, {
url: g,
auth: e,
data: a,
options: d,
onSuccess: function() {
c.x(),
c.R("success", {
data: a,
src: g
}),
b && b()
},
onError: function(d) {
c.y("error", "Raven transport failed to send: ", d),
d.request && c.ea(d.request),
c.R("failure", {
data: a,
src: g
}),
d = d || new Error("Raven send failed (no additional details provided)"),
b && b(d)
}
})
}
},
ha: function(a) {
var b = I.XMLHttpRequest && new I.XMLHttpRequest;
if (b && ("withCredentials"in b || "undefined" != typeof XDomainRequest)) {
var d = a.url;
"withCredentials"in b ? b.onreadystatechange = function() {
if (4 === b.readyState)
if (200 === b.status)
a.onSuccess && a.onSuccess();
else if (a.onError) {
var c = new Error("Sentry error code: " + b.status);
c.request = b,
a.onError(c)
}
}
: (b = new XDomainRequest,
d = d.replace(/^https?:/, ""),
a.onSuccess && (b.onload = a.onSuccess),
a.onError && (b.onerror = function() {
var c = new Error("Sentry error code: XDomainRequest");
c.request = b,
a.onError(c)
}
)),
b.open("POST", d + "?" + function(a) {
var b = [];
return k(a, function(a, c) {
b.push(encodeURIComponent(a) + "=" + encodeURIComponent(c))
}),
b.join("&")
}(a.auth)),
b.send(A(a.data))
}
},
y: function(a) {
this.p[a] && this.debug && Function.prototype.apply.call(this.p[a], this.o, [].slice.call(arguments, 1))
},
Q: function(a, b) {
g(b) ? delete this.j[a] : this.j[a] = l(this.j[a] || {}, b)
}
};
var L = Object.prototype;
f.prototype.setUser = f.prototype.setUserContext,
f.prototype.setReleaseContext = f.prototype.setRelease,
b.exports = f
}
).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
}
, {
1: 1,
2: 2,
5: 5,
6: 6,
7: 7
}],
4: [function(a, b, c) {
(function(c) {
var d = a(3)
, e = "undefined" != typeof window ? window : void 0 !== c ? c : "undefined" != typeof self ? self : {}
, f = e.Raven
, g = new d;
g.noConflict = function() {
return e.Raven = f,
g
}
,
g.afterLoad(),
b.exports = g
}
).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
}
, {
3: 3
}],
5: [function(a, b, c) {
b.exports = {
isObject: function(a) {
return "object" == typeof a && null !== a
},
isError: function(a) {
switch ({}.toString.call(a)) {
case "[object Error]":
case "[object Exception]":
case "[object DOMException]":
return !0;
default:
return a instanceof Error
}
},
wrappedCallback: function(a) {
return function(b, c) {
var d = a(b) || b;
return c && c(d) || d
}
}
}
}
, {}],
6: [function(a, b, c) {
(function(c) {
function d() {
return "undefined" == typeof document || null == document.location ? "" : document.location.href
}
var e = a(5)
, f = {
collectWindowErrors: !0,
debug: !1
}
, g = "undefined" != typeof window ? window : void 0 !== c ? c : "undefined" != typeof self ? self : {}
, h = [].slice
, i = "?"
, j = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/;
f.report = function() {
function k(a, b) {
var c = null;
if (!b || f.collectWindowErrors) {
for (var d in s)
if (s.hasOwnProperty(d))
try {
s[d].apply(null, [a].concat(h.call(arguments, 2)))
} catch (e) {
c = e
}
if (c)
throw c
}
}
function l(a, b, c, g, h) {
if (v)
f.computeStackTrace.augmentStackTraceWithInitialElement(v, b, c, a),
o();
else if (h && e.isError(h))
k(f.computeStackTrace(h), !0);
else {
var m, n = {
url: b,
line: c,
column: g
}, p = void 0, r = a;
if ("[object String]" === {}.toString.call(a))
(m = a.match(j)) && (p = m[1],
r = m[2]);
n.func = i,
k({
name: p,
message: r,
url: d(),
stack: [n]
}, !0)
}
return !!q && q.apply(this, arguments)
}
function o() {
var a = v
, b = t;
k.apply(u = v = t = null, [a, !1].concat(b))
}
function p(a, b) {
var c = h.call(arguments, 1);
if (v) {
if (u === a)
return;
o()
}
var d = f.computeStackTrace(a);
if (v = d,
u = a,
t = c,
setTimeout(function() {
u === a && o()
}, d.incomplete ? 2e3 : 0),
!1 !== b)
throw a
}
var q, r, s = [], t = null, u = null, v = null;
return p.subscribe = function(a) {
r || (q = g.onerror,
g.onerror = l,
r = !0),
s.push(a)
}
,
p.unsubscribe = function(a) {
for (var b = s.length - 1; 0 <= b; --b)
s[b] === a && s.splice(b, 1)
}
,
p.uninstall = function() {
r && (g.onerror = q,
r = !1,
q = void 0),
s = []
}
,
p
}(),
f.computeStackTrace = function() {
function a(a) {
if (void 0 !== a.stack && a.stack) {
for (var b, c, e, f = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i, g = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i, h = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i, j = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i, k = /\((\S*)(?::(\d+))(?::(\d+))\)/, l = a.stack.split("\n"), m = [], n = (/^(.*) is undefined$/.exec(a.message),
0), o = l.length; n < o; ++n) {
if (c = f.exec(l[n])) {
var p = c[2] && 0 === c[2].indexOf("native");
c[2] && 0 === c[2].indexOf("eval") && (b = k.exec(c[2])) && (c[2] = b[1],
c[3] = b[2],
c[4] = b[3]),
e = {
url: p ? null : c[2],
func: c[1] || i,
args: p ? [c[2]] : [],
line: c[3] ? +c[3] : null,
column: c[4] ? +c[4] : null
}
} else if (c = h.exec(l[n]))
e = {
url: c[2],
func: c[1] || i,
args: [],
line: +c[3],
column: c[4] ? +c[4] : null
};
else {
if (!(c = g.exec(l[n])))
continue;
c[3] && -1 < c[3].indexOf(" > eval") && (b = j.exec(c[3])) ? (c[3] = b[1],
c[4] = b[2],
c[5] = null) : 0 !== n || c[5] || void 0 === a.columnNumber || (m[0].column = a.columnNumber + 1),
e = {
url: c[3],
func: c[1] || i,
args: c[2] ? c[2].split(",") : [],
line: c[4] ? +c[4] : null,
column: c[5] ? +c[5] : null
}
}
!e.func && e.line && (e.func = i),
m.push(e)
}
return m.length ? {
name: a.name,
message: a.message,
url: d(),
stack: m
} : null
}
}
function b(a, b, c, d) {
var e = {
url: b,
line: c
};
if (e.url && e.line) {
if (a.incomplete = !1,
e.func || (e.func = i),
0 < a.stack.length && a.stack[0].url === e.url) {
if (a.stack[0].line === e.line)
return !1;
if (!a.stack[0].line && a.stack[0].func === e.func)
return a.stack[0].line = e.line,
!1
}
return a.stack.unshift(e),
a.partial = !0
}
return !(a.incomplete = !0)
}
function c(a, g) {
for (var h, j, k = /function\s+([_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*)?\s*\(/i, l = [], m = {}, n = !1, o = c.caller; o && !n; o = o.caller)
if (o !== e && o !== f.report) {
if (j = {
url: null,
func: i,
line: null,
column: null
},
o.name ? j.func = o.name : (h = k.exec(o.toString())) && (j.func = h[1]),
void 0 === j.func)
try {
j.func = h.input.substring(0, h.input.indexOf("{"))
} catch (p) {}
m["" + o] ? n = !0 : m["" + o] = !0,
l.push(j)
}
g && l.splice(0, g);
var q = {
name: a.name,
message: a.message,
url: d(),
stack: l
};
return b(q, a.sourceURL || a.fileName, a.line || a.lineNumber, a.message || a.description),
q
}
function e(b, e) {
var g = null;
e = null == e ? 0 : +e;
try {
if (g = a(b))
return g
} catch (h) {
if (f.debug)
throw h
}
try {
if (g = c(b, e + 1))
return g
} catch (h) {
if (f.debug)
throw h
}
return {
name: b.name,
message: b.message,
url: d()
}
}
return e.augmentStackTraceWithInitialElement = b,
e.computeStackTraceFromStackProp = a,
e
}(),
b.exports = f
}
).call(this, "undefined" != typeof global ? global : "undefined" != typeof self ? self : "undefined" != typeof window ? window : {})
}
, {
5: 5
}],
7: [function(a, b, c) {
function d(a, b) {
for (var c = 0; c < a.length; ++c)
if (a[c] === b)
return c;
return -1
}
function g(a, b) {
var c = []
, e = [];
return null == b && (b = function(a, b) {
return c[0] === b ? "[Circular ~]" : "[Circular ~." + e.slice(0, d(c, b)).join(".") + "]"
}
),
function(g, h) {
if (0 < c.length) {
var i = d(c, this);
~i ? c.splice(i + 1) : c.push(this),
~i ? e.splice(i, 1 / 0, g) : e.push(g),
~d(c, h) && (h = b.call(this, g, h))
} else
c.push(h);
return null == a ? h instanceof Error ? function(a) {
var b = {
stack: a.stack,
message: a.message,
name: a.name
};
for (var c in a)
Object.prototype.hasOwnProperty.call(a, c) && (b[c] = a[c]);
return b
}(h) : h : a.call(this, g, h)
}
}
(b.exports = function(a, b, c, d) {
return JSON.stringify(a, g(b, d), c)
}
).getSerialize = g
}
, {}]
}, {}, [4])(4)
}),
function(factory) {
"function" == typeof define && define.amd ? define(["jquery"], factory) : "object" == typeof exports ? factory(require("jquery")) : factory(jQuery)
}(function($) {
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
jqXHR.retry = function(opts) {
return opts.timeout && (this.timeout = opts.timeout),
opts.statusCodes && (this.statusCodes = opts.statusCodes),
this.pipe(null, function(jqXHR, opts) {
var times = opts.times
, timeout = jqXHR.timeout;
return function(input, status, msg) {
var ajaxOptions = this
, output = new $.Deferred
, retryAfter = jqXHR.getResponseHeader("Retry-After");
function nextRequest() {
$.ajax(ajaxOptions).retry({
times: times - 1,
timeout: opts.timeout,
statusCodes: opts.statusCodes
}).pipe(output.resolve, output.reject)
}
return 1 < times && (!jqXHR.statusCodes || -1 < $.inArray(input.status, jqXHR.statusCodes)) ? (retryAfter && (timeout = isNaN(retryAfter) ? new Date(retryAfter).getTime() - $.now() : 1e3 * parseInt(retryAfter, 10),
(isNaN(timeout) || timeout < 0) && (timeout = jqXHR.timeout)),
void 0 !== timeout ? setTimeout(nextRequest, timeout) : nextRequest()) : output.rejectWith(this, arguments),
output
}
}(this, opts))
}
})
}),
function(root, factory) {
var origin, modules = {}, _require = function(deps, callback) {
var args, len, i;
if ("string" == typeof deps)
return getModule(deps);
for (args = [],
len = deps.length,
i = 0; i < len; i++)
args.push(getModule(deps[i]));
return callback.apply(null, args)
}, _define = function(id, deps, factory) {
2 === arguments.length && (factory = deps,
deps = null),
_require(deps || [], function() {
setModule(id, factory, arguments)
})
}, setModule = function(id, factory, args) {
var returned, module = {
exports: factory
};
"function" == typeof factory && (args.length || (args = [_require, module.exports, module]),
void 0 !== (returned = factory.apply(null, args)) && (module.exports = returned)),
modules[id] = module.exports
}, getModule = function(id) {
var module = modules[id] || root[id];
if (!module)
throw new Error("`" + id + "` is undefined");
return module
}, makeExport = function(dollar) {
return root.__dollar = dollar,
function(obj) {
var key, host, parts, part, last, ucFirst;
for (key in ucFirst = function(str) {
return str && str.charAt(0).toUpperCase() + str.substr(1)
}
,
modules)
if (host = obj,
modules.hasOwnProperty(key)) {
for (last = ucFirst((parts = key.split("/")).pop()); part = ucFirst(parts.shift()); )
host[part] = host[part] || {},
host = host[part];
host[last] = modules[key]
}
return obj
}((window = root,
require = _require,
(define = _define)("dollar-third", [], function() {
var req = window.require
, $ = window.__dollar || window.jQuery || window.Zepto || req("jquery") || req("zepto");
if (!$)
throw new Error("jQuery or Zepto not found!");
return $
}),
define("dollar", ["dollar-third"], function(_) {
return _
}),
define("promise-third", ["dollar"], function($) {
return {
Deferred: $.Deferred,
when: $.when,
isPromise: function(anything) {
return anything && "function" == typeof anything.then
}
}
}),
define("promise", ["promise-third"], function(_) {
return _
}),
define("base", ["dollar", "promise"], function($, promise) {
var counter, fn, ua, ret, webkit, chrome, ie, firefox, safari, opera, noop = function() {}, call = Function.call;
function bindFn(fn, context) {
return function() {
return fn.apply(context, arguments)
}
}
return {
version: "0.1.8-alpha",
$: $,
Deferred: promise.Deferred,
isPromise: promise.isPromise,
when: promise.when,
browser: (ua = navigator.userAgent,
ret = {},
webkit = ua.match(/WebKit\/([\d.]+)/),
chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/),
ie = ua.match(/MSIE\s([\d\.]+)/) || ua.match(/(?:trident)(?:.*rv:([\w.]+))?/i),
firefox = ua.match(/Firefox\/([\d.]+)/),
safari = ua.match(/Safari\/([\d.]+)/),
opera = ua.match(/OPR\/([\d.]+)/),
webkit && (ret.webkit = parseFloat(webkit[1])),
chrome && (ret.chrome = parseFloat(chrome[1])),
ie && (ret.ie = parseFloat(ie[1])),
firefox && (ret.firefox = parseFloat(firefox[1])),
safari && (ret.safari = parseFloat(safari[1])),
opera && (ret.opera = parseFloat(opera[1])),
ret),
os: function(ua) {
var ret = {}
, android = ua.match(/(?:Android);?[\s\/]+([\d.]+)?/)
, ios = ua.match(/(?:iPad|iPod|iPhone).*OS\s([\d_]+)/);
return android && (ret.android = parseFloat(android[1])),
ios && (ret.ios = parseFloat(ios[1].replace(/_/g, "."))),
ret
}(navigator.userAgent),
inherits: function(Super, protos, staticProtos) {
var child, proto, f;
return "function" == typeof protos ? (child = protos,
protos = null) : child = protos && protos.hasOwnProperty("constructor") ? protos.constructor : function() {
return Super.apply(this, arguments)
}
,
$.extend(!0, child, Super, staticProtos || {}),
child.__super__ = Super.prototype,
child.prototype = (proto = Super.prototype,
Object.create ? Object.create(proto) : ((f = function() {}
).prototype = proto,
new f)),
protos && $.extend(!0, child.prototype, protos),
child
},
noop: noop,
bindFn: bindFn,
log: window.console ? bindFn(console.log, console) : noop,
nextTick: function(cb) {
setTimeout(cb, 1)
},
slice: (fn = [].slice,
function() {
return call.apply(fn, arguments)
}
),
guid: (counter = 0,
function(prefix) {
for (var guid = (+new Date).toString(32), i = 0; i < 5; i++)
guid += Math.floor(65535 * Math.random()).toString(32);
return (prefix || "wu_") + guid + (counter++).toString(32)
}
),
formatSize: function(size, pointLength, units) {
var unit;
for (units = units || ["B", "K", "M", "G", "TB"]; (unit = units.shift()) && 1024 < size; )
size /= 1024;
return ("B" === unit ? size : size.toFixed(pointLength || 2)) + unit
}
}
}),
define("mediator", ["base"], function(Base) {
var protos, $ = Base.$, slice = [].slice, separator = /\s+/;
function findHandlers(arr, name, callback, context) {
return $.grep(arr, function(handler) {
return handler && (!name || handler.e === name) && (!callback || handler.cb === callback || handler.cb._cb === callback) && (!context || handler.ctx === context)
})
}
function eachEvent(events, callback, iterator) {
$.each((events || "").split(separator), function(_, key) {
iterator(key, callback)
})
}
function triggerHanders(events, args) {
for (var handler, stoped = !1, i = -1, len = events.length; ++i < len; )
if (!1 === (handler = events[i]).cb.apply(handler.ctx2, args)) {
stoped = !0;
break
}
return !stoped
}
return protos = {
on: function(name, callback, context) {
var set, me = this;
return callback && (set = this._events || (this._events = []),
eachEvent(name, callback, function(name, callback) {
var handler = {
e: name
};
handler.cb = callback,
handler.ctx = context,
handler.ctx2 = context || me,
handler.id = set.length,
set.push(handler)
})),
this
},
once: function(name, callback, context) {
var me = this;
return callback && eachEvent(name, callback, function(name, callback) {
var once = function() {
return me.off(name, once),
callback.apply(context || me, arguments)
};
once._cb = callback,
me.on(name, once, context)
}),
me
},
off: function(name, cb, ctx) {
var events = this._events;
return events && (name || cb || ctx ? eachEvent(name, cb, function(name, cb) {
$.each(findHandlers(events, name, cb, ctx), function() {
delete events[this.id]
})
}) : this._events = []),
this
},
trigger: function(type) {
var args, events, allEvents;
return this._events && type ? (args = slice.call(arguments, 1),
events = findHandlers(this._events, type),
allEvents = findHandlers(this._events, "all"),
triggerHanders(events, args) && triggerHanders(allEvents, arguments)) : this
}
},
$.extend({
installTo: function(obj) {
return $.extend(obj, protos)
}
}, protos)
}),
define("uploader", ["base", "mediator"], function(Base, Mediator) {
var $ = Base.$;
function Uploader(opts) {
this.options = $.extend(!0, {}, Uploader.options, opts),
this._init(this.options)
}
return Uploader.options = {},
Mediator.installTo(Uploader.prototype),
$.each({
upload: "start-upload",
stop: "stop-upload",
getFile: "get-file",
getFiles: "get-files",
addFile: "add-file",
addFiles: "add-file",
sort: "sort-files",
removeFile: "remove-file",
cancelFile: "cancel-file",
skipFile: "skip-file",
retry: "retry",
isInProgress: "is-in-progress",
makeThumb: "make-thumb",
md5File: "md5-file",
getDimension: "get-dimension",
addButton: "add-btn",
predictRuntimeType: "predict-runtime-type",
refresh: "refresh",
disable: "disable",
enable: "enable",
reset: "reset"
}, function(fn, command) {
Uploader.prototype[fn] = function() {
return this.request(command, arguments)
}
}),
$.extend(Uploader.prototype, {
state: "pending",
_init: function(opts) {
var me = this;
me.request("init", opts, function() {
me.state = "ready",
me.trigger("ready")
})
},
option: function(key, val) {
var opts = this.options;
if (!(1 < arguments.length))
return key ? opts[key] : opts;
$.isPlainObject(val) && $.isPlainObject(opts[key]) ? $.extend(opts[key], val) : opts[key] = val
},
getStats: function() {
var stats = this.request("get-stats");
return stats ? {
successNum: stats.numOfSuccess,
progressNum: stats.numOfProgress,
cancelNum: stats.numOfCancel,
invalidNum: stats.numOfInvalid,
uploadFailNum: stats.numOfUploadFailed,
queueNum: stats.numOfQueue,
interruptNum: stats.numofInterrupt
} : {}
},
trigger: function(type) {
var args = [].slice.call(arguments, 1)
, opts = this.options
, name = "on" + type.substring(0, 1).toUpperCase() + type.substring(1);
return !(!1 === Mediator.trigger.apply(this, arguments) || $.isFunction(opts[name]) && !1 === opts[name].apply(this, args) || $.isFunction(this[name]) && !1 === this[name].apply(this, args) || !1 === Mediator.trigger.apply(Mediator, [this, type].concat(args)))
},
destroy: function() {
this.request("destroy", arguments),
this.off()
},
request: Base.noop
}),
Base.create = Uploader.create = function(opts) {
return new Uploader(opts)
}
,
Base.Uploader = Uploader
}),
define("runtime/runtime", ["base", "mediator"], function(Base, Mediator) {
var $ = Base.$
, factories = {}
, getFirstKey = function(obj) {
for (var key in obj)
if (obj.hasOwnProperty(key))
return key;
return null
};
function Runtime(options) {
this.options = $.extend({
container: document.body
}, options),
this.uid = Base.guid("rt_")
}
return $.extend(Runtime.prototype, {
getContainer: function() {
var parent, container, opts = this.options;
return this._container ? this._container : (parent = $(opts.container || document.body),
(container = $(document.createElement("div"))).attr("id", "rt_" + this.uid),
container.css({
position: "absolute",
top: "0px",
left: "0px",
width: "1px",
height: "1px",
overflow: "hidden"
}),
parent.append(container),
parent.addClass("webuploader-container"),
this._container = container,
this._parent = parent,
container)
},
init: Base.noop,
exec: Base.noop,
destroy: function() {
this._container && this._container.remove(),
this._parent && this._parent.removeClass("webuploader-container"),
this.off()
}
}),
Runtime.orders = "html5,flash",
Runtime.addRuntime = function(type, factory) {
factories[type] = factory
}
,
Runtime.hasRuntime = function(type) {
return !!(type ? factories[type] : getFirstKey(factories))
}
,
Runtime.create = function(opts, orders) {
var type;
if (orders = orders || Runtime.orders,
$.each(orders.split(/\s*,\s*/g), function() {
if (factories[this])
return type = this,
!1
}),
!(type = type || getFirstKey(factories)))
throw new Error("Runtime Error");
return new factories[type](opts)
}
,
Mediator.installTo(Runtime.prototype),
Runtime
}),
define("runtime/client", ["base", "mediator", "runtime/runtime"], function(Base, Mediator, Runtime) {
var cache, obj;
function RuntimeClient(component, standalone) {
var runtime, destroy, deferred = Base.Deferred();
this.uid = Base.guid("client_"),
this.runtimeReady = function(cb) {
return deferred.done(cb)
}
,
this.connectRuntime = function(opts, cb) {
if (runtime)
throw new Error("already connected!");
return deferred.done(cb),
"string" == typeof opts && cache.get(opts) && (runtime = cache.get(opts)),
(runtime = runtime || cache.get(null, standalone)) ? (Base.$.extend(runtime.options, opts),
runtime.__promise.then(deferred.resolve),
runtime.__client++) : ((runtime = Runtime.create(opts, opts.runtimeOrder)).__promise = deferred.promise(),
runtime.once("ready", deferred.resolve),
runtime.init(),
cache.add(runtime),
runtime.__client = 1),
standalone && (runtime.__standalone = standalone),
runtime
}
,
this.getRuntime = function() {
return runtime
}
,
this.disconnectRuntime = function() {
runtime && (runtime.__client--,
runtime.__client <= 0 && (cache.remove(runtime),
delete runtime.__promise,
runtime.destroy()),
runtime = null)
}
,
this.exec = function() {
if (runtime) {
var args = Base.slice(arguments);
return component && args.unshift(component),
runtime.exec.apply(this, args)
}
}
,
this.getRuid = function() {
return runtime && runtime.uid
}
,
this.destroy = (destroy = this.destroy,
function() {
destroy && destroy.apply(this, arguments),
this.trigger("destroy"),
this.off(),
this.exec("destroy"),
this.disconnectRuntime()
}
)
}
return obj = {},
cache = {
add: function(runtime) {
obj[runtime.uid] = runtime
},
get: function(ruid, standalone) {
var i;
if (ruid)
return obj[ruid];
for (i in obj)
if (!standalone || !obj[i].__standalone)
return obj[i];
return null
},
remove: function(runtime) {
delete obj[runtime.uid]
}
},
Mediator.installTo(RuntimeClient.prototype),
RuntimeClient
}),
define("lib/dnd", ["base", "mediator", "runtime/client"], function(Base, Mediator, RuntimeClent) {
var $ = Base.$;
function DragAndDrop(opts) {
(opts = this.options = $.extend({}, DragAndDrop.options, opts)).container = $(opts.container),
opts.container.length && RuntimeClent.call(this, "DragAndDrop")
}
return DragAndDrop.options = {
accept: null,
disableGlobalDnd: !1
},
Base.inherits(RuntimeClent, {
constructor: DragAndDrop,
init: function() {
var me = this;
me.connectRuntime(me.options, function() {
me.exec("init"),
me.trigger("ready")
})
}
}),
Mediator.installTo(DragAndDrop.prototype),
DragAndDrop
}),
define("widgets/widget", ["base", "uploader"], function(Base, Uploader) {
var $ = Base.$
, _init = Uploader.prototype._init
, _destroy = Uploader.prototype.destroy
, IGNORE = {}
, widgetClass = [];
function Widget(uploader) {
this.owner = uploader,
this.options = uploader.options
}
return $.extend(Widget.prototype, {
init: Base.noop,
invoke: function(apiName, args) {
var map = this.responseMap;
return map && apiName in map && map[apiName]in this && $.isFunction(this[map[apiName]]) ? this[map[apiName]].apply(this, args) : IGNORE
},
request: function() {
return this.owner.request.apply(this.owner, arguments)
}
}),
$.extend(Uploader.prototype, {
_init: function() {
var me = this
, widgets = me._widgets = []
, deactives = me.options.disableWidgets || "";
return $.each(widgetClass, function(_, klass) {
(!deactives || !~deactives.indexOf(klass._name)) && widgets.push(new klass(me))
}),
_init.apply(me, arguments)
},
request: function(apiName, args, callback) {
var rlt, promise, key, i = 0, widgets = this._widgets, len = widgets && widgets.length, rlts = [], dfds = [];
for (args = function(obj) {
if (!obj)
return !1;
var length = obj.length
, type = $.type(obj);
return !(1 !== obj.nodeType || !length) || "array" === type || "function" !== type && "string" !== type && (0 === length || "number" == typeof length && 0 < length && length - 1 in obj)
}(args) ? args : [args]; i < len; i++)
(rlt = widgets[i].invoke(apiName, args)) !== IGNORE && (Base.isPromise(rlt) ? dfds.push(rlt) : rlts.push(rlt));
return callback || dfds.length ? (promise = Base.when.apply(Base, dfds))[key = promise.pipe ? "pipe" : "then"](function() {
var deferred = Base.Deferred()
, args = arguments;
return 1 === args.length && (args = args[0]),
setTimeout(function() {
deferred.resolve(args)
}, 1),
deferred.promise()
})[callback ? key : "done"](callback || Base.noop) : rlts[0]
},
destroy: function() {
_destroy.apply(this, arguments),
this._widgets = null
}
}),
Uploader.register = Widget.register = function(responseMap, widgetProto) {
var klass, map = {
init: "init",
destroy: "destroy",
name: "anonymous"
};
return 1 === arguments.length ? (widgetProto = responseMap,
$.each(widgetProto, function(key) {
"_" !== key[0] && "name" !== key ? map[key.replace(/[A-Z]/g, "-$&").toLowerCase()] = key : "name" === key && (map.name = widgetProto.name)
})) : map = $.extend(map, responseMap),
widgetProto.responseMap = map,
(klass = Base.inherits(Widget, widgetProto))._name = map.name,
widgetClass.push(klass),
klass
}
,
Uploader.unRegister = Widget.unRegister = function(name) {
if (name && "anonymous" !== name)
for (var i = widgetClass.length; i--; )
widgetClass[i]._name === name && widgetClass.splice(i, 1)
}
,
Widget
}),
define("widgets/filednd", ["base", "uploader", "lib/dnd", "widgets/widget"], function(Base, Uploader, Dnd) {
var $ = Base.$;
return Uploader.options.dnd = "",
Uploader.register({
name: "dnd",
init: function(opts) {
if (opts.dnd && "html5" === this.request("predict-runtime-type")) {
var dnd, me = this, deferred = Base.Deferred(), options = $.extend({}, {
disableGlobalDnd: opts.disableGlobalDnd,
container: opts.dnd,
accept: opts.accept
});
return this.dnd = dnd = new Dnd(options),
dnd.once("ready", deferred.resolve),
dnd.on("drop", function(files) {
me.request("add-file", [files])
}),
dnd.on("accept", function(items) {
return me.owner.trigger("dndAccept", items)
}),
dnd.init(),
deferred.promise()
}
},
destroy: function() {
this.dnd && this.dnd.destroy()
}
})
}),
define("lib/filepaste", ["base", "mediator", "runtime/client"], function(Base, Mediator, RuntimeClent) {
var $ = Base.$;
function FilePaste(opts) {
(opts = this.options = $.extend({}, opts)).container = $(opts.container || document.body),
RuntimeClent.call(this, "FilePaste")
}
return Base.inherits(RuntimeClent, {
constructor: FilePaste,
init: function() {
var me = this;
me.connectRuntime(me.options, function() {
me.exec("init"),
me.trigger("ready")
})
}
}),
Mediator.installTo(FilePaste.prototype),
FilePaste
}),
define("widgets/filepaste", ["base", "uploader", "lib/filepaste", "widgets/widget"], function(Base, Uploader, FilePaste) {
var $ = Base.$;
return Uploader.register({
name: "paste",
init: function(opts) {
if (opts.paste && "html5" === this.request("predict-runtime-type")) {
var paste, me = this, deferred = Base.Deferred(), options = $.extend({}, {
container: opts.paste,
accept: opts.accept
});
return this.paste = paste = new FilePaste(options),
paste.once("ready", deferred.resolve),
paste.on("paste", function(files) {
me.owner.request("add-file", [files])
}),
paste.init(),
deferred.promise()
}
},
destroy: function() {
this.paste && this.paste.destroy()
}
})
}),
define("lib/blob", ["base", "runtime/client"], function(Base, RuntimeClient) {
function Blob(ruid, source) {
this.source = source,
this.ruid = ruid,
this.size = source.size || 0,
!source.type && this.ext && ~"jpg,jpeg,png,gif,bmp".indexOf(this.ext) ? this.type = "image/" + ("jpg" === this.ext ? "jpeg" : this.ext) : this.type = source.type || "application/octet-stream",
RuntimeClient.call(this, "Blob"),
this.uid = source.uid || this.uid,
ruid && this.connectRuntime(ruid)
}
return Base.inherits(RuntimeClient, {
constructor: Blob,
slice: function(start, end) {
return this.exec("slice", start, end)
},
getSource: function() {
return this.source
}
}),
Blob
}),
define("lib/file", ["base", "lib/blob"], function(Base, Blob) {
var uid = 1
, rExt = /\.([^.]+)$/;
return Base.inherits(Blob, function(ruid, file) {
var ext;
this.name = file.name || "untitled" + uid++,
!(ext = rExt.exec(file.name) ? RegExp.$1.toLowerCase() : "") && file.type && (ext = /\/(jpg|jpeg|png|gif|bmp)$/i.exec(file.type) ? RegExp.$1.toLowerCase() : "",
this.name += "." + ext),
this.ext = ext,
this.lastModifiedDate = file.lastModifiedDate || (new Date).toLocaleString(),
Blob.apply(this, arguments)
})
}),
define("lib/filepicker", ["base", "runtime/client", "lib/file"], function(Base, RuntimeClient, File) {
var $ = Base.$;
function FilePicker(opts) {
if ((opts = this.options = $.extend({}, FilePicker.options, opts)).container = $(opts.id),
!opts.container.length)
throw new Error("按钮指定错误");
opts.innerHTML = opts.innerHTML || opts.label || opts.container.html() || "",
opts.button = $(opts.button || document.createElement("div")),
opts.button.html(opts.innerHTML),
opts.container.html(opts.button),
RuntimeClient.call(this, "FilePicker", !0)
}
return FilePicker.options = {
button: null,
container: null,
label: null,
innerHTML: null,
multiple: !0,
accept: null,
name: "file",
style: "webuploader-pick"
},
Base.inherits(RuntimeClient, {
constructor: FilePicker,
init: function() {
var me = this
, opts = me.options
, button = opts.button
, style = opts.style;
style && button.addClass("webuploader-pick"),
me.on("all", function(type) {
var files;
switch (type) {
case "mouseenter":
style && button.addClass("webuploader-pick-hover");
break;
case "mouseleave":
style && button.removeClass("webuploader-pick-hover");
break;
case "change":
files = me.exec("getFiles"),
me.trigger("select", $.map(files, function(file) {
return (file = new File(me.getRuid(),file))._refer = opts.container,
file
}), opts.container)
}
}),
me.connectRuntime(opts, function() {
me.refresh(),
me.exec("init", opts),
me.trigger("ready")
}),
this._resizeHandler = Base.bindFn(this.refresh, this),
$(window).on("resize", this._resizeHandler)
},
refresh: function() {
var shimContainer = this.getRuntime().getContainer()
, button = this.options.button
, width = button.outerWidth ? button.outerWidth() : button.width()
, height = button.outerHeight ? button.outerHeight() : button.height()
, pos = button.offset();
width && height && shimContainer.css({
bottom: "auto",
right: "auto",
width: width + "px",
height: height + "px"
}).offset(pos)
},
enable: function() {
this.options.button.removeClass("webuploader-pick-disable"),
this.refresh()
},
disable: function() {
var btn = this.options.button;
this.getRuntime().getContainer().css({
top: "-99999px"
}),
btn.addClass("webuploader-pick-disable")
},
destroy: function() {
var btn = this.options.button;
$(window).off("resize", this._resizeHandler),
btn.removeClass("webuploader-pick-disable webuploader-pick-hover webuploader-pick")
}
}),
FilePicker
}),
define("widgets/filepicker", ["base", "uploader", "lib/filepicker", "widgets/widget"], function(Base, Uploader, FilePicker) {
var $ = Base.$;
return $.extend(Uploader.options, {
pick: null,
accept: null
}),
Uploader.register({
name: "picker",
init: function(opts) {
return this.pickers = [],
opts.pick && this.addBtn(opts.pick)
},
refresh: function() {
$.each(this.pickers, function() {
this.refresh()
})
},
addBtn: function(pick) {
var me = this
, opts = me.options
, accept = opts.accept
, promises = [];
if (pick)
return $.isPlainObject(pick) || (pick = {
id: pick
}),
$(pick.id).each(function() {
var options, picker, deferred;
deferred = Base.Deferred(),
options = $.extend({}, pick, {
accept: $.isPlainObject(accept) ? [accept] : accept,
swf: opts.swf,
runtimeOrder: opts.runtimeOrder,
id: this
}),
(picker = new FilePicker(options)).once("ready", deferred.resolve),
picker.on("select", function(files) {
me.owner.request("add-file", [files])
}),
picker.on("dialogopen", function() {
me.owner.trigger("dialogOpen", picker.button)
}),
picker.init(),
me.pickers.push(picker),
promises.push(deferred.promise())
}),
Base.when.apply(Base, promises)
},
disable: function() {
$.each(this.pickers, function() {
this.disable()
})
},
enable: function() {
$.each(this.pickers, function() {
this.enable()
})
},
destroy: function() {
$.each(this.pickers, function() {
this.destroy()
}),
this.pickers = null
}
})
}),
define("lib/image", ["base", "runtime/client", "lib/blob"], function(Base, RuntimeClient, Blob) {
var $ = Base.$;
function Image(opts) {
this.options = $.extend({}, Image.options, opts),
RuntimeClient.call(this, "Image"),
this.on("load", function() {
this._info = this.exec("info"),
this._meta = this.exec("meta")
})
}
return Image.options = {
quality: 90,
crop: !1,
preserveHeaders: !1,
allowMagnify: !1
},
Base.inherits(RuntimeClient, {
constructor: Image,
info: function(val) {
return val ? (this._info = val,
this) : this._info
},
meta: function(val) {
return val ? (this._meta = val,
this) : this._meta
},
loadFromBlob: function(blob) {
var me = this
, ruid = blob.getRuid();
this.connectRuntime(ruid, function() {
me.exec("init", me.options),
me.exec("loadFromBlob", blob)
})
},
resize: function() {
var args = Base.slice(arguments);
return this.exec.apply(this, ["resize"].concat(args))
},
crop: function() {
var args = Base.slice(arguments);
return this.exec.apply(this, ["crop"].concat(args))
},
getAsDataUrl: function(type) {
return this.exec("getAsDataUrl", type)
},
getAsBlob: function(type) {
var blob = this.exec("getAsBlob", type);
return new Blob(this.getRuid(),blob)
}
}),
Image
}),
define("widgets/image", ["base", "uploader", "lib/image", "widgets/widget"], function(Base, Uploader, Image) {
var throttle, occupied, waiting, tick, $ = Base.$;
return occupied = 0,
waiting = [],
tick = function() {
for (var item; waiting.length && occupied < 5242880; )
item = waiting.shift(),
occupied += item[0],
item[1]()
}
,
throttle = function(emiter, size, cb) {
waiting.push([size, cb]),
emiter.once("destroy", function() {
occupied -= size,
setTimeout(tick, 1)
}),
setTimeout(tick, 1)
}
,
$.extend(Uploader.options, {
thumb: {
width: 110,
height: 110,
quality: 70,
allowMagnify: !0,
crop: !0,
preserveHeaders: !1,
type: "image/jpeg"
},
compress: {
width: 1600,
height: 1600,
quality: 90,
allowMagnify: !1,
crop: !1,
preserveHeaders: !0
}
}),
Uploader.register({
name: "image",
makeThumb: function(file, cb, width, height) {
var opts, image;
(file = this.request("get-file", file)).type.match(/^image/) ? (opts = $.extend({}, this.options.thumb),
$.isPlainObject(width) && (opts = $.extend(opts, width),
width = null),
width = width || opts.width,
height = height || opts.height,
(image = new Image(opts)).once("load", function() {
file._info = file._info || image.info(),
file._meta = file._meta || image.meta(),
width <= 1 && 0 < width && (width = file._info.width * width),
height <= 1 && 0 < height && (height = file._info.height * height),
image.resize(width, height)
}),
image.once("complete", function() {
cb(!1, image.getAsDataUrl(opts.type)),
image.destroy()
}),
image.once("error", function(reason) {
cb(reason || !0),
image.destroy()
}),
throttle(image, file.source.size, function() {
file._info && image.info(file._info),
file._meta && image.meta(file._meta),
image.loadFromBlob(file.source)
})) : cb(!0)
},
beforeSendFile: function(file) {
var image, deferred, opts = this.options.compress || this.options.resize, compressSize = opts && opts.compressSize || 0, noCompressIfLarger = opts && opts.noCompressIfLarger || !1;
if (file = this.request("get-file", file),
opts && ~"image/jpeg,image/jpg".indexOf(file.type) && !(file.size < compressSize) && !file._compressed)
return opts = $.extend({}, opts),
deferred = Base.Deferred(),
image = new Image(opts),
deferred.always(function() {
image.destroy(),
image = null
}),
image.once("error", deferred.reject),
image.once("load", function() {
var width = opts.width
, height = opts.height;
file._info = file._info || image.info(),
file._meta = file._meta || image.meta(),
width <= 1 && 0 < width && (width = file._info.width * width),
height <= 1 && 0 < height && (height = file._info.height * height),
image.resize(width, height)
}),
image.once("complete", function() {
var blob, size;
try {
blob = image.getAsBlob(opts.type),
size = file.size,
(!noCompressIfLarger || blob.size < size) && (file.source = blob,
file.size = blob.size,
file.trigger("resize", blob.size, size)),
file._compressed = !0,
deferred.resolve()
} catch (e) {
deferred.resolve()
}
}),
file._info && image.info(file._info),
file._meta && image.meta(file._meta),
image.loadFromBlob(file.source),
deferred.promise()
}
})
}),
define("file", ["base", "mediator"], function(Base, Mediator) {
var $ = Base.$
, idPrefix = "WU_FILE_"
, idSuffix = 0
, rExt = /\.([^.]+)$/
, statusMap = {};
function WUFile(source) {
this.name = source.name || "Untitled",
this.size = source.size || 0,
this.type = source.type || "application/octet-stream",
this.lastModifiedDate = source.lastModifiedDate || 1 * new Date,
this.id = idPrefix + idSuffix++,
this.ext = rExt.exec(this.name) ? RegExp.$1 : "",
this.statusText = "",
statusMap[this.id] = WUFile.Status.INITED,
this.source = source,
this.loaded = 0,
this.on("error", function(msg) {
this.setStatus(WUFile.Status.ERROR, msg)
})
}
return $.extend(WUFile.prototype, {
setStatus: function(status, text) {
var prevStatus = statusMap[this.id];
void 0 !== text && (this.statusText = text),
status !== prevStatus && (statusMap[this.id] = status,
this.trigger("statuschange", status, prevStatus))
},
getStatus: function() {
return statusMap[this.id]
},
getSource: function() {
return this.source
},
destroy: function() {
this.off(),
delete statusMap[this.id]
}
}),
Mediator.installTo(WUFile.prototype),
WUFile.Status = {
INITED: "inited",
QUEUED: "queued",
PROGRESS: "progress",
ERROR: "error",
COMPLETE: "complete",
CANCELLED: "cancelled",
INTERRUPT: "interrupt",
INVALID: "invalid"
},
WUFile
}),
define("queue", ["base", "mediator", "file"], function(Base, Mediator, WUFile) {
var $ = Base.$
, STATUS = WUFile.Status;
function Queue() {
this.stats = {
numOfQueue: 0,
numOfSuccess: 0,
numOfCancel: 0,
numOfProgress: 0,
numOfUploadFailed: 0,
numOfInvalid: 0,
numofDeleted: 0,
numofInterrupt: 0
},
this._queue = [],
this._map = {}
}
return $.extend(Queue.prototype, {
append: function(file) {
return this._queue.push(file),
this._fileAdded(file),
this
},
prepend: function(file) {
return this._queue.unshift(file),
this._fileAdded(file),
this
},
getFile: function(fileId) {
return "string" != typeof fileId ? fileId : this._map[fileId]
},
fetch: function(status) {
var i, file, len = this._queue.length;
for (status = status || STATUS.QUEUED,
i = 0; i < len; i++)
if (status === (file = this._queue[i]).getStatus())
return file;
return null
},
sort: function(fn) {
"function" == typeof fn && this._queue.sort(fn)
},
getFiles: function() {
for (var file, sts = [].slice.call(arguments, 0), ret = [], i = 0, len = this._queue.length; i < len; i++)
file = this._queue[i],
sts.length && !~$.inArray(file.getStatus(), sts) || ret.push(file);
return ret
},
removeFile: function(file) {
this._map[file.id] && (delete this._map[file.id],
this._delFile(file),
file.destroy(),
this.stats.numofDeleted++)
},
_fileAdded: function(file) {
var me = this;
this._map[file.id] || (this._map[file.id] = file).on("statuschange", function(cur, pre) {
me._onFileStatusChange(cur, pre)
})
},
_delFile: function(file) {
for (var i = this._queue.length - 1; 0 <= i; i--)
if (this._queue[i] == file) {
this._queue.splice(i, 1);
break
}
},
_onFileStatusChange: function(curStatus, preStatus) {
var stats = this.stats;
switch (preStatus) {
case STATUS.PROGRESS:
stats.numOfProgress--;
break;
case STATUS.QUEUED:
stats.numOfQueue--;
break;
case STATUS.ERROR:
stats.numOfUploadFailed--;
break;
case STATUS.INVALID:
stats.numOfInvalid--;
break;
case STATUS.INTERRUPT:
stats.numofInterrupt--
}
switch (curStatus) {
case STATUS.QUEUED:
stats.numOfQueue++;
break;
case STATUS.PROGRESS:
stats.numOfProgress++;
break;
case STATUS.ERROR:
stats.numOfUploadFailed++;
break;
case STATUS.COMPLETE:
stats.numOfSuccess++;
break;
case STATUS.CANCELLED:
stats.numOfCancel++;
break;
case STATUS.INVALID:
stats.numOfInvalid++;
break;
case STATUS.INTERRUPT:
stats.numofInterrupt++
}
}
}),
Mediator.installTo(Queue.prototype),
Queue
}),
define("widgets/queue", ["base", "uploader", "queue", "file", "lib/file", "runtime/client", "widgets/widget"], function(Base, Uploader, Queue, WUFile, File, RuntimeClient) {
var $ = Base.$
, rExt = /\.\w+$/
, Status = WUFile.Status;
return Uploader.register({
name: "queue",
init: function(opts) {
var deferred, len, i, item, arr, accept, runtime, me = this;
if ($.isPlainObject(opts.accept) && (opts.accept = [opts.accept]),
opts.accept) {
for (arr = [],
i = 0,
len = opts.accept.length; i < len; i++)
(item = opts.accept[i].extensions) && arr.push(item);
arr.length && (accept = "\\." + arr.join(",").replace(/,/g, "$|\\.").replace(/\*/g, ".*") + "$"),
me.accept = new RegExp(accept,"i")
}
if (me.queue = new Queue,
me.stats = me.queue.stats,
"html5" === this.request("predict-runtime-type"))
return deferred = Base.Deferred(),
this.placeholder = runtime = new RuntimeClient("Placeholder"),
runtime.connectRuntime({
runtimeOrder: "html5"
}, function() {
me._ruid = runtime.getRuid(),
deferred.resolve()
}),
deferred.promise()
},
_wrapFile: function(file) {
if (!(file instanceof WUFile)) {
if (!(file instanceof File)) {
if (!this._ruid)
throw new Error("Can't add external files.");
file = new File(this._ruid,file)
}
file = new WUFile(file)
}
return file
},
acceptFile: function(file) {
return !(!file || !file.size || this.accept && rExt.exec(file.name) && !this.accept.test(file.name))
},
_addFile: function(file) {
var me = this;
if (file = me._wrapFile(file),
me.owner.trigger("beforeFileQueued", file)) {
if (me.acceptFile(file))
return me.queue.append(file),
me.owner.trigger("fileQueued", file),
file;
me.owner.trigger("error", "Q_TYPE_DENIED", file)
}
},
getFile: function(fileId) {
return this.queue.getFile(fileId)
},
addFile: function(files) {
var me = this;
files.length || (files = [files]),
(files = $.map(files, function(file) {
return me._addFile(file)
})).length && (me.owner.trigger("filesQueued", files),
me.options.auto && setTimeout(function() {
me.request("start-upload")
}, 20))
},
getStats: function() {
return this.stats
},
removeFile: function(file, remove) {
file = file.id ? file : this.queue.getFile(file),
this.request("cancel-file", file),
remove && this.queue.removeFile(file)
},
getFiles: function() {
return this.queue.getFiles.apply(this.queue, arguments)
},
fetchFile: function() {
return this.queue.fetch.apply(this.queue, arguments)
},
retry: function(file, noForceStart) {
var files, i, len;
if (file)
return (file = file.id ? file : this.queue.getFile(file)).setStatus(Status.QUEUED),
void (noForceStart || this.request("start-upload"));
for (i = 0,
len = (files = this.queue.getFiles(Status.ERROR)).length; i < len; i++)
(file = files[i]).setStatus(Status.QUEUED);
this.request("start-upload")
},
sortFiles: function() {
return this.queue.sort.apply(this.queue, arguments)
},
reset: function() {
this.owner.trigger("reset"),
this.queue = new Queue,
this.stats = this.queue.stats
},
destroy: function() {
this.reset(),
this.placeholder && this.placeholder.destroy()
}
})
}),
define("widgets/runtime", ["uploader", "runtime/runtime", "widgets/widget"], function(Uploader, Runtime) {
return Uploader.support = function() {
return Runtime.hasRuntime.apply(Runtime, arguments)
}
,
Uploader.register({
name: "runtime",
init: function() {
if (!this.predictRuntimeType())
throw Error("Runtime Error")
},
predictRuntimeType: function() {
var i, len, orders = this.options.runtimeOrder || Runtime.orders, type = this.type;
if (!type)
for (i = 0,
len = (orders = orders.split(/\s*,\s*/g)).length; i < len; i++)
if (Runtime.hasRuntime(orders[i])) {
this.type = type = orders[i];
break
}
return type
}
})
}),
define("lib/transport", ["base", "runtime/client", "mediator"], function(Base, RuntimeClient, Mediator) {
var $ = Base.$;
function Transport(opts) {
var me = this;
opts = me.options = $.extend(!0, {}, Transport.options, opts || {}),
RuntimeClient.call(this, "Transport"),
this._blob = null,
this._formData = opts.formData || {},
this._headers = opts.headers || {},
this.on("progress", this._timeout),
this.on("load error", function() {
me.trigger("progress", 1),
clearTimeout(me._timer)
})
}
return Transport.options = {
server: "",
method: "POST",
withCredentials: !1,
fileVal: "file",
timeout: 12e4,
formData: {},
headers: {},
sendAsBinary: !1
},
$.extend(Transport.prototype, {
appendBlob: function(key, blob, filename) {
var me = this
, opts = me.options;
me.getRuid() && me.disconnectRuntime(),
me.connectRuntime(blob.ruid, function() {
me.exec("init")
}),
me._blob = blob,
opts.fileVal = key || opts.fileVal,
opts.filename = filename || opts.filename
},
append: function(key, value) {
"object" == typeof key ? $.extend(this._formData, key) : this._formData[key] = value
},
setRequestHeader: function(key, value) {
"object" == typeof key ? $.extend(this._headers, key) : this._headers[key] = value
},
send: function(method) {
this.exec("send", method),
this._timeout()
},
abort: function() {
return clearTimeout(this._timer),
this.exec("abort")
},
destroy: function() {
this.trigger("destroy"),
this.off(),
this.exec("destroy"),
this.disconnectRuntime()
},
getResponseHeaders: function() {
return this.exec("getResponseHeaders")
},
getResponse: function() {
return this.exec("getResponse")
},
getResponseAsJson: function() {
return this.exec("getResponseAsJson")
},
getStatus: function() {
return this.exec("getStatus")
},
_timeout: function() {
var me = this
, duration = me.options.timeout;
duration && (clearTimeout(me._timer),
me._timer = setTimeout(function() {
me.abort(),
me.trigger("error", "timeout")
}, duration))
}
}),
Mediator.installTo(Transport.prototype),
Transport
}),
define("widgets/upload", ["base", "uploader", "file", "lib/transport", "widgets/widget"], function(Base, Uploader, WUFile, Transport) {
var $ = Base.$
, isPromise = Base.isPromise
, Status = WUFile.Status;
$.extend(Uploader.options, {
prepareNextFile: !1,
chunked: !1,
chunkSize: 5242880,
chunkRetry: 2,
chunkRetryDelay: 1e3,
threads: 3,
formData: {}
}),
Uploader.register({
name: "upload",
init: function() {
var owner = this.owner
, me = this;
this.runing = !1,
this.progress = !1,
owner.on("startUpload", function() {
me.progress = !0
}).on("uploadFinished", function() {
me.progress = !1
}),
this.pool = [],
this.stack = [],
this.pending = [],
this.remaning = 0,
this.__tick = Base.bindFn(this._tick, this),
owner.on("uploadComplete", function(file) {
file.blocks && $.each(file.blocks, function(_, v) {
v.transport && (v.transport.abort(),
v.transport.destroy()),
delete v.transport
}),
delete file.blocks,
delete file.remaning
})
},
reset: function() {
this.request("stop-upload", !0),
this.runing = !1,
this.pool = [],
this.stack = [],
this.pending = [],
this.remaning = 0,
this._trigged = !1,
this._promise = null
},
startUpload: function(file) {
var me = this;
if ($.each(me.request("get-files", Status.INVALID), function() {
me.request("remove-file", this)
}),
file ? (file = file.id ? file : me.request("get-file", file)).getStatus() === Status.INTERRUPT ? (file.setStatus(Status.QUEUED),
$.each(me.pool, function(_, v) {
v.file === file && (v.transport && v.transport.send(),
file.setStatus(Status.PROGRESS))
})) : file.getStatus() !== Status.PROGRESS && file.setStatus(Status.QUEUED) : $.each(me.request("get-files", [Status.INITED]), function() {
this.setStatus(Status.QUEUED)
}),
me.runing)
return me.owner.trigger("startUpload", file),
Base.nextTick(me.__tick);
me.runing = !0;
var files = [];
file || $.each(me.pool, function(_, v) {
var file = v.file;
file.getStatus() === Status.INTERRUPT && (me._trigged = !1,
files.push(file),
v.transport && v.transport.send())
}),
$.each(files, function() {
this.setStatus(Status.PROGRESS)
}),
file || $.each(me.request("get-files", Status.INTERRUPT), function() {
this.setStatus(Status.PROGRESS)
}),
me._trigged = !1,
Base.nextTick(me.__tick),
me.owner.trigger("startUpload")
},
stopUpload: function(file, interrupt) {
var me = this;
if (!0 === file && (interrupt = file,
file = null),
!1 !== me.runing) {
if (file) {
if ((file = file.id ? file : me.request("get-file", file)).getStatus() !== Status.PROGRESS && file.getStatus() !== Status.QUEUED)
return;
return file.setStatus(Status.INTERRUPT),
$.each(me.pool, function(_, v) {
v.file === file && (v.transport && v.transport.abort(),
interrupt && (me._putback(v),
me._popBlock(v)))
}),
me.owner.trigger("stopUpload", file),
Base.nextTick(me.__tick)
}
me.runing = !1,
this._promise && this._promise.file && this._promise.file.setStatus(Status.INTERRUPT),
interrupt && $.each(me.pool, function(_, v) {
v.transport && v.transport.abort(),
v.file.setStatus(Status.INTERRUPT)
}),
me.owner.trigger("stopUpload")
}
},
cancelFile: function(file) {
(file = file.id ? file : this.request("get-file", file)).blocks && $.each(file.blocks, function(_, v) {
var _tr = v.transport;
_tr && (_tr.abort(),
_tr.destroy(),
delete v.transport)
}),
file.setStatus(Status.CANCELLED),
this.owner.trigger("fileDequeued", file)
},
isInProgress: function() {
return !!this.progress
},
_getStats: function() {
return this.request("get-stats")
},
skipFile: function(file, status) {
(file = file.id ? file : this.request("get-file", file)).setStatus(status || Status.COMPLETE),
file.skipped = !0,
file.blocks && $.each(file.blocks, function(_, v) {
var _tr = v.transport;
_tr && (_tr.abort(),
_tr.destroy(),
delete v.transport)
}),
this.owner.trigger("uploadSkip", file)
},
_tick: function() {
var fn, val, me = this, opts = me.options;
if (me._promise)
return me._promise.always(me.__tick);
me.pool.length < opts.threads && (val = me._nextBlock()) ? (me._trigged = !1,
fn = function(val) {
me._promise = null,
val && val.file && me._startSend(val),
Base.nextTick(me.__tick)
}
,
me._promise = isPromise(val) ? val.always(fn) : fn(val)) : me.remaning || me._getStats().numOfQueue || me._getStats().numofInterrupt || (me.runing = !1,
me._trigged || Base.nextTick(function() {
me.owner.trigger("uploadFinished")
}),
me._trigged = !0)
},
_putback: function(block) {
block.cuted.unshift(block),
~this.stack.indexOf(block.cuted) || this.stack.unshift(block.cuted)
},
_getStack: function() {
for (var act, i = 0; act = this.stack[i++]; ) {
if (act.has() && act.file.getStatus() === Status.PROGRESS)
return act;
(!act.has() || act.file.getStatus() !== Status.PROGRESS && act.file.getStatus() !== Status.INTERRUPT) && this.stack.splice(--i, 1)
}
return null
},
_nextBlock: function() {
var act, next, done, preparing, me = this, opts = me.options;
return (act = this._getStack()) ? (opts.prepareNextFile && !me.pending.length && me._prepareNextFile(),
act.shift()) : me.runing ? (!me.pending.length && me._getStats().numOfQueue && me._prepareNextFile(),
next = me.pending.shift(),
done = function(file) {
return file ? (act = function(file, chunkSize) {
var len, api, pending = [], total = file.source.size, chunks = chunkSize ? Math.ceil(total / chunkSize) : 1, start = 0, index = 0;
for (api = {
file: file,
has: function() {
return !!pending.length
},
shift: function() {
return pending.shift()
},
unshift: function(block) {
pending.unshift(block)
}
}; index < chunks; )
len = Math.min(chunkSize, total - start),
pending.push({
file: file,
start: start,
end: chunkSize ? start + len : total,
total: total,
chunks: chunks,
chunk: index++,
cuted: api
}),
start += len;
return 2 < pending.length && (pending.unshift(pending.pop()),
pending.unshift(pending.pop())),
file.blocks = pending.concat(),
file.remaning = pending.length,
api
}(file, opts.chunked ? opts.chunkSize : 0),
me.stack.push(act),
act.shift()) : null
}
,
isPromise(next) ? (preparing = next.file,
(next = next[next.pipe ? "pipe" : "then"](done)).file = preparing,
next) : done(next)) : void 0
},
_prepareNextFile: function() {
var promise, me = this, file = me.request("fetch-file"), pending = me.pending;
file && (promise = me.request("before-send-file", file, function() {
return file.getStatus() === Status.PROGRESS || file.getStatus() === Status.INTERRUPT ? file : me._finishFile(file)
}),
me.owner.trigger("uploadStart", file),
file.setStatus(Status.PROGRESS),
promise.file = file,
promise.done(function() {
var idx = $.inArray(promise, pending);
~idx && pending.splice(idx, 1, file)
}),
promise.fail(function(reason) {
file.setStatus(Status.ERROR, reason),
me.owner.trigger("uploadError", file, reason),
me.owner.trigger("uploadComplete", file)
}),
pending.push(promise))
},
_popBlock: function(block) {
var idx = $.inArray(block, this.pool);
this.pool.splice(idx, 1),
block.file.remaning--,
this.remaning--
},
_startSend: function(block) {
var me = this
, file = block.file;
file.getStatus() === Status.PROGRESS ? (me.pool.push(block),
me.remaning++,
block.blob = 1 === block.chunks ? file.source : file.source.slice(block.start, block.end),
me.request("before-send", block, function() {
file.getStatus() === Status.PROGRESS ? me._doSend(block) : (me._popBlock(block),
Base.nextTick(me.__tick))
}).fail(function() {
1 === file.remaning ? me._finishFile(file).always(function() {
block.percentage = 1,
me._popBlock(block),
me.owner.trigger("uploadComplete", file),
Base.nextTick(me.__tick)
}) : (block.percentage = 1,
me.updateFileProgress(file),
me._popBlock(block),
Base.nextTick(me.__tick))
})) : file.getStatus() === Status.INTERRUPT && me._putback(block)
},
_doSend: function(block) {
var requestAccept, ret, me = this, owner = me.owner, opts = $.extend({}, me.options, block.options), file = block.file, tr = new Transport(opts), data = $.extend({}, opts.formData), headers = $.extend({}, opts.headers);
(block.transport = tr).on("destroy", function() {
delete block.transport,
me._popBlock(block),
Base.nextTick(me.__tick)
}),
tr.on("progress", function(percentage) {
block.percentage = percentage,
me.updateFileProgress(file)
}),
requestAccept = function(reject) {
var fn;
return (ret = tr.getResponseAsJson() || {})._raw = tr.getResponse(),
ret._headers = tr.getResponseHeaders(),
block.response = ret,
fn = function(value) {
reject = value
}
,
owner.trigger("uploadAccept", block, ret, fn) || (reject = reject || "server"),
reject
}
,
tr.on("error", function(type, flag) {
block.retried = block.retried || 0,
1 < block.chunks && ~"http,abort,server".indexOf(type.replace(/-.*/, "")) && block.retried < opts.chunkRetry ? (block.retried++,
me.retryTimer = setTimeout(function() {
tr.send()
}, opts.chunkRetryDelay || 1e3)) : (flag || "server" !== type || (type = requestAccept(type)),
file.setStatus(Status.ERROR, type),
owner.trigger("uploadError", file, type),
owner.trigger("uploadComplete", file))
}),
tr.on("load", function() {
var reason;
(reason = requestAccept()) ? tr.trigger("error", reason, !0) : 1 === file.remaning ? me._finishFile(file, ret) : tr.destroy()
}),
data = $.extend(data, {
id: file.id,
name: file.name,
type: file.type,
lastModifiedDate: file.lastModifiedDate,
size: file.size
}),
1 < block.chunks && $.extend(data, {
chunks: block.chunks,
chunk: block.chunk
}),
owner.trigger("uploadBeforeSend", block, data, headers),
tr.appendBlob(opts.fileVal, block.blob, file.name),
tr.append(data),
tr.setRequestHeader(headers),
tr.send()
},
_finishFile: function(file, ret, hds) {
var owner = this.owner;
return owner.request("after-send-file", arguments, function() {
file.setStatus(Status.COMPLETE),
owner.trigger("uploadSuccess", file, ret, hds)
}).fail(function(reason) {
file.getStatus() === Status.PROGRESS && file.setStatus(Status.ERROR, reason),
owner.trigger("uploadError", file, reason)
}).always(function() {
owner.trigger("uploadComplete", file)
})
},
updateFileProgress: function(file) {
var totalPercent, uploaded = 0;
file.blocks && ($.each(file.blocks, function(_, v) {
uploaded += (v.percentage || 0) * (v.end - v.start)
}),
totalPercent = uploaded / file.size,
this.owner.trigger("uploadProgress", file, totalPercent || 0))
},
destroy: function() {
clearTimeout(this.retryTimer)
}
})
}),
define("widgets/validator", ["base", "uploader", "file", "widgets/widget"], function(Base, Uploader, WUFile) {
var api, $ = Base.$, validators = {};
return api = {
addValidator: function(type, cb) {
validators[type] = cb
},
removeValidator: function(type) {
delete validators[type]
}
},
Uploader.register({
name: "validator",
init: function() {
var me = this;
Base.nextTick(function() {
$.each(validators, function() {
this.call(me.owner)
})
})
}
}),
api.addValidator("fileNumLimit", function() {
var opts = this.options
, count = 0
, max = parseInt(opts.fileNumLimit, 10)
, flag = !0;
max && (this.on("beforeFileQueued", function(file) {
return !(!this.trigger("beforeFileQueuedCheckfileNumLimit", file, count) || (max <= count && flag && (flag = !1,
this.trigger("error", "Q_EXCEED_NUM_LIMIT", max, file),
setTimeout(function() {
flag = !0
}, 1)),
max <= count))
}),
this.on("fileQueued", function() {
count++
}),
this.on("fileDequeued", function() {
count--
}),
this.on("reset", function() {
count = 0
}))
}),
api.addValidator("fileSizeLimit", function() {
var opts = this.options
, count = 0
, max = parseInt(opts.fileSizeLimit, 10)
, flag = !0;
max && (this.on("beforeFileQueued", function(file) {
var invalid = (count + file.size > max) && 0;
return invalid && flag && (flag = !1,
this.trigger("error", "Q_EXCEED_SIZE_LIMIT", max, file),
setTimeout(function() {
flag = !0
}, 1)),
!invalid
}),
this.on("fileQueued", function(file) {
count += file.size
}),
this.on("fileDequeued", function(file) {
count -= file.size
}),
this.on("reset", function() {
count = 0
}))
}),
api.addValidator("fileSingleSizeLimit", function() {
var max = this.options.fileSingleSizeLimit;
max && this.on("beforeFileQueued", function(file) {
if (file.size > max && 0)
return file.setStatus(WUFile.Status.INVALID, "exceed_size"),
this.trigger("error", "F_EXCEED_SIZE", max, file),
!1
})
}),
api.addValidator("duplicate", function() {
var opts = this.options
, mapping = {};
opts.duplicate || (this.on("beforeFileQueued", function(file) {
var hash = file.__hash || (file.__hash = function(str) {
for (var hash = 0, i = 0, len = str.length; i < len; i++)
hash = str.charCodeAt(i) + (hash << 6) + (hash << 16) - hash;
return hash
}(file.name + file.size + file.lastModifiedDate));
if (mapping[hash])
return this.trigger("error", "F_DUPLICATE", file),
!1
}),
this.on("fileQueued", function(file) {
var hash = file.__hash;
hash && (mapping[hash] = !0)
}),
this.on("fileDequeued", function(file) {
var hash = file.__hash;
hash && delete mapping[hash]
}),
this.on("reset", function() {
mapping = {}
}))
}),
api
}),
define("runtime/compbase", [], function() {
return function(owner, runtime) {
this.owner = owner,
this.options = owner.options,
this.getRuntime = function() {
return runtime
}
,
this.getRuid = function() {
return runtime.uid
}
,
this.trigger = function() {
return owner.trigger.apply(owner, arguments)
}
}
}),
define("runtime/html5/runtime", ["base", "runtime/runtime", "runtime/compbase"], function(Base, Runtime, CompBase) {
var components = {};
function Html5Runtime() {
var pool = {}
, me = this
, destroy = this.destroy;
Runtime.apply(me, arguments),
me.type = "html5",
me.exec = function(comp, fn) {
var instance, uid = this.uid, args = Base.slice(arguments, 2);
if (components[comp] && (instance = pool[uid] = pool[uid] || new components[comp](this,me))[fn])
return instance[fn].apply(instance, args)
}
,
me.destroy = function() {
return destroy && destroy.apply(this, arguments)
}
}
return Base.inherits(Runtime, {
constructor: Html5Runtime,
init: function() {
var me = this;
setTimeout(function() {
me.trigger("ready")
}, 1)
}
}),
Html5Runtime.register = function(name, component) {
return components[name] = Base.inherits(CompBase, component)
}
,
window.Blob && window.FileReader && window.DataView && Runtime.addRuntime("html5", Html5Runtime),
Html5Runtime
}),
define("runtime/html5/blob", ["runtime/html5/runtime", "lib/blob"], function(Html5Runtime, Blob) {
return Html5Runtime.register("Blob", {
slice: function(start, end) {
var blob = this.owner.source;
return blob = (blob.slice || blob.webkitSlice || blob.mozSlice).call(blob, start, end),
new Blob(this.getRuid(),blob)
}
})
}),
define("runtime/html5/dnd", ["base", "runtime/html5/runtime", "lib/file"], function(Base, Html5Runtime, File) {
var $ = Base.$
, prefix = "webuploader-dnd-";
return Html5Runtime.register("DragAndDrop", {
init: function() {
var elem = this.elem = this.options.container;
this.dragEnterHandler = Base.bindFn(this._dragEnterHandler, this),
this.dragOverHandler = Base.bindFn(this._dragOverHandler, this),
this.dragLeaveHandler = Base.bindFn(this._dragLeaveHandler, this),
this.dropHandler = Base.bindFn(this._dropHandler, this),
this.dndOver = !1,
elem.on("dragenter", this.dragEnterHandler),
elem.on("dragover", this.dragOverHandler),
elem.on("dragleave", this.dragLeaveHandler),
elem.on("drop", this.dropHandler),
this.options.disableGlobalDnd && ($(document).on("dragover", this.dragOverHandler),
$(document).on("drop", this.dropHandler))
},
_dragEnterHandler: function(e) {
var items, me = this, denied = me._denied || !1;
return e = e.originalEvent || e,
me.dndOver || (me.dndOver = !0,
(items = e.dataTransfer.items) && items.length && (me._denied = denied = !me.trigger("accept", items)),
me.elem.addClass(prefix + "over"),
me.elem[denied ? "addClass" : "removeClass"](prefix + "denied")),
e.dataTransfer.dropEffect = denied ? "none" : "copy",
!1
},
_dragOverHandler: function(e) {
var parentElem = this.elem.parent().get(0);
return parentElem && !$.contains(parentElem, e.currentTarget) || (clearTimeout(this._leaveTimer),
this._dragEnterHandler.call(this, e)),
!1
},
_dragLeaveHandler: function() {
var handler, me = this;
return handler = function() {
me.dndOver = !1,
me.elem.removeClass(prefix + "over " + prefix + "denied")
}
,
clearTimeout(me._leaveTimer),
me._leaveTimer = setTimeout(handler, 100),
!1
},
_dropHandler: function(e) {
var dataTransfer, data, me = this, ruid = me.getRuid(), parentElem = me.elem.parent().get(0);
if (parentElem && !$.contains(parentElem, e.currentTarget))
return !1;
dataTransfer = (e = e.originalEvent || e).dataTransfer;
try {
data = dataTransfer.getData("text/html")
} catch (err) {}
return me.dndOver = !1,
me.elem.removeClass(prefix + "over"),
dataTransfer && !data ? (me._getTansferFiles(dataTransfer, function(results) {
me.trigger("drop", $.map(results, function(file) {
return new File(ruid,file)
}))
}),
!1) : void 0
},
_getTansferFiles: function(dataTransfer, callback) {
var items, files, file, item, i, len, canAccessFolder, results = [], promises = [];
for (items = dataTransfer.items,
files = dataTransfer.files,
canAccessFolder = !(!items || !items[0].webkitGetAsEntry),
i = 0,
len = files.length; i < len; i++)
file = files[i],
item = items && items[i],
canAccessFolder && item.webkitGetAsEntry().isDirectory ? promises.push(this._traverseDirectoryTree(item.webkitGetAsEntry(), results)) : results.push(file);
Base.when.apply(Base, promises).done(function() {
results.length && callback(results)
})
},
_traverseDirectoryTree: function(entry, results) {
var deferred = Base.Deferred()
, me = this;
return entry.isFile ? entry.file(function(file) {
results.push(file),
deferred.resolve()
}) : entry.isDirectory && entry.createReader().readEntries(function(entries) {
var i, len = entries.length, promises = [], arr = [];
for (i = 0; i < len; i++)
promises.push(me._traverseDirectoryTree(entries[i], arr));
Base.when.apply(Base, promises).then(function() {
results.push.apply(results, arr),
deferred.resolve()
}, deferred.reject)
}),
deferred.promise()
},
destroy: function() {
var elem = this.elem;
elem && (elem.off("dragenter", this.dragEnterHandler),
elem.off("dragover", this.dragOverHandler),
elem.off("dragleave", this.dragLeaveHandler),
elem.off("drop", this.dropHandler),
this.options.disableGlobalDnd && ($(document).off("dragover", this.dragOverHandler),
$(document).off("drop", this.dropHandler)))
}
})
}),
define("runtime/html5/filepaste", ["base", "runtime/html5/runtime", "lib/file"], function(Base, Html5Runtime, File) {
return Html5Runtime.register("FilePaste", {
init: function() {
var arr, i, len, item, opts = this.options, elem = this.elem = opts.container, accept = ".*";
if (opts.accept) {
for (arr = [],
i = 0,
len = opts.accept.length; i < len; i++)
(item = opts.accept[i].mimeTypes) && arr.push(item);
arr.length && (accept = (accept = arr.join(",")).replace(/,/g, "|").replace(/\*/g, ".*"))
}
this.accept = accept = new RegExp(accept,"i"),
this.hander = Base.bindFn(this._pasteHander, this),
elem.on("paste", this.hander)
},
_pasteHander: function(e) {
var items, item, blob, i, len, allowed = [], ruid = this.getRuid();
for (i = 0,
len = (items = (e = e.originalEvent || e).clipboardData.items).length; i < len; i++)
"file" === (item = items[i]).kind && (blob = item.getAsFile()) && allowed.push(new File(ruid,blob));
allowed.length && (e.preventDefault(),
e.stopPropagation(),
this.trigger("paste", allowed))
},
destroy: function() {
this.elem.off("paste", this.hander)
}
})
}),
define("runtime/html5/filepicker", ["base", "runtime/html5/runtime"], function(Base, Html5Runtime) {
var $ = Base.$;
return Html5Runtime.register("FilePicker", {
init: function() {
var arr, i, len, mouseHandler, changeHandler, container = this.getRuntime().getContainer(), me = this, owner = me.owner, opts = me.options, label = this.label = $(document.createElement("label")), input = this.input = $(document.createElement("input"));
if (input.attr("type", "file"),
input.attr("name", opts.name),
input.addClass("webuploader-element-invisible"),
label.on("click", function(e) {
input.trigger("click"),
e.stopPropagation(),
owner.trigger("dialogopen")
}),
label.css({
opacity: 0,
width: "100%",
height: "100%",
display: "block",
cursor: "pointer",
background: "#ffffff"
}),
opts.multiple && input.attr("multiple", "multiple"),
opts.accept && 0 < opts.accept.length) {
for (arr = [],
i = 0,
len = opts.accept.length; i < len; i++)
arr.push(opts.accept[i].mimeTypes);
input.attr("accept", arr.join(","))
}
container.append(input),
container.append(label),
mouseHandler = function(e) {
owner.trigger(e.type)
}
,
changeHandler = function(e) {
var clone;
if (0 === e.target.files.length)
return !1;
me.files = e.target.files,
(clone = this.cloneNode(!0)).value = null,
this.parentNode.replaceChild(clone, this),
input.off(),
input = $(clone).on("change", changeHandler).on("mouseenter mouseleave", mouseHandler),
owner.trigger("change")
}
,
input.on("change", changeHandler),
label.on("mouseenter mouseleave", mouseHandler)
},
getFiles: function() {
return this.files
},
destroy: function() {
this.input.off(),
this.label.off()
}
})
}),
define("runtime/html5/util", ["base"], function(Base) {
var urlAPI = window.createObjectURL && window || window.URL && URL.revokeObjectURL && URL || window.webkitURL
, createObjectURL = Base.noop
, revokeObjectURL = createObjectURL;
return urlAPI && (createObjectURL = function() {
return urlAPI.createObjectURL.apply(urlAPI, arguments)
}
,
revokeObjectURL = function() {
return urlAPI.revokeObjectURL.apply(urlAPI, arguments)
}
),
{
createObjectURL: createObjectURL,
revokeObjectURL: revokeObjectURL,
dataURL2Blob: function(dataURI) {
var byteStr, intArray, ab, i, mimetype, parts;
for (byteStr = ~(parts = dataURI.split(","))[0].indexOf("base64") ? atob(parts[1]) : decodeURIComponent(parts[1]),
ab = new ArrayBuffer(byteStr.length),
intArray = new Uint8Array(ab),
i = 0; i < byteStr.length; i++)
intArray[i] = byteStr.charCodeAt(i);
return mimetype = parts[0].split(":")[1].split(";")[0],
this.arrayBufferToBlob(ab, mimetype)
},
dataURL2ArrayBuffer: function(dataURI) {
var byteStr, intArray, i, parts;
for (byteStr = ~(parts = dataURI.split(","))[0].indexOf("base64") ? atob(parts[1]) : decodeURIComponent(parts[1]),
intArray = new Uint8Array(byteStr.length),
i = 0; i < byteStr.length; i++)
intArray[i] = byteStr.charCodeAt(i);
return intArray.buffer
},
arrayBufferToBlob: function(buffer, type) {
var bb, builder = window.BlobBuilder || window.WebKitBlobBuilder;
return builder ? ((bb = new builder).append(buffer),
bb.getBlob(type)) : new Blob([buffer],type ? {
type: type
} : {})
},
canvasToDataUrl: function(canvas, type, quality) {
return canvas.toDataURL(type, quality / 100)
},
parseMeta: function(blob, callback) {
callback(!1, {})
},
updateImageHead: function(data) {
return data
}
}
}),
define("runtime/html5/imagemeta", ["runtime/html5/util"], function(Util) {
var api;
return api = {
parsers: {
65505: []
},
maxMetaDataSize: 262144,
parse: function(blob, cb) {
var me = this
, fr = new FileReader;
fr.onload = function() {
cb(!1, me._parse(this.result)),
fr = fr.onload = fr.onerror = null
}
,
fr.onerror = function(e) {
cb(e.message),
fr = fr.onload = fr.onerror = null
}
,
blob = blob.slice(0, me.maxMetaDataSize),
fr.readAsArrayBuffer(blob.getSource())
},
_parse: function(buffer, noParse) {
if (!(buffer.byteLength < 6)) {
var markerBytes, markerLength, parsers, i, dataview = new DataView(buffer), offset = 2, maxOffset = dataview.byteLength - 4, headLength = offset, ret = {};
if (65496 === dataview.getUint16(0)) {
for (; offset < maxOffset && (65504 <= (markerBytes = dataview.getUint16(offset)) && markerBytes <= 65519 || 65534 === markerBytes) && !(offset + (markerLength = dataview.getUint16(offset + 2) + 2) > dataview.byteLength); ) {
if (parsers = api.parsers[markerBytes],
!noParse && parsers)
for (i = 0; i < parsers.length; i += 1)
parsers[i].call(api, dataview, offset, markerLength, ret);
headLength = offset += markerLength
}
6 < headLength && (buffer.slice ? ret.imageHead = buffer.slice(2, headLength) : ret.imageHead = new Uint8Array(buffer).subarray(2, headLength))
}
return ret
}
},
updateImageHead: function(buffer, head) {
var buf1, buf2, bodyoffset, data = this._parse(buffer, !0);
return bodyoffset = 2,
data.imageHead && (bodyoffset = 2 + data.imageHead.byteLength),
buf2 = buffer.slice ? buffer.slice(bodyoffset) : new Uint8Array(buffer).subarray(bodyoffset),
(buf1 = new Uint8Array(head.byteLength + 2 + buf2.byteLength))[0] = 255,
buf1[1] = 216,
buf1.set(new Uint8Array(head), 2),
buf1.set(new Uint8Array(buf2), head.byteLength + 2),
buf1.buffer
}
},
Util.parseMeta = function() {
return api.parse.apply(api, arguments)
}
,
Util.updateImageHead = function() {
return api.updateImageHead.apply(api, arguments)
}
,
api
}),
define("runtime/html5/imagemeta/exif", ["base", "runtime/html5/imagemeta"], function(Base, ImageMeta) {
var EXIF = {
ExifMap: function() {
return this
}
};
return EXIF.ExifMap.prototype.map = {
Orientation: 274
},
EXIF.ExifMap.prototype.get = function(id) {
return this[id] || this[this.map[id]]
}
,
EXIF.exifTagTypes = {
1: {
getValue: function(dataView, dataOffset) {
return dataView.getUint8(dataOffset)
},
size: 1
},
2: {
getValue: function(dataView, dataOffset) {
return String.fromCharCode(dataView.getUint8(dataOffset))
},
size: 1,
ascii: !0
},
3: {
getValue: function(dataView, dataOffset, littleEndian) {
return dataView.getUint16(dataOffset, littleEndian)
},
size: 2
},
4: {
getValue: function(dataView, dataOffset, littleEndian) {
return dataView.getUint32(dataOffset, littleEndian)
},
size: 4
},
5: {
getValue: function(dataView, dataOffset, littleEndian) {
return dataView.getUint32(dataOffset, littleEndian) / dataView.getUint32(dataOffset + 4, littleEndian)
},
size: 8
},
9: {
getValue: function(dataView, dataOffset, littleEndian) {
return dataView.getInt32(dataOffset, littleEndian)
},
size: 4
},
10: {
getValue: function(dataView, dataOffset, littleEndian) {
return dataView.getInt32(dataOffset, littleEndian) / dataView.getInt32(dataOffset + 4, littleEndian)
},
size: 8
}
},
EXIF.exifTagTypes[7] = EXIF.exifTagTypes[1],
EXIF.getExifValue = function(dataView, tiffOffset, offset, type, length, littleEndian) {
var tagSize, dataOffset, values, i, str, c, tagType = EXIF.exifTagTypes[type];
if (tagType) {
if (!((dataOffset = 4 < (tagSize = tagType.size * length) ? tiffOffset + dataView.getUint32(offset + 8, littleEndian) : offset + 8) + tagSize > dataView.byteLength)) {
if (1 === length)
return tagType.getValue(dataView, dataOffset, littleEndian);
for (values = [],
i = 0; i < length; i += 1)
values[i] = tagType.getValue(dataView, dataOffset + i * tagType.size, littleEndian);
if (tagType.ascii) {
for (str = "",
i = 0; i < values.length && "\0" !== (c = values[i]); i += 1)
str += c;
return str
}
return values
}
Base.log("Invalid Exif data: Invalid data offset.")
} else
Base.log("Invalid Exif data: Invalid tag type.")
}
,
EXIF.parseExifTag = function(dataView, tiffOffset, offset, littleEndian, data) {
var tag = dataView.getUint16(offset, littleEndian);
data.exif[tag] = EXIF.getExifValue(dataView, tiffOffset, offset, dataView.getUint16(offset + 2, littleEndian), dataView.getUint32(offset + 4, littleEndian), littleEndian)
}
,
EXIF.parseExifTags = function(dataView, tiffOffset, dirOffset, littleEndian, data) {
var tagsNumber, dirEndOffset, i;
if (dirOffset + 6 > dataView.byteLength)
Base.log("Invalid Exif data: Invalid directory offset.");
else {
if (!((dirEndOffset = dirOffset + 2 + 12 * (tagsNumber = dataView.getUint16(dirOffset, littleEndian))) + 4 > dataView.byteLength)) {
for (i = 0; i < tagsNumber; i += 1)
this.parseExifTag(dataView, tiffOffset, dirOffset + 2 + 12 * i, littleEndian, data);
return dataView.getUint32(dirEndOffset, littleEndian)
}
Base.log("Invalid Exif data: Invalid directory size.")
}
}
,
EXIF.parseExifData = function(dataView, offset, length, data) {
var littleEndian, dirOffset, tiffOffset = offset + 10;
if (1165519206 === dataView.getUint32(offset + 4))
if (tiffOffset + 8 > dataView.byteLength)
Base.log("Invalid Exif data: Invalid segment size.");
else if (0 === dataView.getUint16(offset + 8)) {
switch (dataView.getUint16(tiffOffset)) {
case 18761:
littleEndian = !0;
break;
case 19789:
littleEndian = !1;
break;
default:
return void Base.log("Invalid Exif data: Invalid byte alignment marker.")
}
42 === dataView.getUint16(tiffOffset + 2, littleEndian) ? (dirOffset = dataView.getUint32(tiffOffset + 4, littleEndian),
data.exif = new EXIF.ExifMap,
dirOffset = EXIF.parseExifTags(dataView, tiffOffset, tiffOffset + dirOffset, littleEndian, data)) : Base.log("Invalid Exif data: Missing TIFF marker.")
} else
Base.log("Invalid Exif data: Missing byte alignment offset.")
}
,
ImageMeta.parsers[65505].push(EXIF.parseExifData),
EXIF
}),
define("runtime/html5/image", ["base", "runtime/html5/runtime", "runtime/html5/util"], function(Base, Html5Runtime, Util) {
return Html5Runtime.register("Image", {
modified: !1,
init: function() {
var me = this
, img = new Image;
img.onload = function() {
me._info = {
type: me.type,
width: this.width,
height: this.height
},
me._metas || "image/jpeg" !== me.type ? me.owner.trigger("load") : Util.parseMeta(me._blob, function(error, ret) {
me._metas = ret,
me.owner.trigger("load")
})
}
,
img.onerror = function() {
me.owner.trigger("error")
}
,
me._img = img
},
loadFromBlob: function(blob) {
var img = this._img;
this._blob = blob,
this.type = blob.type,
img.src = Util.createObjectURL(blob.getSource()),
this.owner.once("load", function() {
Util.revokeObjectURL(img.src)
})
},
resize: function(width, height) {
var canvas = this._canvas || (this._canvas = document.createElement("canvas"));
this._resize(this._img, canvas, width, height),
this._blob = null,
this.modified = !0,
this.owner.trigger("complete", "resize")
},
crop: function(x, y, w, h, s) {
var cvs = this._canvas || (this._canvas = document.createElement("canvas"))
, opts = this.options
, img = this._img
, iw = img.naturalWidth
, ih = img.naturalHeight
, orientation = this.getOrientation();
s = s || 1,
cvs.width = w,
cvs.height = h,
opts.preserveHeaders || this._rotate2Orientaion(cvs, orientation),
this._renderImageToCanvas(cvs, img, -x, -y, iw * s, ih * s),
this._blob = null,
this.modified = !0,
this.owner.trigger("complete", "crop")
},
getAsBlob: function(type) {
var canvas, blob = this._blob, opts = this.options;
if (type = type || this.type,
this.modified || this.type !== type) {
if (canvas = this._canvas,
"image/jpeg" === type) {
if (blob = Util.canvasToDataUrl(canvas, type, opts.quality),
opts.preserveHeaders && this._metas && this._metas.imageHead)
return blob = Util.dataURL2ArrayBuffer(blob),
blob = Util.updateImageHead(blob, this._metas.imageHead),
blob = Util.arrayBufferToBlob(blob, type)
} else
blob = Util.canvasToDataUrl(canvas, type);
blob = Util.dataURL2Blob(blob)
}
return blob
},
getAsDataUrl: function(type) {
var opts = this.options;
return "image/jpeg" === (type = type || this.type) ? Util.canvasToDataUrl(this._canvas, type, opts.quality) : this._canvas.toDataURL(type)
},
getOrientation: function() {
return this._metas && this._metas.exif && this._metas.exif.get("Orientation") || 1
},
info: function(val) {
return val ? (this._info = val,
this) : this._info
},
meta: function(val) {
return val ? (this._metas = val,
this) : this._metas
},
destroy: function() {
var canvas = this._canvas;
this._img.onload = null,
canvas && (canvas.getContext("2d").clearRect(0, 0, canvas.width, canvas.height),
canvas.width = canvas.height = 0,
this._canvas = null),
this._img.src = "data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs%3D",
this._img = this._blob = null
},
_resize: function(img, cvs, width, height) {
var scale, w, h, x, y, opts = this.options, naturalWidth = img.width, naturalHeight = img.height, orientation = this.getOrientation();
~[5, 6, 7, 8].indexOf(orientation) && (width ^= height,
width ^= height ^= width),
scale = Math[opts.crop ? "max" : "min"](width / naturalWidth, height / naturalHeight),
opts.allowMagnify || (scale = Math.min(1, scale)),
w = naturalWidth * scale,
h = naturalHeight * scale,
opts.crop ? (cvs.width = width,
cvs.height = height) : (cvs.width = w,
cvs.height = h),
x = (cvs.width - w) / 2,
y = (cvs.height - h) / 2,
opts.preserveHeaders || this._rotate2Orientaion(cvs, orientation),
this._renderImageToCanvas(cvs, img, x, y, w, h)
},
_rotate2Orientaion: function(canvas, orientation) {
var width = canvas.width
, height = canvas.height
, ctx = canvas.getContext("2d");
switch (orientation) {
case 5:
case 6:
case 7:
case 8:
canvas.width = height,
canvas.height = width
}
switch (orientation) {
case 2:
ctx.translate(width, 0),
ctx.scale(-1, 1);
break;
case 3:
ctx.translate(width, height),
ctx.rotate(Math.PI);
break;
case 4:
ctx.translate(0, height),
ctx.scale(1, -1);
break;
case 5:
ctx.rotate(.5 * Math.PI),
ctx.scale(1, -1);
break;
case 6:
ctx.rotate(.5 * Math.PI),
ctx.translate(0, -height);
break;
case 7:
ctx.rotate(.5 * Math.PI),
ctx.translate(width, -height),
ctx.scale(-1, 1);
break;
case 8:
ctx.rotate(-.5 * Math.PI),
ctx.translate(-width, 0)
}
},
_renderImageToCanvas: function() {
if (!Base.os.ios)
return function(canvas) {
var args = Base.slice(arguments, 1)
, ctx = canvas.getContext("2d");
ctx.drawImage.apply(ctx, args)
}
;
function detectVerticalSquash(img, iw, ih) {
var data, ratio, canvas = document.createElement("canvas"), ctx = canvas.getContext("2d"), sy = 0, ey = ih, py = ih;
for (canvas.width = 1,
canvas.height = ih,
ctx.drawImage(img, 0, 0),
data = ctx.getImageData(0, 0, 1, ih).data; sy < py; )
0 === data[4 * (py - 1) + 3] ? ey = py : sy = py,
py = ey + sy >> 1;
return 0 == (ratio = py / ih) ? 1 : ratio
}
return 7 <= Base.os.ios ? function(canvas, img, x, y, w, h) {
var iw = img.naturalWidth
, ih = img.naturalHeight
, vertSquashRatio = detectVerticalSquash(img, 0, ih);
return canvas.getContext("2d").drawImage(img, 0, 0, iw * vertSquashRatio, ih * vertSquashRatio, x, y, w, h)
}
: function(canvas, img, x, y, width, height) {
var tmpCanvas, tmpCtx, vertSquashRatio, dw, dh, sx, dx, iw = img.naturalWidth, ih = img.naturalHeight, ctx = canvas.getContext("2d"), subsampled = function(img) {
var canvas, ctx, iw = img.naturalWidth;
return 1048576 < iw * img.naturalHeight && ((canvas = document.createElement("canvas")).width = canvas.height = 1,
(ctx = canvas.getContext("2d")).drawImage(img, 1 - iw, 0),
0 === ctx.getImageData(0, 0, 1, 1).data[3])
}(img), doSquash = "image/jpeg" === this.type, d = 1024, sy = 0, dy = 0;
for (subsampled && (iw /= 2,
ih /= 2),
ctx.save(),
(tmpCanvas = document.createElement("canvas")).width = tmpCanvas.height = d,
tmpCtx = tmpCanvas.getContext("2d"),
vertSquashRatio = doSquash ? detectVerticalSquash(img, 0, ih) : 1,
dw = Math.ceil(d * width / iw),
dh = Math.ceil(d * height / ih / vertSquashRatio); sy < ih; ) {
for (dx = sx = 0; sx < iw; )
tmpCtx.clearRect(0, 0, d, d),
tmpCtx.drawImage(img, -sx, -sy),
ctx.drawImage(tmpCanvas, 0, 0, d, d, x + dx, y + dy, dw, dh),
sx += d,
dx += dw;
sy += d,
dy += dh
}
ctx.restore(),
tmpCanvas = tmpCtx = null
}
}()
})
}),
define("runtime/html5/transport", ["base", "runtime/html5/runtime"], function(Base, Html5Runtime) {
var noop = Base.noop
, $ = Base.$;
return Html5Runtime.register("Transport", {
init: function() {
this._status = 0,
this._response = null
},
send: function() {
var formData, binary, fr, owner = this.owner, opts = this.options, xhr = this._initAjax(), blob = owner._blob, server = opts.server;
opts.sendAsBinary ? (server += !1 !== opts.attachInfoToQuery ? (/\?/.test(server) ? "&" : "?") + $.param(owner._formData) : "",
binary = blob.getSource()) : (formData = new FormData,
$.each(owner._formData, function(k, v) {
formData.append(k, v)
}),
formData.append(opts.fileVal, blob.getSource(), opts.filename || owner._formData.name || "")),
opts.withCredentials && "withCredentials"in xhr ? (xhr.open(opts.method, server, !0),
xhr.withCredentials = !0) : xhr.open(opts.method, server),
this._setRequestHeader(xhr, opts.headers),
binary ? (xhr.overrideMimeType && xhr.overrideMimeType("application/octet-stream"),
Base.os.android ? ((fr = new FileReader).onload = function() {
xhr.send(this.result),
fr = fr.onload = null
}
,
fr.readAsArrayBuffer(binary)) : xhr.send(binary)) : xhr.send(formData)
},
getResponse: function() {
return this._response
},
getResponseAsJson: function() {
return this._parseJson(this._response)
},
getResponseHeaders: function() {
return this._headers
},
getStatus: function() {
return this._status
},
abort: function() {
var xhr = this._xhr;
xhr && (xhr.upload.onprogress = noop,
xhr.onreadystatechange = noop,
xhr.abort(),
this._xhr = xhr = null)
},
destroy: function() {
this.abort()
},
_parseHeader: function(raw) {
var ret = {};
return raw && raw.replace(/^([^\:]+):(.*)$/gm, function(_, key, value) {
ret[key.trim()] = value.trim()
}),
ret
},
_initAjax: function() {
var me = this
, xhr = new XMLHttpRequest;
return !this.options.withCredentials || "withCredentials"in xhr || "undefined" == typeof XDomainRequest || (xhr = new XDomainRequest),
xhr.upload.onprogress = function(e) {
var percentage = 0;
return e.lengthComputable && (percentage = e.loaded / e.total),
me.trigger("progress", percentage)
}
,
xhr.onreadystatechange = function() {
if (4 === xhr.readyState)
return xhr.upload.onprogress = noop,
xhr.onreadystatechange = noop,
me._xhr = null,
me._status = xhr.status,
200 <= xhr.status && xhr.status < 300 ? (me._response = xhr.responseText,
me._headers = me._parseHeader(xhr.getAllResponseHeaders()),
me.trigger("load")) : 500 <= xhr.status && xhr.status < 600 ? (me._response = xhr.responseText,
me._headers = me._parseHeader(xhr.getAllResponseHeaders()),
me.trigger("error", "server-" + xhr.status)) : me.trigger("error", me._status ? "http-" + xhr.status : "abort")
}
,
me._xhr = xhr
},
_setRequestHeader: function(xhr, headers) {
$.each(headers, function(key, val) {
xhr.setRequestHeader(key, val)
})
},
_parseJson: function(str) {
var json;
try {
json = JSON.parse(str)
} catch (ex) {
json = {}
}
return json
}
})
}),
define("preset/html5only", ["base", "widgets/filednd", "widgets/filepaste", "widgets/filepicker", "widgets/image", "widgets/queue", "widgets/runtime", "widgets/upload", "widgets/validator", "runtime/html5/blob", "runtime/html5/dnd", "runtime/html5/filepaste", "runtime/html5/filepicker", "runtime/html5/imagemeta/exif", "runtime/html5/image", "runtime/html5/transport"], function(Base) {
return Base
}),
define("webuploader", ["preset/html5only"], function(preset) {
return preset
}),
require("webuploader")));
var window, define, require
};
"object" == typeof module && "object" == typeof module.exports ? module.exports = makeExport() : "function" == typeof define && define.amd ? define(["jquery"], makeExport) : (origin = root.WebUploader,
root.WebUploader = makeExport(),
root.WebUploader.noConflict = function() {
root.WebUploader = origin
}
)
}(window);
var ybuploader = WebUploader;
ybuploader.get_upcdns = function(callback, limitNum) {
limitNum = limitNum || 1;
var upcdns = []
, complete = !1
, timer = setTimeout(function() {
upcdns.sort(function(a, b) {
return a.cost - b.cost
}),
callback(upcdns.concat()),
complete = !0
}, 800);
$.each([{
os: "kodo",
query: "os=kodo&bucket=bvcupcdnkodobm",
url: "//up-na0.qbox.me/crossdomain.xml"
}, {
os: "upos",
query: "os=upos&upcdn=ws",
url: "//upos-hz-upcdnws.acgvideo.com/OK"
}, {
os: "upos",
query: "os=upos&upcdn=tx",
url: "//upos-hz-upcdntx.acgvideo.com/OK"
}, {
os: "bos",
query: "os=bos&bucket=bvcupcdnbosxg",
url: "//hk-2.bcebos.com/m/opmon"
}], function(_, line) {
!function(url, timeout, callback) {
var img = document.createElement("img");
img.src = url + "?_=" + Date.now();
var called = !1
, start = Date.now();
function onload() {
called || (callback(null, Date.now() - start),
called = !0)
}
img.onload = onload,
img.onerror = onload,
setTimeout(function() {
called || (img.src = "")
}, timeout)
}(line.url, 800, function(_, cost) {
line.cost = cost,
upcdns.push(line),
upcdns.length !== limitNum || complete || (callback(upcdns),
clearInterval(timer),
complete = !0)
})
})
}
,
ybuploader.Ybuploader = function(os, options, profile, preupload, upcdn_query) {
if (upcdn_query = upcdn_query || "",
WebUploader.Uploader.support() || alert("暂不支持您的浏览器,推荐使用Chrome浏览器!如有疑问请加QQ:385749807"),
window.weblog = function(name, data) {
var connection = navigator.connection || navigator.mozConnection || navigator.webkitConnection || {};
data.rtt = connection.rtt,
data.effectiveType = connection.effectiveType,
data.downlink = connection.downlink,
data.weblog = name,
data.sysos = WebUploader.os,
data.browser = WebUploader.browser,
data.js_now = Date.now(),
data.js_uploadstart = data.js_uploadstart,
"string" != typeof data.statusText && (data.statusText = "NOT_STRING"),
"string" != typeof data.reason && (data.reason = "NOT_STRING"),
WebUploader.log(data),
$.ajax({
url: "//member.bilibili.com/preupload?r=weblog",
type: "post",
data: data
})
}
,
"undefined" != typeof Raven && 1 != options.disable_sentry && (Raven.config("//[email protected]/3").install(),
WebUploader.log("sentry_install")),
-1 == ["cos", "kodo", "bos", "upos", "oss"].indexOf(os)) {
os = "upos";
var ret = JSON.parse($.ajax({
timeout: 200,
url: "http://member.bilibili.com/preupload?r=get_os",
type: "GET",
async: !1
}).responseText);
"bos" != ret.os && "cos" != ret.os && "kodo" != ret.os && "upos" != ret.os && "oss" != ret.os || (os = ret.os)
}
if ("kodo" === (window.os = os))
profile = "ugcupos/fetch",
WebUploader.Uploader.register({
name: "_",
"before-send-file": function(file) {
var deferred = WebUploader.Deferred();
return $.ajax({
url: preUploadUrl,
data: {
name: file.name,
size: file.size,
r: os,
ssl: 0,
profile: profile
},
dataType: "json",
success: function(ret) {
file.js_uploadstart = Date.now(),
file.bili_filename = ret.bili_filename,
file.key = ret.key,
file.cdn = ret.cdn,
file.endpoint = ret.endpoint,
file.token = ret.uptoken,
file.biz_id = ret.biz_id,
file.fetch_url = ret.fetch_url,
file.fetch_headers = ret.fetch_headers,
_this.trigger("BeforeUpload", WUploader, file),
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "PREUPLOAD_FAIL",
deferred.reject(file)
}),
deferred.promise()
},
"before-send": function(block) {
block.options = {
method: "POST",
server: block.file.endpoint + "/mkblk/" + (block.end - block.start),
sendAsBinary: !0,
headers: {
Authorization: "UpToken " + block.file.token,
"Content-Type": "application/octet-stream"
}
}
},
"after-send-file": function(file) {
var parts = [];
$.each(file.blocks, function(_, block) {
parts[block.chunk] = block.response.ctx
});
var deferred = WebUploader.Deferred();
return $.ajax({
type: "POST",
url: file.endpoint + "/mkfile/" + file.size + "/key/" + btoa(unescape(encodeURIComponent(file.key))).replace(/\//g, "_").replace(/\+/g, "-"),
data: parts.join(","),
headers: {
Authorization: "UpToken " + file.token
}
}).success(function() {
$.ajax({
url: file.fetch_url,
headers: file.fetch_headers,
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(ret) {
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "FETCH_FAIL",
deferred.reject(file)
})
}).retry({
times: 5
}).fail(function() {
file.statusText = "COMPLETE_FAIL",
deferred.reject(file)
}),
deferred.promise()
}
});
else if ("upos" === os)
profile = profile || "ugcupos/yb",
WebUploader.Uploader.register({
name: "_",
"before-send-file": function(file) {
var deferred = WebUploader.Deferred();
return $.ajax({
url: preUploadUrl,
xhrFields: {
withCredentials: !0
},
data: {
name: file.name,
size: file.size,
r: os,
profile: profile,
ssl: 0
},
dataType: "json",
success: function(ret) {
file.auth = ret.auth,
file.js_uploadstart = Date.now(),
file.bili_filename = ret.upos_uri.split(/(\\|\/)/g).pop().split(".")[0],
file.upos_uri = ret.upos_uri,
file.biz_id = ret.biz_id,
file.endpoint = ret.endpoint,
$.ajax({
type: "POST",
url: file.upos_uri.replace(/^upos:\/\//, file.endpoint + "/") + "?uploads&output=json",
headers: {
"X-Upos-Auth": file.auth
},
dataType: "json",
success: function(ret) {
file.uploadId = ret.upload_id,
_this.trigger("BeforeUpload", WUploader, file),
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "UPLOADS_FAIL",
deferred.reject(file)
})
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "PREUPLOAD_FAIL",
deferred.reject(file)
}),
deferred.promise()
},
"before-send": function(block) {
console.log(block),
block.options = {
method: "PUT",
server: block.file.upos_uri.replace(/^upos:\/\//, block.file.endpoint + "/") + "?" + $.param({
partNumber: block.chunk + 1,
uploadId: block.file.uploadId,
chunk: block.chunk,
chunks: block.chunks,
size: block.blob.size,
start: block.start,
end: block.end,
total: block.total
}),
headers: {
"X-Upos-Auth": block.file.auth
}
}
},
"after-send-file": function(file) {
var deferred = WebUploader.Deferred()
, parts = [];
return $.each(file.blocks, function(k, v) {
parts.push({
partNumber: v.chunk + 1,
eTag: "etag"
})
}),
$.ajax({
url: file.upos_uri.replace(/^upos:\/\//, file.endpoint + "/") + "?" + $.param({
output: "json",
name: file.name,
profile: profile,
uploadId: file.uploadId,
biz_id: file.biz_id
}),
type: "POST",
headers: {
"X-Upos-Auth": file.auth
},
data: JSON.stringify({
parts: parts
}),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(ret) {
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "COMPLETE_FAIL",
deferred.reject(file)
}),
deferred.promise()
}
});
else if ("bos" === os)
profile = profile || "ugcupos/fetch",
WebUploader.Uploader.register({
"before-send-file": function(file) {
var deferred = WebUploader.Deferred();
return $.ajax({
url: preUploadUrl,
type: "GET",
data: {
name: file.name,
size: file.size,
r: os,
profile: profile,
ssl: 0
},
dataType: "json",
success: function(ret) {
file.cdn = ret.cdn,
file.AK = ret.AccessKeyId,
file.SK = ret.SecretAccessKey,
file.SESSION_TOKEN = ret.SessionToken,
file.key = ret.key,
file.bucket = ret.bucket,
file.endpoint = ret.endpoint,
file.biz_id = ret.biz_id,
file.bili_filename = ret.bili_filename,
file.fetch_url = ret.fetch_url,
file.fetch_headers = ret.fetch_headers;
var resource = "/" + file.bucket + "/" + file.key
, xbceDate = (new Date).toISOString().replace(/\.\d+Z$/, "Z")
, timestamp = (new Date).getTime() / 1e3
, headers_ = {
"x-bce-date": xbceDate,
"x-bce-security-token": file.SESSION_TOKEN,
host: file.endpoint
};
$.ajax({
url: "//" + file.endpoint + resource + "?uploads",
type: "POST",
headers: {
authorization: new baidubce.sdk.Auth(file.AK,file.SK).generateAuthorization("POST", resource, {
uploads: ""
}, headers_, timestamp, 0, Object.keys(headers_)),
"x-bce-date": xbceDate,
"x-bce-security-token": file.SESSION_TOKEN
},
success: function(ret) {
file.uploadId = ret.uploadId,
_this.trigger("BeforeUpload", WUploader, file),
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "UPLOADS_FAIL",
deferred.reject(file)
})
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "PREUPLOAD_FAIL",
deferred.reject(file)
}),
deferred.promise()
},
"before-send": function(block) {
var file = block.file
, resource = "/" + file.bucket + "/" + file.key
, params = {
partNumber: block.chunk + 1,
uploadId: file.uploadId
}
, xbceDate = (new Date).toISOString().replace(/\.\d+Z$/, "Z")
, timestamp = (new Date).getTime() / 1e3
, headers_ = {
"x-bce-date": xbceDate,
"x-bce-security-token": file.SESSION_TOKEN,
host: file.endpoint
};
block.options = {
method: "PUT",
server: "//" + file.endpoint + resource + "?partNumber=" + params.partNumber + "&uploadId=" + params.uploadId,
headers: {
authorization: new baidubce.sdk.Auth(file.AK,file.SK).generateAuthorization("PUT", resource, params, headers_, timestamp, 0, Object.keys(headers_)),
"x-bce-date": xbceDate,
"x-bce-security-token": file.SESSION_TOKEN
}
}
},
"after-send-file": function(file) {
var blocks = file.blocks
, parts = [];
$.each(blocks, function(k, v) {
var etag = v.response._headers.ETag || v.response._headers.etag;
parts[v.chunk] = {
partNumber: v.chunk + 1,
eTag: etag.replace(/^"|"$/g, "")
}
});
var resource = "/" + file.bucket + "/" + file.key
, params = {
uploadId: file.uploadId
}
, xbceDate = (new Date).toISOString().replace(/\.\d+Z$/, "Z")
, timestamp = (new Date).getTime() / 1e3
, headers_ = {
"x-bce-date": xbceDate,
"x-bce-security-token": file.SESSION_TOKEN,
host: file.endpoint
}
, deferred = WebUploader.Deferred();
return $.ajax({
url: "//" + file.endpoint + resource + "?uploadId=" + params.uploadId,
type: "POST",
headers: {
authorization: new baidubce.sdk.Auth(file.AK,file.SK).generateAuthorization("POST", resource, params, headers_, timestamp, 0, Object.keys(headers_)),
"x-bce-date": xbceDate,
"x-bce-security-token": file.SESSION_TOKEN
},
dataType: "json",
data: JSON.stringify({
parts: parts
}),
contentType: "application/json; charset=utf-8",
success: function(ret) {
$.ajax({
url: file.fetch_url,
headers: file.fetch_headers,
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(ret) {
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "FETCH_FAIL",
deferred.reject(file)
})
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "COMPLETE_FAIL",
deferred.reject(file)
}),
deferred.promise()
}
});
else if ("cos" === os)
profile = profile || "ugcupos/fetch",
WebUploader.Uploader.register({
"before-send-file": function(file) {
var deferred = WebUploader.Deferred();
return $.ajax({
url: preUploadUrl,
type: "GET",
data: {
name: file.name,
size: file.size,
r: os,
ssl: 0,
profile: profile
},
dataType: "json",
success: function(ret) {
file.cdn = ret.cdn,
file.post_auth = ret.post_auth,
file.put_auth = ret.put_auth,
file.url = ret.url,
file.fetch_url = ret.fetch_url,
file.fetch_headers = ret.fetch_headers,
file.biz_id = ret.biz_id,
file.bili_filename = ret.bili_filename,
$.ajax({
type: "POST",
url: file.url + "?uploads",
headers: {
Authorization: file.post_auth
},
success: function(ret) {
file.uploadId = $(ret).find("UploadId")[0].textContent,
_this.trigger("BeforeUpload", WUploader, file),
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "UPLOADS_FAIL",
deferred.reject(file)
})
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "PREUPLOAD_FAIL",
deferred.reject(file)
}),
deferred.promise()
},
"before-send": function(block) {
var file = block.file;
block.options = {
server: file.url + "?" + $.param({
partNumber: block.chunk + 1,
uploadId: file.uploadId,
name: file.name
}),
headers: {
Authorization: file.put_auth
}
}
},
"after-send-file": function(file) {
var parts = [];
$.each(file.blocks, function(_, block) {
parts[block.chunk] = block
});
var xml = "<CompleteMultipartUpload>";
$.each(parts, function(chunk, block) {
var etag = block.response._headers.etag || block.response._headers.ETag;
xml += "<Part><PartNumber>" + (chunk + 1) + "</PartNumber><ETag>" + etag.replace(/^"|"$/g, "") + "</ETag></Part>"
}),
xml += "</CompleteMultipartUpload>";
var deferred = WebUploader.Deferred();
return $.ajax({
contentType: "application/xml",
data: xml,
type: "POST",
url: file.url + "?uploadId=" + file.uploadId,
headers: {
Authorization: file.post_auth
},
success: function(r) {
$.ajax({
contentType: "application/json; charset=utf-8",
dataType: "json",
headers: file.fetch_headers,
type: "POST",
url: file.fetch_url,
success: function(ret) {
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "FETCH_FAIL",
deferred.reject(file)
})
},
error: function(err) {
file.statusText = "COMPLETE_FAIL",
deferred.reject(file)
}
}),
deferred.promise()
}
});
else if ("oss" === os) {
function buildAuth(date, method, params, contentMD5, contentType, bucket, key, aki, aks, token) {
var canonicalizedResource;
return canonicalizedResource = bucket || key ? "/" + bucket + "/" + key : "/",
params && (canonicalizedResource += params),
"OSS " + aki + ":" + b64_hmac_sha1(aks, method + "\n" + contentMD5 + "\n" + contentType + "\n" + date + "\n" + ("x-oss-date:" + date + "\nx-oss-security-token:" + token) + "\n" + canonicalizedResource)
}
profile = profile || "ugcupos/fetch",
WebUploader.Uploader.register({
"before-send-file": function(file) {
var deferred = WebUploader.Deferred();
return $.ajax({
url: preUploadUrl,
data: {
name: file.name,
size: file.size,
r: os,
ssl: 0,
profile: profile
},
dataType: "json",
success: function(ret) {
file.js_uploadstart = Date.now(),
file.token = ret.Credentials.SecurityToken,
file.aki = ret.Credentials.AccessKeyId,
file.aks = ret.Credentials.AccessKeySecret,
file.bili_filename = ret.bili_filename,
file.bucket = ret.bucket,
file.key = ret.key,
file.cdn = ret.cdn,
file.endpoint = ret.endpoint,
file.biz_id = ret.biz_id,
file.url = ret.url,
file.fetch_url = ret.fetch_url,
file.fetch_headers = ret.fetch_headers;
var date = (new Date).toUTCString();
$.ajax({
type: "POST",
url: file.url + "?uploads",
headers: {
"x-oss-date": date,
"x-oss-security-token": file.token,
Authorization: buildAuth(date, "POST", "?uploads", "", "", file.bucket, file.key, file.aki, file.aks, file.token)
},
success: function(ret) {
file.uploadId = $(ret).find("UploadId")[0].textContent,
_this.trigger("BeforeUpload", WUploader, file),
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "UPLOADS_FAIL",
deferred.reject(file)
})
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "PREUPLOAD_FAIL",
deferred.reject(file)
}),
deferred.promise()
},
"before-send": function(block) {
var file = block.file
, date = (new Date).toUTCString()
, params = "?" + $.param({
partNumber: block.chunk + 1,
uploadId: file.uploadId
});
block.options = {
server: file.url + params,
headers: {
"x-oss-date": date,
"x-oss-security-token": file.token,
Authorization: buildAuth(date, "PUT", params, "", "", file.bucket, file.key, file.aki, file.aks, file.token)
}
}
},
"after-send-file": function(file) {
var deferred = WebUploader.Deferred()
, etags = new Array;
$.each(file.blocks, function(_, block) {
var etag = block.response._headers.etag || block.response._headers.ETag;
etags[block.chunk] = etag.replace(/^"|"$/g, "")
});
for (var xml = "<CompleteMultipartUpload>", i = 0; i < etags.length; i++)
xml += "<Part><PartNumber>" + (i + 1) + "</PartNumber><ETag>" + etags[i] + "</ETag></Part>";
xml += "</CompleteMultipartUpload>";
var date = (new Date).toUTCString()
, params = "?uploadId=" + file.uploadId;
return $.ajax({
contentType: "application/xml",
data: xml,
type: "POST",
url: file.url + params,
headers: {
"x-oss-date": date,
"x-oss-security-token": file.token,
Authorization: buildAuth(date, "POST", params, "", "application/xml", file.bucket, file.key, file.aki, file.aks, file.token)
}
}).success(function() {
$.ajax({
url: file.fetch_url,
headers: file.fetch_headers,
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(ret) {
deferred.resolve(file)
}
}).retry({
times: 5
}).fail(function() {
file.statusText = "FETCH_FAIL",
deferred.reject(file)
})
}).retry({
times: 5
}).fail(function() {
file.statusText = "COMPLETE_FAIL",
deferred.reject(file)
}),
deferred.promise()
}
})
}
var _this = this
, preUploadUrl = preupload || "/preupload?" + upcdn_query;
WebUploader.log(options);
var chunkSize = 4194304
, threads = 2;
Date.now() - (window.localStorage.getItem("yb_lock") || 0) < 3e4 && (threads = 1,
weblog("yb_lock", {})),
window.location.search.match(/upcdn=office/) && (threads = 8,
chunkSize = 20971520);
var WUploader = new WebUploader.create({
attachInfoToQuery: !1,
auto: !0,
chunked: !0,
method: "PUT",
prepareNextFile: !0,
runtimeOrder: "html5",
sendAsBinary: !0,
dnd: options.dnd,
pick: options.pick,
fileNumLimit: options.fileNumLimit,
fileSizeLimit: options.fileSizeLimit,
fileSingleSizeLimit: options.fileSingleSizeLimit || 4294967296,
accept: options.accept,
duplicate: options.duplicate,
timeout: 9e5,
chunkRetryDelay: options.chunkrRetryDelay || 3e3,
chunkRetry: options.chunkRetry || 200,
chunkSize: chunkSize,
threads: threads
});
WebUploader.log(WUploader.options),
WUploader.total = {
bytesPerSec: 0
},
WUploader.onBeforeFileQueued = function(file) {
if (-1 == ["webp", "raw", "gif", "bmp", "jpeg", "png", "jpg", "eml", "msg", "flac", "wav", "wma", "mp3", "txt", "mp4", "m4a", "m4v", "flv", "avi", "wmv", "mov", "webm", "mpeg4", "ts", "mpg", "rm", "rmvb", "mkv"].indexOf(file.ext.toLowerCase()) || 42949672960 < file.size)
return !1
}
,
WUploader.onFileQueued = function(file) {
_this.trigger("FileFiltered", WUploader, file),
file.on("statuschange", function(status) {
var prev_status = file.status;
"error" == file.status && "progress" == status || (file.status = status),
-1 != ["cancelled", "invalid", "interrupt", "error"].indexOf(status) && weblog("statuschange", {
statusText: file.statusText,
bili_filename: file.bili_filename,
js_uploadstart: file.js_uploadstart,
size: file.size,
bytesPerSec: file.bytesPerSec,
percent: file.percent,
name: file.name,
type: file.type,
lastModifiedDate: file.lastModifiedDate,
id: file.id,
prev_status: prev_status,
status: status
})
})
}
,
WUploader.onUploadError = function(file, reason) {
weblog("upload_error", {
os: os,
cdn: file.cdn,
reason: reason,
bili_filename: file.bili_filename,
status: file.status,
statusText: file.statusText
}),
_this.trigger("Error", {}, {
message: reason,
showText: "异常退出"
})
}
,
WUploader.onError = function(type) {
var showText = type;
"F_DUPLICATE" == type ? showText = "请勿添加重复文件" : "http-" == type ? showText = "网络错误" : "abort" == type ? showText = "异常退出,请稍后再试" : "PREUPLOAD_FAIL" == type ? showText = "获取上传地址失败" : "F_EXCEED_SIZE" == type ? showText = "体积过大" : "Q_TYPE_DENIED" == type ? showText = "类型不支持,支持列表:txt,mp4,flv,avi,wmv,mov,webm,mpeg4,ts,mpg,rm,rmvb,mkv" : "PULL_ERROR" == type && (showText = "通知失败"),
_this.trigger("Error", {}, {
message: type,
showText: showText
}),
weblog("on_error", {
message: type,
showText: showText
})
}
,
WUploader.onStartUpload = function(file) {
WebUploader.log("startUpload")
}
,
WUploader.onUploadStart = function(file) {
WebUploader.log("uploadStart")
}
,
WUploader.onUploadAccept = function(file, ret) {
WebUploader.log("uploadAccept")
}
,
WUploader.onUploadSuccess = function(file, response) {
WebUploader.log("uploadSuccess"),
_this.trigger("FileUploaded", WUploader, file, {})
}
,
WUploader.onUploadBeforeSend = function(object, data, headers) {
WebUploader.log("uploadBeforeSend")
}
,
WUploader.onUploadProgress = function(file, percentage) {
window.localStorage.setItem("yb_lock", Date.now());
var time = Date.now()
, bytesPerSec = (percentage - (file.prev_percentage || 0)) * file.size / (time - (file.prev_time || Date.now())) * 1e3;
file.percent = Math.round(100 * percentage),
file.bytesPerSec = bytesPerSec,
_this.trigger("UploadProgress", {
total: {
bytesPerSec: bytesPerSec
}
}, file),
(2e3 < time - file.prev_time || !file.prev_time) && (file.prev_percentage = percentage,
file.prev_time = time)
}
,
this.removeFile = function(file) {
return WebUploader.log("removeFile"),
WUploader.removeFile(WUploader.getFile(file.id))
}
,
WebUploader.log(WUploader.predictRuntimeType()),
this.addFiles = WUploader.addFiles,
this.getFile = function(fileid) {
return WUploader.getFile(fileid)
}
,
this.destroy = function() {
return WebUploader.Uploader.unRegister("_"),
WebUploader.log("WUploader.destroy()"),
WUploader.destroy()
}
,
this.init = function() {}
,
this.retry = function() {
return WUploader.retry()
}
,
this.start = function() {
return WUploader.stop(!0),
WUploader.upload()
}
,
this.upload = function() {
return WUploader.upload()
}
,
this.formatSize = WebUploader.formatSize,
this.stop = function() {
return WUploader.stop(!0)
}
,
Object.defineProperty(this, "files", {
get: function() {
return WUploader.getFiles()
}
}),
WebUploader.Mediator.installTo(this),
this.bind = this.on,
this.addUrl = function(pull_url) {
$.ajax({
url: "//member.bilibili.com/preupload",
type: "get",
data: {
r: "head",
url: pull_url
},
async: !1,
dataType: "json",
success: function(ret) {
ret,
WebUploader.log(ret)
}
});
var file = {
percent: 100,
size: 1,
id: WebUploader.guid(),
name: pull_url.split(/(\\|\/)/g).pop()
};
$.ajax({
url: "//member.bilibili.com/preupload?name=a.flv&r=upos&profile=ugcupos/addurl",
async: !1,
dataType: "json",
success: function(ret) {
file.auth = ret.auth,
file.upos_uri = ret.upos_uri,
file.biz_id = ret.biz_id,
file.endpoint = ret.endpoint,
file.bili_filename = ret.upos_uri.split(/(\\|\/)/g).pop().split(".")[0]
}
}),
_this.trigger("FileFiltered", {}, file),
_this.trigger("BeforeUpload", {}, file),
$.ajax({
url: file.upos_uri.replace(/^upos:\/\//, file.endpoint + "/") + "?fetch&yamdi=1&output=json&profile=ugcupos/addurl&biz_id=" + file.biz_id,
type: "post",
async: !1,
headers: {
"X-Upos-Fetch-Source": pull_url,
"X-Upos-Auth": file.auth
},
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(ret) {}
}).retry({
times: 5
}).fail(function() {
file.statusText = "COMPLETE_FAIL"
}),
_this.trigger("UploadProgress", {
total: {
bytesPerSec: 0
}
}, file),
_this.trigger("FileUploaded", {}, file)
}
}
;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment