diff --git a/.env.hella13 b/.env.hella13
new file mode 100644
index 0000000..6c92015
--- /dev/null
+++ b/.env.hella13
@@ -0,0 +1,11 @@
+VITE_BASE_URL=http://172.21.32.13:81/api/admin-api
+VITE_BASE_URL_IMAGE=http://172.21.32.13:81/admin-api
+
+# 租户配置
+VITE_TENANT='[{"text":"长春","value":1}]'
+
+# 是否是测试环境
+VITE_isDevelopment=false
+
+# 积木报表请求路径
+VITE_JMREPORT_BASE_URL='http://172.21.32.13:90'
diff --git a/.env.hella14 b/.env.hella14
new file mode 100644
index 0000000..531b171
--- /dev/null
+++ b/.env.hella14
@@ -0,0 +1,11 @@
+VITE_BASE_URL=http://172.21.32.14:81/api/admin-api
+VITE_BASE_URL_IMAGE=http://172.21.32.14:81/admin-api
+
+# 租户配置
+VITE_TENANT='[{"text":"长春","value":1}]'
+
+# 是否是测试环境
+VITE_isDevelopment=false
+
+# 积木报表请求路径
+VITE_JMREPORT_BASE_URL='http://172.21.32.14:90'
diff --git a/.env.hella15 b/.env.hella15
new file mode 100644
index 0000000..272382a
--- /dev/null
+++ b/.env.hella15
@@ -0,0 +1,11 @@
+VITE_BASE_URL=https://scp.faway-hella.com:81/api/admin-api
+VITE_BASE_URL_IMAGE=https://scp.faway-hella.com:81/admin-api
+
+# 租户配置
+VITE_TENANT='[{"text":"长春","value":1}]'
+
+# 是否是测试环境
+VITE_isDevelopment=false
+
+# 积木报表请求路径
+VITE_JMREPORT_BASE_URL='https://scp.faway-hella.com'
diff --git a/.env.hella16 b/.env.hella16
new file mode 100644
index 0000000..12a1e8c
--- /dev/null
+++ b/.env.hella16
@@ -0,0 +1,11 @@
+VITE_BASE_URL=https://scptest.faway-hella.com:81/api/admin-api
+VITE_BASE_URL_IMAGE=https://scptest.faway-hella.com:81/admin-api
+
+# 租户配置
+VITE_TENANT='[{"text":"长春","value":1},{"text":"成都","value":2}]'
+
+# 是否是测试环境
+VITE_isDevelopment=false
+
+# 积木报表请求路径
+VITE_JMREPORT_BASE_URL='https://scptest.faway-hella.com'
diff --git a/.env.hella8 b/.env.hella8
new file mode 100644
index 0000000..d937607
--- /dev/null
+++ b/.env.hella8
@@ -0,0 +1,12 @@
+VITE_BASE_URL=http://172.22.32.8:81/api/admin-api
+VITE_BASE_URL_IMAGE=http://172.22.32.8:81/admin-api
+
+# 租户配置
+VITE_TENANT='[{"text":"成都","value":2}]'
+
+# 是否是测试环境
+VITE_isDevelopment=false
+
+
+# 积木报表请求路径
+VITE_JMREPORT_BASE_URL='http://172.22.32.8:90'
diff --git a/.env.hella9 b/.env.hella9
new file mode 100644
index 0000000..588c20f
--- /dev/null
+++ b/.env.hella9
@@ -0,0 +1,11 @@
+VITE_BASE_URL=http://172.22.32.9:81/api/admin-api
+VITE_BASE_URL_IMAGE=http://172.22.32.9:81/admin-api
+
+# 租户配置
+VITE_TENANT='[{"text":"成都","value":2}]'
+
+# 是否是测试环境
+VITE_isDevelopment=false
+
+# 积木报表请求路径
+VITE_JMREPORT_BASE_URL='http://172.22.32.9:90'
diff --git a/src/common/config.js b/src/common/config.js
new file mode 100644
index 0000000..67d4d8c
--- /dev/null
+++ b/src/common/config.js
@@ -0,0 +1,9 @@
+export const overPagePrint="overPage_print"
+export const overPageTemplate="overPage_Template"
+//3分钟刷新
+export const planRefreshTime=3*60*1000
+
+export const issueJobFilter="issue_job_filter"
+export const repleinshJobFilter="repleinsh_job_filter"
+export const overPackageJobFilter="over_package_job_filter"
+export const productionReceiptJobFilter="production_receipt_job_filter"
\ No newline at end of file
diff --git a/src/common/noclick.js b/src/common/noclick.js
new file mode 100644
index 0000000..6bec4fe
--- /dev/null
+++ b/src/common/noclick.js
@@ -0,0 +1,44 @@
+// 防止处理多次点击
+function noMultipleClicks(methods, info) {
+ // methods是需要点击后需要执行的函数, info是点击需要传的参数
+ let that = this;
+ if (that.noClick) {
+ // 第一次点击
+ that.noClick= false;
+ if(info && info !== '') {
+ // info是执行函数需要传的参数
+ methods(info);
+ } else {
+ methods();
+ }
+ let timer = setTimeout(()=> {
+ that.noClick= true;
+ clearTimeout(timer)
+ }, 2000)
+ } else {
+ // 这里是重复点击的判断
+ }
+}
+
+
+// 节流函数
+const throttle = (fn, t,_this) => {
+ console.log('throttle')
+ return ()=> {
+ if (!_this.timer) {
+ _this.timer = setTimeout(()=>{
+ console.log('fn')
+ //·清空定时器
+ _this.timer = null
+ }, t)
+ fn()
+ }
+ }
+}
+
+
+//导出
+export default {
+ noMultipleClicks,//禁止多次点击
+ throttle
+}
diff --git a/src/components/kk-printer/empty-icon.png b/src/components/kk-printer/empty-icon.png
new file mode 100644
index 0000000..1f61685
Binary files /dev/null and b/src/components/kk-printer/empty-icon.png differ
diff --git a/src/components/kk-printer/index.vue b/src/components/kk-printer/index.vue
new file mode 100644
index 0000000..3df817a
--- /dev/null
+++ b/src/components/kk-printer/index.vue
@@ -0,0 +1,416 @@
+
+
+
+ {{isPrinting?printingText:defaultText}}
+
+
+
+
+
+ 根据SRRI过滤设备
+
+
+
+ 根据蓝牙名过滤
+
+
+
+
+ 搜索设备
+
+
+ 搜索中...
+
+
+ 停止搜索
+
+
+
+
+
+ ~ 无可搜索到的设备 ~
+
+
+
+
+ 设备名称:
+ {{item.name?item.name:'未命名'}}
+
+
+
+ 设备ID:
+ {{item.deviceId}}
+
+
+ advMac:
+ {{item.advMac}}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/kk-printer/utils/barcode.js b/src/components/kk-printer/utils/barcode.js
new file mode 100644
index 0000000..0838c8e
--- /dev/null
+++ b/src/components/kk-printer/utils/barcode.js
@@ -0,0 +1,402 @@
+var CHAR_TILDE = 126;
+var CODE_FNC1 = 102;
+
+var SET_STARTA = 103;
+var SET_STARTB = 104;
+var SET_STARTC = 105;
+var SET_SHIFT = 98;
+var SET_CODEA = 101;
+var SET_CODEB = 100;
+var SET_STOP = 106;
+
+
+var REPLACE_CODES = {
+ CHAR_TILDE: CODE_FNC1 //~ corresponds to FNC1 in GS1-128 standard
+}
+
+var CODESET = {
+ ANY: 1,
+ AB: 2,
+ A: 3,
+ B: 4,
+ C: 5
+};
+
+function getBytes(str) {
+ var bytes = [];
+ for (var i = 0; i < str.length; i++) {
+ bytes.push(str.charCodeAt(i));
+ }
+ return bytes;
+}
+
+exports.code128 = function (ctx, text, width, height) {
+
+ width = parseInt(width);
+
+ height = parseInt(height);
+
+ var codes = stringToCode128(text);
+
+ var g = new Graphics(ctx, width, height);
+
+ var barWeight = g.area.width / ((codes.length - 3) * 11 + 35);
+
+ var x = g.area.left;
+ var y = g.area.top;
+ for (var i = 0; i < codes.length; i++) {
+ var c = codes[i];
+ //two bars at a time: 1 black and 1 white
+ for (var bar = 0; bar < 8; bar += 2) {
+ var barW = PATTERNS[c][bar] * barWeight;
+ // var barH = height - y - this.border;
+ var barH = height - y;
+ var spcW = PATTERNS[c][bar + 1] * barWeight;
+
+ //no need to draw if 0 width
+ if (barW > 0) {
+ g.fillFgRect(x, y, barW, barH);
+ }
+
+ x += barW + spcW;
+ }
+ }
+
+ ctx.draw();
+}
+
+
+function stringToCode128(text) {
+
+ var barc = {
+ currcs: CODESET.C
+ };
+
+ var bytes = getBytes(text);
+ //decide starting codeset
+ var index = bytes[0] == CHAR_TILDE ? 1 : 0;
+
+ var csa1 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
+ var csa2 = bytes.length > 0 ? codeSetAllowedFor(bytes[index++]) : CODESET.AB;
+ barc.currcs = getBestStartSet(csa1, csa2);
+ barc.currcs = perhapsCodeC(bytes, barc.currcs);
+
+ //if no codeset changes this will end up with bytes.length+3
+ //start, checksum and stop
+ var codes = new Array();
+
+ switch (barc.currcs) {
+ case CODESET.A:
+ codes.push(SET_STARTA);
+ break;
+ case CODESET.B:
+ codes.push(SET_STARTB);
+ break;
+ default:
+ codes.push(SET_STARTC);
+ break;
+ }
+
+
+ for (var i = 0; i < bytes.length; i++) {
+ var b1 = bytes[i]; //get the first of a pair
+ //should we translate/replace
+ if (b1 in REPLACE_CODES) {
+ codes.push(REPLACE_CODES[b1]);
+ i++ //jump to next
+ b1 = bytes[i];
+ }
+
+ //get the next in the pair if possible
+ var b2 = bytes.length > (i + 1) ? bytes[i + 1] : -1;
+
+ codes = codes.concat(codesForChar(b1, b2, barc.currcs));
+ //code C takes 2 chars each time
+ if (barc.currcs == CODESET.C) i++;
+ }
+
+ //calculate checksum according to Code 128 standards
+ var checksum = codes[0];
+ for (var weight = 1; weight < codes.length; weight++) {
+ checksum += (weight * codes[weight]);
+ }
+ codes.push(checksum % 103);
+
+ codes.push(SET_STOP);
+
+ //encoding should now be complete
+ return codes;
+
+ function getBestStartSet(csa1, csa2) {
+ //tries to figure out the best codeset
+ //to start with to get the most compact code
+ var vote = 0;
+ vote += csa1 == CODESET.A ? 1 : 0;
+ vote += csa1 == CODESET.B ? -1 : 0;
+ vote += csa2 == CODESET.A ? 1 : 0;
+ vote += csa2 == CODESET.B ? -1 : 0;
+ //tie goes to B due to my own predudices
+ return vote > 0 ? CODESET.A : CODESET.B;
+ }
+
+ function perhapsCodeC(bytes, codeset) {
+ for (var i = 0; i < bytes.length; i++) {
+ var b = bytes[i]
+ if ((b < 48 || b > 57) && b != CHAR_TILDE)
+ return codeset;
+ }
+ return CODESET.C;
+ }
+
+ //chr1 is current byte
+ //chr2 is the next byte to process. looks ahead.
+ function codesForChar(chr1, chr2, currcs) {
+ var result = [];
+ var shifter = -1;
+
+ if (charCompatible(chr1, currcs)) {
+ if (currcs == CODESET.C) {
+ if (chr2 == -1) {
+ shifter = SET_CODEB;
+ currcs = CODESET.B;
+ }
+ else if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
+ //need to check ahead as well
+ if (charCompatible(chr2, CODESET.A)) {
+ shifter = SET_CODEA;
+ currcs = CODESET.A;
+ }
+ else {
+ shifter = SET_CODEB;
+ currcs = CODESET.B;
+ }
+ }
+ }
+ }
+ else {
+ //if there is a next char AND that next char is also not compatible
+ if ((chr2 != -1) && !charCompatible(chr2, currcs)) {
+ //need to switch code sets
+ switch (currcs) {
+ case CODESET.A:
+ shifter = SET_CODEB;
+ currcs = CODESET.B;
+ break;
+ case CODESET.B:
+ shifter = SET_CODEA;
+ currcs = CODESET.A;
+ break;
+ }
+ }
+ else {
+ //no need to shift code sets, a temporary SHIFT will suffice
+ shifter = SET_SHIFT;
+ }
+ }
+
+ //ok some type of shift is nessecary
+ if (shifter != -1) {
+ result.push(shifter);
+ result.push(codeValue(chr2));
+ }
+ else {
+ if (currcs == CODESET.C) {
+ //include next as well
+ result.push(codeValue(chr1, chr2));
+ }
+ else {
+ result.push(codeValue(chr1));
+ }
+ }
+ barc.currcs = currcs;
+
+ return result;
+ }
+}
+
+//reduce the ascii code to fit into the Code128 char table
+function codeValue(chr1, chr2) {
+ if (typeof chr2 == "undefined") {
+ return chr1 >= 32 ? chr1 - 32 : chr1 + 64;
+ }
+ else {
+ return parseInt(String.fromCharCode(chr1) + String.fromCharCode(chr2));
+ }
+}
+
+function charCompatible(chr, codeset) {
+ var csa = codeSetAllowedFor(chr);
+ if (csa == CODESET.ANY) return true;
+ //if we need to change from current
+ if (csa == CODESET.AB) return true;
+ if (csa == CODESET.A && codeset == CODESET.A) return true;
+ if (csa == CODESET.B && codeset == CODESET.B) return true;
+ return false;
+}
+
+function codeSetAllowedFor(chr) {
+ if (chr >= 48 && chr <= 57) {
+ //0-9
+ return CODESET.ANY;
+ }
+ else if (chr >= 32 && chr <= 95) {
+ //0-9 A-Z
+ return CODESET.AB;
+ }
+ else {
+ //if non printable
+ return chr < 32 ? CODESET.A : CODESET.B;
+ }
+}
+
+var Graphics = function(ctx, width, height) {
+
+ this.width = width;
+ this.height = height;
+ this.quiet = Math.round(this.width / 40);
+
+ this.border_size = 0;
+ this.padding_width = 0;
+
+ this.area = {
+ width : width - this.padding_width * 2 - this.quiet * 2,
+ height: height - this.border_size * 2,
+ top : this.border_size - 4,
+ left : this.padding_width + this.quiet
+ };
+
+ this.ctx = ctx;
+ this.fg = "#000000";
+ this.bg = "#ffffff";
+
+ // fill background
+ this.fillBgRect(0,0, width, height);
+
+ // fill center to create border
+ this.fillBgRect(0, this.border_size, width, height - this.border_size * 2);
+}
+
+//use native color
+Graphics.prototype._fillRect = function(x, y, width, height, color) {
+ this.ctx.setFillStyle(color)
+ this.ctx.fillRect(x, y, width, height)
+}
+
+Graphics.prototype.fillFgRect = function(x,y, width, height) {
+ this._fillRect(x, y, width, height, this.fg);
+}
+
+Graphics.prototype.fillBgRect = function(x,y, width, height) {
+ this._fillRect(x, y, width, height, this.bg);
+}
+
+var PATTERNS = [
+ [2, 1, 2, 2, 2, 2, 0, 0], // 0
+ [2, 2, 2, 1, 2, 2, 0, 0], // 1
+ [2, 2, 2, 2, 2, 1, 0, 0], // 2
+ [1, 2, 1, 2, 2, 3, 0, 0], // 3
+ [1, 2, 1, 3, 2, 2, 0, 0], // 4
+ [1, 3, 1, 2, 2, 2, 0, 0], // 5
+ [1, 2, 2, 2, 1, 3, 0, 0], // 6
+ [1, 2, 2, 3, 1, 2, 0, 0], // 7
+ [1, 3, 2, 2, 1, 2, 0, 0], // 8
+ [2, 2, 1, 2, 1, 3, 0, 0], // 9
+ [2, 2, 1, 3, 1, 2, 0, 0], // 10
+ [2, 3, 1, 2, 1, 2, 0, 0], // 11
+ [1, 1, 2, 2, 3, 2, 0, 0], // 12
+ [1, 2, 2, 1, 3, 2, 0, 0], // 13
+ [1, 2, 2, 2, 3, 1, 0, 0], // 14
+ [1, 1, 3, 2, 2, 2, 0, 0], // 15
+ [1, 2, 3, 1, 2, 2, 0, 0], // 16
+ [1, 2, 3, 2, 2, 1, 0, 0], // 17
+ [2, 2, 3, 2, 1, 1, 0, 0], // 18
+ [2, 2, 1, 1, 3, 2, 0, 0], // 19
+ [2, 2, 1, 2, 3, 1, 0, 0], // 20
+ [2, 1, 3, 2, 1, 2, 0, 0], // 21
+ [2, 2, 3, 1, 1, 2, 0, 0], // 22
+ [3, 1, 2, 1, 3, 1, 0, 0], // 23
+ [3, 1, 1, 2, 2, 2, 0, 0], // 24
+ [3, 2, 1, 1, 2, 2, 0, 0], // 25
+ [3, 2, 1, 2, 2, 1, 0, 0], // 26
+ [3, 1, 2, 2, 1, 2, 0, 0], // 27
+ [3, 2, 2, 1, 1, 2, 0, 0], // 28
+ [3, 2, 2, 2, 1, 1, 0, 0], // 29
+ [2, 1, 2, 1, 2, 3, 0, 0], // 30
+ [2, 1, 2, 3, 2, 1, 0, 0], // 31
+ [2, 3, 2, 1, 2, 1, 0, 0], // 32
+ [1, 1, 1, 3, 2, 3, 0, 0], // 33
+ [1, 3, 1, 1, 2, 3, 0, 0], // 34
+ [1, 3, 1, 3, 2, 1, 0, 0], // 35
+ [1, 1, 2, 3, 1, 3, 0, 0], // 36
+ [1, 3, 2, 1, 1, 3, 0, 0], // 37
+ [1, 3, 2, 3, 1, 1, 0, 0], // 38
+ [2, 1, 1, 3, 1, 3, 0, 0], // 39
+ [2, 3, 1, 1, 1, 3, 0, 0], // 40
+ [2, 3, 1, 3, 1, 1, 0, 0], // 41
+ [1, 1, 2, 1, 3, 3, 0, 0], // 42
+ [1, 1, 2, 3, 3, 1, 0, 0], // 43
+ [1, 3, 2, 1, 3, 1, 0, 0], // 44
+ [1, 1, 3, 1, 2, 3, 0, 0], // 45
+ [1, 1, 3, 3, 2, 1, 0, 0], // 46
+ [1, 3, 3, 1, 2, 1, 0, 0], // 47
+ [3, 1, 3, 1, 2, 1, 0, 0], // 48
+ [2, 1, 1, 3, 3, 1, 0, 0], // 49
+ [2, 3, 1, 1, 3, 1, 0, 0], // 50
+ [2, 1, 3, 1, 1, 3, 0, 0], // 51
+ [2, 1, 3, 3, 1, 1, 0, 0], // 52
+ [2, 1, 3, 1, 3, 1, 0, 0], // 53
+ [3, 1, 1, 1, 2, 3, 0, 0], // 54
+ [3, 1, 1, 3, 2, 1, 0, 0], // 55
+ [3, 3, 1, 1, 2, 1, 0, 0], // 56
+ [3, 1, 2, 1, 1, 3, 0, 0], // 57
+ [3, 1, 2, 3, 1, 1, 0, 0], // 58
+ [3, 3, 2, 1, 1, 1, 0, 0], // 59
+ [3, 1, 4, 1, 1, 1, 0, 0], // 60
+ [2, 2, 1, 4, 1, 1, 0, 0], // 61
+ [4, 3, 1, 1, 1, 1, 0, 0], // 62
+ [1, 1, 1, 2, 2, 4, 0, 0], // 63
+ [1, 1, 1, 4, 2, 2, 0, 0], // 64
+ [1, 2, 1, 1, 2, 4, 0, 0], // 65
+ [1, 2, 1, 4, 2, 1, 0, 0], // 66
+ [1, 4, 1, 1, 2, 2, 0, 0], // 67
+ [1, 4, 1, 2, 2, 1, 0, 0], // 68
+ [1, 1, 2, 2, 1, 4, 0, 0], // 69
+ [1, 1, 2, 4, 1, 2, 0, 0], // 70
+ [1, 2, 2, 1, 1, 4, 0, 0], // 71
+ [1, 2, 2, 4, 1, 1, 0, 0], // 72
+ [1, 4, 2, 1, 1, 2, 0, 0], // 73
+ [1, 4, 2, 2, 1, 1, 0, 0], // 74
+ [2, 4, 1, 2, 1, 1, 0, 0], // 75
+ [2, 2, 1, 1, 1, 4, 0, 0], // 76
+ [4, 1, 3, 1, 1, 1, 0, 0], // 77
+ [2, 4, 1, 1, 1, 2, 0, 0], // 78
+ [1, 3, 4, 1, 1, 1, 0, 0], // 79
+ [1, 1, 1, 2, 4, 2, 0, 0], // 80
+ [1, 2, 1, 1, 4, 2, 0, 0], // 81
+ [1, 2, 1, 2, 4, 1, 0, 0], // 82
+ [1, 1, 4, 2, 1, 2, 0, 0], // 83
+ [1, 2, 4, 1, 1, 2, 0, 0], // 84
+ [1, 2, 4, 2, 1, 1, 0, 0], // 85
+ [4, 1, 1, 2, 1, 2, 0, 0], // 86
+ [4, 2, 1, 1, 1, 2, 0, 0], // 87
+ [4, 2, 1, 2, 1, 1, 0, 0], // 88
+ [2, 1, 2, 1, 4, 1, 0, 0], // 89
+ [2, 1, 4, 1, 2, 1, 0, 0], // 90
+ [4, 1, 2, 1, 2, 1, 0, 0], // 91
+ [1, 1, 1, 1, 4, 3, 0, 0], // 92
+ [1, 1, 1, 3, 4, 1, 0, 0], // 93
+ [1, 3, 1, 1, 4, 1, 0, 0], // 94
+ [1, 1, 4, 1, 1, 3, 0, 0], // 95
+ [1, 1, 4, 3, 1, 1, 0, 0], // 96
+ [4, 1, 1, 1, 1, 3, 0, 0], // 97
+ [4, 1, 1, 3, 1, 1, 0, 0], // 98
+ [1, 1, 3, 1, 4, 1, 0, 0], // 99
+ [1, 1, 4, 1, 3, 1, 0, 0], // 100
+ [3, 1, 1, 1, 4, 1, 0, 0], // 101
+ [4, 1, 1, 1, 3, 1, 0, 0], // 102
+ [2, 1, 1, 4, 1, 2, 0, 0], // 103
+ [2, 1, 1, 2, 1, 4, 0, 0], // 104
+ [2, 1, 1, 2, 3, 2, 0, 0], // 105
+ [2, 3, 3, 1, 1, 1, 2, 0] // 106
+]
+
diff --git a/src/components/kk-printer/utils/bluetoolth.js b/src/components/kk-printer/utils/bluetoolth.js
new file mode 100644
index 0000000..764172d
--- /dev/null
+++ b/src/components/kk-printer/utils/bluetoolth.js
@@ -0,0 +1,723 @@
+/**
+ * @export
+ * @param {string} name 微信api的名称 ,如 uniAsyncPromise("getSystemInfo",options)
+ * @param {object} options 除了success 和 fail 的其他参数
+ * @returns
+ */
+export function uniAsyncPromise(name, options) {
+ return new Promise((resolve, reject) => {
+ uni[name]({
+ ...(options || {}),
+ // ...options,
+ success: (res) => {
+ resolve(res);
+ },
+ fail: (err) => {
+ reject(err);
+ }
+ });
+ });
+}
+//微信小程序向蓝牙打印机发送数据进行打印的坑:
+//小程序api向蓝牙打印机发送数据打印,发送的任何内容都应该要转成二进制数据,而且蓝牙打印的文本编码是GBK的,发送中文需转成GBK编码再转成二进制数据发送
+//发送打印机指令也要转成二进制数据发送
+//蓝牙打印机一次接收的二级制数据有限制,不同的系统不同的蓝牙设备限制可能不同,微信建议一次20个字节,需做递归分包发送
+//发送完要打印的内容后,一定要发送一个打印的指令才能顺利打印 (有些指令就不需要)
+
+//一、初始化蓝牙、开始检索蓝牙设备
+// { allowDuplicatesKey: true, interval: 500}
+export function openBlue() {
+ return uniAsyncPromise('openBluetoothAdapter')
+}
+
+export function startBluetoothDevicesDiscovery(option) {
+ console.log('开始蓝牙扫描');
+ uniAsyncPromise('startBluetoothDevicesDiscovery', option).then((res) => {
+ console.log('正在搜寻蓝牙设备', res);
+ });
+}
+
+export function getConnectedBluetoothDevices(option) {
+ console.log('开始获取已连接设备');
+ return uniAsyncPromise('getConnectedBluetoothDevices', option)
+}
+//二、
+/**
+ *
+ *
+ * @export
+ * @param {function} getDevices uni.getBluetoothDevices的监听回调函数
+ */
+export function onfindBlueDevices(getDevices) {
+ //监听寻找到新设备的事件
+ uni.onBluetoothDeviceFound((devices)=>{
+ //获取在蓝牙模块生效期间所有已发现的蓝牙设备
+ uniAsyncPromise('getBluetoothDevices').then((res) => {
+ getDevices && getDevices(res.devices);
+ });
+ });
+}
+
+/**
+ * @export
+ * @param {function} stopBlueDevicesDiscovery 关闭蓝牙扫描
+ */
+export function stopBlueDevicesDiscovery() {
+ //监听寻找到新设备的事件
+ console.log('停止蓝牙扫描');
+ return uniAsyncPromise('stopBluetoothDevicesDiscovery').then((res) => {
+ console.log('停止搜寻蓝牙设备', res);
+ });
+}
+
+
+
+//三、连接蓝牙设备
+/**
+ * @export
+ * @param {function} createBLEConnection
+ * @param {number} deviceId 蓝牙设备id
+ */
+export function createBLEConnection(deviceId, sucess, fail) {
+ //连接蓝牙设备
+ console.log('连接蓝牙设备', deviceId);
+ uniAsyncPromise("createBLEConnection", {
+ deviceId
+ })
+ .then(res => {
+ //连接成功可选择停止搜索蓝牙
+ //stopBlueDevicesDiscovery();
+ console.log('连接成功');
+ sucess && sucess({
+ res: res,
+ });
+ })
+ .catch(res => {
+ console.log('连接设备异常' + res);
+ fail && fail({
+ res: res,
+ });
+ })
+ /*.finally(res=>{
+ console.log('连接成功');
+ sucess && sucess({
+ res: res,
+ });
+ });*/
+}
+
+export function closeBLEConnection(deviceId) {
+ console.log('断开蓝牙设备', deviceId);
+ uniAsyncPromise("closeBLEConnection", {
+ deviceId
+ })
+ .then(res => {
+ console.log('BLEDisconnect complete', res);
+ })
+ .catch(res => {
+ console.log('断开设备异常' + res);
+ })
+ /*.finally(res=>{
+ console.log('BLEDisconnect complete', res);
+ }); */
+}
+
+//四、连接成功后, 获取蓝牙设备的service服务
+// uniAsyncPromise("getBLEDeviceServices",{deviceId:""}).then(res=>{})
+export function getBLEDeviceServices(deviceId, success, fail) {
+ console.log('获取ServiceId', deviceId);
+ //加延迟避免取不到service
+ setTimeout(()=>{
+ uniAsyncPromise("getBLEDeviceServices", {
+ deviceId:deviceId
+ })
+ .then(res => {
+ console.log('服务', res);
+ success && success({
+ serviceId: res.services,
+ });
+ })
+ .catch((res) => {
+ //getBLEDeviceServices(deviceId, success, fail);
+ console.log('获取ServiceId异常' + res);
+ fail && fail({
+ res: res,
+ });
+ });
+ },1000)
+}
+
+//五、获取的service服务可能有多个,递归获取特征值(最后要用的是能读,能写,能监听的那个值的uuid作为特征值id)
+/**
+ *
+ *
+ * @export
+ * @param {number} deviceId 蓝牙设备id
+ * @param {array} services uniAsyncPromise("getBLEDeviceServices",{deviceId:""}).then(res=>{})获取的res.services
+ * @param {function} success 成功取得有用特征值uuid的回调函数
+ */
+export function getDeviceCharacteristics(deviceId, services, success, fail) {
+ //services = services.slice(0);
+ console.log('获取Characteristics', deviceId, services);
+ if (services.length) {
+ const serviceId = services.shift().uuid;
+ console.log('ServceID ', serviceId);
+ uniAsyncPromise('getBLEDeviceCharacteristics', {
+ deviceId,
+ serviceId,
+ })
+ .then((res) => {
+ console.log('getBLEDeviceCharacteristics', deviceId, serviceId, res);
+ let finished = false;
+ let write = false;
+ let notify = false;
+ let indicate = false;
+ var readId;
+ var writeId;
+ //有斑马品牌的一款打印机中res.characteristics的所有uuid都是相同的,找所有的properties存在(notify || indicate) && write这种情况就说明这个uuid是可用的(不确保所有的打印机都能用这种方式取得uuid,在主要测试得凯盛诺打印机res.characteristic只有一个uuid,所以也能用这个方式)
+ for (var i = 0; i < res.characteristics.length; i++) {
+ if (!notify) {
+ notify = res.characteristics[i].properties.notify;
+ if (notify) readId = res.characteristics[i].uuid;
+ }
+ if (!indicate) {
+ indicate = res.characteristics[i].properties.indicate;
+ if (indicate) readId = res.characteristics[i].uuid;
+ }
+ if (!write) {
+ write = res.characteristics[i].properties.write;
+ writeId = res.characteristics[i].uuid;
+ }
+ if ((notify || indicate) && write) {
+ /* 获取蓝牙特征值uuid */
+ success &&
+ success({
+ serviceId,
+ writeId: writeId,
+ readId: readId,
+ });
+ finished = true;
+ break;
+ }
+ }
+
+ if (!finished) {
+ getDeviceCharacteristics(deviceId, services, success, fail);
+ }
+ })
+ .catch((res) => {
+ getDeviceCharacteristics(deviceId, services, success, fail);
+ });
+ } else {
+ fail && fail();
+ }
+}
+
+//六、启动notify 蓝牙监听功能 然后使用 uni.onBLECharacteristicValueChange用来监听蓝牙设备传递数据
+/**
+ * @export
+ * @param {object} options
+ * {
+ deviceId,//蓝牙设备id
+ serviceId,//服务id
+ characteristicId,//可用特征值uuid
+ }
+ * @param {function} onChange 监听蓝牙设备传递数据回调函数
+ */
+export function onGetBLECharacteristicValueChange(options, onChange = function() {}) {
+ console.log('deviceId ', options.deviceId);
+ console.log('serviceId ', options.serviceId);
+ console.log('characteristicId ', options.characteristicId);
+ uniAsyncPromise('notifyBLECharacteristicValueChange', {
+ state: true,
+ ...options,
+ }).then((res) => {
+ console.log('onBLECharacteristicValueChange ');
+ uni.onBLECharacteristicValueChange(onChange);
+ });
+}
+
+//七、发送数据(递归分包发送)
+/**
+ * @export
+ * @param {object} options
+ * {
+ deviceId,
+ serviceId,
+ characteristicId,
+ value [ArrayBuffer],
+ lasterSuccess,
+ onceLength
+ }
+ */
+
+export function sendDataToDevice(options) {
+ let byteLength = options.value.byteLength;
+ //这里默认一次20个字节发送
+ const speed = options.onceLength; //20;
+ console.log("send data 20");
+ console.log(options);
+ if (byteLength > 0) {
+ uniAsyncPromise('writeBLECharacteristicValue', {
+ ...options,
+ value: options.value.slice(0, byteLength > speed ? speed : byteLength),
+ })
+ .then((res) => {
+ if (byteLength > speed) {
+ sendDataToDevice({
+ ...options,
+ value: options.value.slice(speed, byteLength),
+ });
+ } else {
+ options.lasterSuccess && options.lasterSuccess();
+ }
+ })
+ .catch((res) => {
+ console.log(res);
+ });
+ }
+}
+export function charToArrayBuffer(str) {
+ var out = new ArrayBuffer(str.length);
+ var uint8 = new Uint8Array(out);
+ var strs = str.split('');
+ for (var i = 0; i < strs.length; i++) {
+ uint8[i] = strs[i].charCodeAt();
+ }
+ return uint8;
+}
+export function charToArray(str) {
+ var arr = [];
+ var strs = str.split('');
+ for (var i = 0; i < strs.length; i++) {
+ arr[i] = strs[i].charCodeAt();
+ }
+ return arr;
+}
+//打印二维码
+/**
+ * @export
+ * @param {object} options
+ * {
+ deviceId,
+ serviceId,
+ characteristicId,
+ value,//ArrayBuffer:二维码的数据
+ }
+ */
+export function printQR(options) {
+ //打印二维码的十进制指令data:
+ let data = [29, 107, 97, 7, 4, options.value.byteLength, 0];
+ sendDataToDevice({
+ ...options,
+ value: new Uint8Array(data).buffer,
+ lasterSuccess: () => {
+ //指令发送成功后,发送二维码的数据
+ sendDataToDevice(options);
+ },
+ });
+}
+
+function grayPixle(pix) {
+ return pix[0] * 0.299 + pix[1] * 0.587 + pix[2] * 0.114;
+}
+
+export function overwriteImageData(data) {
+ let sendWidth = data.width,
+ sendHeight = data.height;
+ const threshold = data.threshold || 180;
+ let sendImageData = new ArrayBuffer((sendWidth * sendHeight) / 8);
+ sendImageData = new Uint8Array(sendImageData);
+ let pix = data.imageData;
+ const part = [];
+ let index = 0;
+ for (let i = 0; i < pix.length; i += 32) {
+ //横向每8个像素点组成一个字节(8位二进制数)。
+ for (let k = 0; k < 8; k++) {
+ const grayPixle1 = grayPixle(pix.slice(i + k * 4, i + k * 4 + (4 - 1)));
+ //阈值调整
+ if (grayPixle1 > threshold) {
+ //灰度值大于threshold位 白色 为第k位0不打印
+ part[k] = 0;
+ } else {
+ part[k] = 1;
+ }
+ }
+ let temp = 0;
+ for (let a = 0; a < part.length; a++) {
+ temp += part[a] * Math.pow(2, part.length - 1 - a);
+ }
+ //开始不明白以下算法什么意思,了解了字节才知道,一个字节是8位的二进制数,part这个数组存的0和1就是二进制的0和1,传输到打印的位图数据的一个字节是0-255之间的十进制数,以下是用权相加法转十进制数,理解了这个就用上面的for循环替代了
+ // const temp =
+ // part[0] * 128 +
+ // part[1] * 64 +
+ // part[2] * 32 +
+ // part[3] * 16 +
+ // part[4] * 8 +
+ // part[5] * 4 +
+ // part[6] * 2 +
+ // part[7] * 1;
+ sendImageData[index++] = temp;
+ }
+ return {
+ array: Array.from(sendImageData),
+ width: sendWidth / 8,
+ height: sendHeight,
+ };
+}
+/**
+ * printImage
+ * @param {object} opt
+ * {
+ deviceId,//蓝牙设备id
+ serviceId,//服务id
+ characteristicId,//可用特征值uuid
+ lasterSuccess , //最后完成的回调
+ }
+ */
+export function printImage(opt = {}, imageInfo = {}) {
+ let arr = imageInfo.array,
+ width = imageInfo.width;
+ const writeArray = [];
+ const xl = width % 256;
+ const xh = width / 256;
+ //分行发送图片数据,用的十进制指令
+ const command = [29, 118, 48, 0, xl, xh, 1, 0]; //1D 76 30 00 w h
+ const enter = [13, 10];
+ for (let i = 0; i < arr.length / width; i++) {
+ const subArr = arr.slice(i * width, i * width + width);
+ const tempArr = command.concat(subArr);
+ writeArray.push(new Uint8Array(tempArr));
+ }
+ writeArray.push(new Uint8Array(enter));
+ //console.log(writeArray);
+ const print = (options, writeArray) => {
+ if (writeArray.length) {
+ console.log("send");
+ sendDataToDevice({
+ ...options,
+ value: writeArray.shift().buffer,
+ lasterSuccess: () => {
+ if (writeArray.length) {
+ print(options, writeArray);
+ } else {
+ options.lasterSuccess && options.lasterSuccess();
+ }
+ },
+ });
+ }
+ };
+ console.log("start print");
+ print(opt, writeArray);
+}
+
+/* 16hex insert 0 */
+function Hex2Str(num) {
+ if (num.toString(16).length < 2) return "0" + num.toString(16);
+ else
+ return num.toString(16);
+}
+/*****CPCL指令接口****/
+
+/**
+ * 配置项如下
+ *
+ * width: 标签纸的宽度,单位像素點
+ * height: 标签纸的高度,单位像素點
+ * 8像素=1mm
+ * printNum: 打印张数,默认为1
+ * rotation:页面整体旋转 1-90度 2-180度 3-270度 其他-不旋转
+ */
+export function CreatCPCLPage(width, height, printNum, rotation = 0, offset = 0) {
+ var strCmd = '! ' + offset + ' 200 200 ' + height + ' ' + printNum + '\n';
+ strCmd += "PAGE-WIDTH " + width + '\n';
+ if (rotation == 1)
+ strCmd += "ZPROTATE90\n";
+ else if (rotation == 2)
+ strCmd += "ZPROTATE180\n";
+ else if (rotation == 3)
+ strCmd += "ZPROTATE270\n";
+ else
+ strCmd += "ZPROTATE0\n";
+ return strCmd;
+}
+
+/**
+ * 打印文字
+ * x: 文字方块左上角X座标,单位dot
+ * y: 文字方块左上角Y座标,单位dot
+ * fontName,fontSize: 字体,取值: 參考文檔
+ * rotation: 旋转 1-90度 2-180度 3-270度 其他-不旋转
+ * content: 文字内容
+ */
+export function addCPCLText(x, y, fontName, fontSize, rotation, content) {
+ //console.log(fontName,fontSize,rotation, content);
+ var strCmd = '';
+ if (rotation == 1) {
+ strCmd += 'T90 ';
+ }
+ if (rotation == 2) {
+ strCmd += 'T180 ';
+ }
+ if (rotation == 3) {
+ strCmd += 'T270 ';
+ } else {
+ strCmd += 'T ';
+ }
+ strCmd += fontName + ' ' + fontSize + ' ' + x + ' ' + y + ' ' + content + '\n';
+ return strCmd;
+};
+
+/**
+ * 打印一维码
+ *
+ * x: 文字方块左上角X座标,单位dot
+ * y: 文字方块左上角Y座标,单位dot
+ * codeType: 条码类型,取值为128、UPCA、UPCA2、UPCA5、UPCE、UPCE2、UPC5、EAN13、EAN13+2、EAN13+5、
+ * EAN8、EAN8+2、EAN8+5、39、39C、F39、F39C、93、CODABAR、CODABAR16、ITF、I2OF5
+ * h: 条码高度,单位dot
+ * rotation: 顺时针旋转角度,取值如下:
+ * - 0 不旋转
+ * - 1 顺时针旋转90度
+ *
+ * narrow: 窄条码比例因子(dot) 取值: 參考文檔
+ * wide: 宽条码比例因子(dot) 取值: 參考文檔
+ * content: 文字内容
+ *
+ */
+export function addCPCLBarCode(x, y, codeType, h, rotation, narrow, wide, content) {
+ var strCmd = '';
+ if (rotation == 0)
+ strCmd += 'B ';
+ else
+ strCmd += 'VB ';
+ strCmd += codeType + ' ' + narrow + ' ' + wide + ' ' + h + ' ' + x + ' ' + y + ' ' + content + '\n'
+ return strCmd;
+};
+
+/**
+ * 打印二维码
+ *
+ * x: 文字方块左上角X座标,单位dot
+ * y: 文字方块左上角Y座标,单位dot
+ * level: 错误纠正能力等级,取值为L(7%)、M(15%)、Q(25%)、H(30%)
+ * ver: 1-10 版本,根据内容调整以获取合适容量
+ * scale: 1-10 放大倍数
+ * content: 文字内容
+ *
+ */
+export function addCPCLQRCode(x, y, level, ver, scale, content) {
+ var strCmd = 'B QR ' + x + ' ' + y + ' M ' + ver + ' U ' + scale + '\n' + level + 'A,' + content + '\n';
+ strCmd += 'ENDQR\n';
+ return strCmd;
+};
+
+/**
+ * 放大指令
+ * scaleX: 横向放大倍数 1,2,3等整数
+ * scaleY: 纵向放大倍数 1,2,3等整数
+ */
+export function addCPCLSETMAG(scaleX, scaleY) {
+ var strCmd = 'SETMAG ' + scaleX + ' ' + scaleY + '\n';
+ return strCmd;
+};
+
+/**
+ * 对齐指令 0-左对齐 1-右对齐 2-居中
+ */
+export function addCPCLLocation(set) {
+ var strCmd = '';
+ if (set == 1) {
+ strCmd += 'RIGHT\n';
+ } else if (set == 2) {
+ strCmd += 'CENTER\n';
+ } else {
+ strCmd += 'LEFT\n';
+ }
+ return strCmd;
+};
+
+/**
+ * 反白线 x0,y0,x1,y1,width
+ */
+export function addCPCLInverseLine(x0, y0, x1, y1, width) {
+ var strCmd = 'IL ' + x0 + ' ' + y0 + ' ' + x1 + ' ' + y1 + ' ' + width + '\n';
+ return strCmd;
+};
+
+/**
+ * 画线 x0,y0,x1,y1,width
+ */
+export function addCPCLLine(x0, y0, x1, y1, width) {
+ var strCmd = 'L ' + x0 + ' ' + y0 + ' ' + x1 + ' ' + y1 + ' ' + width + '\n';
+ return strCmd;
+};
+
+/**
+ * 画框 x0,y0,x1,y1,width
+ */
+export function addCPCLBox(x0, y0, x1, y1, width) {
+ var strCmd = 'BOX ' + x0 + ' ' + y0 + ' ' + x1 + ' ' + y1 + ' ' + width + '\n';
+ return strCmd;
+};
+
+/**
+ * 字体加粗
+ */
+export function addCPCLSETBOLD(bold) {
+ var strCmd = 'SETBOLD ' + bold + '\n';
+ return strCmd;
+};
+
+/**
+ * 字体下划线
+ */
+export function addCPCLUNDERLINE(c) {
+ var strCmd = 'UNDERLINE ';
+ if (c) strCmd += 'ON\n';
+ else if (c) strCmd += 'OFF\n';
+ return strCmd;
+};
+
+/**
+ * 水印打印灰度等级 0-255
+ */
+export function addCPCLBACKGROUND(level) {
+ var strCmd = 'BACKGROUND ';
+ if (level > 255 || level < 0) level = 255;
+ strCmd += level + '\n';
+ return strCmd;
+};
+
+/**
+ * 打印水印文字
+ * x: 文字方块左上角X座标,单位dot
+ * y: 文字方块左上角Y座标,单位dot
+ * fontName,fontSize: 字体,取值: 參考文檔
+ * rotation: 旋转 1-90度 2-180度 3-270度 其他-不旋转
+ * content: 文字内容
+ */
+export function addCPCLBKVText(x, y, fontName, fontSize, rotation, content) {
+ //console.log(fontName,fontSize,rotation, content);
+ var strCmd = '';
+ if (rotation == 1) {
+ strCmd += 'BKT90 ';
+ }
+ if (rotation == 2) {
+ strCmd += 'BKT180 ';
+ }
+ if (rotation == 3) {
+ strCmd += 'BKT270 ';
+ } else {
+ strCmd += 'BKT ';
+ }
+ strCmd += fontName + ' ' + fontSize + ' ' + x + ' ' + y + ' ' + content + '\n';
+ return strCmd;
+};
+
+
+/**
+ * 标签缝隙定位指令
+ */
+export function addCPCLGAP() {
+ var strCmd = 'GAP-SENSE\nFORM\n';
+ return strCmd;
+};
+
+/**
+ * 标签右黑标检测指令
+ */
+export function addCPCLSENSE() {
+ var strCmd = 'BAR-SENSE\nFORM\n';
+ return strCmd;
+};
+
+/**
+ * 标签左黑标检测指令
+ */
+export function addCPCLSENSELEFT() {
+ var strCmd = 'BAR-SENSE LEFT\nFORM\n';
+ return strCmd;
+};
+
+/**
+ * 打印指令
+ */
+export function addCPCLPrint() {
+ var strCmd = 'PRINT\n';
+ return strCmd;
+};
+
+/**
+ * 图片打印指令
+ * x: 文字方块左上角X座标,单位dot
+ * y: 文字方块左上角Y座标,单位dot
+ * data{
+ threshold,//0/1提取的灰度级
+ width,//图像宽度
+ height,//图像高度
+ imageData , //图像数据
+ }
+ */
+export function addCPCLImageCmd(x, y, data) {
+ var strImgCmd = '';
+ const threshold = data.threshold || 180;
+ let myBitmapWidth = data.width,
+ myBitmapHeight = data.height;
+ let len = parseInt((myBitmapWidth + 7) / 8); //一行的数据长度
+ //console.log('len=',len);
+ //console.log('myBitmapWidth=',myBitmapWidth);
+ //console.log('myBitmapHeight=',myBitmapHeight);
+ let ndata = 0;
+ let i = 0;
+ let j = 0;
+ let sendImageData = new ArrayBuffer(len * myBitmapHeight);
+ sendImageData = new Uint8Array(sendImageData);
+ let pix = data.imageData;
+ console.log('pix=', pix);
+
+ for (i = 0; i < myBitmapHeight; i++) {
+ for (j = 0; j < len; j++) {
+ sendImageData[ndata + j] = 0;
+ }
+ for (j = 0; j < myBitmapWidth; j++) {
+ const grayPixle1 = grayPixle(pix.slice((i * myBitmapWidth + j) * 4, (i * myBitmapWidth + j) * 4 + 3));
+ if (grayPixle1 < threshold)
+ sendImageData[ndata + parseInt(j / 8)] |= (0x80 >> (j % 8));
+
+ }
+ ndata += len;
+ }
+ //console.log('sendImageData=',sendImageData);
+ //CPCL指令图片数据
+ strImgCmd += 'EG ' + len + ' ' + myBitmapHeight + ' ' + x + ' ' + y + ' ';
+ for (i = 0; i < sendImageData.length; i++) {
+ strImgCmd += Hex2Str(sendImageData[i]);
+ }
+ strImgCmd += '\n';
+ //console.log(strImgCmd);
+ return strImgCmd;
+}
+/**
+ * toast显示捕获的蓝牙异常
+ */
+export function catchToast(err) {
+ const errMsg = {
+ 10000: '未初始化蓝牙模块',
+ 10001: '蓝牙未打开',
+ 10002: '没有找到指定设备',
+ 10003: '连接失败',
+ 10004: '没有找到指定服务',
+ 10005: '没有找到指定特征值',
+ 10006: '当前连接已断开',
+ 10007: '当前特征值不支持此操作',
+ 10008: '系统上报异常',
+ 10009: '系统版本低于 4.3 不支持BLE'
+ };
+ let coode = err.errCode ? err.errCode.toString() : '';
+ let msg = errMsg[coode];
+ plus.nativeUI.toast(msg || coode, {
+ align: 'center',
+ verticalAlign: 'center'
+ });
+}
diff --git a/src/components/kk-printer/utils/index.js b/src/components/kk-printer/utils/index.js
new file mode 100644
index 0000000..78e43f4
--- /dev/null
+++ b/src/components/kk-printer/utils/index.js
@@ -0,0 +1,23 @@
+var barcode = require('./barcode');
+var qrcode = require('./qrcode');
+
+function convert_length(length) {
+ return Math.round(wx.getSystemInfoSync().windowWidth * length / 750);
+}
+
+function barc(id, code, width, height) {
+ barcode.code128(wx.createCanvasContext(id), code, convert_length(width), convert_length(height))
+}
+
+function qrc(id, code, width, height) {
+ qrcode.api.draw(code, {
+ ctx: wx.createCanvasContext(id),
+ width: convert_length(width),
+ height: convert_length(height)
+ })
+}
+
+module.exports = {
+ barcode: barc,
+ qrcode: qrc
+}
\ No newline at end of file
diff --git a/src/components/kk-printer/utils/mqtt.js b/src/components/kk-printer/utils/mqtt.js
new file mode 100644
index 0000000..79ceffb
--- /dev/null
+++ b/src/components/kk-printer/utils/mqtt.js
@@ -0,0 +1,14633 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mqtt = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i to
+ *
+ * @param {String} topic - topic to publish to
+ * @param {String, Buffer} message - message to publish
+ * @param {Object} [opts] - publish options, includes:
+ * {Number} qos - qos level to publish on
+ * {Boolean} retain - whether or not to retain the message
+ * {Boolean} dup - whether or not mark a message as duplicate
+ * {Function} cbStorePut - function(){} called when message is put into `outgoingStore`
+ * @param {Function} [callback] - function(err){}
+ * called when publish succeeds or fails
+ * @returns {MqttClient} this - for chaining
+ * @api public
+ *
+ * @example client.publish('topic', 'message');
+ * @example
+ * client.publish('topic', 'message', {qos: 1, retain: true, dup: true});
+ * @example client.publish('topic', 'message', console.log);
+ */
+MqttClient.prototype.publish = function (topic, message, opts, callback) {
+ var packet
+ var options = this.options
+
+ // .publish(topic, payload, cb);
+ if (typeof opts === 'function') {
+ callback = opts
+ opts = null
+ }
+
+ // default opts
+ var defaultOpts = {qos: 0, retain: false, dup: false}
+ opts = xtend(defaultOpts, opts)
+
+ if (this._checkDisconnecting(callback)) {
+ return this
+ }
+
+ packet = {
+ cmd: 'publish',
+ topic: topic,
+ payload: message,
+ qos: opts.qos,
+ retain: opts.retain,
+ messageId: this._nextId(),
+ dup: opts.dup
+ }
+
+ if (options.protocolVersion === 5) {
+ packet.properties = opts.properties
+ if ((!options.properties && packet.properties && packet.properties.topicAlias) || ((opts.properties && options.properties) &&
+ ((opts.properties.topicAlias && options.properties.topicAliasMaximum && opts.properties.topicAlias > options.properties.topicAliasMaximum) ||
+ (!options.properties.topicAliasMaximum && opts.properties.topicAlias)))) {
+ /*
+ if we are don`t setup topic alias or
+ topic alias maximum less than topic alias or
+ server don`t give topic alias maximum,
+ we are removing topic alias from packet
+ */
+ delete packet.properties.topicAlias
+ }
+ }
+
+ switch (opts.qos) {
+ case 1:
+ case 2:
+ // Add to callbacks
+ this.outgoing[packet.messageId] = {
+ volatile: false,
+ cb: callback || nop
+ }
+ if (this._storeProcessing) {
+ this._packetIdsDuringStoreProcessing[packet.messageId] = false
+ this._storePacket(packet, undefined, opts.cbStorePut)
+ } else {
+ this._sendPacket(packet, undefined, opts.cbStorePut)
+ }
+ break
+ default:
+ if (this._storeProcessing) {
+ this._storePacket(packet, callback, opts.cbStorePut)
+ } else {
+ this._sendPacket(packet, callback, opts.cbStorePut)
+ }
+ break
+ }
+
+ return this
+}
+
+/**
+ * subscribe - subscribe to
+ *
+ * @param {String, Array, Object} topic - topic(s) to subscribe to, supports objects in the form {'topic': qos}
+ * @param {Object} [opts] - optional subscription options, includes:
+ * {Number} qos - subscribe qos level
+ * @param {Function} [callback] - function(err, granted){} where:
+ * {Error} err - subscription error (none at the moment!)
+ * {Array} granted - array of {topic: 't', qos: 0}
+ * @returns {MqttClient} this - for chaining
+ * @api public
+ * @example client.subscribe('topic');
+ * @example client.subscribe('topic', {qos: 1});
+ * @example client.subscribe({'topic': {qos: 0}, 'topic2': {qos: 1}}, console.log);
+ * @example client.subscribe('topic', console.log);
+ */
+MqttClient.prototype.subscribe = function () {
+ var packet
+ var args = new Array(arguments.length)
+ for (var i = 0; i < arguments.length; i++) {
+ args[i] = arguments[i]
+ }
+ var subs = []
+ var obj = args.shift()
+ var resubscribe = obj.resubscribe
+ var callback = args.pop() || nop
+ var opts = args.pop()
+ var invalidTopic
+ var that = this
+ var version = this.options.protocolVersion
+
+ delete obj.resubscribe
+
+ if (typeof obj === 'string') {
+ obj = [obj]
+ }
+
+ if (typeof callback !== 'function') {
+ opts = callback
+ callback = nop
+ }
+
+ invalidTopic = validations.validateTopics(obj)
+ if (invalidTopic !== null) {
+ setImmediate(callback, new Error('Invalid topic ' + invalidTopic))
+ return this
+ }
+
+ if (this._checkDisconnecting(callback)) {
+ return this
+ }
+
+ var defaultOpts = {
+ qos: 0
+ }
+ if (version === 5) {
+ defaultOpts.nl = false
+ defaultOpts.rap = false
+ defaultOpts.rh = 0
+ }
+ opts = xtend(defaultOpts, opts)
+
+ if (Array.isArray(obj)) {
+ obj.forEach(function (topic) {
+ if (!that._resubscribeTopics.hasOwnProperty(topic) ||
+ that._resubscribeTopics[topic].qos < opts.qos ||
+ resubscribe) {
+ var currentOpts = {
+ topic: topic,
+ qos: opts.qos
+ }
+ if (version === 5) {
+ currentOpts.nl = opts.nl
+ currentOpts.rap = opts.rap
+ currentOpts.rh = opts.rh
+ currentOpts.properties = opts.properties
+ }
+ subs.push(currentOpts)
+ }
+ })
+ } else {
+ Object
+ .keys(obj)
+ .forEach(function (k) {
+ if (!that._resubscribeTopics.hasOwnProperty(k) ||
+ that._resubscribeTopics[k].qos < obj[k].qos ||
+ resubscribe) {
+ var currentOpts = {
+ topic: k,
+ qos: obj[k].qos
+ }
+ if (version === 5) {
+ currentOpts.nl = obj[k].nl
+ currentOpts.rap = obj[k].rap
+ currentOpts.rh = obj[k].rh
+ currentOpts.properties = opts.properties
+ }
+ subs.push(currentOpts)
+ }
+ })
+ }
+
+ packet = {
+ cmd: 'subscribe',
+ subscriptions: subs,
+ qos: 1,
+ retain: false,
+ dup: false,
+ messageId: this._nextId()
+ }
+
+ if (opts.properties) {
+ packet.properties = opts.properties
+ }
+
+ if (!subs.length) {
+ callback(null, [])
+ return
+ }
+
+ // subscriptions to resubscribe to in case of disconnect
+ if (this.options.resubscribe) {
+ var topics = []
+ subs.forEach(function (sub) {
+ if (that.options.reconnectPeriod > 0) {
+ var topic = { qos: sub.qos }
+ if (version === 5) {
+ topic.nl = sub.nl || false
+ topic.rap = sub.rap || false
+ topic.rh = sub.rh || 0
+ topic.properties = sub.properties
+ }
+ that._resubscribeTopics[sub.topic] = topic
+ topics.push(sub.topic)
+ }
+ })
+ that.messageIdToTopic[packet.messageId] = topics
+ }
+
+ this.outgoing[packet.messageId] = {
+ volatile: true,
+ cb: function (err, packet) {
+ if (!err) {
+ var granted = packet.granted
+ for (var i = 0; i < granted.length; i += 1) {
+ subs[i].qos = granted[i]
+ }
+ }
+
+ callback(err, subs)
+ }
+ }
+
+ this._sendPacket(packet)
+
+ return this
+}
+
+/**
+ * unsubscribe - unsubscribe from topic(s)
+ *
+ * @param {String, Array} topic - topics to unsubscribe from
+ * @param {Object} [opts] - optional subscription options, includes:
+ * {Object} properties - properties of unsubscribe packet
+ * @param {Function} [callback] - callback fired on unsuback
+ * @returns {MqttClient} this - for chaining
+ * @api public
+ * @example client.unsubscribe('topic');
+ * @example client.unsubscribe('topic', console.log);
+ */
+MqttClient.prototype.unsubscribe = function () {
+ var packet = {
+ cmd: 'unsubscribe',
+ qos: 1,
+ messageId: this._nextId()
+ }
+ var that = this
+ var args = new Array(arguments.length)
+ for (var i = 0; i < arguments.length; i++) {
+ args[i] = arguments[i]
+ }
+ var topic = args.shift()
+ var callback = args.pop() || nop
+ var opts = args.pop()
+
+ if (typeof topic === 'string') {
+ topic = [topic]
+ }
+
+ if (typeof callback !== 'function') {
+ opts = callback
+ callback = nop
+ }
+
+ if (this._checkDisconnecting(callback)) {
+ return this
+ }
+
+ if (typeof topic === 'string') {
+ packet.unsubscriptions = [topic]
+ } else if (typeof topic === 'object' && topic.length) {
+ packet.unsubscriptions = topic
+ }
+
+ if (this.options.resubscribe) {
+ packet.unsubscriptions.forEach(function (topic) {
+ delete that._resubscribeTopics[topic]
+ })
+ }
+
+ if (typeof opts === 'object' && opts.properties) {
+ packet.properties = opts.properties
+ }
+
+ this.outgoing[packet.messageId] = {
+ volatile: true,
+ cb: callback
+ }
+
+ this._sendPacket(packet)
+
+ return this
+}
+
+/**
+ * end - close connection
+ *
+ * @returns {MqttClient} this - for chaining
+ * @param {Boolean} force - do not wait for all in-flight messages to be acked
+ * @param {Function} cb - called when the client has been closed
+ *
+ * @api public
+ */
+MqttClient.prototype.end = function () {
+ var that = this
+
+ var force = arguments[0]
+ var opts = arguments[1]
+ var cb = arguments[2]
+
+ if (force == null || typeof force !== 'boolean') {
+ cb = opts || nop
+ opts = force
+ force = false
+ if (typeof opts !== 'object') {
+ cb = opts
+ opts = null
+ if (typeof cb !== 'function') {
+ cb = nop
+ }
+ }
+ }
+
+ if (typeof opts !== 'object') {
+ cb = opts
+ opts = null
+ }
+
+ cb = cb || nop
+
+ function closeStores () {
+ that.disconnected = true
+ that.incomingStore.close(function () {
+ that.outgoingStore.close(function () {
+ if (cb) {
+ cb.apply(null, arguments)
+ }
+ that.emit('end')
+ })
+ })
+ if (that._deferredReconnect) {
+ that._deferredReconnect()
+ }
+ }
+
+ function finish () {
+ // defer closesStores of an I/O cycle,
+ // just to make sure things are
+ // ok for websockets
+ that._cleanUp(force, setImmediate.bind(null, closeStores), opts)
+ }
+
+ if (this.disconnecting) {
+ return this
+ }
+
+ this._clearReconnect()
+
+ this.disconnecting = true
+
+ if (!force && Object.keys(this.outgoing).length > 0) {
+ // wait 10ms, just to be sure we received all of it
+ this.once('outgoingEmpty', setTimeout.bind(null, finish, 10))
+ } else {
+ finish()
+ }
+
+ return this
+}
+
+/**
+ * removeOutgoingMessage - remove a message in outgoing store
+ * the outgoing callback will be called withe Error('Message removed') if the message is removed
+ *
+ * @param {Number} mid - messageId to remove message
+ * @returns {MqttClient} this - for chaining
+ * @api public
+ *
+ * @example client.removeOutgoingMessage(client.getLastMessageId());
+ */
+MqttClient.prototype.removeOutgoingMessage = function (mid) {
+ var cb = this.outgoing[mid] ? this.outgoing[mid].cb : null
+ delete this.outgoing[mid]
+ this.outgoingStore.del({messageId: mid}, function () {
+ cb(new Error('Message removed'))
+ })
+ return this
+}
+
+/**
+ * reconnect - connect again using the same options as connect()
+ *
+ * @param {Object} [opts] - optional reconnect options, includes:
+ * {Store} incomingStore - a store for the incoming packets
+ * {Store} outgoingStore - a store for the outgoing packets
+ * if opts is not given, current stores are used
+ * @returns {MqttClient} this - for chaining
+ *
+ * @api public
+ */
+MqttClient.prototype.reconnect = function (opts) {
+ var that = this
+ var f = function () {
+ if (opts) {
+ that.options.incomingStore = opts.incomingStore
+ that.options.outgoingStore = opts.outgoingStore
+ } else {
+ that.options.incomingStore = null
+ that.options.outgoingStore = null
+ }
+ that.incomingStore = that.options.incomingStore || new Store()
+ that.outgoingStore = that.options.outgoingStore || new Store()
+ that.disconnecting = false
+ that.disconnected = false
+ that._deferredReconnect = null
+ that._reconnect()
+ }
+
+ if (this.disconnecting && !this.disconnected) {
+ this._deferredReconnect = f
+ } else {
+ f()
+ }
+ return this
+}
+
+/**
+ * _reconnect - implement reconnection
+ * @api privateish
+ */
+MqttClient.prototype._reconnect = function () {
+ this.emit('reconnect')
+ this._setupStream()
+}
+
+/**
+ * _setupReconnect - setup reconnect timer
+ */
+MqttClient.prototype._setupReconnect = function () {
+ var that = this
+
+ if (!that.disconnecting && !that.reconnectTimer && (that.options.reconnectPeriod > 0)) {
+ if (!this.reconnecting) {
+ this.emit('offline')
+ this.reconnecting = true
+ }
+ that.reconnectTimer = setInterval(function () {
+ that._reconnect()
+ }, that.options.reconnectPeriod)
+ }
+}
+
+/**
+ * _clearReconnect - clear the reconnect timer
+ */
+MqttClient.prototype._clearReconnect = function () {
+ if (this.reconnectTimer) {
+ clearInterval(this.reconnectTimer)
+ this.reconnectTimer = null
+ }
+}
+
+/**
+ * _cleanUp - clean up on connection end
+ * @api private
+ */
+MqttClient.prototype._cleanUp = function (forced, done) {
+ var opts = arguments[2]
+ if (done) {
+ this.stream.on('close', done)
+ }
+
+ if (forced) {
+ if ((this.options.reconnectPeriod === 0) && this.options.clean) {
+ flush(this.outgoing)
+ }
+ this.stream.destroy()
+ } else {
+ var packet = xtend({ cmd: 'disconnect' }, opts)
+ this._sendPacket(
+ packet,
+ setImmediate.bind(
+ null,
+ this.stream.end.bind(this.stream)
+ )
+ )
+ }
+
+ if (!this.disconnecting) {
+ this._clearReconnect()
+ this._setupReconnect()
+ }
+
+ if (this.pingTimer !== null) {
+ this.pingTimer.clear()
+ this.pingTimer = null
+ }
+
+ if (done && !this.connected) {
+ this.stream.removeListener('close', done)
+ done()
+ }
+}
+
+/**
+ * _sendPacket - send or queue a packet
+ * @param {String} type - packet type (see `protocol`)
+ * @param {Object} packet - packet options
+ * @param {Function} cb - callback when the packet is sent
+ * @param {Function} cbStorePut - called when message is put into outgoingStore
+ * @api private
+ */
+MqttClient.prototype._sendPacket = function (packet, cb, cbStorePut) {
+ cbStorePut = cbStorePut || nop
+
+ if (!this.connected) {
+ this._storePacket(packet, cb, cbStorePut)
+ return
+ }
+
+ // When sending a packet, reschedule the ping timer
+ this._shiftPingInterval()
+
+ switch (packet.cmd) {
+ case 'publish':
+ break
+ case 'pubrel':
+ storeAndSend(this, packet, cb, cbStorePut)
+ return
+ default:
+ sendPacket(this, packet, cb)
+ return
+ }
+
+ switch (packet.qos) {
+ case 2:
+ case 1:
+ storeAndSend(this, packet, cb, cbStorePut)
+ break
+ /**
+ * no need of case here since it will be caught by default
+ * and jshint comply that before default it must be a break
+ * anyway it will result in -1 evaluation
+ */
+ case 0:
+ /* falls through */
+ default:
+ sendPacket(this, packet, cb)
+ break
+ }
+}
+
+/**
+ * _storePacket - queue a packet
+ * @param {String} type - packet type (see `protocol`)
+ * @param {Object} packet - packet options
+ * @param {Function} cb - callback when the packet is sent
+ * @param {Function} cbStorePut - called when message is put into outgoingStore
+ * @api private
+ */
+MqttClient.prototype._storePacket = function (packet, cb, cbStorePut) {
+ cbStorePut = cbStorePut || nop
+
+ if (((packet.qos || 0) === 0 && this.queueQoSZero) || packet.cmd !== 'publish') {
+ this.queue.push({ packet: packet, cb: cb })
+ } else if (packet.qos > 0) {
+ cb = this.outgoing[packet.messageId] ? this.outgoing[packet.messageId].cb : null
+ this.outgoingStore.put(packet, function (err) {
+ if (err) {
+ return cb && cb(err)
+ }
+ cbStorePut()
+ })
+ } else if (cb) {
+ cb(new Error('No connection to broker'))
+ }
+}
+
+/**
+ * _setupPingTimer - setup the ping timer
+ *
+ * @api private
+ */
+MqttClient.prototype._setupPingTimer = function () {
+ var that = this
+
+ if (!this.pingTimer && this.options.keepalive) {
+ this.pingResp = true
+ this.pingTimer = reInterval(function () {
+ that._checkPing()
+ }, this.options.keepalive * 1000)
+ }
+}
+
+/**
+ * _shiftPingInterval - reschedule the ping interval
+ *
+ * @api private
+ */
+MqttClient.prototype._shiftPingInterval = function () {
+ if (this.pingTimer && this.options.keepalive && this.options.reschedulePings) {
+ this.pingTimer.reschedule(this.options.keepalive * 1000)
+ }
+}
+/**
+ * _checkPing - check if a pingresp has come back, and ping the server again
+ *
+ * @api private
+ */
+MqttClient.prototype._checkPing = function () {
+ if (this.pingResp) {
+ this.pingResp = false
+ this._sendPacket({ cmd: 'pingreq' })
+ } else {
+ // do a forced cleanup since socket will be in bad shape
+ this._cleanUp(true)
+ }
+}
+
+/**
+ * _handlePingresp - handle a pingresp
+ *
+ * @api private
+ */
+MqttClient.prototype._handlePingresp = function () {
+ this.pingResp = true
+}
+
+/**
+ * _handleConnack
+ *
+ * @param {Object} packet
+ * @api private
+ */
+
+MqttClient.prototype._handleConnack = function (packet) {
+ var options = this.options
+ var version = options.protocolVersion
+ var rc = version === 5 ? packet.reasonCode : packet.returnCode
+
+ clearTimeout(this.connackTimer)
+
+ if (packet.properties) {
+ if (packet.properties.topicAliasMaximum) {
+ if (!options.properties) { options.properties = {} }
+ options.properties.topicAliasMaximum = packet.properties.topicAliasMaximum
+ }
+ if (packet.properties.serverKeepAlive && options.keepalive) {
+ options.keepalive = packet.properties.serverKeepAlive
+ this._shiftPingInterval()
+ }
+ if (packet.properties.maximumPacketSize) {
+ if (!options.properties) { options.properties = {} }
+ options.properties.maximumPacketSize = packet.properties.maximumPacketSize
+ }
+ }
+
+ if (rc === 0) {
+ this.reconnecting = false
+ this._onConnect(packet)
+ } else if (rc > 0) {
+ var err = new Error('Connection refused: ' + errors[rc])
+ err.code = rc
+ this.emit('error', err)
+ }
+}
+
+/**
+ * _handlePublish
+ *
+ * @param {Object} packet
+ * @api private
+ */
+/*
+those late 2 case should be rewrite to comply with coding style:
+
+case 1:
+case 0:
+ // do not wait sending a puback
+ // no callback passed
+ if (1 === qos) {
+ this._sendPacket({
+ cmd: 'puback',
+ messageId: mid
+ });
+ }
+ // emit the message event for both qos 1 and 0
+ this.emit('message', topic, message, packet);
+ this.handleMessage(packet, done);
+ break;
+default:
+ // do nothing but every switch mus have a default
+ // log or throw an error about unknown qos
+ break;
+
+for now i just suppressed the warnings
+*/
+MqttClient.prototype._handlePublish = function (packet, done) {
+ done = typeof done !== 'undefined' ? done : nop
+ var topic = packet.topic.toString()
+ var message = packet.payload
+ var qos = packet.qos
+ var mid = packet.messageId
+ var that = this
+ var options = this.options
+ var validReasonCodes = [0, 16, 128, 131, 135, 144, 145, 151, 153]
+
+ switch (qos) {
+ case 2: {
+ options.customHandleAcks(topic, message, packet, function (error, code) {
+ if (!(error instanceof Error)) {
+ code = error
+ error = null
+ }
+ if (error) { return that.emit('error', error) }
+ if (validReasonCodes.indexOf(code) === -1) { return that.emit('error', new Error('Wrong reason code for pubrec')) }
+ if (code) {
+ that._sendPacket({cmd: 'pubrec', messageId: mid, reasonCode: code}, done)
+ } else {
+ that.incomingStore.put(packet, function () {
+ that._sendPacket({cmd: 'pubrec', messageId: mid}, done)
+ })
+ }
+ })
+ break
+ }
+ case 1: {
+ // emit the message event
+ options.customHandleAcks(topic, message, packet, function (error, code) {
+ if (!(error instanceof Error)) {
+ code = error
+ error = null
+ }
+ if (error) { return that.emit('error', error) }
+ if (validReasonCodes.indexOf(code) === -1) { return that.emit('error', new Error('Wrong reason code for puback')) }
+ if (!code) { that.emit('message', topic, message, packet) }
+ that.handleMessage(packet, function (err) {
+ if (err) {
+ return done && done(err)
+ }
+ that._sendPacket({cmd: 'puback', messageId: mid, reasonCode: code}, done)
+ })
+ })
+ break
+ }
+ case 0:
+ // emit the message event
+ this.emit('message', topic, message, packet)
+ this.handleMessage(packet, done)
+ break
+ default:
+ // do nothing
+ // log or throw an error about unknown qos
+ break
+ }
+}
+
+/**
+ * Handle messages with backpressure support, one at a time.
+ * Override at will.
+ *
+ * @param Packet packet the packet
+ * @param Function callback call when finished
+ * @api public
+ */
+MqttClient.prototype.handleMessage = function (packet, callback) {
+ callback()
+}
+
+/**
+ * _handleAck
+ *
+ * @param {Object} packet
+ * @api private
+ */
+
+MqttClient.prototype._handleAck = function (packet) {
+ /* eslint no-fallthrough: "off" */
+ var mid = packet.messageId
+ var type = packet.cmd
+ var response = null
+ var cb = this.outgoing[mid] ? this.outgoing[mid].cb : null
+ var that = this
+ var err
+
+ if (!cb) {
+ // Server sent an ack in error, ignore it.
+ return
+ }
+
+ // Process
+ switch (type) {
+ case 'pubcomp':
+ // same thing as puback for QoS 2
+ case 'puback':
+ var pubackRC = packet.reasonCode
+ // Callback - we're done
+ if (pubackRC && pubackRC > 0 && pubackRC !== 16) {
+ err = new Error('Publish error: ' + errors[pubackRC])
+ err.code = pubackRC
+ cb(err, packet)
+ }
+ delete this.outgoing[mid]
+ this.outgoingStore.del(packet, cb)
+ break
+ case 'pubrec':
+ response = {
+ cmd: 'pubrel',
+ qos: 2,
+ messageId: mid
+ }
+ var pubrecRC = packet.reasonCode
+
+ if (pubrecRC && pubrecRC > 0 && pubrecRC !== 16) {
+ err = new Error('Publish error: ' + errors[pubrecRC])
+ err.code = pubrecRC
+ cb(err, packet)
+ } else {
+ this._sendPacket(response)
+ }
+ break
+ case 'suback':
+ delete this.outgoing[mid]
+ for (var grantedI = 0; grantedI < packet.granted.length; grantedI++) {
+ if ((packet.granted[grantedI] & 0x80) !== 0) {
+ // suback with Failure status
+ var topics = this.messageIdToTopic[mid]
+ if (topics) {
+ topics.forEach(function (topic) {
+ delete that._resubscribeTopics[topic]
+ })
+ }
+ }
+ }
+ cb(null, packet)
+ break
+ case 'unsuback':
+ delete this.outgoing[mid]
+ cb(null)
+ break
+ default:
+ that.emit('error', new Error('unrecognized packet type'))
+ }
+
+ if (this.disconnecting &&
+ Object.keys(this.outgoing).length === 0) {
+ this.emit('outgoingEmpty')
+ }
+}
+
+/**
+ * _handlePubrel
+ *
+ * @param {Object} packet
+ * @api private
+ */
+MqttClient.prototype._handlePubrel = function (packet, callback) {
+ callback = typeof callback !== 'undefined' ? callback : nop
+ var mid = packet.messageId
+ var that = this
+
+ var comp = {cmd: 'pubcomp', messageId: mid}
+
+ that.incomingStore.get(packet, function (err, pub) {
+ if (!err) {
+ that.emit('message', pub.topic, pub.payload, pub)
+ that.handleMessage(pub, function (err) {
+ if (err) {
+ return callback(err)
+ }
+ that.incomingStore.del(pub, nop)
+ that._sendPacket(comp, callback)
+ })
+ } else {
+ that._sendPacket(comp, callback)
+ }
+ })
+}
+
+/**
+ * _handleDisconnect
+ *
+ * @param {Object} packet
+ * @api private
+ */
+MqttClient.prototype._handleDisconnect = function (packet) {
+ this.emit('disconnect', packet)
+}
+
+/**
+ * _nextId
+ * @return unsigned int
+ */
+MqttClient.prototype._nextId = function () {
+ // id becomes current state of this.nextId and increments afterwards
+ var id = this.nextId++
+ // Ensure 16 bit unsigned int (max 65535, nextId got one higher)
+ if (this.nextId === 65536) {
+ this.nextId = 1
+ }
+ return id
+}
+
+/**
+ * getLastMessageId
+ * @return unsigned int
+ */
+MqttClient.prototype.getLastMessageId = function () {
+ return (this.nextId === 1) ? 65535 : (this.nextId - 1)
+}
+
+/**
+ * _resubscribe
+ * @api private
+ */
+MqttClient.prototype._resubscribe = function (connack) {
+ var _resubscribeTopicsKeys = Object.keys(this._resubscribeTopics)
+ if (!this._firstConnection &&
+ (this.options.clean || (this.options.protocolVersion === 5 && !connack.sessionPresent)) &&
+ _resubscribeTopicsKeys.length > 0) {
+ if (this.options.resubscribe) {
+ if (this.options.protocolVersion === 5) {
+ for (var topicI = 0; topicI < _resubscribeTopicsKeys.length; topicI++) {
+ var resubscribeTopic = {}
+ resubscribeTopic[_resubscribeTopicsKeys[topicI]] = this._resubscribeTopics[_resubscribeTopicsKeys[topicI]]
+ resubscribeTopic.resubscribe = true
+ this.subscribe(resubscribeTopic, {properties: resubscribeTopic[_resubscribeTopicsKeys[topicI]].properties})
+ }
+ } else {
+ this._resubscribeTopics.resubscribe = true
+ this.subscribe(this._resubscribeTopics)
+ }
+ } else {
+ this._resubscribeTopics = {}
+ }
+ }
+
+ this._firstConnection = false
+}
+
+/**
+ * _onConnect
+ *
+ * @api private
+ */
+MqttClient.prototype._onConnect = function (packet) {
+ if (this.disconnected) {
+ this.emit('connect', packet)
+ return
+ }
+
+ var that = this
+
+ this._setupPingTimer()
+ this._resubscribe(packet)
+
+ this.connected = true
+
+ function startStreamProcess () {
+ var outStore = that.outgoingStore.createStream()
+
+ function clearStoreProcessing () {
+ that._storeProcessing = false
+ that._packetIdsDuringStoreProcessing = {}
+ }
+
+ that.once('close', remove)
+ outStore.on('error', function (err) {
+ clearStoreProcessing()
+ that.removeListener('close', remove)
+ that.emit('error', err)
+ })
+
+ function remove () {
+ outStore.destroy()
+ outStore = null
+ clearStoreProcessing()
+ }
+
+ function storeDeliver () {
+ // edge case, we wrapped this twice
+ if (!outStore) {
+ return
+ }
+ that._storeProcessing = true
+
+ var packet = outStore.read(1)
+
+ var cb
+
+ if (!packet) {
+ // read when data is available in the future
+ outStore.once('readable', storeDeliver)
+ return
+ }
+
+ // Skip already processed store packets
+ if (that._packetIdsDuringStoreProcessing[packet.messageId]) {
+ storeDeliver()
+ return
+ }
+
+ // Avoid unnecessary stream read operations when disconnected
+ if (!that.disconnecting && !that.reconnectTimer) {
+ cb = that.outgoing[packet.messageId] ? that.outgoing[packet.messageId].cb : null
+ that.outgoing[packet.messageId] = {
+ volatile: false,
+ cb: function (err, status) {
+ // Ensure that the original callback passed in to publish gets invoked
+ if (cb) {
+ cb(err, status)
+ }
+
+ storeDeliver()
+ }
+ }
+ that._packetIdsDuringStoreProcessing[packet.messageId] = true
+ that._sendPacket(packet)
+ } else if (outStore.destroy) {
+ outStore.destroy()
+ }
+ }
+
+ outStore.on('end', function () {
+ var allProcessed = true
+ for (var id in that._packetIdsDuringStoreProcessing) {
+ if (!that._packetIdsDuringStoreProcessing[id]) {
+ allProcessed = false
+ break
+ }
+ }
+ if (allProcessed) {
+ clearStoreProcessing()
+ that.removeListener('close', remove)
+ that.emit('connect', packet)
+ } else {
+ startStreamProcess()
+ }
+ })
+ storeDeliver()
+ }
+ // start flowing
+ startStreamProcess()
+}
+
+module.exports = MqttClient
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./store":7,"./validations":8,"_process":92,"events":13,"inherits":80,"mqtt-packet":84,"readable-stream":108,"reinterval":109,"xtend":121}],2:[function(require,module,exports){
+(function (Buffer){
+'use strict'
+
+var Transform = require('readable-stream').Transform
+var duplexify = require('duplexify')
+var base64 = require('base64-js')
+
+/* global FileReader */
+var my
+var proxy
+var stream
+var isInitialized = false
+
+function buildProxy () {
+ var proxy = new Transform()
+ proxy._write = function (chunk, encoding, next) {
+ my.sendSocketMessage({
+ data: chunk.buffer,
+ success: function () {
+ next()
+ },
+ fail: function () {
+ next(new Error())
+ }
+ })
+ }
+ proxy._flush = function socketEnd (done) {
+ my.closeSocket({
+ success: function () {
+ done()
+ }
+ })
+ }
+
+ return proxy
+}
+
+function setDefaultOpts (opts) {
+ if (!opts.hostname) {
+ opts.hostname = 'localhost'
+ }
+ if (!opts.path) {
+ opts.path = '/'
+ }
+
+ if (!opts.wsOptions) {
+ opts.wsOptions = {}
+ }
+}
+
+function buildUrl (opts, client) {
+ var protocol = opts.protocol === 'alis' ? 'wss' : 'ws'
+ var url = protocol + '://' + opts.hostname + opts.path
+ if (opts.port && opts.port !== 80 && opts.port !== 443) {
+ url = protocol + '://' + opts.hostname + ':' + opts.port + opts.path
+ }
+ if (typeof (opts.transformWsUrl) === 'function') {
+ url = opts.transformWsUrl(url, opts, client)
+ }
+ return url
+}
+
+function bindEventHandler () {
+ if (isInitialized) return
+
+ isInitialized = true
+
+ my.onSocketOpen(function () {
+ stream.setReadable(proxy)
+ stream.setWritable(proxy)
+ stream.emit('connect')
+ })
+
+ my.onSocketMessage(function (res) {
+ if (typeof res.data === 'string') {
+ var array = base64.toByteArray(res.data)
+ var buffer = Buffer.from(array)
+ proxy.push(buffer)
+ } else {
+ var reader = new FileReader()
+ reader.addEventListener('load', function () {
+ var data = reader.result
+
+ if (data instanceof ArrayBuffer) data = Buffer.from(data)
+ else data = Buffer.from(data, 'utf8')
+ proxy.push(data)
+ })
+ reader.readAsArrayBuffer(res.data)
+ }
+ })
+
+ my.onSocketClose(function () {
+ stream.end()
+ stream.destroy()
+ })
+
+ my.onSocketError(function (res) {
+ stream.destroy(res)
+ })
+}
+
+function buildStream (client, opts) {
+ opts.hostname = opts.hostname || opts.host
+
+ if (!opts.hostname) {
+ throw new Error('Could not determine host. Specify host manually.')
+ }
+
+ var websocketSubProtocol =
+ (opts.protocolId === 'MQIsdp') && (opts.protocolVersion === 3)
+ ? 'mqttv3.1'
+ : 'mqtt'
+
+ setDefaultOpts(opts)
+
+ var url = buildUrl(opts, client)
+ my = opts.my
+ my.connectSocket({
+ url: url,
+ protocols: websocketSubProtocol
+ })
+
+ proxy = buildProxy()
+ stream = duplexify.obj()
+
+ bindEventHandler()
+
+ return stream
+}
+
+module.exports = buildStream
+
+}).call(this,require("buffer").Buffer)
+},{"base64-js":10,"buffer":12,"duplexify":17,"readable-stream":108}],3:[function(require,module,exports){
+'use strict'
+var net = require('net')
+
+/*
+ variables port and host can be removed since
+ you have all required information in opts object
+*/
+function buildBuilder (client, opts) {
+ var port, host
+ opts.port = opts.port || 1883
+ opts.hostname = opts.hostname || opts.host || 'localhost'
+
+ port = opts.port
+ host = opts.hostname
+
+ return net.createConnection(port, host)
+}
+
+module.exports = buildBuilder
+
+},{"net":11}],4:[function(require,module,exports){
+'use strict'
+var tls = require('tls')
+
+function buildBuilder (mqttClient, opts) {
+ var connection
+ opts.port = opts.port || 8883
+ opts.host = opts.hostname || opts.host || 'localhost'
+
+ opts.rejectUnauthorized = opts.rejectUnauthorized !== false
+
+ delete opts.path
+
+ connection = tls.connect(opts)
+ /* eslint no-use-before-define: [2, "nofunc"] */
+ connection.on('secureConnect', function () {
+ if (opts.rejectUnauthorized && !connection.authorized) {
+ connection.emit('error', new Error('TLS not authorized'))
+ } else {
+ connection.removeListener('error', handleTLSerrors)
+ }
+ })
+
+ function handleTLSerrors (err) {
+ // How can I get verify this error is a tls error?
+ if (opts.rejectUnauthorized) {
+ mqttClient.emit('error', err)
+ }
+
+ // close this connection to match the behaviour of net
+ // otherwise all we get is an error from the connection
+ // and close event doesn't fire. This is a work around
+ // to enable the reconnect code to work the same as with
+ // net.createConnection
+ connection.end()
+ }
+
+ connection.on('error', handleTLSerrors)
+ return connection
+}
+
+module.exports = buildBuilder
+
+},{"tls":11}],5:[function(require,module,exports){
+(function (process){
+'use strict'
+
+var websocket = require('websocket-stream')
+var urlModule = require('url')
+var WSS_OPTIONS = [
+ 'rejectUnauthorized',
+ 'ca',
+ 'cert',
+ 'key',
+ 'pfx',
+ 'passphrase'
+]
+var IS_BROWSER = process.title === 'browser'
+
+function buildUrl (opts, client) {
+ var url = opts.protocol + '://' + opts.hostname + ':' + opts.port + opts.path
+ if (typeof (opts.transformWsUrl) === 'function') {
+ url = opts.transformWsUrl(url, opts, client)
+ }
+ return url
+}
+
+function setDefaultOpts (opts) {
+ if (!opts.hostname) {
+ opts.hostname = 'localhost'
+ }
+ if (!opts.port) {
+ if (opts.protocol === 'wss') {
+ opts.port = 443
+ } else {
+ opts.port = 80
+ }
+ }
+ if (!opts.path) {
+ opts.path = '/'
+ }
+
+ if (!opts.wsOptions) {
+ opts.wsOptions = {}
+ }
+ if (!IS_BROWSER && opts.protocol === 'wss') {
+ // Add cert/key/ca etc options
+ WSS_OPTIONS.forEach(function (prop) {
+ if (opts.hasOwnProperty(prop) && !opts.wsOptions.hasOwnProperty(prop)) {
+ opts.wsOptions[prop] = opts[prop]
+ }
+ })
+ }
+}
+
+function createWebSocket (client, opts) {
+ var websocketSubProtocol =
+ (opts.protocolId === 'MQIsdp') && (opts.protocolVersion === 3)
+ ? 'mqttv3.1'
+ : 'mqtt'
+
+ setDefaultOpts(opts)
+ var url = buildUrl(opts, client)
+ return websocket(url, [websocketSubProtocol], opts.wsOptions)
+}
+
+function buildBuilder (client, opts) {
+ return createWebSocket(client, opts)
+}
+
+function buildBuilderBrowser (client, opts) {
+ if (!opts.hostname) {
+ opts.hostname = opts.host
+ }
+
+ if (!opts.hostname) {
+ // Throwing an error in a Web Worker if no `hostname` is given, because we
+ // can not determine the `hostname` automatically. If connecting to
+ // localhost, please supply the `hostname` as an argument.
+ if (typeof (document) === 'undefined') {
+ throw new Error('Could not determine host. Specify host manually.')
+ }
+ var parsed = urlModule.parse(document.URL)
+ opts.hostname = parsed.hostname
+
+ if (!opts.port) {
+ opts.port = parsed.port
+ }
+ }
+ return createWebSocket(client, opts)
+}
+
+if (IS_BROWSER) {
+ module.exports = buildBuilderBrowser
+} else {
+ module.exports = buildBuilder
+}
+
+}).call(this,require('_process'))
+},{"_process":92,"url":113,"websocket-stream":118}],6:[function(require,module,exports){
+(function (process,Buffer){
+'use strict'
+
+var Transform = require('readable-stream').Transform
+var duplexify = require('duplexify')
+
+/* global wx */
+var socketTask
+var proxy
+var stream
+
+function buildProxy () {
+ var proxy = new Transform()
+ proxy._write = function (chunk, encoding, next) {
+ socketTask.send({
+ data: chunk.buffer,
+ success: function () {
+ next()
+ },
+ fail: function (errMsg) {
+ next(new Error(errMsg))
+ }
+ })
+ }
+ proxy._flush = function socketEnd (done) {
+ socketTask.close({
+ success: function () {
+ done()
+ }
+ })
+ }
+
+ return proxy
+}
+
+function setDefaultOpts (opts) {
+ if (!opts.hostname) {
+ opts.hostname = 'localhost'
+ }
+ if (!opts.path) {
+ opts.path = '/'
+ }
+
+ if (!opts.wsOptions) {
+ opts.wsOptions = {}
+ }
+}
+
+function buildUrl (opts, client) {
+ var protocol = opts.protocol === 'wxs' ? 'wss' : 'ws'
+ var url = protocol + '://' + opts.hostname + opts.path
+ if (opts.port && opts.port !== 80 && opts.port !== 443) {
+ url = protocol + '://' + opts.hostname + ':' + opts.port + opts.path
+ }
+ if (typeof (opts.transformWsUrl) === 'function') {
+ url = opts.transformWsUrl(url, opts, client)
+ }
+ return url
+}
+
+function bindEventHandler () {
+ socketTask.onOpen(function () {
+ stream.setReadable(proxy)
+ stream.setWritable(proxy)
+ stream.emit('connect')
+ })
+
+ socketTask.onMessage(function (res) {
+ var data = res.data
+
+ if (data instanceof ArrayBuffer) data = Buffer.from(data)
+ else data = Buffer.from(data, 'utf8')
+ proxy.push(data)
+ })
+
+ socketTask.onClose(function () {
+ stream.end()
+ stream.destroy()
+ })
+
+ socketTask.onError(function (res) {
+ stream.destroy(new Error(res.errMsg))
+ })
+}
+
+function buildStream (client, opts) {
+ opts.hostname = opts.hostname || opts.host
+
+ if (!opts.hostname) {
+ throw new Error('Could not determine host. Specify host manually.')
+ }
+
+ var websocketSubProtocol =
+ (opts.protocolId === 'MQIsdp') && (opts.protocolVersion === 3)
+ ? 'mqttv3.1'
+ : 'mqtt'
+
+ setDefaultOpts(opts)
+
+ var url = buildUrl(opts, client)
+ socketTask = wx.connectSocket({
+ url: url,
+ protocols: websocketSubProtocol
+ })
+
+ proxy = buildProxy()
+ stream = duplexify.obj()
+ stream._destroy = function (err, cb) {
+ socketTask.close({
+ success: function () {
+ cb && cb(err)
+ }
+ })
+ }
+
+ var destroyRef = stream.destroy
+ stream.destroy = function () {
+ stream.destroy = destroyRef
+
+ var self = this
+ process.nextTick(function () {
+ socketTask.close({
+ fail: function () {
+ self._destroy(new Error())
+ }
+ })
+ })
+ }.bind(stream)
+
+ bindEventHandler()
+
+ return stream
+}
+
+module.exports = buildStream
+
+}).call(this,require('_process'),require("buffer").Buffer)
+},{"_process":92,"buffer":12,"duplexify":17,"readable-stream":108}],7:[function(require,module,exports){
+(function (process){
+'use strict'
+
+/**
+ * Module dependencies
+ */
+var xtend = require('xtend')
+
+var Readable = require('readable-stream').Readable
+var streamsOpts = { objectMode: true }
+var defaultStoreOptions = {
+ clean: true
+}
+
+/**
+ * es6-map can preserve insertion order even if ES version is older.
+ *
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Description
+ * It should be noted that a Map which is a map of an object, especially
+ * a dictionary of dictionaries, will only map to the object's insertion
+ * order. In ES2015 this is ordered for objects but for older versions of
+ * ES, this may be random and not ordered.
+ *
+ */
+var Map = require('es6-map')
+
+/**
+ * In-memory implementation of the message store
+ * This can actually be saved into files.
+ *
+ * @param {Object} [options] - store options
+ */
+function Store (options) {
+ if (!(this instanceof Store)) {
+ return new Store(options)
+ }
+
+ this.options = options || {}
+
+ // Defaults
+ this.options = xtend(defaultStoreOptions, options)
+
+ this._inflights = new Map()
+}
+
+/**
+ * Adds a packet to the store, a packet is
+ * anything that has a messageId property.
+ *
+ */
+Store.prototype.put = function (packet, cb) {
+ this._inflights.set(packet.messageId, packet)
+
+ if (cb) {
+ cb()
+ }
+
+ return this
+}
+
+/**
+ * Creates a stream with all the packets in the store
+ *
+ */
+Store.prototype.createStream = function () {
+ var stream = new Readable(streamsOpts)
+ var destroyed = false
+ var values = []
+ var i = 0
+
+ this._inflights.forEach(function (value, key) {
+ values.push(value)
+ })
+
+ stream._read = function () {
+ if (!destroyed && i < values.length) {
+ this.push(values[i++])
+ } else {
+ this.push(null)
+ }
+ }
+
+ stream.destroy = function () {
+ if (destroyed) {
+ return
+ }
+
+ var self = this
+
+ destroyed = true
+
+ process.nextTick(function () {
+ self.emit('close')
+ })
+ }
+
+ return stream
+}
+
+/**
+ * deletes a packet from the store.
+ */
+Store.prototype.del = function (packet, cb) {
+ packet = this._inflights.get(packet.messageId)
+ if (packet) {
+ this._inflights.delete(packet.messageId)
+ cb(null, packet)
+ } else if (cb) {
+ cb(new Error('missing packet'))
+ }
+
+ return this
+}
+
+/**
+ * get a packet from the store.
+ */
+Store.prototype.get = function (packet, cb) {
+ packet = this._inflights.get(packet.messageId)
+ if (packet) {
+ cb(null, packet)
+ } else if (cb) {
+ cb(new Error('missing packet'))
+ }
+
+ return this
+}
+
+/**
+ * Close the store
+ */
+Store.prototype.close = function (cb) {
+ if (this.options.clean) {
+ this._inflights = null
+ }
+ if (cb) {
+ cb()
+ }
+}
+
+module.exports = Store
+
+}).call(this,require('_process'))
+},{"_process":92,"es6-map":67,"readable-stream":108,"xtend":121}],8:[function(require,module,exports){
+'use strict'
+
+/**
+ * Validate a topic to see if it's valid or not.
+ * A topic is valid if it follow below rules:
+ * - Rule #1: If any part of the topic is not `+` or `#`, then it must not contain `+` and '#'
+ * - Rule #2: Part `#` must be located at the end of the mailbox
+ *
+ * @param {String} topic - A topic
+ * @returns {Boolean} If the topic is valid, returns true. Otherwise, returns false.
+ */
+function validateTopic (topic) {
+ var parts = topic.split('/')
+
+ for (var i = 0; i < parts.length; i++) {
+ if (parts[i] === '+') {
+ continue
+ }
+
+ if (parts[i] === '#') {
+ // for Rule #2
+ return i === parts.length - 1
+ }
+
+ if (parts[i].indexOf('+') !== -1 || parts[i].indexOf('#') !== -1) {
+ return false
+ }
+ }
+
+ return true
+}
+
+/**
+ * Validate an array of topics to see if any of them is valid or not
+ * @param {Array} topics - Array of topics
+ * @returns {String} If the topics is valid, returns null. Otherwise, returns the invalid one
+ */
+function validateTopics (topics) {
+ if (topics.length === 0) {
+ return 'empty_topic_list'
+ }
+ for (var i = 0; i < topics.length; i++) {
+ if (!validateTopic(topics[i])) {
+ return topics[i]
+ }
+ }
+ return null
+}
+
+module.exports = {
+ validateTopics: validateTopics
+}
+
+},{}],9:[function(require,module,exports){
+(function (process){
+'use strict'
+
+var MqttClient = require('../client')
+var Store = require('../store')
+var url = require('url')
+var xtend = require('xtend')
+var protocols = {}
+
+if (process.title !== 'browser') {
+ protocols.mqtt = require('./tcp')
+ protocols.tcp = require('./tcp')
+ protocols.ssl = require('./tls')
+ protocols.tls = require('./tls')
+ protocols.mqtts = require('./tls')
+} else {
+ protocols.wx = require('./wx')
+ protocols.wxs = require('./wx')
+
+ protocols.ali = require('./ali')
+ protocols.alis = require('./ali')
+}
+
+protocols.ws = require('./ws')
+protocols.wss = require('./ws')
+
+/**
+ * Parse the auth attribute and merge username and password in the options object.
+ *
+ * @param {Object} [opts] option object
+ */
+function parseAuthOptions (opts) {
+ var matches
+ if (opts.auth) {
+ matches = opts.auth.match(/^(.+):(.+)$/)
+ if (matches) {
+ opts.username = matches[1]
+ opts.password = matches[2]
+ } else {
+ opts.username = opts.auth
+ }
+ }
+}
+
+/**
+ * connect - connect to an MQTT broker.
+ *
+ * @param {String} [brokerUrl] - url of the broker, optional
+ * @param {Object} opts - see MqttClient#constructor
+ */
+function connect (brokerUrl, opts) {
+ if ((typeof brokerUrl === 'object') && !opts) {
+ opts = brokerUrl
+ brokerUrl = null
+ }
+
+ opts = opts || {}
+
+ if (brokerUrl) {
+ var parsed = url.parse(brokerUrl, true)
+ if (parsed.port != null) {
+ parsed.port = Number(parsed.port)
+ }
+
+ opts = xtend(parsed, opts)
+
+ if (opts.protocol === null) {
+ throw new Error('Missing protocol')
+ }
+ opts.protocol = opts.protocol.replace(/:$/, '')
+ }
+
+ // merge in the auth options if supplied
+ parseAuthOptions(opts)
+
+ // support clientId passed in the query string of the url
+ if (opts.query && typeof opts.query.clientId === 'string') {
+ opts.clientId = opts.query.clientId
+ }
+
+ if (opts.cert && opts.key) {
+ if (opts.protocol) {
+ if (['mqtts', 'wss', 'wxs', 'alis'].indexOf(opts.protocol) === -1) {
+ switch (opts.protocol) {
+ case 'mqtt':
+ opts.protocol = 'mqtts'
+ break
+ case 'ws':
+ opts.protocol = 'wss'
+ break
+ case 'wx':
+ opts.protocol = 'wxs'
+ break
+ case 'ali':
+ opts.protocol = 'alis'
+ break
+ default:
+ throw new Error('Unknown protocol for secure connection: "' + opts.protocol + '"!')
+ }
+ }
+ } else {
+ // don't know what protocol he want to use, mqtts or wss
+ throw new Error('Missing secure protocol key')
+ }
+ }
+
+ if (!protocols[opts.protocol]) {
+ var isSecure = ['mqtts', 'wss'].indexOf(opts.protocol) !== -1
+ opts.protocol = [
+ 'mqtt',
+ 'mqtts',
+ 'ws',
+ 'wss',
+ 'wx',
+ 'wxs',
+ 'ali',
+ 'alis'
+ ].filter(function (key, index) {
+ if (isSecure && index % 2 === 0) {
+ // Skip insecure protocols when requesting a secure one.
+ return false
+ }
+ return (typeof protocols[key] === 'function')
+ })[0]
+ }
+
+ if (opts.clean === false && !opts.clientId) {
+ throw new Error('Missing clientId for unclean clients')
+ }
+
+ if (opts.protocol) {
+ opts.defaultProtocol = opts.protocol
+ }
+
+ function wrapper (client) {
+ if (opts.servers) {
+ if (!client._reconnectCount || client._reconnectCount === opts.servers.length) {
+ client._reconnectCount = 0
+ }
+
+ opts.host = opts.servers[client._reconnectCount].host
+ opts.port = opts.servers[client._reconnectCount].port
+ opts.protocol = (!opts.servers[client._reconnectCount].protocol ? opts.defaultProtocol : opts.servers[client._reconnectCount].protocol)
+ opts.hostname = opts.host
+
+ client._reconnectCount++
+ }
+
+ return protocols[opts.protocol](client, opts)
+ }
+
+ return new MqttClient(wrapper, opts)
+}
+
+module.exports = connect
+module.exports.connect = connect
+module.exports.MqttClient = MqttClient
+module.exports.Store = Store
+
+}).call(this,require('_process'))
+},{"../client":1,"../store":7,"./ali":2,"./tcp":3,"./tls":4,"./ws":5,"./wx":6,"_process":92,"url":113,"xtend":121}],10:[function(require,module,exports){
+'use strict'
+
+exports.byteLength = byteLength
+exports.toByteArray = toByteArray
+exports.fromByteArray = fromByteArray
+
+var lookup = []
+var revLookup = []
+var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
+
+var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
+for (var i = 0, len = code.length; i < len; ++i) {
+ lookup[i] = code[i]
+ revLookup[code.charCodeAt(i)] = i
+}
+
+// Support decoding URL-safe base64 strings, as Node.js does.
+// See: https://en.wikipedia.org/wiki/Base64#URL_applications
+revLookup['-'.charCodeAt(0)] = 62
+revLookup['_'.charCodeAt(0)] = 63
+
+function getLens (b64) {
+ var len = b64.length
+
+ if (len % 4 > 0) {
+ throw new Error('Invalid string. Length must be a multiple of 4')
+ }
+
+ // Trim off extra bytes after placeholder bytes are found
+ // See: https://github.com/beatgammit/base64-js/issues/42
+ var validLen = b64.indexOf('=')
+ if (validLen === -1) validLen = len
+
+ var placeHoldersLen = validLen === len
+ ? 0
+ : 4 - (validLen % 4)
+
+ return [validLen, placeHoldersLen]
+}
+
+// base64 is 4/3 + up to two characters of the original data
+function byteLength (b64) {
+ var lens = getLens(b64)
+ var validLen = lens[0]
+ var placeHoldersLen = lens[1]
+ return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
+}
+
+function _byteLength (b64, validLen, placeHoldersLen) {
+ return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen
+}
+
+function toByteArray (b64) {
+ var tmp
+ var lens = getLens(b64)
+ var validLen = lens[0]
+ var placeHoldersLen = lens[1]
+
+ var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))
+
+ var curByte = 0
+
+ // if there are placeholders, only get up to the last complete 4 chars
+ var len = placeHoldersLen > 0
+ ? validLen - 4
+ : validLen
+
+ for (var i = 0; i < len; i += 4) {
+ tmp =
+ (revLookup[b64.charCodeAt(i)] << 18) |
+ (revLookup[b64.charCodeAt(i + 1)] << 12) |
+ (revLookup[b64.charCodeAt(i + 2)] << 6) |
+ revLookup[b64.charCodeAt(i + 3)]
+ arr[curByte++] = (tmp >> 16) & 0xFF
+ arr[curByte++] = (tmp >> 8) & 0xFF
+ arr[curByte++] = tmp & 0xFF
+ }
+
+ if (placeHoldersLen === 2) {
+ tmp =
+ (revLookup[b64.charCodeAt(i)] << 2) |
+ (revLookup[b64.charCodeAt(i + 1)] >> 4)
+ arr[curByte++] = tmp & 0xFF
+ }
+
+ if (placeHoldersLen === 1) {
+ tmp =
+ (revLookup[b64.charCodeAt(i)] << 10) |
+ (revLookup[b64.charCodeAt(i + 1)] << 4) |
+ (revLookup[b64.charCodeAt(i + 2)] >> 2)
+ arr[curByte++] = (tmp >> 8) & 0xFF
+ arr[curByte++] = tmp & 0xFF
+ }
+
+ return arr
+}
+
+function tripletToBase64 (num) {
+ return lookup[num >> 18 & 0x3F] +
+ lookup[num >> 12 & 0x3F] +
+ lookup[num >> 6 & 0x3F] +
+ lookup[num & 0x3F]
+}
+
+function encodeChunk (uint8, start, end) {
+ var tmp
+ var output = []
+ for (var i = start; i < end; i += 3) {
+ tmp =
+ ((uint8[i] << 16) & 0xFF0000) +
+ ((uint8[i + 1] << 8) & 0xFF00) +
+ (uint8[i + 2] & 0xFF)
+ output.push(tripletToBase64(tmp))
+ }
+ return output.join('')
+}
+
+function fromByteArray (uint8) {
+ var tmp
+ var len = uint8.length
+ var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
+ var parts = []
+ var maxChunkLength = 16383 // must be multiple of 3
+
+ // go through the array every three bytes, we'll deal with trailing stuff later
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+ parts.push(encodeChunk(
+ uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)
+ ))
+ }
+
+ // pad the end with zeros, but make sure to not forget the extra bytes
+ if (extraBytes === 1) {
+ tmp = uint8[len - 1]
+ parts.push(
+ lookup[tmp >> 2] +
+ lookup[(tmp << 4) & 0x3F] +
+ '=='
+ )
+ } else if (extraBytes === 2) {
+ tmp = (uint8[len - 2] << 8) + uint8[len - 1]
+ parts.push(
+ lookup[tmp >> 10] +
+ lookup[(tmp >> 4) & 0x3F] +
+ lookup[(tmp << 2) & 0x3F] +
+ '='
+ )
+ }
+
+ return parts.join('')
+}
+
+},{}],11:[function(require,module,exports){
+
+},{}],12:[function(require,module,exports){
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ */
+/* eslint-disable no-proto */
+
+'use strict'
+
+var base64 = require('base64-js')
+var ieee754 = require('ieee754')
+
+exports.Buffer = Buffer
+exports.SlowBuffer = SlowBuffer
+exports.INSPECT_MAX_BYTES = 50
+
+var K_MAX_LENGTH = 0x7fffffff
+exports.kMaxLength = K_MAX_LENGTH
+
+/**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ * === true Use Uint8Array implementation (fastest)
+ * === false Print warning and recommend using `buffer` v4.x which has an Object
+ * implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * We report that the browser does not support typed arrays if the are not subclassable
+ * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
+ * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
+ * for __proto__ and has a buggy typed array implementation.
+ */
+Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
+
+if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
+ typeof console.error === 'function') {
+ console.error(
+ 'This browser lacks typed array (Uint8Array) support which is required by ' +
+ '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
+ )
+}
+
+function typedArraySupport () {
+ // Can typed array instances can be augmented?
+ try {
+ var arr = new Uint8Array(1)
+ arr.__proto__ = { __proto__: Uint8Array.prototype, foo: function () { return 42 } }
+ return arr.foo() === 42
+ } catch (e) {
+ return false
+ }
+}
+
+Object.defineProperty(Buffer.prototype, 'parent', {
+ enumerable: true,
+ get: function () {
+ if (!Buffer.isBuffer(this)) return undefined
+ return this.buffer
+ }
+})
+
+Object.defineProperty(Buffer.prototype, 'offset', {
+ enumerable: true,
+ get: function () {
+ if (!Buffer.isBuffer(this)) return undefined
+ return this.byteOffset
+ }
+})
+
+function createBuffer (length) {
+ if (length > K_MAX_LENGTH) {
+ throw new RangeError('The value "' + length + '" is invalid for option "size"')
+ }
+ // Return an augmented `Uint8Array` instance
+ var buf = new Uint8Array(length)
+ buf.__proto__ = Buffer.prototype
+ return buf
+}
+
+/**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+function Buffer (arg, encodingOrOffset, length) {
+ // Common case.
+ if (typeof arg === 'number') {
+ if (typeof encodingOrOffset === 'string') {
+ throw new TypeError(
+ 'The "string" argument must be of type string. Received type number'
+ )
+ }
+ return allocUnsafe(arg)
+ }
+ return from(arg, encodingOrOffset, length)
+}
+
+// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
+if (typeof Symbol !== 'undefined' && Symbol.species != null &&
+ Buffer[Symbol.species] === Buffer) {
+ Object.defineProperty(Buffer, Symbol.species, {
+ value: null,
+ configurable: true,
+ enumerable: false,
+ writable: false
+ })
+}
+
+Buffer.poolSize = 8192 // not used by this implementation
+
+function from (value, encodingOrOffset, length) {
+ if (typeof value === 'string') {
+ return fromString(value, encodingOrOffset)
+ }
+
+ if (ArrayBuffer.isView(value)) {
+ return fromArrayLike(value)
+ }
+
+ if (value == null) {
+ throw TypeError(
+ 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+ 'or Array-like Object. Received type ' + (typeof value)
+ )
+ }
+
+ if (isInstance(value, ArrayBuffer) ||
+ (value && isInstance(value.buffer, ArrayBuffer))) {
+ return fromArrayBuffer(value, encodingOrOffset, length)
+ }
+
+ if (typeof value === 'number') {
+ throw new TypeError(
+ 'The "value" argument must not be of type number. Received type number'
+ )
+ }
+
+ var valueOf = value.valueOf && value.valueOf()
+ if (valueOf != null && valueOf !== value) {
+ return Buffer.from(valueOf, encodingOrOffset, length)
+ }
+
+ var b = fromObject(value)
+ if (b) return b
+
+ if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&
+ typeof value[Symbol.toPrimitive] === 'function') {
+ return Buffer.from(
+ value[Symbol.toPrimitive]('string'), encodingOrOffset, length
+ )
+ }
+
+ throw new TypeError(
+ 'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +
+ 'or Array-like Object. Received type ' + (typeof value)
+ )
+}
+
+/**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+Buffer.from = function (value, encodingOrOffset, length) {
+ return from(value, encodingOrOffset, length)
+}
+
+// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
+// https://github.com/feross/buffer/pull/148
+Buffer.prototype.__proto__ = Uint8Array.prototype
+Buffer.__proto__ = Uint8Array
+
+function assertSize (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('"size" argument must be of type number')
+ } else if (size < 0) {
+ throw new RangeError('The value "' + size + '" is invalid for option "size"')
+ }
+}
+
+function alloc (size, fill, encoding) {
+ assertSize(size)
+ if (size <= 0) {
+ return createBuffer(size)
+ }
+ if (fill !== undefined) {
+ // Only pay attention to encoding if it's a string. This
+ // prevents accidentally sending in a number that would
+ // be interpretted as a start offset.
+ return typeof encoding === 'string'
+ ? createBuffer(size).fill(fill, encoding)
+ : createBuffer(size).fill(fill)
+ }
+ return createBuffer(size)
+}
+
+/**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+Buffer.alloc = function (size, fill, encoding) {
+ return alloc(size, fill, encoding)
+}
+
+function allocUnsafe (size) {
+ assertSize(size)
+ return createBuffer(size < 0 ? 0 : checked(size) | 0)
+}
+
+/**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+Buffer.allocUnsafe = function (size) {
+ return allocUnsafe(size)
+}
+/**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+Buffer.allocUnsafeSlow = function (size) {
+ return allocUnsafe(size)
+}
+
+function fromString (string, encoding) {
+ if (typeof encoding !== 'string' || encoding === '') {
+ encoding = 'utf8'
+ }
+
+ if (!Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding)
+ }
+
+ var length = byteLength(string, encoding) | 0
+ var buf = createBuffer(length)
+
+ var actual = buf.write(string, encoding)
+
+ if (actual !== length) {
+ // Writing a hex string, for example, that contains invalid characters will
+ // cause everything after the first invalid character to be ignored. (e.g.
+ // 'abxxcd' will be treated as 'ab')
+ buf = buf.slice(0, actual)
+ }
+
+ return buf
+}
+
+function fromArrayLike (array) {
+ var length = array.length < 0 ? 0 : checked(array.length) | 0
+ var buf = createBuffer(length)
+ for (var i = 0; i < length; i += 1) {
+ buf[i] = array[i] & 255
+ }
+ return buf
+}
+
+function fromArrayBuffer (array, byteOffset, length) {
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
+ throw new RangeError('"offset" is outside of buffer bounds')
+ }
+
+ if (array.byteLength < byteOffset + (length || 0)) {
+ throw new RangeError('"length" is outside of buffer bounds')
+ }
+
+ var buf
+ if (byteOffset === undefined && length === undefined) {
+ buf = new Uint8Array(array)
+ } else if (length === undefined) {
+ buf = new Uint8Array(array, byteOffset)
+ } else {
+ buf = new Uint8Array(array, byteOffset, length)
+ }
+
+ // Return an augmented `Uint8Array` instance
+ buf.__proto__ = Buffer.prototype
+ return buf
+}
+
+function fromObject (obj) {
+ if (Buffer.isBuffer(obj)) {
+ var len = checked(obj.length) | 0
+ var buf = createBuffer(len)
+
+ if (buf.length === 0) {
+ return buf
+ }
+
+ obj.copy(buf, 0, 0, len)
+ return buf
+ }
+
+ if (obj.length !== undefined) {
+ if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
+ return createBuffer(0)
+ }
+ return fromArrayLike(obj)
+ }
+
+ if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
+ return fromArrayLike(obj.data)
+ }
+}
+
+function checked (length) {
+ // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
+ // length is NaN (which is otherwise coerced to zero.)
+ if (length >= K_MAX_LENGTH) {
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
+ 'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
+ }
+ return length | 0
+}
+
+function SlowBuffer (length) {
+ if (+length != length) { // eslint-disable-line eqeqeq
+ length = 0
+ }
+ return Buffer.alloc(+length)
+}
+
+Buffer.isBuffer = function isBuffer (b) {
+ return b != null && b._isBuffer === true &&
+ b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false
+}
+
+Buffer.compare = function compare (a, b) {
+ if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)
+ if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)
+ if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
+ throw new TypeError(
+ 'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array'
+ )
+ }
+
+ if (a === b) return 0
+
+ var x = a.length
+ var y = b.length
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i]
+ y = b[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+Buffer.isEncoding = function isEncoding (encoding) {
+ switch (String(encoding).toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return true
+ default:
+ return false
+ }
+}
+
+Buffer.concat = function concat (list, length) {
+ if (!Array.isArray(list)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+
+ if (list.length === 0) {
+ return Buffer.alloc(0)
+ }
+
+ var i
+ if (length === undefined) {
+ length = 0
+ for (i = 0; i < list.length; ++i) {
+ length += list[i].length
+ }
+ }
+
+ var buffer = Buffer.allocUnsafe(length)
+ var pos = 0
+ for (i = 0; i < list.length; ++i) {
+ var buf = list[i]
+ if (isInstance(buf, Uint8Array)) {
+ buf = Buffer.from(buf)
+ }
+ if (!Buffer.isBuffer(buf)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+ buf.copy(buffer, pos)
+ pos += buf.length
+ }
+ return buffer
+}
+
+function byteLength (string, encoding) {
+ if (Buffer.isBuffer(string)) {
+ return string.length
+ }
+ if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {
+ return string.byteLength
+ }
+ if (typeof string !== 'string') {
+ throw new TypeError(
+ 'The "string" argument must be one of type string, Buffer, or ArrayBuffer. ' +
+ 'Received type ' + typeof string
+ )
+ }
+
+ var len = string.length
+ var mustMatch = (arguments.length > 2 && arguments[2] === true)
+ if (!mustMatch && len === 0) return 0
+
+ // Use a for loop to avoid recursion
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ return len
+ case 'utf8':
+ case 'utf-8':
+ return utf8ToBytes(string).length
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return len * 2
+ case 'hex':
+ return len >>> 1
+ case 'base64':
+ return base64ToBytes(string).length
+ default:
+ if (loweredCase) {
+ return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8
+ }
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+Buffer.byteLength = byteLength
+
+function slowToString (encoding, start, end) {
+ var loweredCase = false
+
+ // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+ // property of a typed array.
+
+ // This behaves neither like String nor Uint8Array in that we set start/end
+ // to their upper/lower bounds if the value passed is out of range.
+ // undefined is handled specially as per ECMA-262 6th Edition,
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+ if (start === undefined || start < 0) {
+ start = 0
+ }
+ // Return early if start > this.length. Done here to prevent potential uint32
+ // coercion fail below.
+ if (start > this.length) {
+ return ''
+ }
+
+ if (end === undefined || end > this.length) {
+ end = this.length
+ }
+
+ if (end <= 0) {
+ return ''
+ }
+
+ // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
+ end >>>= 0
+ start >>>= 0
+
+ if (end <= start) {
+ return ''
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ while (true) {
+ switch (encoding) {
+ case 'hex':
+ return hexSlice(this, start, end)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Slice(this, start, end)
+
+ case 'ascii':
+ return asciiSlice(this, start, end)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Slice(this, start, end)
+
+ case 'base64':
+ return base64Slice(this, start, end)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return utf16leSlice(this, start, end)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = (encoding + '').toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
+// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
+// reliably in a browserify context because there could be multiple different
+// copies of the 'buffer' package in use. This method works even for Buffer
+// instances that were created from another copy of the `buffer` package.
+// See: https://github.com/feross/buffer/issues/154
+Buffer.prototype._isBuffer = true
+
+function swap (b, n, m) {
+ var i = b[n]
+ b[n] = b[m]
+ b[m] = i
+}
+
+Buffer.prototype.swap16 = function swap16 () {
+ var len = this.length
+ if (len % 2 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 16-bits')
+ }
+ for (var i = 0; i < len; i += 2) {
+ swap(this, i, i + 1)
+ }
+ return this
+}
+
+Buffer.prototype.swap32 = function swap32 () {
+ var len = this.length
+ if (len % 4 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 32-bits')
+ }
+ for (var i = 0; i < len; i += 4) {
+ swap(this, i, i + 3)
+ swap(this, i + 1, i + 2)
+ }
+ return this
+}
+
+Buffer.prototype.swap64 = function swap64 () {
+ var len = this.length
+ if (len % 8 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 64-bits')
+ }
+ for (var i = 0; i < len; i += 8) {
+ swap(this, i, i + 7)
+ swap(this, i + 1, i + 6)
+ swap(this, i + 2, i + 5)
+ swap(this, i + 3, i + 4)
+ }
+ return this
+}
+
+Buffer.prototype.toString = function toString () {
+ var length = this.length
+ if (length === 0) return ''
+ if (arguments.length === 0) return utf8Slice(this, 0, length)
+ return slowToString.apply(this, arguments)
+}
+
+Buffer.prototype.toLocaleString = Buffer.prototype.toString
+
+Buffer.prototype.equals = function equals (b) {
+ if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
+ if (this === b) return true
+ return Buffer.compare(this, b) === 0
+}
+
+Buffer.prototype.inspect = function inspect () {
+ var str = ''
+ var max = exports.INSPECT_MAX_BYTES
+ str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()
+ if (this.length > max) str += ' ... '
+ return ''
+}
+
+Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
+ if (isInstance(target, Uint8Array)) {
+ target = Buffer.from(target, target.offset, target.byteLength)
+ }
+ if (!Buffer.isBuffer(target)) {
+ throw new TypeError(
+ 'The "target" argument must be one of type Buffer or Uint8Array. ' +
+ 'Received type ' + (typeof target)
+ )
+ }
+
+ if (start === undefined) {
+ start = 0
+ }
+ if (end === undefined) {
+ end = target ? target.length : 0
+ }
+ if (thisStart === undefined) {
+ thisStart = 0
+ }
+ if (thisEnd === undefined) {
+ thisEnd = this.length
+ }
+
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+ throw new RangeError('out of range index')
+ }
+
+ if (thisStart >= thisEnd && start >= end) {
+ return 0
+ }
+ if (thisStart >= thisEnd) {
+ return -1
+ }
+ if (start >= end) {
+ return 1
+ }
+
+ start >>>= 0
+ end >>>= 0
+ thisStart >>>= 0
+ thisEnd >>>= 0
+
+ if (this === target) return 0
+
+ var x = thisEnd - thisStart
+ var y = end - start
+ var len = Math.min(x, y)
+
+ var thisCopy = this.slice(thisStart, thisEnd)
+ var targetCopy = target.slice(start, end)
+
+ for (var i = 0; i < len; ++i) {
+ if (thisCopy[i] !== targetCopy[i]) {
+ x = thisCopy[i]
+ y = targetCopy[i]
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+}
+
+// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+//
+// Arguments:
+// - buffer - a Buffer to search
+// - val - a string, Buffer, or number
+// - byteOffset - an index into `buffer`; will be clamped to an int32
+// - encoding - an optional encoding, relevant is val is a string
+// - dir - true for indexOf, false for lastIndexOf
+function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
+ // Empty buffer means no match
+ if (buffer.length === 0) return -1
+
+ // Normalize byteOffset
+ if (typeof byteOffset === 'string') {
+ encoding = byteOffset
+ byteOffset = 0
+ } else if (byteOffset > 0x7fffffff) {
+ byteOffset = 0x7fffffff
+ } else if (byteOffset < -0x80000000) {
+ byteOffset = -0x80000000
+ }
+ byteOffset = +byteOffset // Coerce to Number.
+ if (numberIsNaN(byteOffset)) {
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+ byteOffset = dir ? 0 : (buffer.length - 1)
+ }
+
+ // Normalize byteOffset: negative offsets start from the end of the buffer
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset
+ if (byteOffset >= buffer.length) {
+ if (dir) return -1
+ else byteOffset = buffer.length - 1
+ } else if (byteOffset < 0) {
+ if (dir) byteOffset = 0
+ else return -1
+ }
+
+ // Normalize val
+ if (typeof val === 'string') {
+ val = Buffer.from(val, encoding)
+ }
+
+ // Finally, search either indexOf (if dir is true) or lastIndexOf
+ if (Buffer.isBuffer(val)) {
+ // Special case: looking for empty string/buffer always fails
+ if (val.length === 0) {
+ return -1
+ }
+ return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
+ } else if (typeof val === 'number') {
+ val = val & 0xFF // Search for a byte value [0-255]
+ if (typeof Uint8Array.prototype.indexOf === 'function') {
+ if (dir) {
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
+ } else {
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
+ }
+ }
+ return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
+ }
+
+ throw new TypeError('val must be string, number or Buffer')
+}
+
+function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
+ var indexSize = 1
+ var arrLength = arr.length
+ var valLength = val.length
+
+ if (encoding !== undefined) {
+ encoding = String(encoding).toLowerCase()
+ if (encoding === 'ucs2' || encoding === 'ucs-2' ||
+ encoding === 'utf16le' || encoding === 'utf-16le') {
+ if (arr.length < 2 || val.length < 2) {
+ return -1
+ }
+ indexSize = 2
+ arrLength /= 2
+ valLength /= 2
+ byteOffset /= 2
+ }
+ }
+
+ function read (buf, i) {
+ if (indexSize === 1) {
+ return buf[i]
+ } else {
+ return buf.readUInt16BE(i * indexSize)
+ }
+ }
+
+ var i
+ if (dir) {
+ var foundIndex = -1
+ for (i = byteOffset; i < arrLength; i++) {
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+ if (foundIndex === -1) foundIndex = i
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
+ } else {
+ if (foundIndex !== -1) i -= i - foundIndex
+ foundIndex = -1
+ }
+ }
+ } else {
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
+ for (i = byteOffset; i >= 0; i--) {
+ var found = true
+ for (var j = 0; j < valLength; j++) {
+ if (read(arr, i + j) !== read(val, j)) {
+ found = false
+ break
+ }
+ }
+ if (found) return i
+ }
+ }
+
+ return -1
+}
+
+Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
+ return this.indexOf(val, byteOffset, encoding) !== -1
+}
+
+Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
+}
+
+Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
+}
+
+function hexWrite (buf, string, offset, length) {
+ offset = Number(offset) || 0
+ var remaining = buf.length - offset
+ if (!length) {
+ length = remaining
+ } else {
+ length = Number(length)
+ if (length > remaining) {
+ length = remaining
+ }
+ }
+
+ var strLen = string.length
+
+ if (length > strLen / 2) {
+ length = strLen / 2
+ }
+ for (var i = 0; i < length; ++i) {
+ var parsed = parseInt(string.substr(i * 2, 2), 16)
+ if (numberIsNaN(parsed)) return i
+ buf[offset + i] = parsed
+ }
+ return i
+}
+
+function utf8Write (buf, string, offset, length) {
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+function asciiWrite (buf, string, offset, length) {
+ return blitBuffer(asciiToBytes(string), buf, offset, length)
+}
+
+function latin1Write (buf, string, offset, length) {
+ return asciiWrite(buf, string, offset, length)
+}
+
+function base64Write (buf, string, offset, length) {
+ return blitBuffer(base64ToBytes(string), buf, offset, length)
+}
+
+function ucs2Write (buf, string, offset, length) {
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
+}
+
+Buffer.prototype.write = function write (string, offset, length, encoding) {
+ // Buffer#write(string)
+ if (offset === undefined) {
+ encoding = 'utf8'
+ length = this.length
+ offset = 0
+ // Buffer#write(string, encoding)
+ } else if (length === undefined && typeof offset === 'string') {
+ encoding = offset
+ length = this.length
+ offset = 0
+ // Buffer#write(string, offset[, length][, encoding])
+ } else if (isFinite(offset)) {
+ offset = offset >>> 0
+ if (isFinite(length)) {
+ length = length >>> 0
+ if (encoding === undefined) encoding = 'utf8'
+ } else {
+ encoding = length
+ length = undefined
+ }
+ } else {
+ throw new Error(
+ 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
+ )
+ }
+
+ var remaining = this.length - offset
+ if (length === undefined || length > remaining) length = remaining
+
+ if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
+ throw new RangeError('Attempt to write outside buffer bounds')
+ }
+
+ if (!encoding) encoding = 'utf8'
+
+ var loweredCase = false
+ for (;;) {
+ switch (encoding) {
+ case 'hex':
+ return hexWrite(this, string, offset, length)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Write(this, string, offset, length)
+
+ case 'ascii':
+ return asciiWrite(this, string, offset, length)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Write(this, string, offset, length)
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ return base64Write(this, string, offset, length)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return ucs2Write(this, string, offset, length)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = ('' + encoding).toLowerCase()
+ loweredCase = true
+ }
+ }
+}
+
+Buffer.prototype.toJSON = function toJSON () {
+ return {
+ type: 'Buffer',
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ }
+}
+
+function base64Slice (buf, start, end) {
+ if (start === 0 && end === buf.length) {
+ return base64.fromByteArray(buf)
+ } else {
+ return base64.fromByteArray(buf.slice(start, end))
+ }
+}
+
+function utf8Slice (buf, start, end) {
+ end = Math.min(buf.length, end)
+ var res = []
+
+ var i = start
+ while (i < end) {
+ var firstByte = buf[i]
+ var codePoint = null
+ var bytesPerSequence = (firstByte > 0xEF) ? 4
+ : (firstByte > 0xDF) ? 3
+ : (firstByte > 0xBF) ? 2
+ : 1
+
+ if (i + bytesPerSequence <= end) {
+ var secondByte, thirdByte, fourthByte, tempCodePoint
+
+ switch (bytesPerSequence) {
+ case 1:
+ if (firstByte < 0x80) {
+ codePoint = firstByte
+ }
+ break
+ case 2:
+ secondByte = buf[i + 1]
+ if ((secondByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
+ if (tempCodePoint > 0x7F) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 3:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+ codePoint = tempCodePoint
+ }
+ }
+ break
+ case 4:
+ secondByte = buf[i + 1]
+ thirdByte = buf[i + 2]
+ fourthByte = buf[i + 3]
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+ codePoint = tempCodePoint
+ }
+ }
+ }
+ }
+
+ if (codePoint === null) {
+ // we did not generate a valid codePoint so insert a
+ // replacement char (U+FFFD) and advance only 1 byte
+ codePoint = 0xFFFD
+ bytesPerSequence = 1
+ } else if (codePoint > 0xFFFF) {
+ // encode to utf16 (surrogate pair dance)
+ codePoint -= 0x10000
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800)
+ codePoint = 0xDC00 | codePoint & 0x3FF
+ }
+
+ res.push(codePoint)
+ i += bytesPerSequence
+ }
+
+ return decodeCodePointsArray(res)
+}
+
+// Based on http://stackoverflow.com/a/22747272/680742, the browser with
+// the lowest limit is Chrome, with 0x10000 args.
+// We go 1 magnitude less, for safety
+var MAX_ARGUMENTS_LENGTH = 0x1000
+
+function decodeCodePointsArray (codePoints) {
+ var len = codePoints.length
+ if (len <= MAX_ARGUMENTS_LENGTH) {
+ return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
+ }
+
+ // Decode in chunks to avoid "call stack size exceeded".
+ var res = ''
+ var i = 0
+ while (i < len) {
+ res += String.fromCharCode.apply(
+ String,
+ codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
+ )
+ }
+ return res
+}
+
+function asciiSlice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i] & 0x7F)
+ }
+ return ret
+}
+
+function latin1Slice (buf, start, end) {
+ var ret = ''
+ end = Math.min(buf.length, end)
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i])
+ }
+ return ret
+}
+
+function hexSlice (buf, start, end) {
+ var len = buf.length
+
+ if (!start || start < 0) start = 0
+ if (!end || end < 0 || end > len) end = len
+
+ var out = ''
+ for (var i = start; i < end; ++i) {
+ out += toHex(buf[i])
+ }
+ return out
+}
+
+function utf16leSlice (buf, start, end) {
+ var bytes = buf.slice(start, end)
+ var res = ''
+ for (var i = 0; i < bytes.length; i += 2) {
+ res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
+ }
+ return res
+}
+
+Buffer.prototype.slice = function slice (start, end) {
+ var len = this.length
+ start = ~~start
+ end = end === undefined ? len : ~~end
+
+ if (start < 0) {
+ start += len
+ if (start < 0) start = 0
+ } else if (start > len) {
+ start = len
+ }
+
+ if (end < 0) {
+ end += len
+ if (end < 0) end = 0
+ } else if (end > len) {
+ end = len
+ }
+
+ if (end < start) end = start
+
+ var newBuf = this.subarray(start, end)
+ // Return an augmented `Uint8Array` instance
+ newBuf.__proto__ = Buffer.prototype
+ return newBuf
+}
+
+/*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+function checkOffset (offset, ext, length) {
+ if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
+}
+
+Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) {
+ checkOffset(offset, byteLength, this.length)
+ }
+
+ var val = this[offset + --byteLength]
+ var mul = 1
+ while (byteLength > 0 && (mul *= 0x100)) {
+ val += this[offset + --byteLength] * mul
+ }
+
+ return val
+}
+
+Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ return this[offset]
+}
+
+Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return this[offset] | (this[offset + 1] << 8)
+}
+
+Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ return (this[offset] << 8) | this[offset + 1]
+}
+
+Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return ((this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16)) +
+ (this[offset + 3] * 0x1000000)
+}
+
+Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] * 0x1000000) +
+ ((this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ this[offset + 3])
+}
+
+Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var val = this[offset]
+ var mul = 1
+ var i = 0
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) checkOffset(offset, byteLength, this.length)
+
+ var i = byteLength
+ var mul = 1
+ var val = this[offset + --i]
+ while (i > 0 && (mul *= 0x100)) {
+ val += this[offset + --i] * mul
+ }
+ mul *= 0x80
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength)
+
+ return val
+}
+
+Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 1, this.length)
+ if (!(this[offset] & 0x80)) return (this[offset])
+ return ((0xff - this[offset] + 1) * -1)
+}
+
+Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset] | (this[offset + 1] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 2, this.length)
+ var val = this[offset + 1] | (this[offset] << 8)
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+}
+
+Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16) |
+ (this[offset + 3] << 24)
+}
+
+Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+
+ return (this[offset] << 24) |
+ (this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ (this[offset + 3])
+}
+
+Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, true, 23, 4)
+}
+
+Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 4, this.length)
+ return ieee754.read(this, offset, false, 23, 4)
+}
+
+Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, true, 52, 8)
+}
+
+Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
+ offset = offset >>> 0
+ if (!noAssert) checkOffset(offset, 8, this.length)
+ return ieee754.read(this, offset, false, 52, 8)
+}
+
+function checkInt (buf, value, offset, ext, max, min) {
+ if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+}
+
+Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var mul = 1
+ var i = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ byteLength = byteLength >>> 0
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1
+ checkInt(this, value, offset, byteLength, maxBytes, 0)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ return offset + 2
+}
+
+Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ return offset + 2
+}
+
+Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ this[offset + 3] = (value >>> 24)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 1] = (value >>> 8)
+ this[offset] = (value & 0xff)
+ return offset + 4
+}
+
+Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ return offset + 4
+}
+
+Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) {
+ var limit = Math.pow(2, (8 * byteLength) - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = 0
+ var mul = 1
+ var sub = 0
+ this[offset] = value & 0xFF
+ while (++i < byteLength && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) {
+ var limit = Math.pow(2, (8 * byteLength) - 1)
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit)
+ }
+
+ var i = byteLength - 1
+ var mul = 1
+ var sub = 0
+ this[offset + i] = value & 0xFF
+ while (--i >= 0 && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+ sub = 1
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
+ }
+
+ return offset + byteLength
+}
+
+Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
+ if (value < 0) value = 0xff + value + 1
+ this[offset] = (value & 0xff)
+ return offset + 1
+}
+
+Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ return offset + 2
+}
+
+Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
+ this[offset] = (value >>> 8)
+ this[offset + 1] = (value & 0xff)
+ return offset + 2
+}
+
+Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ this[offset] = (value & 0xff)
+ this[offset + 1] = (value >>> 8)
+ this[offset + 2] = (value >>> 16)
+ this[offset + 3] = (value >>> 24)
+ return offset + 4
+}
+
+Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
+ if (value < 0) value = 0xffffffff + value + 1
+ this[offset] = (value >>> 24)
+ this[offset + 1] = (value >>> 16)
+ this[offset + 2] = (value >>> 8)
+ this[offset + 3] = (value & 0xff)
+ return offset + 4
+}
+
+function checkIEEE754 (buf, value, offset, ext, max, min) {
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+ if (offset < 0) throw new RangeError('Index out of range')
+}
+
+function writeFloat (buf, value, offset, littleEndian, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 23, 4)
+ return offset + 4
+}
+
+Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, false, noAssert)
+}
+
+function writeDouble (buf, value, offset, littleEndian, noAssert) {
+ value = +value
+ offset = offset >>> 0
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
+ }
+ ieee754.write(buf, value, offset, littleEndian, 52, 8)
+ return offset + 8
+}
+
+Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, true, noAssert)
+}
+
+Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, false, noAssert)
+}
+
+// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+ if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')
+ if (!start) start = 0
+ if (!end && end !== 0) end = this.length
+ if (targetStart >= target.length) targetStart = target.length
+ if (!targetStart) targetStart = 0
+ if (end > 0 && end < start) end = start
+
+ // Copy 0 bytes; we're done
+ if (end === start) return 0
+ if (target.length === 0 || this.length === 0) return 0
+
+ // Fatal error conditions
+ if (targetStart < 0) {
+ throw new RangeError('targetStart out of bounds')
+ }
+ if (start < 0 || start >= this.length) throw new RangeError('Index out of range')
+ if (end < 0) throw new RangeError('sourceEnd out of bounds')
+
+ // Are we oob?
+ if (end > this.length) end = this.length
+ if (target.length - targetStart < end - start) {
+ end = target.length - targetStart + start
+ }
+
+ var len = end - start
+
+ if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {
+ // Use built-in when available, missing from IE11
+ this.copyWithin(targetStart, start, end)
+ } else if (this === target && start < targetStart && targetStart < end) {
+ // descending copy from end
+ for (var i = len - 1; i >= 0; --i) {
+ target[i + targetStart] = this[i + start]
+ }
+ } else {
+ Uint8Array.prototype.set.call(
+ target,
+ this.subarray(start, end),
+ targetStart
+ )
+ }
+
+ return len
+}
+
+// Usage:
+// buffer.fill(number[, offset[, end]])
+// buffer.fill(buffer[, offset[, end]])
+// buffer.fill(string[, offset[, end]][, encoding])
+Buffer.prototype.fill = function fill (val, start, end, encoding) {
+ // Handle string cases:
+ if (typeof val === 'string') {
+ if (typeof start === 'string') {
+ encoding = start
+ start = 0
+ end = this.length
+ } else if (typeof end === 'string') {
+ encoding = end
+ end = this.length
+ }
+ if (encoding !== undefined && typeof encoding !== 'string') {
+ throw new TypeError('encoding must be a string')
+ }
+ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding)
+ }
+ if (val.length === 1) {
+ var code = val.charCodeAt(0)
+ if ((encoding === 'utf8' && code < 128) ||
+ encoding === 'latin1') {
+ // Fast path: If `val` fits into a single byte, use that numeric value.
+ val = code
+ }
+ }
+ } else if (typeof val === 'number') {
+ val = val & 255
+ }
+
+ // Invalid ranges are not set to a default, so can range check early.
+ if (start < 0 || this.length < start || this.length < end) {
+ throw new RangeError('Out of range index')
+ }
+
+ if (end <= start) {
+ return this
+ }
+
+ start = start >>> 0
+ end = end === undefined ? this.length : end >>> 0
+
+ if (!val) val = 0
+
+ var i
+ if (typeof val === 'number') {
+ for (i = start; i < end; ++i) {
+ this[i] = val
+ }
+ } else {
+ var bytes = Buffer.isBuffer(val)
+ ? val
+ : Buffer.from(val, encoding)
+ var len = bytes.length
+ if (len === 0) {
+ throw new TypeError('The value "' + val +
+ '" is invalid for argument "value"')
+ }
+ for (i = 0; i < end - start; ++i) {
+ this[i + start] = bytes[i % len]
+ }
+ }
+
+ return this
+}
+
+// HELPER FUNCTIONS
+// ================
+
+var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
+
+function base64clean (str) {
+ // Node takes equal signs as end of the Base64 encoding
+ str = str.split('=')[0]
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
+ str = str.trim().replace(INVALID_BASE64_RE, '')
+ // Node converts strings with length < 2 to ''
+ if (str.length < 2) return ''
+ // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+ while (str.length % 4 !== 0) {
+ str = str + '='
+ }
+ return str
+}
+
+function toHex (n) {
+ if (n < 16) return '0' + n.toString(16)
+ return n.toString(16)
+}
+
+function utf8ToBytes (string, units) {
+ units = units || Infinity
+ var codePoint
+ var length = string.length
+ var leadSurrogate = null
+ var bytes = []
+
+ for (var i = 0; i < length; ++i) {
+ codePoint = string.charCodeAt(i)
+
+ // is surrogate component
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
+ // last char was a lead
+ if (!leadSurrogate) {
+ // no lead yet
+ if (codePoint > 0xDBFF) {
+ // unexpected trail
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ } else if (i + 1 === length) {
+ // unpaired lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ continue
+ }
+
+ // valid lead
+ leadSurrogate = codePoint
+
+ continue
+ }
+
+ // 2 leads in a row
+ if (codePoint < 0xDC00) {
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ leadSurrogate = codePoint
+ continue
+ }
+
+ // valid surrogate pair
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
+ } else if (leadSurrogate) {
+ // valid bmp char, but last char was a lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
+ }
+
+ leadSurrogate = null
+
+ // encode utf8
+ if (codePoint < 0x80) {
+ if ((units -= 1) < 0) break
+ bytes.push(codePoint)
+ } else if (codePoint < 0x800) {
+ if ((units -= 2) < 0) break
+ bytes.push(
+ codePoint >> 0x6 | 0xC0,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x10000) {
+ if ((units -= 3) < 0) break
+ bytes.push(
+ codePoint >> 0xC | 0xE0,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else if (codePoint < 0x110000) {
+ if ((units -= 4) < 0) break
+ bytes.push(
+ codePoint >> 0x12 | 0xF0,
+ codePoint >> 0xC & 0x3F | 0x80,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ )
+ } else {
+ throw new Error('Invalid code point')
+ }
+ }
+
+ return bytes
+}
+
+function asciiToBytes (str) {
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ // Node's code seems to be doing this and not & 0x7F..
+ byteArray.push(str.charCodeAt(i) & 0xFF)
+ }
+ return byteArray
+}
+
+function utf16leToBytes (str, units) {
+ var c, hi, lo
+ var byteArray = []
+ for (var i = 0; i < str.length; ++i) {
+ if ((units -= 2) < 0) break
+
+ c = str.charCodeAt(i)
+ hi = c >> 8
+ lo = c % 256
+ byteArray.push(lo)
+ byteArray.push(hi)
+ }
+
+ return byteArray
+}
+
+function base64ToBytes (str) {
+ return base64.toByteArray(base64clean(str))
+}
+
+function blitBuffer (src, dst, offset, length) {
+ for (var i = 0; i < length; ++i) {
+ if ((i + offset >= dst.length) || (i >= src.length)) break
+ dst[i + offset] = src[i]
+ }
+ return i
+}
+
+// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass
+// the `instanceof` check but they should be treated as of that type.
+// See: https://github.com/feross/buffer/issues/166
+function isInstance (obj, type) {
+ return obj instanceof type ||
+ (obj != null && obj.constructor != null && obj.constructor.name != null &&
+ obj.constructor.name === type.name)
+}
+function numberIsNaN (obj) {
+ // For IE11 support
+ return obj !== obj // eslint-disable-line no-self-compare
+}
+
+},{"base64-js":10,"ieee754":79}],13:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var objectCreate = Object.create || objectCreatePolyfill
+var objectKeys = Object.keys || objectKeysPolyfill
+var bind = Function.prototype.bind || functionBindPolyfill
+
+function EventEmitter() {
+ if (!this._events || !Object.prototype.hasOwnProperty.call(this, '_events')) {
+ this._events = objectCreate(null);
+ this._eventsCount = 0;
+ }
+
+ this._maxListeners = this._maxListeners || undefined;
+}
+module.exports = EventEmitter;
+
+// Backwards-compat with node 0.10.x
+EventEmitter.EventEmitter = EventEmitter;
+
+EventEmitter.prototype._events = undefined;
+EventEmitter.prototype._maxListeners = undefined;
+
+// By default EventEmitters will print a warning if more than 10 listeners are
+// added to it. This is a useful default which helps finding memory leaks.
+var defaultMaxListeners = 10;
+
+var hasDefineProperty;
+try {
+ var o = {};
+ if (Object.defineProperty) Object.defineProperty(o, 'x', { value: 0 });
+ hasDefineProperty = o.x === 0;
+} catch (err) { hasDefineProperty = false }
+if (hasDefineProperty) {
+ Object.defineProperty(EventEmitter, 'defaultMaxListeners', {
+ enumerable: true,
+ get: function() {
+ return defaultMaxListeners;
+ },
+ set: function(arg) {
+ // check whether the input is a positive number (whose value is zero or
+ // greater and not a NaN).
+ if (typeof arg !== 'number' || arg < 0 || arg !== arg)
+ throw new TypeError('"defaultMaxListeners" must be a positive number');
+ defaultMaxListeners = arg;
+ }
+ });
+} else {
+ EventEmitter.defaultMaxListeners = defaultMaxListeners;
+}
+
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
+ if (typeof n !== 'number' || n < 0 || isNaN(n))
+ throw new TypeError('"n" argument must be a positive number');
+ this._maxListeners = n;
+ return this;
+};
+
+function $getMaxListeners(that) {
+ if (that._maxListeners === undefined)
+ return EventEmitter.defaultMaxListeners;
+ return that._maxListeners;
+}
+
+EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
+ return $getMaxListeners(this);
+};
+
+// These standalone emit* functions are used to optimize calling of event
+// handlers for fast cases because emit() itself often has a variable number of
+// arguments and can be deoptimized because of that. These functions always have
+// the same number of arguments and thus do not get deoptimized, so the code
+// inside them can execute faster.
+function emitNone(handler, isFn, self) {
+ if (isFn)
+ handler.call(self);
+ else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+ for (var i = 0; i < len; ++i)
+ listeners[i].call(self);
+ }
+}
+function emitOne(handler, isFn, self, arg1) {
+ if (isFn)
+ handler.call(self, arg1);
+ else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+ for (var i = 0; i < len; ++i)
+ listeners[i].call(self, arg1);
+ }
+}
+function emitTwo(handler, isFn, self, arg1, arg2) {
+ if (isFn)
+ handler.call(self, arg1, arg2);
+ else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+ for (var i = 0; i < len; ++i)
+ listeners[i].call(self, arg1, arg2);
+ }
+}
+function emitThree(handler, isFn, self, arg1, arg2, arg3) {
+ if (isFn)
+ handler.call(self, arg1, arg2, arg3);
+ else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+ for (var i = 0; i < len; ++i)
+ listeners[i].call(self, arg1, arg2, arg3);
+ }
+}
+
+function emitMany(handler, isFn, self, args) {
+ if (isFn)
+ handler.apply(self, args);
+ else {
+ var len = handler.length;
+ var listeners = arrayClone(handler, len);
+ for (var i = 0; i < len; ++i)
+ listeners[i].apply(self, args);
+ }
+}
+
+EventEmitter.prototype.emit = function emit(type) {
+ var er, handler, len, args, i, events;
+ var doError = (type === 'error');
+
+ events = this._events;
+ if (events)
+ doError = (doError && events.error == null);
+ else if (!doError)
+ return false;
+
+ // If there is no 'error' event listener then throw.
+ if (doError) {
+ if (arguments.length > 1)
+ er = arguments[1];
+ if (er instanceof Error) {
+ throw er; // Unhandled 'error' event
+ } else {
+ // At least give some kind of context to the user
+ var err = new Error('Unhandled "error" event. (' + er + ')');
+ err.context = er;
+ throw err;
+ }
+ return false;
+ }
+
+ handler = events[type];
+
+ if (!handler)
+ return false;
+
+ var isFn = typeof handler === 'function';
+ len = arguments.length;
+ switch (len) {
+ // fast cases
+ case 1:
+ emitNone(handler, isFn, this);
+ break;
+ case 2:
+ emitOne(handler, isFn, this, arguments[1]);
+ break;
+ case 3:
+ emitTwo(handler, isFn, this, arguments[1], arguments[2]);
+ break;
+ case 4:
+ emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);
+ break;
+ // slower
+ default:
+ args = new Array(len - 1);
+ for (i = 1; i < len; i++)
+ args[i - 1] = arguments[i];
+ emitMany(handler, isFn, this, args);
+ }
+
+ return true;
+};
+
+function _addListener(target, type, listener, prepend) {
+ var m;
+ var events;
+ var existing;
+
+ if (typeof listener !== 'function')
+ throw new TypeError('"listener" argument must be a function');
+
+ events = target._events;
+ if (!events) {
+ events = target._events = objectCreate(null);
+ target._eventsCount = 0;
+ } else {
+ // To avoid recursion in the case that type === "newListener"! Before
+ // adding it to the listeners, first emit "newListener".
+ if (events.newListener) {
+ target.emit('newListener', type,
+ listener.listener ? listener.listener : listener);
+
+ // Re-assign `events` because a newListener handler could have caused the
+ // this._events to be assigned to a new object
+ events = target._events;
+ }
+ existing = events[type];
+ }
+
+ if (!existing) {
+ // Optimize the case of one listener. Don't need the extra array object.
+ existing = events[type] = listener;
+ ++target._eventsCount;
+ } else {
+ if (typeof existing === 'function') {
+ // Adding the second element, need to change to array.
+ existing = events[type] =
+ prepend ? [listener, existing] : [existing, listener];
+ } else {
+ // If we've already got an array, just append.
+ if (prepend) {
+ existing.unshift(listener);
+ } else {
+ existing.push(listener);
+ }
+ }
+
+ // Check for listener leak
+ if (!existing.warned) {
+ m = $getMaxListeners(target);
+ if (m && m > 0 && existing.length > m) {
+ existing.warned = true;
+ var w = new Error('Possible EventEmitter memory leak detected. ' +
+ existing.length + ' "' + String(type) + '" listeners ' +
+ 'added. Use emitter.setMaxListeners() to ' +
+ 'increase limit.');
+ w.name = 'MaxListenersExceededWarning';
+ w.emitter = target;
+ w.type = type;
+ w.count = existing.length;
+ if (typeof console === 'object' && console.warn) {
+ console.warn('%s: %s', w.name, w.message);
+ }
+ }
+ }
+ }
+
+ return target;
+}
+
+EventEmitter.prototype.addListener = function addListener(type, listener) {
+ return _addListener(this, type, listener, false);
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.prependListener =
+ function prependListener(type, listener) {
+ return _addListener(this, type, listener, true);
+ };
+
+function onceWrapper() {
+ if (!this.fired) {
+ this.target.removeListener(this.type, this.wrapFn);
+ this.fired = true;
+ switch (arguments.length) {
+ case 0:
+ return this.listener.call(this.target);
+ case 1:
+ return this.listener.call(this.target, arguments[0]);
+ case 2:
+ return this.listener.call(this.target, arguments[0], arguments[1]);
+ case 3:
+ return this.listener.call(this.target, arguments[0], arguments[1],
+ arguments[2]);
+ default:
+ var args = new Array(arguments.length);
+ for (var i = 0; i < args.length; ++i)
+ args[i] = arguments[i];
+ this.listener.apply(this.target, args);
+ }
+ }
+}
+
+function _onceWrap(target, type, listener) {
+ var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };
+ var wrapped = bind.call(onceWrapper, state);
+ wrapped.listener = listener;
+ state.wrapFn = wrapped;
+ return wrapped;
+}
+
+EventEmitter.prototype.once = function once(type, listener) {
+ if (typeof listener !== 'function')
+ throw new TypeError('"listener" argument must be a function');
+ this.on(type, _onceWrap(this, type, listener));
+ return this;
+};
+
+EventEmitter.prototype.prependOnceListener =
+ function prependOnceListener(type, listener) {
+ if (typeof listener !== 'function')
+ throw new TypeError('"listener" argument must be a function');
+ this.prependListener(type, _onceWrap(this, type, listener));
+ return this;
+ };
+
+// Emits a 'removeListener' event if and only if the listener was removed.
+EventEmitter.prototype.removeListener =
+ function removeListener(type, listener) {
+ var list, events, position, i, originalListener;
+
+ if (typeof listener !== 'function')
+ throw new TypeError('"listener" argument must be a function');
+
+ events = this._events;
+ if (!events)
+ return this;
+
+ list = events[type];
+ if (!list)
+ return this;
+
+ if (list === listener || list.listener === listener) {
+ if (--this._eventsCount === 0)
+ this._events = objectCreate(null);
+ else {
+ delete events[type];
+ if (events.removeListener)
+ this.emit('removeListener', type, list.listener || listener);
+ }
+ } else if (typeof list !== 'function') {
+ position = -1;
+
+ for (i = list.length - 1; i >= 0; i--) {
+ if (list[i] === listener || list[i].listener === listener) {
+ originalListener = list[i].listener;
+ position = i;
+ break;
+ }
+ }
+
+ if (position < 0)
+ return this;
+
+ if (position === 0)
+ list.shift();
+ else
+ spliceOne(list, position);
+
+ if (list.length === 1)
+ events[type] = list[0];
+
+ if (events.removeListener)
+ this.emit('removeListener', type, originalListener || listener);
+ }
+
+ return this;
+ };
+
+EventEmitter.prototype.removeAllListeners =
+ function removeAllListeners(type) {
+ var listeners, events, i;
+
+ events = this._events;
+ if (!events)
+ return this;
+
+ // not listening for removeListener, no need to emit
+ if (!events.removeListener) {
+ if (arguments.length === 0) {
+ this._events = objectCreate(null);
+ this._eventsCount = 0;
+ } else if (events[type]) {
+ if (--this._eventsCount === 0)
+ this._events = objectCreate(null);
+ else
+ delete events[type];
+ }
+ return this;
+ }
+
+ // emit removeListener for all listeners on all events
+ if (arguments.length === 0) {
+ var keys = objectKeys(events);
+ var key;
+ for (i = 0; i < keys.length; ++i) {
+ key = keys[i];
+ if (key === 'removeListener') continue;
+ this.removeAllListeners(key);
+ }
+ this.removeAllListeners('removeListener');
+ this._events = objectCreate(null);
+ this._eventsCount = 0;
+ return this;
+ }
+
+ listeners = events[type];
+
+ if (typeof listeners === 'function') {
+ this.removeListener(type, listeners);
+ } else if (listeners) {
+ // LIFO order
+ for (i = listeners.length - 1; i >= 0; i--) {
+ this.removeListener(type, listeners[i]);
+ }
+ }
+
+ return this;
+ };
+
+function _listeners(target, type, unwrap) {
+ var events = target._events;
+
+ if (!events)
+ return [];
+
+ var evlistener = events[type];
+ if (!evlistener)
+ return [];
+
+ if (typeof evlistener === 'function')
+ return unwrap ? [evlistener.listener || evlistener] : [evlistener];
+
+ return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);
+}
+
+EventEmitter.prototype.listeners = function listeners(type) {
+ return _listeners(this, type, true);
+};
+
+EventEmitter.prototype.rawListeners = function rawListeners(type) {
+ return _listeners(this, type, false);
+};
+
+EventEmitter.listenerCount = function(emitter, type) {
+ if (typeof emitter.listenerCount === 'function') {
+ return emitter.listenerCount(type);
+ } else {
+ return listenerCount.call(emitter, type);
+ }
+};
+
+EventEmitter.prototype.listenerCount = listenerCount;
+function listenerCount(type) {
+ var events = this._events;
+
+ if (events) {
+ var evlistener = events[type];
+
+ if (typeof evlistener === 'function') {
+ return 1;
+ } else if (evlistener) {
+ return evlistener.length;
+ }
+ }
+
+ return 0;
+}
+
+EventEmitter.prototype.eventNames = function eventNames() {
+ return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
+};
+
+// About 1.5x faster than the two-arg version of Array#splice().
+function spliceOne(list, index) {
+ for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)
+ list[i] = list[k];
+ list.pop();
+}
+
+function arrayClone(arr, n) {
+ var copy = new Array(n);
+ for (var i = 0; i < n; ++i)
+ copy[i] = arr[i];
+ return copy;
+}
+
+function unwrapListeners(arr) {
+ var ret = new Array(arr.length);
+ for (var i = 0; i < ret.length; ++i) {
+ ret[i] = arr[i].listener || arr[i];
+ }
+ return ret;
+}
+
+function objectCreatePolyfill(proto) {
+ var F = function() {};
+ F.prototype = proto;
+ return new F;
+}
+function objectKeysPolyfill(obj) {
+ var keys = [];
+ for (var k in obj) if (Object.prototype.hasOwnProperty.call(obj, k)) {
+ keys.push(k);
+ }
+ return k;
+}
+function functionBindPolyfill(context) {
+ var fn = this;
+ return function () {
+ return fn.apply(context, arguments);
+ };
+}
+
+},{}],14:[function(require,module,exports){
+(function (Buffer){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+
+function isArray(arg) {
+ if (Array.isArray) {
+ return Array.isArray(arg);
+ }
+ return objectToString(arg) === '[object Array]';
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = Buffer.isBuffer;
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+}).call(this,{"isBuffer":require("../../is-buffer/index.js")})
+},{"../../is-buffer/index.js":81}],15:[function(require,module,exports){
+'use strict';
+
+var copy = require('es5-ext/object/copy')
+ , normalizeOptions = require('es5-ext/object/normalize-options')
+ , ensureCallable = require('es5-ext/object/valid-callable')
+ , map = require('es5-ext/object/map')
+ , callable = require('es5-ext/object/valid-callable')
+ , validValue = require('es5-ext/object/valid-value')
+
+ , bind = Function.prototype.bind, defineProperty = Object.defineProperty
+ , hasOwnProperty = Object.prototype.hasOwnProperty
+ , define;
+
+define = function (name, desc, options) {
+ var value = validValue(desc) && callable(desc.value), dgs;
+ dgs = copy(desc);
+ delete dgs.writable;
+ delete dgs.value;
+ dgs.get = function () {
+ if (!options.overwriteDefinition && hasOwnProperty.call(this, name)) return value;
+ desc.value = bind.call(value, options.resolveContext ? options.resolveContext(this) : this);
+ defineProperty(this, name, desc);
+ return this[name];
+ };
+ return dgs;
+};
+
+module.exports = function (props/*, options*/) {
+ var options = normalizeOptions(arguments[1]);
+ if (options.resolveContext != null) ensureCallable(options.resolveContext);
+ return map(props, function (desc, name) { return define(name, desc, options); });
+};
+
+},{"es5-ext/object/copy":39,"es5-ext/object/map":48,"es5-ext/object/normalize-options":49,"es5-ext/object/valid-callable":54,"es5-ext/object/valid-value":55}],16:[function(require,module,exports){
+'use strict';
+
+var assign = require('es5-ext/object/assign')
+ , normalizeOpts = require('es5-ext/object/normalize-options')
+ , isCallable = require('es5-ext/object/is-callable')
+ , contains = require('es5-ext/string/#/contains')
+
+ , d;
+
+d = module.exports = function (dscr, value/*, options*/) {
+ var c, e, w, options, desc;
+ if ((arguments.length < 2) || (typeof dscr !== 'string')) {
+ options = value;
+ value = dscr;
+ dscr = null;
+ } else {
+ options = arguments[2];
+ }
+ if (dscr == null) {
+ c = w = true;
+ e = false;
+ } else {
+ c = contains.call(dscr, 'c');
+ e = contains.call(dscr, 'e');
+ w = contains.call(dscr, 'w');
+ }
+
+ desc = { value: value, configurable: c, enumerable: e, writable: w };
+ return !options ? desc : assign(normalizeOpts(options), desc);
+};
+
+d.gs = function (dscr, get, set/*, options*/) {
+ var c, e, options, desc;
+ if (typeof dscr !== 'string') {
+ options = set;
+ set = get;
+ get = dscr;
+ dscr = null;
+ } else {
+ options = arguments[3];
+ }
+ if (get == null) {
+ get = undefined;
+ } else if (!isCallable(get)) {
+ options = get;
+ get = set = undefined;
+ } else if (set == null) {
+ set = undefined;
+ } else if (!isCallable(set)) {
+ options = set;
+ set = undefined;
+ }
+ if (dscr == null) {
+ c = true;
+ e = false;
+ } else {
+ c = contains.call(dscr, 'c');
+ e = contains.call(dscr, 'e');
+ }
+
+ desc = { get: get, set: set, configurable: c, enumerable: e };
+ return !options ? desc : assign(normalizeOpts(options), desc);
+};
+
+},{"es5-ext/object/assign":36,"es5-ext/object/is-callable":42,"es5-ext/object/normalize-options":49,"es5-ext/string/#/contains":56}],17:[function(require,module,exports){
+(function (process,Buffer){
+var stream = require('readable-stream')
+var eos = require('end-of-stream')
+var inherits = require('inherits')
+var shift = require('stream-shift')
+
+var SIGNAL_FLUSH = (Buffer.from && Buffer.from !== Uint8Array.from)
+ ? Buffer.from([0])
+ : new Buffer([0])
+
+var onuncork = function(self, fn) {
+ if (self._corked) self.once('uncork', fn)
+ else fn()
+}
+
+var autoDestroy = function (self, err) {
+ if (self._autoDestroy) self.destroy(err)
+}
+
+var destroyer = function(self, end) {
+ return function(err) {
+ if (err) autoDestroy(self, err.message === 'premature close' ? null : err)
+ else if (end && !self._ended) self.end()
+ }
+}
+
+var end = function(ws, fn) {
+ if (!ws) return fn()
+ if (ws._writableState && ws._writableState.finished) return fn()
+ if (ws._writableState) return ws.end(fn)
+ ws.end()
+ fn()
+}
+
+var toStreams2 = function(rs) {
+ return new (stream.Readable)({objectMode:true, highWaterMark:16}).wrap(rs)
+}
+
+var Duplexify = function(writable, readable, opts) {
+ if (!(this instanceof Duplexify)) return new Duplexify(writable, readable, opts)
+ stream.Duplex.call(this, opts)
+
+ this._writable = null
+ this._readable = null
+ this._readable2 = null
+
+ this._autoDestroy = !opts || opts.autoDestroy !== false
+ this._forwardDestroy = !opts || opts.destroy !== false
+ this._forwardEnd = !opts || opts.end !== false
+ this._corked = 1 // start corked
+ this._ondrain = null
+ this._drained = false
+ this._forwarding = false
+ this._unwrite = null
+ this._unread = null
+ this._ended = false
+
+ this.destroyed = false
+
+ if (writable) this.setWritable(writable)
+ if (readable) this.setReadable(readable)
+}
+
+inherits(Duplexify, stream.Duplex)
+
+Duplexify.obj = function(writable, readable, opts) {
+ if (!opts) opts = {}
+ opts.objectMode = true
+ opts.highWaterMark = 16
+ return new Duplexify(writable, readable, opts)
+}
+
+Duplexify.prototype.cork = function() {
+ if (++this._corked === 1) this.emit('cork')
+}
+
+Duplexify.prototype.uncork = function() {
+ if (this._corked && --this._corked === 0) this.emit('uncork')
+}
+
+Duplexify.prototype.setWritable = function(writable) {
+ if (this._unwrite) this._unwrite()
+
+ if (this.destroyed) {
+ if (writable && writable.destroy) writable.destroy()
+ return
+ }
+
+ if (writable === null || writable === false) {
+ this.end()
+ return
+ }
+
+ var self = this
+ var unend = eos(writable, {writable:true, readable:false}, destroyer(this, this._forwardEnd))
+
+ var ondrain = function() {
+ var ondrain = self._ondrain
+ self._ondrain = null
+ if (ondrain) ondrain()
+ }
+
+ var clear = function() {
+ self._writable.removeListener('drain', ondrain)
+ unend()
+ }
+
+ if (this._unwrite) process.nextTick(ondrain) // force a drain on stream reset to avoid livelocks
+
+ this._writable = writable
+ this._writable.on('drain', ondrain)
+ this._unwrite = clear
+
+ this.uncork() // always uncork setWritable
+}
+
+Duplexify.prototype.setReadable = function(readable) {
+ if (this._unread) this._unread()
+
+ if (this.destroyed) {
+ if (readable && readable.destroy) readable.destroy()
+ return
+ }
+
+ if (readable === null || readable === false) {
+ this.push(null)
+ this.resume()
+ return
+ }
+
+ var self = this
+ var unend = eos(readable, {writable:false, readable:true}, destroyer(this))
+
+ var onreadable = function() {
+ self._forward()
+ }
+
+ var onend = function() {
+ self.push(null)
+ }
+
+ var clear = function() {
+ self._readable2.removeListener('readable', onreadable)
+ self._readable2.removeListener('end', onend)
+ unend()
+ }
+
+ this._drained = true
+ this._readable = readable
+ this._readable2 = readable._readableState ? readable : toStreams2(readable)
+ this._readable2.on('readable', onreadable)
+ this._readable2.on('end', onend)
+ this._unread = clear
+
+ this._forward()
+}
+
+Duplexify.prototype._read = function() {
+ this._drained = true
+ this._forward()
+}
+
+Duplexify.prototype._forward = function() {
+ if (this._forwarding || !this._readable2 || !this._drained) return
+ this._forwarding = true
+
+ var data
+
+ while (this._drained && (data = shift(this._readable2)) !== null) {
+ if (this.destroyed) continue
+ this._drained = this.push(data)
+ }
+
+ this._forwarding = false
+}
+
+Duplexify.prototype.destroy = function(err) {
+ if (this.destroyed) return
+ this.destroyed = true
+
+ var self = this
+ process.nextTick(function() {
+ self._destroy(err)
+ })
+}
+
+Duplexify.prototype._destroy = function(err) {
+ if (err) {
+ var ondrain = this._ondrain
+ this._ondrain = null
+ if (ondrain) ondrain(err)
+ else this.emit('error', err)
+ }
+
+ if (this._forwardDestroy) {
+ if (this._readable && this._readable.destroy) this._readable.destroy()
+ if (this._writable && this._writable.destroy) this._writable.destroy()
+ }
+
+ this.emit('close')
+}
+
+Duplexify.prototype._write = function(data, enc, cb) {
+ if (this.destroyed) return cb()
+ if (this._corked) return onuncork(this, this._write.bind(this, data, enc, cb))
+ if (data === SIGNAL_FLUSH) return this._finish(cb)
+ if (!this._writable) return cb()
+
+ if (this._writable.write(data) === false) this._ondrain = cb
+ else cb()
+}
+
+Duplexify.prototype._finish = function(cb) {
+ var self = this
+ this.emit('preend')
+ onuncork(this, function() {
+ end(self._forwardEnd && self._writable, function() {
+ // haxx to not emit prefinish twice
+ if (self._writableState.prefinished === false) self._writableState.prefinished = true
+ self.emit('prefinish')
+ onuncork(self, cb)
+ })
+ })
+}
+
+Duplexify.prototype.end = function(data, enc, cb) {
+ if (typeof data === 'function') return this.end(null, null, data)
+ if (typeof enc === 'function') return this.end(data, null, enc)
+ this._ended = true
+ if (data) this.write(data)
+ if (!this._writableState.ending) this.write(SIGNAL_FLUSH)
+ return stream.Writable.prototype.end.call(this, cb)
+}
+
+module.exports = Duplexify
+
+}).call(this,require('_process'),require("buffer").Buffer)
+},{"_process":92,"buffer":12,"end-of-stream":18,"inherits":80,"readable-stream":108,"stream-shift":111}],18:[function(require,module,exports){
+var once = require('once');
+
+var noop = function() {};
+
+var isRequest = function(stream) {
+ return stream.setHeader && typeof stream.abort === 'function';
+};
+
+var isChildProcess = function(stream) {
+ return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3
+};
+
+var eos = function(stream, opts, callback) {
+ if (typeof opts === 'function') return eos(stream, null, opts);
+ if (!opts) opts = {};
+
+ callback = once(callback || noop);
+
+ var ws = stream._writableState;
+ var rs = stream._readableState;
+ var readable = opts.readable || (opts.readable !== false && stream.readable);
+ var writable = opts.writable || (opts.writable !== false && stream.writable);
+
+ var onlegacyfinish = function() {
+ if (!stream.writable) onfinish();
+ };
+
+ var onfinish = function() {
+ writable = false;
+ if (!readable) callback.call(stream);
+ };
+
+ var onend = function() {
+ readable = false;
+ if (!writable) callback.call(stream);
+ };
+
+ var onexit = function(exitCode) {
+ callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);
+ };
+
+ var onerror = function(err) {
+ callback.call(stream, err);
+ };
+
+ var onclose = function() {
+ if (readable && !(rs && rs.ended)) return callback.call(stream, new Error('premature close'));
+ if (writable && !(ws && ws.ended)) return callback.call(stream, new Error('premature close'));
+ };
+
+ var onrequest = function() {
+ stream.req.on('finish', onfinish);
+ };
+
+ if (isRequest(stream)) {
+ stream.on('complete', onfinish);
+ stream.on('abort', onclose);
+ if (stream.req) onrequest();
+ else stream.on('request', onrequest);
+ } else if (writable && !ws) { // legacy streams
+ stream.on('end', onlegacyfinish);
+ stream.on('close', onlegacyfinish);
+ }
+
+ if (isChildProcess(stream)) stream.on('exit', onexit);
+
+ stream.on('end', onend);
+ stream.on('finish', onfinish);
+ if (opts.error !== false) stream.on('error', onerror);
+ stream.on('close', onclose);
+
+ return function() {
+ stream.removeListener('complete', onfinish);
+ stream.removeListener('abort', onclose);
+ stream.removeListener('request', onrequest);
+ if (stream.req) stream.req.removeListener('finish', onfinish);
+ stream.removeListener('end', onlegacyfinish);
+ stream.removeListener('close', onlegacyfinish);
+ stream.removeListener('finish', onfinish);
+ stream.removeListener('exit', onexit);
+ stream.removeListener('end', onend);
+ stream.removeListener('error', onerror);
+ stream.removeListener('close', onclose);
+ };
+};
+
+module.exports = eos;
+
+},{"once":90}],19:[function(require,module,exports){
+// Inspired by Google Closure:
+// http://closure-library.googlecode.com/svn/docs/
+// closure_goog_array_array.js.html#goog.array.clear
+
+"use strict";
+
+var value = require("../../object/valid-value");
+
+module.exports = function () {
+ value(this).length = 0;
+ return this;
+};
+
+},{"../../object/valid-value":55}],20:[function(require,module,exports){
+"use strict";
+
+var numberIsNaN = require("../../number/is-nan")
+ , toPosInt = require("../../number/to-pos-integer")
+ , value = require("../../object/valid-value")
+ , indexOf = Array.prototype.indexOf
+ , objHasOwnProperty = Object.prototype.hasOwnProperty
+ , abs = Math.abs
+ , floor = Math.floor;
+
+module.exports = function (searchElement /*, fromIndex*/) {
+ var i, length, fromIndex, val;
+ if (!numberIsNaN(searchElement)) return indexOf.apply(this, arguments);
+
+ length = toPosInt(value(this).length);
+ fromIndex = arguments[1];
+ if (isNaN(fromIndex)) fromIndex = 0;
+ else if (fromIndex >= 0) fromIndex = floor(fromIndex);
+ else fromIndex = toPosInt(this.length) - floor(abs(fromIndex));
+
+ for (i = fromIndex; i < length; ++i) {
+ if (objHasOwnProperty.call(this, i)) {
+ val = this[i];
+ if (numberIsNaN(val)) return i; // Jslint: ignore
+ }
+ }
+ return -1;
+};
+
+},{"../../number/is-nan":30,"../../number/to-pos-integer":34,"../../object/valid-value":55}],21:[function(require,module,exports){
+"use strict";
+
+module.exports = require("./is-implemented")()
+ ? Array.from
+ : require("./shim");
+
+},{"./is-implemented":22,"./shim":23}],22:[function(require,module,exports){
+"use strict";
+
+module.exports = function () {
+ var from = Array.from, arr, result;
+ if (typeof from !== "function") return false;
+ arr = ["raz", "dwa"];
+ result = from(arr);
+ return Boolean(result && (result !== arr) && (result[1] === "dwa"));
+};
+
+},{}],23:[function(require,module,exports){
+"use strict";
+
+var iteratorSymbol = require("es6-symbol").iterator
+ , isArguments = require("../../function/is-arguments")
+ , isFunction = require("../../function/is-function")
+ , toPosInt = require("../../number/to-pos-integer")
+ , callable = require("../../object/valid-callable")
+ , validValue = require("../../object/valid-value")
+ , isValue = require("../../object/is-value")
+ , isString = require("../../string/is-string")
+ , isArray = Array.isArray
+ , call = Function.prototype.call
+ , desc = { configurable: true, enumerable: true, writable: true, value: null }
+ , defineProperty = Object.defineProperty;
+
+// eslint-disable-next-line complexity
+module.exports = function (arrayLike /*, mapFn, thisArg*/) {
+ var mapFn = arguments[1]
+ , thisArg = arguments[2]
+ , Context
+ , i
+ , j
+ , arr
+ , length
+ , code
+ , iterator
+ , result
+ , getIterator
+ , value;
+
+ arrayLike = Object(validValue(arrayLike));
+
+ if (isValue(mapFn)) callable(mapFn);
+ if (!this || this === Array || !isFunction(this)) {
+ // Result: Plain array
+ if (!mapFn) {
+ if (isArguments(arrayLike)) {
+ // Source: Arguments
+ length = arrayLike.length;
+ if (length !== 1) return Array.apply(null, arrayLike);
+ arr = new Array(1);
+ arr[0] = arrayLike[0];
+ return arr;
+ }
+ if (isArray(arrayLike)) {
+ // Source: Array
+ arr = new Array(length = arrayLike.length);
+ for (i = 0; i < length; ++i) arr[i] = arrayLike[i];
+ return arr;
+ }
+ }
+ arr = [];
+ } else {
+ // Result: Non plain array
+ Context = this;
+ }
+
+ if (!isArray(arrayLike)) {
+ if ((getIterator = arrayLike[iteratorSymbol]) !== undefined) {
+ // Source: Iterator
+ iterator = callable(getIterator).call(arrayLike);
+ if (Context) arr = new Context();
+ result = iterator.next();
+ i = 0;
+ while (!result.done) {
+ value = mapFn ? call.call(mapFn, thisArg, result.value, i) : result.value;
+ if (Context) {
+ desc.value = value;
+ defineProperty(arr, i, desc);
+ } else {
+ arr[i] = value;
+ }
+ result = iterator.next();
+ ++i;
+ }
+ length = i;
+ } else if (isString(arrayLike)) {
+ // Source: String
+ length = arrayLike.length;
+ if (Context) arr = new Context();
+ for (i = 0, j = 0; i < length; ++i) {
+ value = arrayLike[i];
+ if (i + 1 < length) {
+ code = value.charCodeAt(0);
+ // eslint-disable-next-line max-depth
+ if (code >= 0xd800 && code <= 0xdbff) value += arrayLike[++i];
+ }
+ value = mapFn ? call.call(mapFn, thisArg, value, j) : value;
+ if (Context) {
+ desc.value = value;
+ defineProperty(arr, j, desc);
+ } else {
+ arr[j] = value;
+ }
+ ++j;
+ }
+ length = j;
+ }
+ }
+ if (length === undefined) {
+ // Source: array or array-like
+ length = toPosInt(arrayLike.length);
+ if (Context) arr = new Context(length);
+ for (i = 0; i < length; ++i) {
+ value = mapFn ? call.call(mapFn, thisArg, arrayLike[i], i) : arrayLike[i];
+ if (Context) {
+ desc.value = value;
+ defineProperty(arr, i, desc);
+ } else {
+ arr[i] = value;
+ }
+ }
+ }
+ if (Context) {
+ desc.value = null;
+ arr.length = length;
+ }
+ return arr;
+};
+
+},{"../../function/is-arguments":24,"../../function/is-function":25,"../../number/to-pos-integer":34,"../../object/is-value":44,"../../object/valid-callable":54,"../../object/valid-value":55,"../../string/is-string":59,"es6-symbol":73}],24:[function(require,module,exports){
+"use strict";
+
+var objToString = Object.prototype.toString
+ , id = objToString.call(
+ (function () {
+ return arguments;
+ })()
+);
+
+module.exports = function (value) {
+ return objToString.call(value) === id;
+};
+
+},{}],25:[function(require,module,exports){
+"use strict";
+
+var objToString = Object.prototype.toString, id = objToString.call(require("./noop"));
+
+module.exports = function (value) {
+ return typeof value === "function" && objToString.call(value) === id;
+};
+
+},{"./noop":26}],26:[function(require,module,exports){
+"use strict";
+
+// eslint-disable-next-line no-empty-function
+module.exports = function () {};
+
+},{}],27:[function(require,module,exports){
+"use strict";
+
+module.exports = require("./is-implemented")()
+ ? Math.sign
+ : require("./shim");
+
+},{"./is-implemented":28,"./shim":29}],28:[function(require,module,exports){
+"use strict";
+
+module.exports = function () {
+ var sign = Math.sign;
+ if (typeof sign !== "function") return false;
+ return (sign(10) === 1) && (sign(-20) === -1);
+};
+
+},{}],29:[function(require,module,exports){
+"use strict";
+
+module.exports = function (value) {
+ value = Number(value);
+ if (isNaN(value) || (value === 0)) return value;
+ return value > 0 ? 1 : -1;
+};
+
+},{}],30:[function(require,module,exports){
+"use strict";
+
+module.exports = require("./is-implemented")()
+ ? Number.isNaN
+ : require("./shim");
+
+},{"./is-implemented":31,"./shim":32}],31:[function(require,module,exports){
+"use strict";
+
+module.exports = function () {
+ var numberIsNaN = Number.isNaN;
+ if (typeof numberIsNaN !== "function") return false;
+ return !numberIsNaN({}) && numberIsNaN(NaN) && !numberIsNaN(34);
+};
+
+},{}],32:[function(require,module,exports){
+"use strict";
+
+module.exports = function (value) {
+ // eslint-disable-next-line no-self-compare
+ return value !== value;
+};
+
+},{}],33:[function(require,module,exports){
+"use strict";
+
+var sign = require("../math/sign")
+
+ , abs = Math.abs, floor = Math.floor;
+
+module.exports = function (value) {
+ if (isNaN(value)) return 0;
+ value = Number(value);
+ if ((value === 0) || !isFinite(value)) return value;
+ return sign(value) * floor(abs(value));
+};
+
+},{"../math/sign":27}],34:[function(require,module,exports){
+"use strict";
+
+var toInteger = require("./to-integer")
+
+ , max = Math.max;
+
+module.exports = function (value) {
+ return max(0, toInteger(value));
+};
+
+},{"./to-integer":33}],35:[function(require,module,exports){
+// Internal method, used by iteration functions.
+// Calls a function for each key-value pair found in object
+// Optionally takes compareFn to iterate object in specific order
+
+"use strict";
+
+var callable = require("./valid-callable")
+ , value = require("./valid-value")
+ , bind = Function.prototype.bind
+ , call = Function.prototype.call
+ , keys = Object.keys
+ , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+module.exports = function (method, defVal) {
+ return function (obj, cb /*, thisArg, compareFn*/) {
+ var list, thisArg = arguments[2], compareFn = arguments[3];
+ obj = Object(value(obj));
+ callable(cb);
+
+ list = keys(obj);
+ if (compareFn) {
+ list.sort(typeof compareFn === "function" ? bind.call(compareFn, obj) : undefined);
+ }
+ if (typeof method !== "function") method = list[method];
+ return call.call(method, list, function (key, index) {
+ if (!objPropertyIsEnumerable.call(obj, key)) return defVal;
+ return call.call(cb, thisArg, obj[key], key, obj, index);
+ });
+ };
+};
+
+},{"./valid-callable":54,"./valid-value":55}],36:[function(require,module,exports){
+"use strict";
+
+module.exports = require("./is-implemented")()
+ ? Object.assign
+ : require("./shim");
+
+},{"./is-implemented":37,"./shim":38}],37:[function(require,module,exports){
+"use strict";
+
+module.exports = function () {
+ var assign = Object.assign, obj;
+ if (typeof assign !== "function") return false;
+ obj = { foo: "raz" };
+ assign(obj, { bar: "dwa" }, { trzy: "trzy" });
+ return (obj.foo + obj.bar + obj.trzy) === "razdwatrzy";
+};
+
+},{}],38:[function(require,module,exports){
+"use strict";
+
+var keys = require("../keys")
+ , value = require("../valid-value")
+ , max = Math.max;
+
+module.exports = function (dest, src /*, …srcn*/) {
+ var error, i, length = max(arguments.length, 2), assign;
+ dest = Object(value(dest));
+ assign = function (key) {
+ try {
+ dest[key] = src[key];
+ } catch (e) {
+ if (!error) error = e;
+ }
+ };
+ for (i = 1; i < length; ++i) {
+ src = arguments[i];
+ keys(src).forEach(assign);
+ }
+ if (error !== undefined) throw error;
+ return dest;
+};
+
+},{"../keys":45,"../valid-value":55}],39:[function(require,module,exports){
+"use strict";
+
+var aFrom = require("../array/from")
+ , assign = require("./assign")
+ , value = require("./valid-value");
+
+module.exports = function (obj/*, propertyNames, options*/) {
+ var copy = Object(value(obj)), propertyNames = arguments[1], options = Object(arguments[2]);
+ if (copy !== obj && !propertyNames) return copy;
+ var result = {};
+ if (propertyNames) {
+ aFrom(propertyNames, function (propertyName) {
+ if (options.ensure || propertyName in obj) result[propertyName] = obj[propertyName];
+ });
+ } else {
+ assign(result, obj);
+ }
+ return result;
+};
+
+},{"../array/from":21,"./assign":36,"./valid-value":55}],40:[function(require,module,exports){
+// Workaround for http://code.google.com/p/v8/issues/detail?id=2804
+
+"use strict";
+
+var create = Object.create, shim;
+
+if (!require("./set-prototype-of/is-implemented")()) {
+ shim = require("./set-prototype-of/shim");
+}
+
+module.exports = (function () {
+ var nullObject, polyProps, desc;
+ if (!shim) return create;
+ if (shim.level !== 1) return create;
+
+ nullObject = {};
+ polyProps = {};
+ desc = {
+ configurable: false,
+ enumerable: false,
+ writable: true,
+ value: undefined
+ };
+ Object.getOwnPropertyNames(Object.prototype).forEach(function (name) {
+ if (name === "__proto__") {
+ polyProps[name] = {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: undefined
+ };
+ return;
+ }
+ polyProps[name] = desc;
+ });
+ Object.defineProperties(nullObject, polyProps);
+
+ Object.defineProperty(shim, "nullPolyfill", {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: nullObject
+ });
+
+ return function (prototype, props) {
+ return create(prototype === null ? nullObject : prototype, props);
+ };
+}());
+
+},{"./set-prototype-of/is-implemented":52,"./set-prototype-of/shim":53}],41:[function(require,module,exports){
+"use strict";
+
+module.exports = require("./_iterate")("forEach");
+
+},{"./_iterate":35}],42:[function(require,module,exports){
+// Deprecated
+
+"use strict";
+
+module.exports = function (obj) {
+ return typeof obj === "function";
+};
+
+},{}],43:[function(require,module,exports){
+"use strict";
+
+var isValue = require("./is-value");
+
+var map = { function: true, object: true };
+
+module.exports = function (value) {
+ return (isValue(value) && map[typeof value]) || false;
+};
+
+},{"./is-value":44}],44:[function(require,module,exports){
+"use strict";
+
+var _undefined = require("../function/noop")(); // Support ES3 engines
+
+module.exports = function (val) {
+ return (val !== _undefined) && (val !== null);
+};
+
+},{"../function/noop":26}],45:[function(require,module,exports){
+"use strict";
+
+module.exports = require("./is-implemented")() ? Object.keys : require("./shim");
+
+},{"./is-implemented":46,"./shim":47}],46:[function(require,module,exports){
+"use strict";
+
+module.exports = function () {
+ try {
+ Object.keys("primitive");
+ return true;
+ } catch (e) {
+ return false;
+ }
+};
+
+},{}],47:[function(require,module,exports){
+"use strict";
+
+var isValue = require("../is-value");
+
+var keys = Object.keys;
+
+module.exports = function (object) { return keys(isValue(object) ? Object(object) : object); };
+
+},{"../is-value":44}],48:[function(require,module,exports){
+"use strict";
+
+var callable = require("./valid-callable")
+ , forEach = require("./for-each")
+ , call = Function.prototype.call;
+
+module.exports = function (obj, cb /*, thisArg*/) {
+ var result = {}, thisArg = arguments[2];
+ callable(cb);
+ forEach(obj, function (value, key, targetObj, index) {
+ result[key] = call.call(cb, thisArg, value, key, targetObj, index);
+ });
+ return result;
+};
+
+},{"./for-each":41,"./valid-callable":54}],49:[function(require,module,exports){
+"use strict";
+
+var isValue = require("./is-value");
+
+var forEach = Array.prototype.forEach, create = Object.create;
+
+var process = function (src, obj) {
+ var key;
+ for (key in src) obj[key] = src[key];
+};
+
+// eslint-disable-next-line no-unused-vars
+module.exports = function (opts1 /*, …options*/) {
+ var result = create(null);
+ forEach.call(arguments, function (options) {
+ if (!isValue(options)) return;
+ process(Object(options), result);
+ });
+ return result;
+};
+
+},{"./is-value":44}],50:[function(require,module,exports){
+"use strict";
+
+var forEach = Array.prototype.forEach, create = Object.create;
+
+// eslint-disable-next-line no-unused-vars
+module.exports = function (arg /*, …args*/) {
+ var set = create(null);
+ forEach.call(arguments, function (name) {
+ set[name] = true;
+ });
+ return set;
+};
+
+},{}],51:[function(require,module,exports){
+"use strict";
+
+module.exports = require("./is-implemented")()
+ ? Object.setPrototypeOf
+ : require("./shim");
+
+},{"./is-implemented":52,"./shim":53}],52:[function(require,module,exports){
+"use strict";
+
+var create = Object.create, getPrototypeOf = Object.getPrototypeOf, plainObject = {};
+
+module.exports = function (/* CustomCreate*/) {
+ var setPrototypeOf = Object.setPrototypeOf, customCreate = arguments[0] || create;
+ if (typeof setPrototypeOf !== "function") return false;
+ return getPrototypeOf(setPrototypeOf(customCreate(null), plainObject)) === plainObject;
+};
+
+},{}],53:[function(require,module,exports){
+/* eslint no-proto: "off" */
+
+// Big thanks to @WebReflection for sorting this out
+// https://gist.github.com/WebReflection/5593554
+
+"use strict";
+
+var isObject = require("../is-object")
+ , value = require("../valid-value")
+ , objIsPrototypeOf = Object.prototype.isPrototypeOf
+ , defineProperty = Object.defineProperty
+ , nullDesc = {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: undefined
+}
+ , validate;
+
+validate = function (obj, prototype) {
+ value(obj);
+ if (prototype === null || isObject(prototype)) return obj;
+ throw new TypeError("Prototype must be null or an object");
+};
+
+module.exports = (function (status) {
+ var fn, set;
+ if (!status) return null;
+ if (status.level === 2) {
+ if (status.set) {
+ set = status.set;
+ fn = function (obj, prototype) {
+ set.call(validate(obj, prototype), prototype);
+ return obj;
+ };
+ } else {
+ fn = function (obj, prototype) {
+ validate(obj, prototype).__proto__ = prototype;
+ return obj;
+ };
+ }
+ } else {
+ fn = function self(obj, prototype) {
+ var isNullBase;
+ validate(obj, prototype);
+ isNullBase = objIsPrototypeOf.call(self.nullPolyfill, obj);
+ if (isNullBase) delete self.nullPolyfill.__proto__;
+ if (prototype === null) prototype = self.nullPolyfill;
+ obj.__proto__ = prototype;
+ if (isNullBase) defineProperty(self.nullPolyfill, "__proto__", nullDesc);
+ return obj;
+ };
+ }
+ return Object.defineProperty(fn, "level", {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: status.level
+ });
+}(
+ (function () {
+ var tmpObj1 = Object.create(null)
+ , tmpObj2 = {}
+ , set
+ , desc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__");
+
+ if (desc) {
+ try {
+ set = desc.set; // Opera crashes at this point
+ set.call(tmpObj1, tmpObj2);
+ } catch (ignore) {}
+ if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { set: set, level: 2 };
+ }
+
+ tmpObj1.__proto__ = tmpObj2;
+ if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 2 };
+
+ tmpObj1 = {};
+ tmpObj1.__proto__ = tmpObj2;
+ if (Object.getPrototypeOf(tmpObj1) === tmpObj2) return { level: 1 };
+
+ return false;
+ })()
+));
+
+require("../create");
+
+},{"../create":40,"../is-object":43,"../valid-value":55}],54:[function(require,module,exports){
+"use strict";
+
+module.exports = function (fn) {
+ if (typeof fn !== "function") throw new TypeError(fn + " is not a function");
+ return fn;
+};
+
+},{}],55:[function(require,module,exports){
+"use strict";
+
+var isValue = require("./is-value");
+
+module.exports = function (value) {
+ if (!isValue(value)) throw new TypeError("Cannot use null or undefined");
+ return value;
+};
+
+},{"./is-value":44}],56:[function(require,module,exports){
+"use strict";
+
+module.exports = require("./is-implemented")()
+ ? String.prototype.contains
+ : require("./shim");
+
+},{"./is-implemented":57,"./shim":58}],57:[function(require,module,exports){
+"use strict";
+
+var str = "razdwatrzy";
+
+module.exports = function () {
+ if (typeof str.contains !== "function") return false;
+ return (str.contains("dwa") === true) && (str.contains("foo") === false);
+};
+
+},{}],58:[function(require,module,exports){
+"use strict";
+
+var indexOf = String.prototype.indexOf;
+
+module.exports = function (searchString/*, position*/) {
+ return indexOf.call(this, searchString, arguments[1]) > -1;
+};
+
+},{}],59:[function(require,module,exports){
+"use strict";
+
+var objToString = Object.prototype.toString, id = objToString.call("");
+
+module.exports = function (value) {
+ return (
+ typeof value === "string" ||
+ (value &&
+ typeof value === "object" &&
+ (value instanceof String || objToString.call(value) === id)) ||
+ false
+ );
+};
+
+},{}],60:[function(require,module,exports){
+"use strict";
+
+var setPrototypeOf = require("es5-ext/object/set-prototype-of")
+ , contains = require("es5-ext/string/#/contains")
+ , d = require("d")
+ , Symbol = require("es6-symbol")
+ , Iterator = require("./");
+
+var defineProperty = Object.defineProperty, ArrayIterator;
+
+ArrayIterator = module.exports = function (arr, kind) {
+ if (!(this instanceof ArrayIterator)) throw new TypeError("Constructor requires 'new'");
+ Iterator.call(this, arr);
+ if (!kind) kind = "value";
+ else if (contains.call(kind, "key+value")) kind = "key+value";
+ else if (contains.call(kind, "key")) kind = "key";
+ else kind = "value";
+ defineProperty(this, "__kind__", d("", kind));
+};
+if (setPrototypeOf) setPrototypeOf(ArrayIterator, Iterator);
+
+// Internal %ArrayIteratorPrototype% doesn't expose its constructor
+delete ArrayIterator.prototype.constructor;
+
+ArrayIterator.prototype = Object.create(Iterator.prototype, {
+ _resolve: d(function (i) {
+ if (this.__kind__ === "value") return this.__list__[i];
+ if (this.__kind__ === "key+value") return [i, this.__list__[i]];
+ return i;
+ })
+});
+defineProperty(ArrayIterator.prototype, Symbol.toStringTag, d("c", "Array Iterator"));
+
+},{"./":63,"d":16,"es5-ext/object/set-prototype-of":51,"es5-ext/string/#/contains":56,"es6-symbol":73}],61:[function(require,module,exports){
+"use strict";
+
+var isArguments = require("es5-ext/function/is-arguments")
+ , callable = require("es5-ext/object/valid-callable")
+ , isString = require("es5-ext/string/is-string")
+ , get = require("./get");
+
+var isArray = Array.isArray, call = Function.prototype.call, some = Array.prototype.some;
+
+module.exports = function (iterable, cb /*, thisArg*/) {
+ var mode, thisArg = arguments[2], result, doBreak, broken, i, length, char, code;
+ if (isArray(iterable) || isArguments(iterable)) mode = "array";
+ else if (isString(iterable)) mode = "string";
+ else iterable = get(iterable);
+
+ callable(cb);
+ doBreak = function () {
+ broken = true;
+ };
+ if (mode === "array") {
+ some.call(iterable, function (value) {
+ call.call(cb, thisArg, value, doBreak);
+ return broken;
+ });
+ return;
+ }
+ if (mode === "string") {
+ length = iterable.length;
+ for (i = 0; i < length; ++i) {
+ char = iterable[i];
+ if (i + 1 < length) {
+ code = char.charCodeAt(0);
+ if (code >= 0xd800 && code <= 0xdbff) char += iterable[++i];
+ }
+ call.call(cb, thisArg, char, doBreak);
+ if (broken) break;
+ }
+ return;
+ }
+ result = iterable.next();
+
+ while (!result.done) {
+ call.call(cb, thisArg, result.value, doBreak);
+ if (broken) return;
+ result = iterable.next();
+ }
+};
+
+},{"./get":62,"es5-ext/function/is-arguments":24,"es5-ext/object/valid-callable":54,"es5-ext/string/is-string":59}],62:[function(require,module,exports){
+"use strict";
+
+var isArguments = require("es5-ext/function/is-arguments")
+ , isString = require("es5-ext/string/is-string")
+ , ArrayIterator = require("./array")
+ , StringIterator = require("./string")
+ , iterable = require("./valid-iterable")
+ , iteratorSymbol = require("es6-symbol").iterator;
+
+module.exports = function (obj) {
+ if (typeof iterable(obj)[iteratorSymbol] === "function") return obj[iteratorSymbol]();
+ if (isArguments(obj)) return new ArrayIterator(obj);
+ if (isString(obj)) return new StringIterator(obj);
+ return new ArrayIterator(obj);
+};
+
+},{"./array":60,"./string":65,"./valid-iterable":66,"es5-ext/function/is-arguments":24,"es5-ext/string/is-string":59,"es6-symbol":73}],63:[function(require,module,exports){
+"use strict";
+
+var clear = require("es5-ext/array/#/clear")
+ , assign = require("es5-ext/object/assign")
+ , callable = require("es5-ext/object/valid-callable")
+ , value = require("es5-ext/object/valid-value")
+ , d = require("d")
+ , autoBind = require("d/auto-bind")
+ , Symbol = require("es6-symbol");
+
+var defineProperty = Object.defineProperty, defineProperties = Object.defineProperties, Iterator;
+
+module.exports = Iterator = function (list, context) {
+ if (!(this instanceof Iterator)) throw new TypeError("Constructor requires 'new'");
+ defineProperties(this, {
+ __list__: d("w", value(list)),
+ __context__: d("w", context),
+ __nextIndex__: d("w", 0)
+ });
+ if (!context) return;
+ callable(context.on);
+ context.on("_add", this._onAdd);
+ context.on("_delete", this._onDelete);
+ context.on("_clear", this._onClear);
+};
+
+// Internal %IteratorPrototype% doesn't expose its constructor
+delete Iterator.prototype.constructor;
+
+defineProperties(
+ Iterator.prototype,
+ assign(
+ {
+ _next: d(function () {
+ var i;
+ if (!this.__list__) return undefined;
+ if (this.__redo__) {
+ i = this.__redo__.shift();
+ if (i !== undefined) return i;
+ }
+ if (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++;
+ this._unBind();
+ return undefined;
+ }),
+ next: d(function () {
+ return this._createResult(this._next());
+ }),
+ _createResult: d(function (i) {
+ if (i === undefined) return { done: true, value: undefined };
+ return { done: false, value: this._resolve(i) };
+ }),
+ _resolve: d(function (i) {
+ return this.__list__[i];
+ }),
+ _unBind: d(function () {
+ this.__list__ = null;
+ delete this.__redo__;
+ if (!this.__context__) return;
+ this.__context__.off("_add", this._onAdd);
+ this.__context__.off("_delete", this._onDelete);
+ this.__context__.off("_clear", this._onClear);
+ this.__context__ = null;
+ }),
+ toString: d(function () {
+ return "[object " + (this[Symbol.toStringTag] || "Object") + "]";
+ })
+ },
+ autoBind({
+ _onAdd: d(function (index) {
+ if (index >= this.__nextIndex__) return;
+ ++this.__nextIndex__;
+ if (!this.__redo__) {
+ defineProperty(this, "__redo__", d("c", [index]));
+ return;
+ }
+ this.__redo__.forEach(function (redo, i) {
+ if (redo >= index) this.__redo__[i] = ++redo;
+ }, this);
+ this.__redo__.push(index);
+ }),
+ _onDelete: d(function (index) {
+ var i;
+ if (index >= this.__nextIndex__) return;
+ --this.__nextIndex__;
+ if (!this.__redo__) return;
+ i = this.__redo__.indexOf(index);
+ if (i !== -1) this.__redo__.splice(i, 1);
+ this.__redo__.forEach(function (redo, j) {
+ if (redo > index) this.__redo__[j] = --redo;
+ }, this);
+ }),
+ _onClear: d(function () {
+ if (this.__redo__) clear.call(this.__redo__);
+ this.__nextIndex__ = 0;
+ })
+ })
+ )
+);
+
+defineProperty(
+ Iterator.prototype,
+ Symbol.iterator,
+ d(function () {
+ return this;
+ })
+);
+
+},{"d":16,"d/auto-bind":15,"es5-ext/array/#/clear":19,"es5-ext/object/assign":36,"es5-ext/object/valid-callable":54,"es5-ext/object/valid-value":55,"es6-symbol":73}],64:[function(require,module,exports){
+"use strict";
+
+var isArguments = require("es5-ext/function/is-arguments")
+ , isValue = require("es5-ext/object/is-value")
+ , isString = require("es5-ext/string/is-string");
+
+var iteratorSymbol = require("es6-symbol").iterator
+ , isArray = Array.isArray;
+
+module.exports = function (value) {
+ if (!isValue(value)) return false;
+ if (isArray(value)) return true;
+ if (isString(value)) return true;
+ if (isArguments(value)) return true;
+ return typeof value[iteratorSymbol] === "function";
+};
+
+},{"es5-ext/function/is-arguments":24,"es5-ext/object/is-value":44,"es5-ext/string/is-string":59,"es6-symbol":73}],65:[function(require,module,exports){
+// Thanks @mathiasbynens
+// http://mathiasbynens.be/notes/javascript-unicode#iterating-over-symbols
+
+"use strict";
+
+var setPrototypeOf = require("es5-ext/object/set-prototype-of")
+ , d = require("d")
+ , Symbol = require("es6-symbol")
+ , Iterator = require("./");
+
+var defineProperty = Object.defineProperty, StringIterator;
+
+StringIterator = module.exports = function (str) {
+ if (!(this instanceof StringIterator)) throw new TypeError("Constructor requires 'new'");
+ str = String(str);
+ Iterator.call(this, str);
+ defineProperty(this, "__length__", d("", str.length));
+};
+if (setPrototypeOf) setPrototypeOf(StringIterator, Iterator);
+
+// Internal %ArrayIteratorPrototype% doesn't expose its constructor
+delete StringIterator.prototype.constructor;
+
+StringIterator.prototype = Object.create(Iterator.prototype, {
+ _next: d(function () {
+ if (!this.__list__) return undefined;
+ if (this.__nextIndex__ < this.__length__) return this.__nextIndex__++;
+ this._unBind();
+ return undefined;
+ }),
+ _resolve: d(function (i) {
+ var char = this.__list__[i], code;
+ if (this.__nextIndex__ === this.__length__) return char;
+ code = char.charCodeAt(0);
+ if (code >= 0xd800 && code <= 0xdbff) return char + this.__list__[this.__nextIndex__++];
+ return char;
+ })
+});
+defineProperty(StringIterator.prototype, Symbol.toStringTag, d("c", "String Iterator"));
+
+},{"./":63,"d":16,"es5-ext/object/set-prototype-of":51,"es6-symbol":73}],66:[function(require,module,exports){
+"use strict";
+
+var isIterable = require("./is-iterable");
+
+module.exports = function (value) {
+ if (!isIterable(value)) throw new TypeError(value + " is not iterable");
+ return value;
+};
+
+},{"./is-iterable":64}],67:[function(require,module,exports){
+'use strict';
+
+module.exports = require('./is-implemented')() ? Map : require('./polyfill');
+
+},{"./is-implemented":68,"./polyfill":72}],68:[function(require,module,exports){
+'use strict';
+
+module.exports = function () {
+ var map, iterator, result;
+ if (typeof Map !== 'function') return false;
+ try {
+ // WebKit doesn't support arguments and crashes
+ map = new Map([['raz', 'one'], ['dwa', 'two'], ['trzy', 'three']]);
+ } catch (e) {
+ return false;
+ }
+ if (String(map) !== '[object Map]') return false;
+ if (map.size !== 3) return false;
+ if (typeof map.clear !== 'function') return false;
+ if (typeof map.delete !== 'function') return false;
+ if (typeof map.entries !== 'function') return false;
+ if (typeof map.forEach !== 'function') return false;
+ if (typeof map.get !== 'function') return false;
+ if (typeof map.has !== 'function') return false;
+ if (typeof map.keys !== 'function') return false;
+ if (typeof map.set !== 'function') return false;
+ if (typeof map.values !== 'function') return false;
+
+ iterator = map.entries();
+ result = iterator.next();
+ if (result.done !== false) return false;
+ if (!result.value) return false;
+ if (result.value[0] !== 'raz') return false;
+ if (result.value[1] !== 'one') return false;
+
+ return true;
+};
+
+},{}],69:[function(require,module,exports){
+// Exports true if environment provides native `Map` implementation,
+// whatever that is.
+
+'use strict';
+
+module.exports = (function () {
+ if (typeof Map === 'undefined') return false;
+ return (Object.prototype.toString.call(new Map()) === '[object Map]');
+}());
+
+},{}],70:[function(require,module,exports){
+'use strict';
+
+module.exports = require('es5-ext/object/primitive-set')('key',
+ 'value', 'key+value');
+
+},{"es5-ext/object/primitive-set":50}],71:[function(require,module,exports){
+'use strict';
+
+var setPrototypeOf = require('es5-ext/object/set-prototype-of')
+ , d = require('d')
+ , Iterator = require('es6-iterator')
+ , toStringTagSymbol = require('es6-symbol').toStringTag
+ , kinds = require('./iterator-kinds')
+
+ , defineProperties = Object.defineProperties
+ , unBind = Iterator.prototype._unBind
+ , MapIterator;
+
+MapIterator = module.exports = function (map, kind) {
+ if (!(this instanceof MapIterator)) return new MapIterator(map, kind);
+ Iterator.call(this, map.__mapKeysData__, map);
+ if (!kind || !kinds[kind]) kind = 'key+value';
+ defineProperties(this, {
+ __kind__: d('', kind),
+ __values__: d('w', map.__mapValuesData__)
+ });
+};
+if (setPrototypeOf) setPrototypeOf(MapIterator, Iterator);
+
+MapIterator.prototype = Object.create(Iterator.prototype, {
+ constructor: d(MapIterator),
+ _resolve: d(function (i) {
+ if (this.__kind__ === 'value') return this.__values__[i];
+ if (this.__kind__ === 'key') return this.__list__[i];
+ return [this.__list__[i], this.__values__[i]];
+ }),
+ _unBind: d(function () {
+ this.__values__ = null;
+ unBind.call(this);
+ }),
+ toString: d(function () { return '[object Map Iterator]'; })
+});
+Object.defineProperty(MapIterator.prototype, toStringTagSymbol,
+ d('c', 'Map Iterator'));
+
+},{"./iterator-kinds":70,"d":16,"es5-ext/object/set-prototype-of":51,"es6-iterator":63,"es6-symbol":73}],72:[function(require,module,exports){
+'use strict';
+
+var clear = require('es5-ext/array/#/clear')
+ , eIndexOf = require('es5-ext/array/#/e-index-of')
+ , setPrototypeOf = require('es5-ext/object/set-prototype-of')
+ , callable = require('es5-ext/object/valid-callable')
+ , validValue = require('es5-ext/object/valid-value')
+ , d = require('d')
+ , ee = require('event-emitter')
+ , Symbol = require('es6-symbol')
+ , iterator = require('es6-iterator/valid-iterable')
+ , forOf = require('es6-iterator/for-of')
+ , Iterator = require('./lib/iterator')
+ , isNative = require('./is-native-implemented')
+
+ , call = Function.prototype.call
+ , defineProperties = Object.defineProperties, getPrototypeOf = Object.getPrototypeOf
+ , MapPoly;
+
+module.exports = MapPoly = function (/*iterable*/) {
+ var iterable = arguments[0], keys, values, self;
+ if (!(this instanceof MapPoly)) throw new TypeError('Constructor requires \'new\'');
+ if (isNative && setPrototypeOf && (Map !== MapPoly)) {
+ self = setPrototypeOf(new Map(), getPrototypeOf(this));
+ } else {
+ self = this;
+ }
+ if (iterable != null) iterator(iterable);
+ defineProperties(self, {
+ __mapKeysData__: d('c', keys = []),
+ __mapValuesData__: d('c', values = [])
+ });
+ if (!iterable) return self;
+ forOf(iterable, function (value) {
+ var key = validValue(value)[0];
+ value = value[1];
+ if (eIndexOf.call(keys, key) !== -1) return;
+ keys.push(key);
+ values.push(value);
+ }, self);
+ return self;
+};
+
+if (isNative) {
+ if (setPrototypeOf) setPrototypeOf(MapPoly, Map);
+ MapPoly.prototype = Object.create(Map.prototype, {
+ constructor: d(MapPoly)
+ });
+}
+
+ee(defineProperties(MapPoly.prototype, {
+ clear: d(function () {
+ if (!this.__mapKeysData__.length) return;
+ clear.call(this.__mapKeysData__);
+ clear.call(this.__mapValuesData__);
+ this.emit('_clear');
+ }),
+ delete: d(function (key) {
+ var index = eIndexOf.call(this.__mapKeysData__, key);
+ if (index === -1) return false;
+ this.__mapKeysData__.splice(index, 1);
+ this.__mapValuesData__.splice(index, 1);
+ this.emit('_delete', index, key);
+ return true;
+ }),
+ entries: d(function () { return new Iterator(this, 'key+value'); }),
+ forEach: d(function (cb/*, thisArg*/) {
+ var thisArg = arguments[1], iterator, result;
+ callable(cb);
+ iterator = this.entries();
+ result = iterator._next();
+ while (result !== undefined) {
+ call.call(cb, thisArg, this.__mapValuesData__[result],
+ this.__mapKeysData__[result], this);
+ result = iterator._next();
+ }
+ }),
+ get: d(function (key) {
+ var index = eIndexOf.call(this.__mapKeysData__, key);
+ if (index === -1) return;
+ return this.__mapValuesData__[index];
+ }),
+ has: d(function (key) {
+ return (eIndexOf.call(this.__mapKeysData__, key) !== -1);
+ }),
+ keys: d(function () { return new Iterator(this, 'key'); }),
+ set: d(function (key, value) {
+ var index = eIndexOf.call(this.__mapKeysData__, key), emit;
+ if (index === -1) {
+ index = this.__mapKeysData__.push(key) - 1;
+ emit = true;
+ }
+ this.__mapValuesData__[index] = value;
+ if (emit) this.emit('_add', index, key);
+ return this;
+ }),
+ size: d.gs(function () { return this.__mapKeysData__.length; }),
+ values: d(function () { return new Iterator(this, 'value'); }),
+ toString: d(function () { return '[object Map]'; })
+}));
+Object.defineProperty(MapPoly.prototype, Symbol.iterator, d(function () {
+ return this.entries();
+}));
+Object.defineProperty(MapPoly.prototype, Symbol.toStringTag, d('c', 'Map'));
+
+},{"./is-native-implemented":69,"./lib/iterator":71,"d":16,"es5-ext/array/#/clear":19,"es5-ext/array/#/e-index-of":20,"es5-ext/object/set-prototype-of":51,"es5-ext/object/valid-callable":54,"es5-ext/object/valid-value":55,"es6-iterator/for-of":61,"es6-iterator/valid-iterable":66,"es6-symbol":73,"event-emitter":78}],73:[function(require,module,exports){
+'use strict';
+
+module.exports = require('./is-implemented')() ? Symbol : require('./polyfill');
+
+},{"./is-implemented":74,"./polyfill":76}],74:[function(require,module,exports){
+'use strict';
+
+var validTypes = { object: true, symbol: true };
+
+module.exports = function () {
+ var symbol;
+ if (typeof Symbol !== 'function') return false;
+ symbol = Symbol('test symbol');
+ try { String(symbol); } catch (e) { return false; }
+
+ // Return 'true' also for polyfills
+ if (!validTypes[typeof Symbol.iterator]) return false;
+ if (!validTypes[typeof Symbol.toPrimitive]) return false;
+ if (!validTypes[typeof Symbol.toStringTag]) return false;
+
+ return true;
+};
+
+},{}],75:[function(require,module,exports){
+'use strict';
+
+module.exports = function (x) {
+ if (!x) return false;
+ if (typeof x === 'symbol') return true;
+ if (!x.constructor) return false;
+ if (x.constructor.name !== 'Symbol') return false;
+ return (x[x.constructor.toStringTag] === 'Symbol');
+};
+
+},{}],76:[function(require,module,exports){
+// ES2015 Symbol polyfill for environments that do not (or partially) support it
+
+'use strict';
+
+var d = require('d')
+ , validateSymbol = require('./validate-symbol')
+
+ , create = Object.create, defineProperties = Object.defineProperties
+ , defineProperty = Object.defineProperty, objPrototype = Object.prototype
+ , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create(null)
+ , isNativeSafe;
+
+if (typeof Symbol === 'function') {
+ NativeSymbol = Symbol;
+ try {
+ String(NativeSymbol());
+ isNativeSafe = true;
+ } catch (ignore) {}
+}
+
+var generateName = (function () {
+ var created = create(null);
+ return function (desc) {
+ var postfix = 0, name, ie11BugWorkaround;
+ while (created[desc + (postfix || '')]) ++postfix;
+ desc += (postfix || '');
+ created[desc] = true;
+ name = '@@' + desc;
+ defineProperty(objPrototype, name, d.gs(null, function (value) {
+ // For IE11 issue see:
+ // https://connect.microsoft.com/IE/feedbackdetail/view/1928508/
+ // ie11-broken-getters-on-dom-objects
+ // https://github.com/medikoo/es6-symbol/issues/12
+ if (ie11BugWorkaround) return;
+ ie11BugWorkaround = true;
+ defineProperty(this, name, d(value));
+ ie11BugWorkaround = false;
+ }));
+ return name;
+ };
+}());
+
+// Internal constructor (not one exposed) for creating Symbol instances.
+// This one is used to ensure that `someSymbol instanceof Symbol` always return false
+HiddenSymbol = function Symbol(description) {
+ if (this instanceof HiddenSymbol) throw new TypeError('Symbol is not a constructor');
+ return SymbolPolyfill(description);
+};
+
+// Exposed `Symbol` constructor
+// (returns instances of HiddenSymbol)
+module.exports = SymbolPolyfill = function Symbol(description) {
+ var symbol;
+ if (this instanceof Symbol) throw new TypeError('Symbol is not a constructor');
+ if (isNativeSafe) return NativeSymbol(description);
+ symbol = create(HiddenSymbol.prototype);
+ description = (description === undefined ? '' : String(description));
+ return defineProperties(symbol, {
+ __description__: d('', description),
+ __name__: d('', generateName(description))
+ });
+};
+defineProperties(SymbolPolyfill, {
+ for: d(function (key) {
+ if (globalSymbols[key]) return globalSymbols[key];
+ return (globalSymbols[key] = SymbolPolyfill(String(key)));
+ }),
+ keyFor: d(function (s) {
+ var key;
+ validateSymbol(s);
+ for (key in globalSymbols) if (globalSymbols[key] === s) return key;
+ }),
+
+ // To ensure proper interoperability with other native functions (e.g. Array.from)
+ // fallback to eventual native implementation of given symbol
+ hasInstance: d('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')),
+ isConcatSpreadable: d('', (NativeSymbol && NativeSymbol.isConcatSpreadable) ||
+ SymbolPolyfill('isConcatSpreadable')),
+ iterator: d('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')),
+ match: d('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')),
+ replace: d('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')),
+ search: d('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')),
+ species: d('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')),
+ split: d('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')),
+ toPrimitive: d('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')),
+ toStringTag: d('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')),
+ unscopables: d('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables'))
+});
+
+// Internal tweaks for real symbol producer
+defineProperties(HiddenSymbol.prototype, {
+ constructor: d(SymbolPolyfill),
+ toString: d('', function () { return this.__name__; })
+});
+
+// Proper implementation of methods exposed on Symbol.prototype
+// They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
+defineProperties(SymbolPolyfill.prototype, {
+ toString: d(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }),
+ valueOf: d(function () { return validateSymbol(this); })
+});
+defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d('', function () {
+ var symbol = validateSymbol(this);
+ if (typeof symbol === 'symbol') return symbol;
+ return symbol.toString();
+}));
+defineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d('c', 'Symbol'));
+
+// Proper implementaton of toPrimitive and toStringTag for returned symbol instances
+defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toStringTag,
+ d('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));
+
+// Note: It's important to define `toPrimitive` as last one, as some implementations
+// implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
+// And that may invoke error in definition flow:
+// See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
+defineProperty(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive,
+ d('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));
+
+},{"./validate-symbol":77,"d":16}],77:[function(require,module,exports){
+'use strict';
+
+var isSymbol = require('./is-symbol');
+
+module.exports = function (value) {
+ if (!isSymbol(value)) throw new TypeError(value + " is not a symbol");
+ return value;
+};
+
+},{"./is-symbol":75}],78:[function(require,module,exports){
+'use strict';
+
+var d = require('d')
+ , callable = require('es5-ext/object/valid-callable')
+
+ , apply = Function.prototype.apply, call = Function.prototype.call
+ , create = Object.create, defineProperty = Object.defineProperty
+ , defineProperties = Object.defineProperties
+ , hasOwnProperty = Object.prototype.hasOwnProperty
+ , descriptor = { configurable: true, enumerable: false, writable: true }
+
+ , on, once, off, emit, methods, descriptors, base;
+
+on = function (type, listener) {
+ var data;
+
+ callable(listener);
+
+ if (!hasOwnProperty.call(this, '__ee__')) {
+ data = descriptor.value = create(null);
+ defineProperty(this, '__ee__', descriptor);
+ descriptor.value = null;
+ } else {
+ data = this.__ee__;
+ }
+ if (!data[type]) data[type] = listener;
+ else if (typeof data[type] === 'object') data[type].push(listener);
+ else data[type] = [data[type], listener];
+
+ return this;
+};
+
+once = function (type, listener) {
+ var once, self;
+
+ callable(listener);
+ self = this;
+ on.call(this, type, once = function () {
+ off.call(self, type, once);
+ apply.call(listener, this, arguments);
+ });
+
+ once.__eeOnceListener__ = listener;
+ return this;
+};
+
+off = function (type, listener) {
+ var data, listeners, candidate, i;
+
+ callable(listener);
+
+ if (!hasOwnProperty.call(this, '__ee__')) return this;
+ data = this.__ee__;
+ if (!data[type]) return this;
+ listeners = data[type];
+
+ if (typeof listeners === 'object') {
+ for (i = 0; (candidate = listeners[i]); ++i) {
+ if ((candidate === listener) ||
+ (candidate.__eeOnceListener__ === listener)) {
+ if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
+ else listeners.splice(i, 1);
+ }
+ }
+ } else {
+ if ((listeners === listener) ||
+ (listeners.__eeOnceListener__ === listener)) {
+ delete data[type];
+ }
+ }
+
+ return this;
+};
+
+emit = function (type) {
+ var i, l, listener, listeners, args;
+
+ if (!hasOwnProperty.call(this, '__ee__')) return;
+ listeners = this.__ee__[type];
+ if (!listeners) return;
+
+ if (typeof listeners === 'object') {
+ l = arguments.length;
+ args = new Array(l - 1);
+ for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
+
+ listeners = listeners.slice();
+ for (i = 0; (listener = listeners[i]); ++i) {
+ apply.call(listener, this, args);
+ }
+ } else {
+ switch (arguments.length) {
+ case 1:
+ call.call(listeners, this);
+ break;
+ case 2:
+ call.call(listeners, this, arguments[1]);
+ break;
+ case 3:
+ call.call(listeners, this, arguments[1], arguments[2]);
+ break;
+ default:
+ l = arguments.length;
+ args = new Array(l - 1);
+ for (i = 1; i < l; ++i) {
+ args[i - 1] = arguments[i];
+ }
+ apply.call(listeners, this, args);
+ }
+ }
+};
+
+methods = {
+ on: on,
+ once: once,
+ off: off,
+ emit: emit
+};
+
+descriptors = {
+ on: d(on),
+ once: d(once),
+ off: d(off),
+ emit: d(emit)
+};
+
+base = defineProperties({}, descriptors);
+
+module.exports = exports = function (o) {
+ return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
+};
+exports.methods = methods;
+
+},{"d":16,"es5-ext/object/valid-callable":54}],79:[function(require,module,exports){
+exports.read = function (buffer, offset, isLE, mLen, nBytes) {
+ var e, m
+ var eLen = (nBytes * 8) - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var nBits = -7
+ var i = isLE ? (nBytes - 1) : 0
+ var d = isLE ? -1 : 1
+ var s = buffer[offset + i]
+
+ i += d
+
+ e = s & ((1 << (-nBits)) - 1)
+ s >>= (-nBits)
+ nBits += eLen
+ for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
+
+ m = e & ((1 << (-nBits)) - 1)
+ e >>= (-nBits)
+ nBits += mLen
+ for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
+
+ if (e === 0) {
+ e = 1 - eBias
+ } else if (e === eMax) {
+ return m ? NaN : ((s ? -1 : 1) * Infinity)
+ } else {
+ m = m + Math.pow(2, mLen)
+ e = e - eBias
+ }
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+}
+
+exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c
+ var eLen = (nBytes * 8) - mLen - 1
+ var eMax = (1 << eLen) - 1
+ var eBias = eMax >> 1
+ var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
+ var i = isLE ? 0 : (nBytes - 1)
+ var d = isLE ? 1 : -1
+ var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
+
+ value = Math.abs(value)
+
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0
+ e = eMax
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2)
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--
+ c *= 2
+ }
+ if (e + eBias >= 1) {
+ value += rt / c
+ } else {
+ value += rt * Math.pow(2, 1 - eBias)
+ }
+ if (value * c >= 2) {
+ e++
+ c /= 2
+ }
+
+ if (e + eBias >= eMax) {
+ m = 0
+ e = eMax
+ } else if (e + eBias >= 1) {
+ m = ((value * c) - 1) * Math.pow(2, mLen)
+ e = e + eBias
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
+ e = 0
+ }
+ }
+
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+ e = (e << mLen) | m
+ eLen += mLen
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+ buffer[offset + i - d] |= s * 128
+}
+
+},{}],80:[function(require,module,exports){
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
+
+},{}],81:[function(require,module,exports){
+/*!
+ * Determine if an object is a Buffer
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ */
+
+// The _isBuffer check is for Safari 5-7 support, because it's missing
+// Object.prototype.constructor. Remove this eventually
+module.exports = function (obj) {
+ return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)
+}
+
+function isBuffer (obj) {
+ return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
+}
+
+// For Node v0.10 support. Remove this eventually.
+function isSlowBuffer (obj) {
+ return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))
+}
+
+},{}],82:[function(require,module,exports){
+'use strict'
+
+var Buffer = require('safe-buffer').Buffer
+
+/* Protocol - protocol constants */
+var protocol = module.exports
+
+/* Command code => mnemonic */
+protocol.types = {
+ 0: 'reserved',
+ 1: 'connect',
+ 2: 'connack',
+ 3: 'publish',
+ 4: 'puback',
+ 5: 'pubrec',
+ 6: 'pubrel',
+ 7: 'pubcomp',
+ 8: 'subscribe',
+ 9: 'suback',
+ 10: 'unsubscribe',
+ 11: 'unsuback',
+ 12: 'pingreq',
+ 13: 'pingresp',
+ 14: 'disconnect',
+ 15: 'auth'
+}
+
+/* Mnemonic => Command code */
+protocol.codes = {}
+for (var k in protocol.types) {
+ var v = protocol.types[k]
+ protocol.codes[v] = k
+}
+
+/* Header */
+protocol.CMD_SHIFT = 4
+protocol.CMD_MASK = 0xF0
+protocol.DUP_MASK = 0x08
+protocol.QOS_MASK = 0x03
+protocol.QOS_SHIFT = 1
+protocol.RETAIN_MASK = 0x01
+
+/* Length */
+protocol.LENGTH_MASK = 0x7F
+protocol.LENGTH_FIN_MASK = 0x80
+
+/* Connack */
+protocol.SESSIONPRESENT_MASK = 0x01
+protocol.SESSIONPRESENT_HEADER = Buffer.from([protocol.SESSIONPRESENT_MASK])
+protocol.CONNACK_HEADER = Buffer.from([protocol.codes['connack'] << protocol.CMD_SHIFT])
+
+/* Connect */
+protocol.USERNAME_MASK = 0x80
+protocol.PASSWORD_MASK = 0x40
+protocol.WILL_RETAIN_MASK = 0x20
+protocol.WILL_QOS_MASK = 0x18
+protocol.WILL_QOS_SHIFT = 3
+protocol.WILL_FLAG_MASK = 0x04
+protocol.CLEAN_SESSION_MASK = 0x02
+protocol.CONNECT_HEADER = Buffer.from([protocol.codes['connect'] << protocol.CMD_SHIFT])
+
+/* Properties */
+protocol.properties = {
+ sessionExpiryInterval: 17,
+ willDelayInterval: 24,
+ receiveMaximum: 33,
+ maximumPacketSize: 39,
+ topicAliasMaximum: 34,
+ requestResponseInformation: 25,
+ requestProblemInformation: 23,
+ userProperties: 38,
+ authenticationMethod: 21,
+ authenticationData: 22,
+ payloadFormatIndicator: 1,
+ messageExpiryInterval: 2,
+ contentType: 3,
+ responseTopic: 8,
+ correlationData: 9,
+ maximumQoS: 36,
+ retainAvailable: 37,
+ assignedClientIdentifier: 18,
+ reasonString: 31,
+ wildcardSubscriptionAvailable: 40,
+ subscriptionIdentifiersAvailable: 41,
+ sharedSubscriptionAvailable: 42,
+ serverKeepAlive: 19,
+ responseInformation: 26,
+ serverReference: 28,
+ topicAlias: 35,
+ subscriptionIdentifier: 11
+}
+protocol.propertiesCodes = {}
+for (var prop in protocol.properties) {
+ var id = protocol.properties[prop]
+ protocol.propertiesCodes[id] = prop
+}
+protocol.propertiesTypes = {
+ sessionExpiryInterval: 'int32',
+ willDelayInterval: 'int32',
+ receiveMaximum: 'int16',
+ maximumPacketSize: 'int32',
+ topicAliasMaximum: 'int16',
+ requestResponseInformation: 'byte',
+ requestProblemInformation: 'byte',
+ userProperties: 'pair',
+ authenticationMethod: 'string',
+ authenticationData: 'binary',
+ payloadFormatIndicator: 'byte',
+ messageExpiryInterval: 'int32',
+ contentType: 'string',
+ responseTopic: 'string',
+ correlationData: 'binary',
+ maximumQoS: 'int8',
+ retainAvailable: 'byte',
+ assignedClientIdentifier: 'string',
+ reasonString: 'string',
+ wildcardSubscriptionAvailable: 'byte',
+ subscriptionIdentifiersAvailable: 'byte',
+ sharedSubscriptionAvailable: 'byte',
+ serverKeepAlive: 'int32',
+ responseInformation: 'string',
+ serverReference: 'string',
+ topicAlias: 'int16',
+ subscriptionIdentifier: 'var'
+}
+
+function genHeader (type) {
+ return [0, 1, 2].map(function (qos) {
+ return [0, 1].map(function (dup) {
+ return [0, 1].map(function (retain) {
+ var buf = new Buffer(1)
+ buf.writeUInt8(
+ protocol.codes[type] << protocol.CMD_SHIFT |
+ (dup ? protocol.DUP_MASK : 0) |
+ qos << protocol.QOS_SHIFT | retain, 0, true)
+ return buf
+ })
+ })
+ })
+}
+
+/* Publish */
+protocol.PUBLISH_HEADER = genHeader('publish')
+
+/* Subscribe */
+protocol.SUBSCRIBE_HEADER = genHeader('subscribe')
+protocol.SUBSCRIBE_OPTIONS_QOS_MASK = 0x03
+protocol.SUBSCRIBE_OPTIONS_NL_MASK = 0x01
+protocol.SUBSCRIBE_OPTIONS_NL_SHIFT = 2
+protocol.SUBSCRIBE_OPTIONS_RAP_MASK = 0x01
+protocol.SUBSCRIBE_OPTIONS_RAP_SHIFT = 3
+protocol.SUBSCRIBE_OPTIONS_RH_MASK = 0x03
+protocol.SUBSCRIBE_OPTIONS_RH_SHIFT = 4
+protocol.SUBSCRIBE_OPTIONS_RH = [0x00, 0x10, 0x20]
+protocol.SUBSCRIBE_OPTIONS_NL = 0x04
+protocol.SUBSCRIBE_OPTIONS_RAP = 0x08
+protocol.SUBSCRIBE_OPTIONS_QOS = [0x00, 0x01, 0x02]
+
+/* Unsubscribe */
+protocol.UNSUBSCRIBE_HEADER = genHeader('unsubscribe')
+
+/* Confirmations */
+protocol.ACKS = {
+ unsuback: genHeader('unsuback'),
+ puback: genHeader('puback'),
+ pubcomp: genHeader('pubcomp'),
+ pubrel: genHeader('pubrel'),
+ pubrec: genHeader('pubrec')
+}
+
+protocol.SUBACK_HEADER = Buffer.from([protocol.codes['suback'] << protocol.CMD_SHIFT])
+
+/* Protocol versions */
+protocol.VERSION3 = Buffer.from([3])
+protocol.VERSION4 = Buffer.from([4])
+protocol.VERSION5 = Buffer.from([5])
+
+/* QoS */
+protocol.QOS = [0, 1, 2].map(function (qos) {
+ return Buffer.from([qos])
+})
+
+/* Empty packets */
+protocol.EMPTY = {
+ pingreq: Buffer.from([protocol.codes['pingreq'] << 4, 0]),
+ pingresp: Buffer.from([protocol.codes['pingresp'] << 4, 0]),
+ disconnect: Buffer.from([protocol.codes['disconnect'] << 4, 0])
+}
+
+},{"safe-buffer":110}],83:[function(require,module,exports){
+'use strict'
+
+var Buffer = require('safe-buffer').Buffer
+var writeToStream = require('./writeToStream')
+var EE = require('events').EventEmitter
+var inherits = require('inherits')
+
+function generate (packet, opts) {
+ var stream = new Accumulator()
+ writeToStream(packet, stream, opts)
+ return stream.concat()
+}
+
+function Accumulator () {
+ this._array = new Array(20)
+ this._i = 0
+}
+
+inherits(Accumulator, EE)
+
+Accumulator.prototype.write = function (chunk) {
+ this._array[this._i++] = chunk
+ return true
+}
+
+Accumulator.prototype.concat = function () {
+ var length = 0
+ var lengths = new Array(this._array.length)
+ var list = this._array
+ var pos = 0
+ var i
+ var result
+
+ for (i = 0; i < list.length && list[i] !== undefined; i++) {
+ if (typeof list[i] !== 'string') lengths[i] = list[i].length
+ else lengths[i] = Buffer.byteLength(list[i])
+
+ length += lengths[i]
+ }
+
+ result = Buffer.allocUnsafe(length)
+
+ for (i = 0; i < list.length && list[i] !== undefined; i++) {
+ if (typeof list[i] !== 'string') {
+ list[i].copy(result, pos)
+ pos += lengths[i]
+ } else {
+ result.write(list[i], pos)
+ pos += lengths[i]
+ }
+ }
+
+ return result
+}
+
+module.exports = generate
+
+},{"./writeToStream":89,"events":13,"inherits":80,"safe-buffer":110}],84:[function(require,module,exports){
+'use strict'
+
+exports.parser = require('./parser')
+exports.generate = require('./generate')
+exports.writeToStream = require('./writeToStream')
+
+},{"./generate":83,"./parser":88,"./writeToStream":89}],85:[function(require,module,exports){
+var DuplexStream = require('readable-stream/duplex')
+ , util = require('util')
+ , Buffer = require('safe-buffer').Buffer
+
+
+function BufferList (callback) {
+ if (!(this instanceof BufferList))
+ return new BufferList(callback)
+
+ this._bufs = []
+ this.length = 0
+
+ if (typeof callback == 'function') {
+ this._callback = callback
+
+ var piper = function piper (err) {
+ if (this._callback) {
+ this._callback(err)
+ this._callback = null
+ }
+ }.bind(this)
+
+ this.on('pipe', function onPipe (src) {
+ src.on('error', piper)
+ })
+ this.on('unpipe', function onUnpipe (src) {
+ src.removeListener('error', piper)
+ })
+ } else {
+ this.append(callback)
+ }
+
+ DuplexStream.call(this)
+}
+
+
+util.inherits(BufferList, DuplexStream)
+
+
+BufferList.prototype._offset = function _offset (offset) {
+ var tot = 0, i = 0, _t
+ if (offset === 0) return [ 0, 0 ]
+ for (; i < this._bufs.length; i++) {
+ _t = tot + this._bufs[i].length
+ if (offset < _t || i == this._bufs.length - 1)
+ return [ i, offset - tot ]
+ tot = _t
+ }
+}
+
+
+BufferList.prototype.append = function append (buf) {
+ var i = 0
+
+ if (Buffer.isBuffer(buf)) {
+ this._appendBuffer(buf);
+ } else if (Array.isArray(buf)) {
+ for (; i < buf.length; i++)
+ this.append(buf[i])
+ } else if (buf instanceof BufferList) {
+ // unwrap argument into individual BufferLists
+ for (; i < buf._bufs.length; i++)
+ this.append(buf._bufs[i])
+ } else if (buf != null) {
+ // coerce number arguments to strings, since Buffer(number) does
+ // uninitialized memory allocation
+ if (typeof buf == 'number')
+ buf = buf.toString()
+
+ this._appendBuffer(Buffer.from(buf));
+ }
+
+ return this
+}
+
+
+BufferList.prototype._appendBuffer = function appendBuffer (buf) {
+ this._bufs.push(buf)
+ this.length += buf.length
+}
+
+
+BufferList.prototype._write = function _write (buf, encoding, callback) {
+ this._appendBuffer(buf)
+
+ if (typeof callback == 'function')
+ callback()
+}
+
+
+BufferList.prototype._read = function _read (size) {
+ if (!this.length)
+ return this.push(null)
+
+ size = Math.min(size, this.length)
+ this.push(this.slice(0, size))
+ this.consume(size)
+}
+
+
+BufferList.prototype.end = function end (chunk) {
+ DuplexStream.prototype.end.call(this, chunk)
+
+ if (this._callback) {
+ this._callback(null, this.slice())
+ this._callback = null
+ }
+}
+
+
+BufferList.prototype.get = function get (index) {
+ return this.slice(index, index + 1)[0]
+}
+
+
+BufferList.prototype.slice = function slice (start, end) {
+ if (typeof start == 'number' && start < 0)
+ start += this.length
+ if (typeof end == 'number' && end < 0)
+ end += this.length
+ return this.copy(null, 0, start, end)
+}
+
+
+BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
+ if (typeof srcStart != 'number' || srcStart < 0)
+ srcStart = 0
+ if (typeof srcEnd != 'number' || srcEnd > this.length)
+ srcEnd = this.length
+ if (srcStart >= this.length)
+ return dst || Buffer.alloc(0)
+ if (srcEnd <= 0)
+ return dst || Buffer.alloc(0)
+
+ var copy = !!dst
+ , off = this._offset(srcStart)
+ , len = srcEnd - srcStart
+ , bytes = len
+ , bufoff = (copy && dstStart) || 0
+ , start = off[1]
+ , l
+ , i
+
+ // copy/slice everything
+ if (srcStart === 0 && srcEnd == this.length) {
+ if (!copy) { // slice, but full concat if multiple buffers
+ return this._bufs.length === 1
+ ? this._bufs[0]
+ : Buffer.concat(this._bufs, this.length)
+ }
+
+ // copy, need to copy individual buffers
+ for (i = 0; i < this._bufs.length; i++) {
+ this._bufs[i].copy(dst, bufoff)
+ bufoff += this._bufs[i].length
+ }
+
+ return dst
+ }
+
+ // easy, cheap case where it's a subset of one of the buffers
+ if (bytes <= this._bufs[off[0]].length - start) {
+ return copy
+ ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)
+ : this._bufs[off[0]].slice(start, start + bytes)
+ }
+
+ if (!copy) // a slice, we need something to copy in to
+ dst = Buffer.allocUnsafe(len)
+
+ for (i = off[0]; i < this._bufs.length; i++) {
+ l = this._bufs[i].length - start
+
+ if (bytes > l) {
+ this._bufs[i].copy(dst, bufoff, start)
+ } else {
+ this._bufs[i].copy(dst, bufoff, start, start + bytes)
+ break
+ }
+
+ bufoff += l
+ bytes -= l
+
+ if (start)
+ start = 0
+ }
+
+ return dst
+}
+
+BufferList.prototype.shallowSlice = function shallowSlice (start, end) {
+ start = start || 0
+ end = end || this.length
+
+ if (start < 0)
+ start += this.length
+ if (end < 0)
+ end += this.length
+
+ var startOffset = this._offset(start)
+ , endOffset = this._offset(end)
+ , buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1)
+
+ if (endOffset[1] == 0)
+ buffers.pop()
+ else
+ buffers[buffers.length-1] = buffers[buffers.length-1].slice(0, endOffset[1])
+
+ if (startOffset[1] != 0)
+ buffers[0] = buffers[0].slice(startOffset[1])
+
+ return new BufferList(buffers)
+}
+
+BufferList.prototype.toString = function toString (encoding, start, end) {
+ return this.slice(start, end).toString(encoding)
+}
+
+BufferList.prototype.consume = function consume (bytes) {
+ while (this._bufs.length) {
+ if (bytes >= this._bufs[0].length) {
+ bytes -= this._bufs[0].length
+ this.length -= this._bufs[0].length
+ this._bufs.shift()
+ } else {
+ this._bufs[0] = this._bufs[0].slice(bytes)
+ this.length -= bytes
+ break
+ }
+ }
+ return this
+}
+
+
+BufferList.prototype.duplicate = function duplicate () {
+ var i = 0
+ , copy = new BufferList()
+
+ for (; i < this._bufs.length; i++)
+ copy.append(this._bufs[i])
+
+ return copy
+}
+
+
+BufferList.prototype.destroy = function destroy () {
+ this._bufs.length = 0
+ this.length = 0
+ this.push(null)
+}
+
+
+;(function () {
+ var methods = {
+ 'readDoubleBE' : 8
+ , 'readDoubleLE' : 8
+ , 'readFloatBE' : 4
+ , 'readFloatLE' : 4
+ , 'readInt32BE' : 4
+ , 'readInt32LE' : 4
+ , 'readUInt32BE' : 4
+ , 'readUInt32LE' : 4
+ , 'readInt16BE' : 2
+ , 'readInt16LE' : 2
+ , 'readUInt16BE' : 2
+ , 'readUInt16LE' : 2
+ , 'readInt8' : 1
+ , 'readUInt8' : 1
+ }
+
+ for (var m in methods) {
+ (function (m) {
+ BufferList.prototype[m] = function (offset) {
+ return this.slice(offset, offset + methods[m])[m](0)
+ }
+ }(m))
+ }
+}())
+
+
+module.exports = BufferList
+
+},{"readable-stream/duplex":97,"safe-buffer":110,"util":117}],86:[function(require,module,exports){
+'use strict'
+
+var Buffer = require('safe-buffer').Buffer
+var max = 65536
+var cache = {}
+
+function generateBuffer (i) {
+ var buffer = Buffer.allocUnsafe(2)
+ buffer.writeUInt8(i >> 8, 0)
+ buffer.writeUInt8(i & 0x00FF, 0 + 1)
+
+ return buffer
+}
+
+function generateCache () {
+ for (var i = 0; i < max; i++) {
+ cache[i] = generateBuffer(i)
+ }
+}
+
+/**
+ * calcVariableByteIntLength - calculate the variable byte integer
+ * length field
+ *
+ * @api private
+ */
+function calcVariableByteIntLength (length) {
+ if (length >= 0 && length < 128) return 1
+ else if (length >= 128 && length < 16384) return 2
+ else if (length >= 16384 && length < 2097152) return 3
+ else if (length >= 2097152 && length < 268435456) return 4
+ else return 0
+}
+
+function genBufVariableByteInt (num) {
+ var digit = 0
+ var pos = 0
+ var length = calcVariableByteIntLength(num)
+ var buffer = Buffer.allocUnsafe(length)
+
+ do {
+ digit = num % 128 | 0
+ num = num / 128 | 0
+ if (num > 0) digit = digit | 0x80
+
+ buffer.writeUInt8(digit, pos++)
+ } while (num > 0)
+
+ return {
+ data: buffer,
+ length: length
+ }
+}
+
+function generate4ByteBuffer (num) {
+ var buffer = Buffer.allocUnsafe(4)
+ buffer.writeUInt32BE(num, 0)
+ return buffer
+}
+
+module.exports = {
+ cache: cache,
+ generateCache: generateCache,
+ generateNumber: generateBuffer,
+ genBufVariableByteInt: genBufVariableByteInt,
+ generate4ByteBuffer: generate4ByteBuffer
+}
+
+},{"safe-buffer":110}],87:[function(require,module,exports){
+
+function Packet () {
+ this.cmd = null
+ this.retain = false
+ this.qos = 0
+ this.dup = false
+ this.length = -1
+ this.topic = null
+ this.payload = null
+}
+
+module.exports = Packet
+
+},{}],88:[function(require,module,exports){
+'use strict'
+
+var bl = require('bl')
+var inherits = require('inherits')
+var EE = require('events').EventEmitter
+var Packet = require('./packet')
+var constants = require('./constants')
+
+function Parser (opt) {
+ if (!(this instanceof Parser)) return new Parser(opt)
+
+ this.settings = opt || {}
+
+ this._states = [
+ '_parseHeader',
+ '_parseLength',
+ '_parsePayload',
+ '_newPacket'
+ ]
+
+ this._resetState()
+}
+
+inherits(Parser, EE)
+
+Parser.prototype._resetState = function () {
+ this.packet = new Packet()
+ this.error = null
+ this._list = bl()
+ this._stateCounter = 0
+}
+
+Parser.prototype.parse = function (buf) {
+ if (this.error) this._resetState()
+
+ this._list.append(buf)
+
+ while ((this.packet.length !== -1 || this._list.length > 0) &&
+ this[this._states[this._stateCounter]]() &&
+ !this.error) {
+ this._stateCounter++
+
+ if (this._stateCounter >= this._states.length) this._stateCounter = 0
+ }
+
+ return this._list.length
+}
+
+Parser.prototype._parseHeader = function () {
+ // There is at least one byte in the buffer
+ var zero = this._list.readUInt8(0)
+ this.packet.cmd = constants.types[zero >> constants.CMD_SHIFT]
+ this.packet.retain = (zero & constants.RETAIN_MASK) !== 0
+ this.packet.qos = (zero >> constants.QOS_SHIFT) & constants.QOS_MASK
+ this.packet.dup = (zero & constants.DUP_MASK) !== 0
+
+ this._list.consume(1)
+
+ return true
+}
+
+Parser.prototype._parseLength = function () {
+ // There is at least one byte in the list
+ var result = this._parseVarByteNum(true)
+
+ if (result) {
+ this.packet.length = result.value
+ this._list.consume(result.bytes)
+ }
+
+ return !!result
+}
+
+Parser.prototype._parsePayload = function () {
+ var result = false
+
+ // Do we have a payload? Do we have enough data to complete the payload?
+ // PINGs have no payload
+ if (this.packet.length === 0 || this._list.length >= this.packet.length) {
+ this._pos = 0
+
+ switch (this.packet.cmd) {
+ case 'connect':
+ this._parseConnect()
+ break
+ case 'connack':
+ this._parseConnack()
+ break
+ case 'publish':
+ this._parsePublish()
+ break
+ case 'puback':
+ case 'pubrec':
+ case 'pubrel':
+ case 'pubcomp':
+ this._parseConfirmation()
+ break
+ case 'subscribe':
+ this._parseSubscribe()
+ break
+ case 'suback':
+ this._parseSuback()
+ break
+ case 'unsubscribe':
+ this._parseUnsubscribe()
+ break
+ case 'unsuback':
+ this._parseUnsuback()
+ break
+ case 'pingreq':
+ case 'pingresp':
+ // These are empty, nothing to do
+ break
+ case 'disconnect':
+ this._parseDisconnect()
+ break
+ case 'auth':
+ this._parseAuth()
+ break
+ default:
+ this._emitError(new Error('Not supported'))
+ }
+
+ result = true
+ }
+
+ return result
+}
+
+Parser.prototype._parseConnect = function () {
+ var protocolId // Protocol ID
+ var clientId // Client ID
+ var topic // Will topic
+ var payload // Will payload
+ var password // Password
+ var username // Username
+ var flags = {}
+ var packet = this.packet
+
+ // Parse protocolId
+ protocolId = this._parseString()
+
+ if (protocolId === null) return this._emitError(new Error('Cannot parse protocolId'))
+ if (protocolId !== 'MQTT' && protocolId !== 'MQIsdp') {
+ return this._emitError(new Error('Invalid protocolId'))
+ }
+
+ packet.protocolId = protocolId
+
+ // Parse constants version number
+ if (this._pos >= this._list.length) return this._emitError(new Error('Packet too short'))
+
+ packet.protocolVersion = this._list.readUInt8(this._pos)
+
+ if (packet.protocolVersion !== 3 && packet.protocolVersion !== 4 && packet.protocolVersion !== 5) {
+ return this._emitError(new Error('Invalid protocol version'))
+ }
+
+ this._pos++
+
+ if (this._pos >= this._list.length) {
+ return this._emitError(new Error('Packet too short'))
+ }
+
+ // Parse connect flags
+ flags.username = (this._list.readUInt8(this._pos) & constants.USERNAME_MASK)
+ flags.password = (this._list.readUInt8(this._pos) & constants.PASSWORD_MASK)
+ flags.will = (this._list.readUInt8(this._pos) & constants.WILL_FLAG_MASK)
+
+ if (flags.will) {
+ packet.will = {}
+ packet.will.retain = (this._list.readUInt8(this._pos) & constants.WILL_RETAIN_MASK) !== 0
+ packet.will.qos = (this._list.readUInt8(this._pos) &
+ constants.WILL_QOS_MASK) >> constants.WILL_QOS_SHIFT
+ }
+
+ packet.clean = (this._list.readUInt8(this._pos) & constants.CLEAN_SESSION_MASK) !== 0
+ this._pos++
+
+ // Parse keepalive
+ packet.keepalive = this._parseNum()
+ if (packet.keepalive === -1) return this._emitError(new Error('Packet too short'))
+
+ // parse properties
+ if (packet.protocolVersion === 5) {
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+ }
+ // Parse clientId
+ clientId = this._parseString()
+ if (clientId === null) return this._emitError(new Error('Packet too short'))
+ packet.clientId = clientId
+
+ if (flags.will) {
+ if (packet.protocolVersion === 5) {
+ var willProperties = this._parseProperties()
+ if (Object.getOwnPropertyNames(willProperties).length) {
+ packet.will.properties = willProperties
+ }
+ }
+ // Parse will topic
+ topic = this._parseString()
+ if (topic === null) return this._emitError(new Error('Cannot parse will topic'))
+ packet.will.topic = topic
+
+ // Parse will payload
+ payload = this._parseBuffer()
+ if (payload === null) return this._emitError(new Error('Cannot parse will payload'))
+ packet.will.payload = payload
+ }
+
+ // Parse username
+ if (flags.username) {
+ username = this._parseString()
+ if (username === null) return this._emitError(new Error('Cannot parse username'))
+ packet.username = username
+ }
+
+ // Parse password
+ if (flags.password) {
+ password = this._parseBuffer()
+ if (password === null) return this._emitError(new Error('Cannot parse password'))
+ packet.password = password
+ }
+ // need for right parse auth packet and self set up
+ this.settings = packet
+
+ return packet
+}
+
+Parser.prototype._parseConnack = function () {
+ var packet = this.packet
+
+ if (this._list.length < 2) return null
+
+ packet.sessionPresent = !!(this._list.readUInt8(this._pos++) & constants.SESSIONPRESENT_MASK)
+ if (this.settings.protocolVersion === 5) {
+ packet.reasonCode = this._list.readUInt8(this._pos++)
+ } else {
+ packet.returnCode = this._list.readUInt8(this._pos++)
+ }
+
+ if (packet.returnCode === -1 || packet.reasonCode === -1) return this._emitError(new Error('Cannot parse return code'))
+ // mqtt 5 properties
+ if (this.settings.protocolVersion === 5) {
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+ }
+}
+
+Parser.prototype._parsePublish = function () {
+ var packet = this.packet
+ packet.topic = this._parseString()
+
+ if (packet.topic === null) return this._emitError(new Error('Cannot parse topic'))
+
+ // Parse messageId
+ if (packet.qos > 0) if (!this._parseMessageId()) { return }
+
+ // Properties mqtt 5
+ if (this.settings.protocolVersion === 5) {
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+ }
+
+ packet.payload = this._list.slice(this._pos, packet.length)
+}
+
+Parser.prototype._parseSubscribe = function () {
+ var packet = this.packet
+ var topic
+ var options
+ var qos
+ var rh
+ var rap
+ var nl
+ var subscription
+
+ if (packet.qos !== 1) {
+ return this._emitError(new Error('Wrong subscribe header'))
+ }
+
+ packet.subscriptions = []
+
+ if (!this._parseMessageId()) { return }
+
+ // Properties mqtt 5
+ if (this.settings.protocolVersion === 5) {
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+ }
+
+ while (this._pos < packet.length) {
+ // Parse topic
+ topic = this._parseString()
+ if (topic === null) return this._emitError(new Error('Cannot parse topic'))
+
+ options = this._parseByte()
+ qos = options & constants.SUBSCRIBE_OPTIONS_QOS_MASK
+ nl = ((options >> constants.SUBSCRIBE_OPTIONS_NL_SHIFT) & constants.SUBSCRIBE_OPTIONS_NL_MASK) !== 0
+ rap = ((options >> constants.SUBSCRIBE_OPTIONS_RAP_SHIFT) & constants.SUBSCRIBE_OPTIONS_RAP_MASK) !== 0
+ rh = (options >> constants.SUBSCRIBE_OPTIONS_RH_SHIFT) & constants.SUBSCRIBE_OPTIONS_RH_MASK
+
+ subscription = { topic: topic, qos: qos }
+
+ // mqtt 5 options
+ if (this.settings.protocolVersion === 5) {
+ subscription.nl = nl
+ subscription.rap = rap
+ subscription.rh = rh
+ }
+
+ // Push pair to subscriptions
+ packet.subscriptions.push(subscription)
+ }
+}
+
+Parser.prototype._parseSuback = function () {
+ var packet = this.packet
+ this.packet.granted = []
+
+ if (!this._parseMessageId()) { return }
+
+ // Properties mqtt 5
+ if (this.settings.protocolVersion === 5) {
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+ }
+
+ // Parse granted QoSes
+ while (this._pos < this.packet.length) {
+ this.packet.granted.push(this._list.readUInt8(this._pos++))
+ }
+}
+
+Parser.prototype._parseUnsubscribe = function () {
+ var packet = this.packet
+
+ packet.unsubscriptions = []
+
+ // Parse messageId
+ if (!this._parseMessageId()) { return }
+
+ // Properties mqtt 5
+ if (this.settings.protocolVersion === 5) {
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+ }
+
+ while (this._pos < packet.length) {
+ var topic
+
+ // Parse topic
+ topic = this._parseString()
+ if (topic === null) return this._emitError(new Error('Cannot parse topic'))
+
+ // Push topic to unsubscriptions
+ packet.unsubscriptions.push(topic)
+ }
+}
+
+Parser.prototype._parseUnsuback = function () {
+ var packet = this.packet
+ if (!this._parseMessageId()) return this._emitError(new Error('Cannot parse messageId'))
+ // Properties mqtt 5
+ if (this.settings.protocolVersion === 5) {
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+ // Parse granted QoSes
+ packet.granted = []
+ while (this._pos < this.packet.length) {
+ this.packet.granted.push(this._list.readUInt8(this._pos++))
+ }
+ }
+}
+
+// parse packets like puback, pubrec, pubrel, pubcomp
+Parser.prototype._parseConfirmation = function () {
+ var packet = this.packet
+
+ this._parseMessageId()
+
+ if (this.settings.protocolVersion === 5) {
+ if (packet.length > 2) {
+ // response code
+ packet.reasonCode = this._parseByte()
+ // properies mqtt 5
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+ }
+ }
+
+ return true
+}
+
+// parse disconnect packet
+Parser.prototype._parseDisconnect = function () {
+ var packet = this.packet
+
+ if (this.settings.protocolVersion === 5) {
+ // response code
+ packet.reasonCode = this._parseByte()
+ // properies mqtt 5
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+ }
+
+ return true
+}
+
+// parse auth packet
+Parser.prototype._parseAuth = function () {
+ var packet = this.packet
+
+ if (this.settings.protocolVersion !== 5) {
+ return this._emitError(new Error('Not supported auth packet for this version MQTT'))
+ }
+
+ // response code
+ packet.reasonCode = this._parseByte()
+ // properies mqtt 5
+ var properties = this._parseProperties()
+ if (Object.getOwnPropertyNames(properties).length) {
+ packet.properties = properties
+ }
+
+ return true
+}
+
+Parser.prototype._parseMessageId = function () {
+ var packet = this.packet
+
+ packet.messageId = this._parseNum()
+
+ if (packet.messageId === null) {
+ this._emitError(new Error('Cannot parse messageId'))
+ return false
+ }
+
+ return true
+}
+
+Parser.prototype._parseString = function (maybeBuffer) {
+ var length = this._parseNum()
+ var result
+ var end = length + this._pos
+
+ if (length === -1 || end > this._list.length || end > this.packet.length) return null
+
+ result = this._list.toString('utf8', this._pos, end)
+ this._pos += length
+
+ return result
+}
+
+Parser.prototype._parseStringPair = function () {
+ return {
+ name: this._parseString(),
+ value: this._parseString()
+ }
+}
+
+Parser.prototype._parseBuffer = function () {
+ var length = this._parseNum()
+ var result
+ var end = length + this._pos
+
+ if (length === -1 || end > this._list.length || end > this.packet.length) return null
+
+ result = this._list.slice(this._pos, end)
+
+ this._pos += length
+
+ return result
+}
+
+Parser.prototype._parseNum = function () {
+ if (this._list.length - this._pos < 2) return -1
+
+ var result = this._list.readUInt16BE(this._pos)
+ this._pos += 2
+
+ return result
+}
+
+Parser.prototype._parse4ByteNum = function () {
+ if (this._list.length - this._pos < 4) return -1
+
+ var result = this._list.readUInt32BE(this._pos)
+ this._pos += 4
+
+ return result
+}
+
+Parser.prototype._parseVarByteNum = function (fullInfoFlag) {
+ var bytes = 0
+ var mul = 1
+ var length = 0
+ var result = true
+ var current
+ var padding = this._pos ? this._pos : 0
+
+ while (bytes < 5) {
+ current = this._list.readUInt8(padding + bytes++)
+ length += mul * (current & constants.LENGTH_MASK)
+ mul *= 0x80
+
+ if ((current & constants.LENGTH_FIN_MASK) === 0) break
+ if (this._list.length <= bytes) {
+ result = false
+ break
+ }
+ }
+
+ if (padding) {
+ this._pos += bytes
+ }
+
+ result = result
+ ? fullInfoFlag ? {
+ bytes: bytes,
+ value: length
+ } : length
+ : false
+
+ return result
+}
+
+Parser.prototype._parseByte = function () {
+ var result = this._list.readUInt8(this._pos)
+ this._pos++
+ return result
+}
+
+Parser.prototype._parseByType = function (type) {
+ switch (type) {
+ case 'byte': {
+ return this._parseByte() !== 0
+ }
+ case 'int8': {
+ return this._parseByte()
+ }
+ case 'int16': {
+ return this._parseNum()
+ }
+ case 'int32': {
+ return this._parse4ByteNum()
+ }
+ case 'var': {
+ return this._parseVarByteNum()
+ }
+ case 'string': {
+ return this._parseString()
+ }
+ case 'pair': {
+ return this._parseStringPair()
+ }
+ case 'binary': {
+ return this._parseBuffer()
+ }
+ }
+}
+
+Parser.prototype._parseProperties = function () {
+ var length = this._parseVarByteNum()
+ var start = this._pos
+ var end = start + length
+ var result = {}
+ while (this._pos < end) {
+ var type = this._parseByte()
+ var name = constants.propertiesCodes[type]
+ if (!name) {
+ this._emitError(new Error('Unknown property'))
+ return false
+ }
+ // user properties process
+ if (name === 'userProperties') {
+ if (!result[name]) {
+ result[name] = {}
+ }
+ var currentUserProperty = this._parseByType(constants.propertiesTypes[name])
+ result[name][currentUserProperty.name] = currentUserProperty.value
+ continue
+ }
+ result[name] = this._parseByType(constants.propertiesTypes[name])
+ }
+ return result
+}
+
+Parser.prototype._newPacket = function () {
+ if (this.packet) {
+ this._list.consume(this.packet.length)
+ this.emit('packet', this.packet)
+ }
+
+ this.packet = new Packet()
+
+ this._pos = 0
+
+ return true
+}
+
+Parser.prototype._emitError = function (err) {
+ this.error = err
+ this.emit('error', err)
+}
+
+module.exports = Parser
+
+},{"./constants":82,"./packet":87,"bl":85,"events":13,"inherits":80}],89:[function(require,module,exports){
+'use strict'
+
+var protocol = require('./constants')
+var Buffer = require('safe-buffer').Buffer
+var empty = Buffer.allocUnsafe(0)
+var zeroBuf = Buffer.from([0])
+var numbers = require('./numbers')
+var nextTick = require('process-nextick-args').nextTick
+
+var numCache = numbers.cache
+var generateNumber = numbers.generateNumber
+var generateCache = numbers.generateCache
+var genBufVariableByteInt = numbers.genBufVariableByteInt
+var generate4ByteBuffer = numbers.generate4ByteBuffer
+var writeNumber = writeNumberCached
+var toGenerate = true
+
+function generate (packet, stream, opts) {
+ if (stream.cork) {
+ stream.cork()
+ nextTick(uncork, stream)
+ }
+
+ if (toGenerate) {
+ toGenerate = false
+ generateCache()
+ }
+
+ switch (packet.cmd) {
+ case 'connect':
+ return connect(packet, stream, opts)
+ case 'connack':
+ return connack(packet, stream, opts)
+ case 'publish':
+ return publish(packet, stream, opts)
+ case 'puback':
+ case 'pubrec':
+ case 'pubrel':
+ case 'pubcomp':
+ return confirmation(packet, stream, opts)
+ case 'subscribe':
+ return subscribe(packet, stream, opts)
+ case 'suback':
+ return suback(packet, stream, opts)
+ case 'unsubscribe':
+ return unsubscribe(packet, stream, opts)
+ case 'unsuback':
+ return unsuback(packet, stream, opts)
+ case 'pingreq':
+ case 'pingresp':
+ return emptyPacket(packet, stream, opts)
+ case 'disconnect':
+ return disconnect(packet, stream, opts)
+ case 'auth':
+ return auth(packet, stream, opts)
+ default:
+ stream.emit('error', new Error('Unknown command'))
+ return false
+ }
+}
+/**
+ * Controls numbers cache.
+ * Set to "false" to allocate buffers on-the-flight instead of pre-generated cache
+ */
+Object.defineProperty(generate, 'cacheNumbers', {
+ get: function () {
+ return writeNumber === writeNumberCached
+ },
+ set: function (value) {
+ if (value) {
+ if (!numCache || Object.keys(numCache).length === 0) toGenerate = true
+ writeNumber = writeNumberCached
+ } else {
+ toGenerate = false
+ writeNumber = writeNumberGenerated
+ }
+ }
+})
+
+function uncork (stream) {
+ stream.uncork()
+}
+
+function connect (packet, stream, opts) {
+ var settings = packet || {}
+ var protocolId = settings.protocolId || 'MQTT'
+ var protocolVersion = settings.protocolVersion || 4
+ var will = settings.will
+ var clean = settings.clean
+ var keepalive = settings.keepalive || 0
+ var clientId = settings.clientId || ''
+ var username = settings.username
+ var password = settings.password
+ /* mqtt5 new oprions */
+ var properties = settings.properties
+
+ if (clean === undefined) clean = true
+
+ var length = 0
+
+ // Must be a string and non-falsy
+ if (!protocolId ||
+ (typeof protocolId !== 'string' && !Buffer.isBuffer(protocolId))) {
+ stream.emit('error', new Error('Invalid protocolId'))
+ return false
+ } else length += protocolId.length + 2
+
+ // Must be 3 or 4 or 5
+ if (protocolVersion !== 3 && protocolVersion !== 4 && protocolVersion !== 5) {
+ stream.emit('error', new Error('Invalid protocol version'))
+ return false
+ } else length += 1
+
+ // ClientId might be omitted in 3.1.1, but only if cleanSession is set to 1
+ if ((typeof clientId === 'string' || Buffer.isBuffer(clientId)) &&
+ (clientId || protocolVersion === 4) && (clientId || clean)) {
+ length += clientId.length + 2
+ } else {
+ if (protocolVersion < 4) {
+ stream.emit('error', new Error('clientId must be supplied before 3.1.1'))
+ return false
+ }
+ if ((clean * 1) === 0) {
+ stream.emit('error', new Error('clientId must be given if cleanSession set to 0'))
+ return false
+ }
+ }
+
+ // Must be a two byte number
+ if (typeof keepalive !== 'number' ||
+ keepalive < 0 ||
+ keepalive > 65535 ||
+ keepalive % 1 !== 0) {
+ stream.emit('error', new Error('Invalid keepalive'))
+ return false
+ } else length += 2
+
+ // Connect flags
+ length += 1
+
+ // Properties
+ if (protocolVersion === 5) {
+ var propertiesData = getProperties(stream, properties)
+ length += propertiesData.length
+ }
+
+ // If will exists...
+ if (will) {
+ // It must be an object
+ if (typeof will !== 'object') {
+ stream.emit('error', new Error('Invalid will'))
+ return false
+ }
+ // It must have topic typeof string
+ if (!will.topic || typeof will.topic !== 'string') {
+ stream.emit('error', new Error('Invalid will topic'))
+ return false
+ } else {
+ length += Buffer.byteLength(will.topic) + 2
+ }
+
+ // Payload
+ if (will.payload) {
+ if (will.payload.length >= 0) {
+ if (typeof will.payload === 'string') {
+ length += Buffer.byteLength(will.payload) + 2
+ } else {
+ length += will.payload.length + 2
+ }
+ } else {
+ stream.emit('error', new Error('Invalid will payload'))
+ return false
+ }
+
+ // will properties
+ var willProperties = {}
+ if (protocolVersion === 5) {
+ willProperties = getProperties(stream, will.properties)
+ length += willProperties.length
+ }
+ }
+ }
+
+ // Username
+ var providedUsername = false
+ if (username != null) {
+ if (isStringOrBuffer(username)) {
+ providedUsername = true
+ length += Buffer.byteLength(username) + 2
+ } else {
+ stream.emit('error', new Error('Invalid username'))
+ return false
+ }
+ }
+
+ // Password
+ if (password != null) {
+ if (!providedUsername) {
+ stream.emit('error', new Error('Username is required to use password'))
+ return false
+ }
+
+ if (isStringOrBuffer(password)) {
+ length += byteLength(password) + 2
+ } else {
+ stream.emit('error', new Error('Invalid password'))
+ return false
+ }
+ }
+
+ // Generate header
+ stream.write(protocol.CONNECT_HEADER)
+
+ // Generate length
+ writeVarByteInt(stream, length)
+
+ // Generate protocol ID
+ writeStringOrBuffer(stream, protocolId)
+ stream.write(
+ protocolVersion === 4
+ ? protocol.VERSION4
+ : protocolVersion === 5
+ ? protocol.VERSION5
+ : protocol.VERSION3
+ )
+
+ // Connect flags
+ var flags = 0
+ flags |= (username != null) ? protocol.USERNAME_MASK : 0
+ flags |= (password != null) ? protocol.PASSWORD_MASK : 0
+ flags |= (will && will.retain) ? protocol.WILL_RETAIN_MASK : 0
+ flags |= (will && will.qos) ? will.qos << protocol.WILL_QOS_SHIFT : 0
+ flags |= will ? protocol.WILL_FLAG_MASK : 0
+ flags |= clean ? protocol.CLEAN_SESSION_MASK : 0
+
+ stream.write(Buffer.from([flags]))
+
+ // Keepalive
+ writeNumber(stream, keepalive)
+
+ // Properties
+ if (protocolVersion === 5) {
+ propertiesData.write()
+ }
+
+ // Client ID
+ writeStringOrBuffer(stream, clientId)
+
+ // Will
+ if (will) {
+ if (protocolVersion === 5) {
+ willProperties.write()
+ }
+ writeString(stream, will.topic)
+ writeStringOrBuffer(stream, will.payload)
+ }
+
+ // Username and password
+ if (username != null) {
+ writeStringOrBuffer(stream, username)
+ }
+ if (password != null) {
+ writeStringOrBuffer(stream, password)
+ }
+ // This is a small packet that happens only once on a stream
+ // We assume the stream is always free to receive more data after this
+ return true
+}
+
+function connack (packet, stream, opts) {
+ var version = opts ? opts.protocolVersion : 4
+ var settings = packet || {}
+ var rc = version === 5 ? settings.reasonCode : settings.returnCode
+ var properties = settings.properties
+ var length = 2 // length of rc and sessionHeader
+
+ // Check return code
+ if (typeof rc !== 'number') {
+ stream.emit('error', new Error('Invalid return code'))
+ return false
+ }
+ // mqtt5 properties
+ var propertiesData = null
+ if (version === 5) {
+ propertiesData = getProperties(stream, properties)
+ length += propertiesData.length
+ }
+
+ stream.write(protocol.CONNACK_HEADER)
+ // length
+ writeVarByteInt(stream, length)
+ stream.write(settings.sessionPresent ? protocol.SESSIONPRESENT_HEADER : zeroBuf)
+
+ stream.write(Buffer.from([rc]))
+ if (propertiesData != null) {
+ propertiesData.write()
+ }
+ return true
+}
+
+function publish (packet, stream, opts) {
+ var version = opts ? opts.protocolVersion : 4
+ var settings = packet || {}
+ var qos = settings.qos || 0
+ var retain = settings.retain ? protocol.RETAIN_MASK : 0
+ var topic = settings.topic
+ var payload = settings.payload || empty
+ var id = settings.messageId
+ var properties = settings.properties
+
+ var length = 0
+
+ // Topic must be a non-empty string or Buffer
+ if (typeof topic === 'string') length += Buffer.byteLength(topic) + 2
+ else if (Buffer.isBuffer(topic)) length += topic.length + 2
+ else {
+ stream.emit('error', new Error('Invalid topic'))
+ return false
+ }
+
+ // Get the payload length
+ if (!Buffer.isBuffer(payload)) length += Buffer.byteLength(payload)
+ else length += payload.length
+
+ // Message ID must a number if qos > 0
+ if (qos && typeof id !== 'number') {
+ stream.emit('error', new Error('Invalid messageId'))
+ return false
+ } else if (qos) length += 2
+
+ // mqtt5 properties
+ var propertiesData = null
+ if (version === 5) {
+ propertiesData = getProperties(stream, properties)
+ length += propertiesData.length
+ }
+
+ // Header
+ stream.write(protocol.PUBLISH_HEADER[qos][settings.dup ? 1 : 0][retain ? 1 : 0])
+
+ // Remaining length
+ writeVarByteInt(stream, length)
+
+ // Topic
+ writeNumber(stream, byteLength(topic))
+ stream.write(topic)
+
+ // Message ID
+ if (qos > 0) writeNumber(stream, id)
+
+ // Properties
+ if (propertiesData != null) {
+ propertiesData.write()
+ }
+
+ // Payload
+ return stream.write(payload)
+}
+
+/* Puback, pubrec, pubrel and pubcomp */
+function confirmation (packet, stream, opts) {
+ var version = opts ? opts.protocolVersion : 4
+ var settings = packet || {}
+ var type = settings.cmd || 'puback'
+ var id = settings.messageId
+ var dup = (settings.dup && type === 'pubrel') ? protocol.DUP_MASK : 0
+ var qos = 0
+ var reasonCode = settings.reasonCode
+ var properties = settings.properties
+ var length = version === 5 ? 3 : 2
+
+ if (type === 'pubrel') qos = 1
+
+ // Check message ID
+ if (typeof id !== 'number') {
+ stream.emit('error', new Error('Invalid messageId'))
+ return false
+ }
+
+ // properies mqtt 5
+ var propertiesData = null
+ if (version === 5) {
+ propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length)
+ if (!propertiesData) { return false }
+ length += propertiesData.length
+ }
+
+ // Header
+ stream.write(protocol.ACKS[type][qos][dup][0])
+
+ // Length
+ writeVarByteInt(stream, length)
+
+ // Message ID
+ writeNumber(stream, id)
+
+ // reason code in header
+ if (version === 5) {
+ stream.write(Buffer.from([reasonCode]))
+ }
+
+ // properies mqtt 5
+ if (propertiesData !== null) {
+ propertiesData.write()
+ }
+ return true
+}
+
+function subscribe (packet, stream, opts) {
+ var version = opts ? opts.protocolVersion : 4
+ var settings = packet || {}
+ var dup = settings.dup ? protocol.DUP_MASK : 0
+ var id = settings.messageId
+ var subs = settings.subscriptions
+ var properties = settings.properties
+
+ var length = 0
+
+ // Check message ID
+ if (typeof id !== 'number') {
+ stream.emit('error', new Error('Invalid messageId'))
+ return false
+ } else length += 2
+
+ // properies mqtt 5
+ var propertiesData = null
+ if (version === 5) {
+ propertiesData = getProperties(stream, properties)
+ length += propertiesData.length
+ }
+
+ // Check subscriptions
+ if (typeof subs === 'object' && subs.length) {
+ for (var i = 0; i < subs.length; i += 1) {
+ var itopic = subs[i].topic
+ var iqos = subs[i].qos
+
+ if (typeof itopic !== 'string') {
+ stream.emit('error', new Error('Invalid subscriptions - invalid topic'))
+ return false
+ }
+ if (typeof iqos !== 'number') {
+ stream.emit('error', new Error('Invalid subscriptions - invalid qos'))
+ return false
+ }
+
+ if (version === 5) {
+ var nl = subs[i].nl || false
+ if (typeof nl !== 'boolean') {
+ stream.emit('error', new Error('Invalid subscriptions - invalid No Local'))
+ return false
+ }
+ var rap = subs[i].rap || false
+ if (typeof rap !== 'boolean') {
+ stream.emit('error', new Error('Invalid subscriptions - invalid Retain as Published'))
+ return false
+ }
+ var rh = subs[i].rh || 0
+ if (typeof rh !== 'number' || rh > 2) {
+ stream.emit('error', new Error('Invalid subscriptions - invalid Retain Handling'))
+ return false
+ }
+ }
+
+ length += Buffer.byteLength(itopic) + 2 + 1
+ }
+ } else {
+ stream.emit('error', new Error('Invalid subscriptions'))
+ return false
+ }
+
+ // Generate header
+ stream.write(protocol.SUBSCRIBE_HEADER[1][dup ? 1 : 0][0])
+
+ // Generate length
+ writeVarByteInt(stream, length)
+
+ // Generate message ID
+ writeNumber(stream, id)
+
+ // properies mqtt 5
+ if (propertiesData !== null) {
+ propertiesData.write()
+ }
+
+ var result = true
+
+ // Generate subs
+ for (var j = 0; j < subs.length; j++) {
+ var sub = subs[j]
+ var jtopic = sub.topic
+ var jqos = sub.qos
+ var jnl = +sub.nl
+ var jrap = +sub.rap
+ var jrh = sub.rh
+ var joptions
+
+ // Write topic string
+ writeString(stream, jtopic)
+
+ // options process
+ joptions = protocol.SUBSCRIBE_OPTIONS_QOS[jqos]
+ if (version === 5) {
+ joptions |= jnl ? protocol.SUBSCRIBE_OPTIONS_NL : 0
+ joptions |= jrap ? protocol.SUBSCRIBE_OPTIONS_RAP : 0
+ joptions |= jrh ? protocol.SUBSCRIBE_OPTIONS_RH[jrh] : 0
+ }
+ // Write options
+ result = stream.write(Buffer.from([joptions]))
+ }
+
+ return result
+}
+
+function suback (packet, stream, opts) {
+ var version = opts ? opts.protocolVersion : 4
+ var settings = packet || {}
+ var id = settings.messageId
+ var granted = settings.granted
+ var properties = settings.properties
+ var length = 0
+
+ // Check message ID
+ if (typeof id !== 'number') {
+ stream.emit('error', new Error('Invalid messageId'))
+ return false
+ } else length += 2
+
+ // Check granted qos vector
+ if (typeof granted === 'object' && granted.length) {
+ for (var i = 0; i < granted.length; i += 1) {
+ if (typeof granted[i] !== 'number') {
+ stream.emit('error', new Error('Invalid qos vector'))
+ return false
+ }
+ length += 1
+ }
+ } else {
+ stream.emit('error', new Error('Invalid qos vector'))
+ return false
+ }
+
+ // properies mqtt 5
+ var propertiesData = null
+ if (version === 5) {
+ propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length)
+ if (!propertiesData) { return false }
+ length += propertiesData.length
+ }
+
+ // header
+ stream.write(protocol.SUBACK_HEADER)
+
+ // Length
+ writeVarByteInt(stream, length)
+
+ // Message ID
+ writeNumber(stream, id)
+
+ // properies mqtt 5
+ if (propertiesData !== null) {
+ propertiesData.write()
+ }
+
+ return stream.write(Buffer.from(granted))
+}
+
+function unsubscribe (packet, stream, opts) {
+ var version = opts ? opts.protocolVersion : 4
+ var settings = packet || {}
+ var id = settings.messageId
+ var dup = settings.dup ? protocol.DUP_MASK : 0
+ var unsubs = settings.unsubscriptions
+ var properties = settings.properties
+
+ var length = 0
+
+ // Check message ID
+ if (typeof id !== 'number') {
+ stream.emit('error', new Error('Invalid messageId'))
+ return false
+ } else {
+ length += 2
+ }
+ // Check unsubs
+ if (typeof unsubs === 'object' && unsubs.length) {
+ for (var i = 0; i < unsubs.length; i += 1) {
+ if (typeof unsubs[i] !== 'string') {
+ stream.emit('error', new Error('Invalid unsubscriptions'))
+ return false
+ }
+ length += Buffer.byteLength(unsubs[i]) + 2
+ }
+ } else {
+ stream.emit('error', new Error('Invalid unsubscriptions'))
+ return false
+ }
+ // properies mqtt 5
+ var propertiesData = null
+ if (version === 5) {
+ propertiesData = getProperties(stream, properties)
+ length += propertiesData.length
+ }
+
+ // Header
+ stream.write(protocol.UNSUBSCRIBE_HEADER[1][dup ? 1 : 0][0])
+
+ // Length
+ writeVarByteInt(stream, length)
+
+ // Message ID
+ writeNumber(stream, id)
+
+ // properies mqtt 5
+ if (propertiesData !== null) {
+ propertiesData.write()
+ }
+
+ // Unsubs
+ var result = true
+ for (var j = 0; j < unsubs.length; j++) {
+ result = writeString(stream, unsubs[j])
+ }
+
+ return result
+}
+
+function unsuback (packet, stream, opts) {
+ var version = opts ? opts.protocolVersion : 4
+ var settings = packet || {}
+ var id = settings.messageId
+ var dup = settings.dup ? protocol.DUP_MASK : 0
+ var granted = settings.granted
+ var properties = settings.properties
+ var type = settings.cmd
+ var qos = 0
+
+ var length = 2
+
+ // Check message ID
+ if (typeof id !== 'number') {
+ stream.emit('error', new Error('Invalid messageId'))
+ return false
+ }
+
+ // Check granted
+ if (version === 5) {
+ if (typeof granted === 'object' && granted.length) {
+ for (var i = 0; i < granted.length; i += 1) {
+ if (typeof granted[i] !== 'number') {
+ stream.emit('error', new Error('Invalid qos vector'))
+ return false
+ }
+ length += 1
+ }
+ } else {
+ stream.emit('error', new Error('Invalid qos vector'))
+ return false
+ }
+ }
+
+ // properies mqtt 5
+ var propertiesData = null
+ if (version === 5) {
+ propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length)
+ if (!propertiesData) { return false }
+ length += propertiesData.length
+ }
+
+ // Header
+ stream.write(protocol.ACKS[type][qos][dup][0])
+
+ // Length
+ writeVarByteInt(stream, length)
+
+ // Message ID
+ writeNumber(stream, id)
+
+ // properies mqtt 5
+ if (propertiesData !== null) {
+ propertiesData.write()
+ }
+
+ // payload
+ if (version === 5) {
+ stream.write(Buffer.from(granted))
+ }
+ return true
+}
+
+function emptyPacket (packet, stream, opts) {
+ return stream.write(protocol.EMPTY[packet.cmd])
+}
+
+function disconnect (packet, stream, opts) {
+ var version = opts ? opts.protocolVersion : 4
+ var settings = packet || {}
+ var reasonCode = settings.reasonCode
+ var properties = settings.properties
+ var length = version === 5 ? 1 : 0
+
+ // properies mqtt 5
+ var propertiesData = null
+ if (version === 5) {
+ propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length)
+ if (!propertiesData) { return false }
+ length += propertiesData.length
+ }
+
+ // Header
+ stream.write(Buffer.from([protocol.codes['disconnect'] << 4]))
+
+ // Length
+ writeVarByteInt(stream, length)
+
+ // reason code in header
+ if (version === 5) {
+ stream.write(Buffer.from([reasonCode]))
+ }
+
+ // properies mqtt 5
+ if (propertiesData !== null) {
+ propertiesData.write()
+ }
+
+ return true
+}
+
+function auth (packet, stream, opts) {
+ var version = opts ? opts.protocolVersion : 4
+ var settings = packet || {}
+ var reasonCode = settings.reasonCode
+ var properties = settings.properties
+ var length = version === 5 ? 1 : 0
+
+ if (version !== 5) stream.emit('error', new Error('Invalid mqtt version for auth packet'))
+
+ // properies mqtt 5
+ var propertiesData = getPropertiesByMaximumPacketSize(stream, properties, opts, length)
+ if (!propertiesData) { return false }
+ length += propertiesData.length
+
+ // Header
+ stream.write(Buffer.from([protocol.codes['auth'] << 4]))
+
+ // Length
+ writeVarByteInt(stream, length)
+
+ // reason code in header
+ stream.write(Buffer.from([reasonCode]))
+
+ // properies mqtt 5
+ if (propertiesData !== null) {
+ propertiesData.write()
+ }
+ return true
+}
+
+/**
+ * writeVarByteInt - write an MQTT style variable byte integer to the buffer
+ *
+ * @param buffer - destination
+ * @param pos - offset
+ * @param length - length (>0)
+ * @returns number of bytes written
+ *
+ * @api private
+ */
+
+var varByteIntCache = {}
+function writeVarByteInt (stream, num) {
+ var buffer = varByteIntCache[num]
+
+ if (!buffer) {
+ buffer = genBufVariableByteInt(num).data
+ if (num < 16384) varByteIntCache[num] = buffer
+ }
+
+ stream.write(buffer)
+}
+
+/**
+ * writeString - write a utf8 string to the buffer
+ *
+ * @param buffer - destination
+ * @param pos - offset
+ * @param string - string to write
+ * @return number of bytes written
+ *
+ * @api private
+ */
+
+function writeString (stream, string) {
+ var strlen = Buffer.byteLength(string)
+ writeNumber(stream, strlen)
+
+ stream.write(string, 'utf8')
+}
+
+/**
+ * writeStringPair - write a utf8 string pairs to the buffer
+ *
+ * @param buffer - destination
+ * @param name - string name to write
+ * @param value - string value to write
+ * @return number of bytes written
+ *
+ * @api private
+ */
+function writeStringPair (stream, name, value) {
+ writeString(stream, name)
+ writeString(stream, value)
+}
+
+/**
+ * writeNumber - write a two byte number to the buffer
+ *
+ * @param buffer - destination
+ * @param pos - offset
+ * @param number - number to write
+ * @return number of bytes written
+ *
+ * @api private
+ */
+function writeNumberCached (stream, number) {
+ return stream.write(numCache[number])
+}
+function writeNumberGenerated (stream, number) {
+ return stream.write(generateNumber(number))
+}
+function write4ByteNumber (stream, number) {
+ return stream.write(generate4ByteBuffer(number))
+}
+/**
+ * writeStringOrBuffer - write a String or Buffer with the its length prefix
+ *
+ * @param buffer - destination
+ * @param pos - offset
+ * @param toWrite - String or Buffer
+ * @return number of bytes written
+ */
+function writeStringOrBuffer (stream, toWrite) {
+ if (typeof toWrite === 'string') {
+ writeString(stream, toWrite)
+ } else if (toWrite) {
+ writeNumber(stream, toWrite.length)
+ stream.write(toWrite)
+ } else writeNumber(stream, 0)
+}
+
+function getProperties (stream, properties) {
+ /* connect properties */
+ if (typeof properties !== 'object' || properties.length != null) {
+ return {
+ length: 1,
+ write: function () {
+ writeProperties(stream, {}, 0)
+ }
+ }
+ }
+ var propertiesLength = 0
+ function getLengthProperty (name) {
+ var type = protocol.propertiesTypes[name]
+ var value = properties[name]
+ var length = 0
+ switch (type) {
+ case 'byte': {
+ if (typeof value !== 'boolean') {
+ stream.emit('error', new Error('Invalid ' + name))
+ return false
+ }
+ length += 1 + 1
+ break
+ }
+ case 'int8': {
+ if (typeof value !== 'number') {
+ stream.emit('error', new Error('Invalid ' + name))
+ return false
+ }
+ length += 1 + 1
+ break
+ }
+ case 'binary': {
+ if (value && value === null) {
+ stream.emit('error', new Error('Invalid ' + name))
+ return false
+ }
+ length += 1 + Buffer.byteLength(value) + 2
+ break
+ }
+ case 'int16': {
+ if (typeof value !== 'number') {
+ stream.emit('error', new Error('Invalid ' + name))
+ return false
+ }
+ length += 1 + 2
+ break
+ }
+ case 'int32': {
+ if (typeof value !== 'number') {
+ stream.emit('error', new Error('Invalid ' + name))
+ return false
+ }
+ length += 1 + 4
+ break
+ }
+ case 'var': {
+ if (typeof value !== 'number') {
+ stream.emit('error', new Error('Invalid ' + name))
+ return false
+ }
+ length += 1 + genBufVariableByteInt(value).length
+ break
+ }
+ case 'string': {
+ if (typeof value !== 'string') {
+ stream.emit('error', new Error('Invalid ' + name))
+ return false
+ }
+ length += 1 + 2 + Buffer.byteLength(value.toString())
+ break
+ }
+ case 'pair': {
+ if (typeof value !== 'object') {
+ stream.emit('error', new Error('Invalid ' + name))
+ return false
+ }
+ length += Object.getOwnPropertyNames(value).reduce(function (result, name) {
+ result += 1 + 2 + Buffer.byteLength(name.toString()) + 2 + Buffer.byteLength(value[name].toString())
+ return result
+ }, 0)
+ break
+ }
+ default: {
+ stream.emit('error', new Error('Invalid property ' + name))
+ return false
+ }
+ }
+ return length
+ }
+ if (properties) {
+ for (var propName in properties) {
+ var propLength = getLengthProperty(propName)
+ if (!propLength) return false
+ propertiesLength += propLength
+ }
+ }
+ var propertiesLengthLength = genBufVariableByteInt(propertiesLength).length
+
+ return {
+ length: propertiesLengthLength + propertiesLength,
+ write: function () {
+ writeProperties(stream, properties, propertiesLength)
+ }
+ }
+}
+
+function getPropertiesByMaximumPacketSize (stream, properties, opts, length) {
+ var mayEmptyProps = ['reasonString', 'userProperties']
+ var maximumPacketSize = opts && opts.properties && opts.properties.maximumPacketSize ? opts.properties.maximumPacketSize : 0
+
+ var propertiesData = getProperties(stream, properties)
+ if (maximumPacketSize) {
+ while (length + propertiesData.length > maximumPacketSize) {
+ var currentMayEmptyProp = mayEmptyProps.shift()
+ if (currentMayEmptyProp && properties[currentMayEmptyProp]) {
+ delete properties[currentMayEmptyProp]
+ propertiesData = getProperties(stream, properties)
+ } else {
+ return false
+ }
+ }
+ }
+ return propertiesData
+}
+
+function writeProperties (stream, properties, propertiesLength) {
+ /* write properties to stream */
+ writeVarByteInt(stream, propertiesLength)
+ for (var propName in properties) {
+ if (properties.hasOwnProperty(propName) && properties[propName] !== null) {
+ var value = properties[propName]
+ var type = protocol.propertiesTypes[propName]
+ switch (type) {
+ case 'byte': {
+ stream.write(Buffer.from([protocol.properties[propName]]))
+ stream.write(Buffer.from([+value]))
+ break
+ }
+ case 'int8': {
+ stream.write(Buffer.from([protocol.properties[propName]]))
+ stream.write(Buffer.from([value]))
+ break
+ }
+ case 'binary': {
+ stream.write(Buffer.from([protocol.properties[propName]]))
+ writeStringOrBuffer(stream, value)
+ break
+ }
+ case 'int16': {
+ stream.write(Buffer.from([protocol.properties[propName]]))
+ writeNumber(stream, value)
+ break
+ }
+ case 'int32': {
+ stream.write(Buffer.from([protocol.properties[propName]]))
+ write4ByteNumber(stream, value)
+ break
+ }
+ case 'var': {
+ stream.write(Buffer.from([protocol.properties[propName]]))
+ writeVarByteInt(stream, value)
+ break
+ }
+ case 'string': {
+ stream.write(Buffer.from([protocol.properties[propName]]))
+ writeString(stream, value)
+ break
+ }
+ case 'pair': {
+ Object.getOwnPropertyNames(value).forEach(function (name) {
+ stream.write(Buffer.from([protocol.properties[propName]]))
+ writeStringPair(stream, name.toString(), value[name].toString())
+ })
+ break
+ }
+ default: {
+ stream.emit('error', new Error('Invalid property ' + propName))
+ return false
+ }
+ }
+ }
+ }
+}
+
+function byteLength (bufOrString) {
+ if (!bufOrString) return 0
+ else if (bufOrString instanceof Buffer) return bufOrString.length
+ else return Buffer.byteLength(bufOrString)
+}
+
+function isStringOrBuffer (field) {
+ return typeof field === 'string' || field instanceof Buffer
+}
+
+module.exports = generate
+
+},{"./constants":82,"./numbers":86,"process-nextick-args":91,"safe-buffer":110}],90:[function(require,module,exports){
+var wrappy = require('wrappy')
+module.exports = wrappy(once)
+module.exports.strict = wrappy(onceStrict)
+
+once.proto = once(function () {
+ Object.defineProperty(Function.prototype, 'once', {
+ value: function () {
+ return once(this)
+ },
+ configurable: true
+ })
+
+ Object.defineProperty(Function.prototype, 'onceStrict', {
+ value: function () {
+ return onceStrict(this)
+ },
+ configurable: true
+ })
+})
+
+function once (fn) {
+ var f = function () {
+ if (f.called) return f.value
+ f.called = true
+ return f.value = fn.apply(this, arguments)
+ }
+ f.called = false
+ return f
+}
+
+function onceStrict (fn) {
+ var f = function () {
+ if (f.called)
+ throw new Error(f.onceError)
+ f.called = true
+ return f.value = fn.apply(this, arguments)
+ }
+ var name = fn.name || 'Function wrapped with `once`'
+ f.onceError = name + " shouldn't be called more than once"
+ f.called = false
+ return f
+}
+
+},{"wrappy":120}],91:[function(require,module,exports){
+(function (process){
+'use strict';
+
+if (!process.version ||
+ process.version.indexOf('v0.') === 0 ||
+ process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
+ module.exports = { nextTick: nextTick };
+} else {
+ module.exports = process
+}
+
+function nextTick(fn, arg1, arg2, arg3) {
+ if (typeof fn !== 'function') {
+ throw new TypeError('"callback" argument must be a function');
+ }
+ var len = arguments.length;
+ var args, i;
+ switch (len) {
+ case 0:
+ case 1:
+ return process.nextTick(fn);
+ case 2:
+ return process.nextTick(function afterTickOne() {
+ fn.call(null, arg1);
+ });
+ case 3:
+ return process.nextTick(function afterTickTwo() {
+ fn.call(null, arg1, arg2);
+ });
+ case 4:
+ return process.nextTick(function afterTickThree() {
+ fn.call(null, arg1, arg2, arg3);
+ });
+ default:
+ args = new Array(len - 1);
+ i = 0;
+ while (i < args.length) {
+ args[i++] = arguments[i];
+ }
+ return process.nextTick(function afterTick() {
+ fn.apply(null, args);
+ });
+ }
+}
+
+
+}).call(this,require('_process'))
+},{"_process":92}],92:[function(require,module,exports){
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+}
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+}
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+}
+
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+},{}],93:[function(require,module,exports){
+(function (global){
+/*! https://mths.be/punycode v1.4.1 by @mathias */
+;(function(root) {
+
+ /** Detect free variables */
+ var freeExports = typeof exports == 'object' && exports &&
+ !exports.nodeType && exports;
+ var freeModule = typeof module == 'object' && module &&
+ !module.nodeType && module;
+ var freeGlobal = typeof global == 'object' && global;
+ if (
+ freeGlobal.global === freeGlobal ||
+ freeGlobal.window === freeGlobal ||
+ freeGlobal.self === freeGlobal
+ ) {
+ root = freeGlobal;
+ }
+
+ /**
+ * The `punycode` object.
+ * @name punycode
+ * @type Object
+ */
+ var punycode,
+
+ /** Highest positive signed 32-bit float value */
+ maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
+
+ /** Bootstring parameters */
+ base = 36,
+ tMin = 1,
+ tMax = 26,
+ skew = 38,
+ damp = 700,
+ initialBias = 72,
+ initialN = 128, // 0x80
+ delimiter = '-', // '\x2D'
+
+ /** Regular expressions */
+ regexPunycode = /^xn--/,
+ regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
+ regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
+
+ /** Error messages */
+ errors = {
+ 'overflow': 'Overflow: input needs wider integers to process',
+ 'not-basic': 'Illegal input >= 0x80 (not a basic code point)',
+ 'invalid-input': 'Invalid input'
+ },
+
+ /** Convenience shortcuts */
+ baseMinusTMin = base - tMin,
+ floor = Math.floor,
+ stringFromCharCode = String.fromCharCode,
+
+ /** Temporary variable */
+ key;
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * A generic error utility function.
+ * @private
+ * @param {String} type The error type.
+ * @returns {Error} Throws a `RangeError` with the applicable error message.
+ */
+ function error(type) {
+ throw new RangeError(errors[type]);
+ }
+
+ /**
+ * A generic `Array#map` utility function.
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} callback The function that gets called for every array
+ * item.
+ * @returns {Array} A new array of values returned by the callback function.
+ */
+ function map(array, fn) {
+ var length = array.length;
+ var result = [];
+ while (length--) {
+ result[length] = fn(array[length]);
+ }
+ return result;
+ }
+
+ /**
+ * A simple `Array#map`-like wrapper to work with domain name strings or email
+ * addresses.
+ * @private
+ * @param {String} domain The domain name or email address.
+ * @param {Function} callback The function that gets called for every
+ * character.
+ * @returns {Array} A new string of characters returned by the callback
+ * function.
+ */
+ function mapDomain(string, fn) {
+ var parts = string.split('@');
+ var result = '';
+ if (parts.length > 1) {
+ // In email addresses, only the domain name should be punycoded. Leave
+ // the local part (i.e. everything up to `@`) intact.
+ result = parts[0] + '@';
+ string = parts[1];
+ }
+ // Avoid `split(regex)` for IE8 compatibility. See #17.
+ string = string.replace(regexSeparators, '\x2E');
+ var labels = string.split('.');
+ var encoded = map(labels, fn).join('.');
+ return result + encoded;
+ }
+
+ /**
+ * Creates an array containing the numeric code points of each Unicode
+ * character in the string. While JavaScript uses UCS-2 internally,
+ * this function will convert a pair of surrogate halves (each of which
+ * UCS-2 exposes as separate characters) into a single code point,
+ * matching UTF-16.
+ * @see `punycode.ucs2.encode`
+ * @see
+ * @memberOf punycode.ucs2
+ * @name decode
+ * @param {String} string The Unicode input string (UCS-2).
+ * @returns {Array} The new array of code points.
+ */
+ function ucs2decode(string) {
+ var output = [],
+ counter = 0,
+ length = string.length,
+ value,
+ extra;
+ while (counter < length) {
+ value = string.charCodeAt(counter++);
+ if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
+ // high surrogate, and there is a next character
+ extra = string.charCodeAt(counter++);
+ if ((extra & 0xFC00) == 0xDC00) { // low surrogate
+ output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
+ } else {
+ // unmatched surrogate; only append this code unit, in case the next
+ // code unit is the high surrogate of a surrogate pair
+ output.push(value);
+ counter--;
+ }
+ } else {
+ output.push(value);
+ }
+ }
+ return output;
+ }
+
+ /**
+ * Creates a string based on an array of numeric code points.
+ * @see `punycode.ucs2.decode`
+ * @memberOf punycode.ucs2
+ * @name encode
+ * @param {Array} codePoints The array of numeric code points.
+ * @returns {String} The new Unicode string (UCS-2).
+ */
+ function ucs2encode(array) {
+ return map(array, function(value) {
+ var output = '';
+ if (value > 0xFFFF) {
+ value -= 0x10000;
+ output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
+ value = 0xDC00 | value & 0x3FF;
+ }
+ output += stringFromCharCode(value);
+ return output;
+ }).join('');
+ }
+
+ /**
+ * Converts a basic code point into a digit/integer.
+ * @see `digitToBasic()`
+ * @private
+ * @param {Number} codePoint The basic numeric code point value.
+ * @returns {Number} The numeric value of a basic code point (for use in
+ * representing integers) in the range `0` to `base - 1`, or `base` if
+ * the code point does not represent a value.
+ */
+ function basicToDigit(codePoint) {
+ if (codePoint - 48 < 10) {
+ return codePoint - 22;
+ }
+ if (codePoint - 65 < 26) {
+ return codePoint - 65;
+ }
+ if (codePoint - 97 < 26) {
+ return codePoint - 97;
+ }
+ return base;
+ }
+
+ /**
+ * Converts a digit/integer into a basic code point.
+ * @see `basicToDigit()`
+ * @private
+ * @param {Number} digit The numeric value of a basic code point.
+ * @returns {Number} The basic code point whose value (when used for
+ * representing integers) is `digit`, which needs to be in the range
+ * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
+ * used; else, the lowercase form is used. The behavior is undefined
+ * if `flag` is non-zero and `digit` has no uppercase form.
+ */
+ function digitToBasic(digit, flag) {
+ // 0..25 map to ASCII a..z or A..Z
+ // 26..35 map to ASCII 0..9
+ return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
+ }
+
+ /**
+ * Bias adaptation function as per section 3.4 of RFC 3492.
+ * https://tools.ietf.org/html/rfc3492#section-3.4
+ * @private
+ */
+ function adapt(delta, numPoints, firstTime) {
+ var k = 0;
+ delta = firstTime ? floor(delta / damp) : delta >> 1;
+ delta += floor(delta / numPoints);
+ for (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {
+ delta = floor(delta / baseMinusTMin);
+ }
+ return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
+ }
+
+ /**
+ * Converts a Punycode string of ASCII-only symbols to a string of Unicode
+ * symbols.
+ * @memberOf punycode
+ * @param {String} input The Punycode string of ASCII-only symbols.
+ * @returns {String} The resulting string of Unicode symbols.
+ */
+ function decode(input) {
+ // Don't use UCS-2
+ var output = [],
+ inputLength = input.length,
+ out,
+ i = 0,
+ n = initialN,
+ bias = initialBias,
+ basic,
+ j,
+ index,
+ oldi,
+ w,
+ k,
+ digit,
+ t,
+ /** Cached calculation results */
+ baseMinusT;
+
+ // Handle the basic code points: let `basic` be the number of input code
+ // points before the last delimiter, or `0` if there is none, then copy
+ // the first basic code points to the output.
+
+ basic = input.lastIndexOf(delimiter);
+ if (basic < 0) {
+ basic = 0;
+ }
+
+ for (j = 0; j < basic; ++j) {
+ // if it's not a basic code point
+ if (input.charCodeAt(j) >= 0x80) {
+ error('not-basic');
+ }
+ output.push(input.charCodeAt(j));
+ }
+
+ // Main decoding loop: start just after the last delimiter if any basic code
+ // points were copied; start at the beginning otherwise.
+
+ for (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {
+
+ // `index` is the index of the next character to be consumed.
+ // Decode a generalized variable-length integer into `delta`,
+ // which gets added to `i`. The overflow checking is easier
+ // if we increase `i` as we go, then subtract off its starting
+ // value at the end to obtain `delta`.
+ for (oldi = i, w = 1, k = base; /* no condition */; k += base) {
+
+ if (index >= inputLength) {
+ error('invalid-input');
+ }
+
+ digit = basicToDigit(input.charCodeAt(index++));
+
+ if (digit >= base || digit > floor((maxInt - i) / w)) {
+ error('overflow');
+ }
+
+ i += digit * w;
+ t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+
+ if (digit < t) {
+ break;
+ }
+
+ baseMinusT = base - t;
+ if (w > floor(maxInt / baseMinusT)) {
+ error('overflow');
+ }
+
+ w *= baseMinusT;
+
+ }
+
+ out = output.length + 1;
+ bias = adapt(i - oldi, out, oldi == 0);
+
+ // `i` was supposed to wrap around from `out` to `0`,
+ // incrementing `n` each time, so we'll fix that now:
+ if (floor(i / out) > maxInt - n) {
+ error('overflow');
+ }
+
+ n += floor(i / out);
+ i %= out;
+
+ // Insert `n` at position `i` of the output
+ output.splice(i++, 0, n);
+
+ }
+
+ return ucs2encode(output);
+ }
+
+ /**
+ * Converts a string of Unicode symbols (e.g. a domain name label) to a
+ * Punycode string of ASCII-only symbols.
+ * @memberOf punycode
+ * @param {String} input The string of Unicode symbols.
+ * @returns {String} The resulting Punycode string of ASCII-only symbols.
+ */
+ function encode(input) {
+ var n,
+ delta,
+ handledCPCount,
+ basicLength,
+ bias,
+ j,
+ m,
+ q,
+ k,
+ t,
+ currentValue,
+ output = [],
+ /** `inputLength` will hold the number of code points in `input`. */
+ inputLength,
+ /** Cached calculation results */
+ handledCPCountPlusOne,
+ baseMinusT,
+ qMinusT;
+
+ // Convert the input in UCS-2 to Unicode
+ input = ucs2decode(input);
+
+ // Cache the length
+ inputLength = input.length;
+
+ // Initialize the state
+ n = initialN;
+ delta = 0;
+ bias = initialBias;
+
+ // Handle the basic code points
+ for (j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+ if (currentValue < 0x80) {
+ output.push(stringFromCharCode(currentValue));
+ }
+ }
+
+ handledCPCount = basicLength = output.length;
+
+ // `handledCPCount` is the number of code points that have been handled;
+ // `basicLength` is the number of basic code points.
+
+ // Finish the basic string - if it is not empty - with a delimiter
+ if (basicLength) {
+ output.push(delimiter);
+ }
+
+ // Main encoding loop:
+ while (handledCPCount < inputLength) {
+
+ // All non-basic code points < n have been handled already. Find the next
+ // larger one:
+ for (m = maxInt, j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+ if (currentValue >= n && currentValue < m) {
+ m = currentValue;
+ }
+ }
+
+ // Increase `delta` enough to advance the decoder's state to ,
+ // but guard against overflow
+ handledCPCountPlusOne = handledCPCount + 1;
+ if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
+ error('overflow');
+ }
+
+ delta += (m - n) * handledCPCountPlusOne;
+ n = m;
+
+ for (j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+
+ if (currentValue < n && ++delta > maxInt) {
+ error('overflow');
+ }
+
+ if (currentValue == n) {
+ // Represent delta as a generalized variable-length integer
+ for (q = delta, k = base; /* no condition */; k += base) {
+ t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);
+ if (q < t) {
+ break;
+ }
+ qMinusT = q - t;
+ baseMinusT = base - t;
+ output.push(
+ stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))
+ );
+ q = floor(qMinusT / baseMinusT);
+ }
+
+ output.push(stringFromCharCode(digitToBasic(q, 0)));
+ bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);
+ delta = 0;
+ ++handledCPCount;
+ }
+ }
+
+ ++delta;
+ ++n;
+
+ }
+ return output.join('');
+ }
+
+ /**
+ * Converts a Punycode string representing a domain name or an email address
+ * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
+ * it doesn't matter if you call it on a string that has already been
+ * converted to Unicode.
+ * @memberOf punycode
+ * @param {String} input The Punycoded domain name or email address to
+ * convert to Unicode.
+ * @returns {String} The Unicode representation of the given Punycode
+ * string.
+ */
+ function toUnicode(input) {
+ return mapDomain(input, function(string) {
+ return regexPunycode.test(string)
+ ? decode(string.slice(4).toLowerCase())
+ : string;
+ });
+ }
+
+ /**
+ * Converts a Unicode string representing a domain name or an email address to
+ * Punycode. Only the non-ASCII parts of the domain name will be converted,
+ * i.e. it doesn't matter if you call it with a domain that's already in
+ * ASCII.
+ * @memberOf punycode
+ * @param {String} input The domain name or email address to convert, as a
+ * Unicode string.
+ * @returns {String} The Punycode representation of the given domain name or
+ * email address.
+ */
+ function toASCII(input) {
+ return mapDomain(input, function(string) {
+ return regexNonASCII.test(string)
+ ? 'xn--' + encode(string)
+ : string;
+ });
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /** Define the public API */
+ punycode = {
+ /**
+ * A string representing the current Punycode.js version number.
+ * @memberOf punycode
+ * @type String
+ */
+ 'version': '1.4.1',
+ /**
+ * An object of methods to convert from JavaScript's internal character
+ * representation (UCS-2) to Unicode code points, and back.
+ * @see
+ * @memberOf punycode
+ * @type Object
+ */
+ 'ucs2': {
+ 'decode': ucs2decode,
+ 'encode': ucs2encode
+ },
+ 'decode': decode,
+ 'encode': encode,
+ 'toASCII': toASCII,
+ 'toUnicode': toUnicode
+ };
+
+ /** Expose `punycode` */
+ // Some AMD build optimizers, like r.js, check for specific condition patterns
+ // like the following:
+ if (
+ typeof define == 'function' &&
+ typeof define.amd == 'object' &&
+ define.amd
+ ) {
+ define('punycode', function() {
+ return punycode;
+ });
+ } else if (freeExports && freeModule) {
+ if (module.exports == freeExports) {
+ // in Node.js, io.js, or RingoJS v0.8.0+
+ freeModule.exports = punycode;
+ } else {
+ // in Narwhal or RingoJS v0.7.0-
+ for (key in punycode) {
+ punycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);
+ }
+ }
+ } else {
+ // in Rhino or a web browser
+ root.punycode = punycode;
+ }
+
+}(this));
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],94:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+// If obj.hasOwnProperty has been overridden, then calling
+// obj.hasOwnProperty(prop) will break.
+// See: https://github.com/joyent/node/issues/1707
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+module.exports = function(qs, sep, eq, options) {
+ sep = sep || '&';
+ eq = eq || '=';
+ var obj = {};
+
+ if (typeof qs !== 'string' || qs.length === 0) {
+ return obj;
+ }
+
+ var regexp = /\+/g;
+ qs = qs.split(sep);
+
+ var maxKeys = 1000;
+ if (options && typeof options.maxKeys === 'number') {
+ maxKeys = options.maxKeys;
+ }
+
+ var len = qs.length;
+ // maxKeys <= 0 means that we should not limit keys count
+ if (maxKeys > 0 && len > maxKeys) {
+ len = maxKeys;
+ }
+
+ for (var i = 0; i < len; ++i) {
+ var x = qs[i].replace(regexp, '%20'),
+ idx = x.indexOf(eq),
+ kstr, vstr, k, v;
+
+ if (idx >= 0) {
+ kstr = x.substr(0, idx);
+ vstr = x.substr(idx + 1);
+ } else {
+ kstr = x;
+ vstr = '';
+ }
+
+ k = decodeURIComponent(kstr);
+ v = decodeURIComponent(vstr);
+
+ if (!hasOwnProperty(obj, k)) {
+ obj[k] = v;
+ } else if (isArray(obj[k])) {
+ obj[k].push(v);
+ } else {
+ obj[k] = [obj[k], v];
+ }
+ }
+
+ return obj;
+};
+
+var isArray = Array.isArray || function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]';
+};
+
+},{}],95:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+var stringifyPrimitive = function(v) {
+ switch (typeof v) {
+ case 'string':
+ return v;
+
+ case 'boolean':
+ return v ? 'true' : 'false';
+
+ case 'number':
+ return isFinite(v) ? v : '';
+
+ default:
+ return '';
+ }
+};
+
+module.exports = function(obj, sep, eq, name) {
+ sep = sep || '&';
+ eq = eq || '=';
+ if (obj === null) {
+ obj = undefined;
+ }
+
+ if (typeof obj === 'object') {
+ return map(objectKeys(obj), function(k) {
+ var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+ if (isArray(obj[k])) {
+ return map(obj[k], function(v) {
+ return ks + encodeURIComponent(stringifyPrimitive(v));
+ }).join(sep);
+ } else {
+ return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+ }
+ }).join(sep);
+
+ }
+
+ if (!name) return '';
+ return encodeURIComponent(stringifyPrimitive(name)) + eq +
+ encodeURIComponent(stringifyPrimitive(obj));
+};
+
+var isArray = Array.isArray || function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]';
+};
+
+function map (xs, f) {
+ if (xs.map) return xs.map(f);
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ res.push(f(xs[i], i));
+ }
+ return res;
+}
+
+var objectKeys = Object.keys || function (obj) {
+ var res = [];
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+ }
+ return res;
+};
+
+},{}],96:[function(require,module,exports){
+'use strict';
+
+exports.decode = exports.parse = require('./decode');
+exports.encode = exports.stringify = require('./encode');
+
+},{"./decode":94,"./encode":95}],97:[function(require,module,exports){
+module.exports = require('./lib/_stream_duplex.js');
+
+},{"./lib/_stream_duplex.js":98}],98:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a duplex stream is just a stream that is both readable and writable.
+// Since JS doesn't have multiple prototypal inheritance, this class
+// prototypally inherits from Readable, and then parasitically from
+// Writable.
+
+'use strict';
+
+/**/
+
+var pna = require('process-nextick-args');
+/**/
+
+/**/
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ keys.push(key);
+ }return keys;
+};
+/**/
+
+module.exports = Duplex;
+
+/**/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/**/
+
+var Readable = require('./_stream_readable');
+var Writable = require('./_stream_writable');
+
+util.inherits(Duplex, Readable);
+
+{
+ // avoid scope creep, the keys array can then be collected
+ var keys = objectKeys(Writable.prototype);
+ for (var v = 0; v < keys.length; v++) {
+ var method = keys[v];
+ if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
+ }
+}
+
+function Duplex(options) {
+ if (!(this instanceof Duplex)) return new Duplex(options);
+
+ Readable.call(this, options);
+ Writable.call(this, options);
+
+ if (options && options.readable === false) this.readable = false;
+
+ if (options && options.writable === false) this.writable = false;
+
+ this.allowHalfOpen = true;
+ if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
+
+ this.once('end', onend);
+}
+
+Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function () {
+ return this._writableState.highWaterMark;
+ }
+});
+
+// the no-half-open enforcer
+function onend() {
+ // if we allow half-open state, or if the writable side ended,
+ // then we're ok.
+ if (this.allowHalfOpen || this._writableState.ended) return;
+
+ // no more data can be written.
+ // But allow more writes to happen in this tick.
+ pna.nextTick(onEndNT, this);
+}
+
+function onEndNT(self) {
+ self.end();
+}
+
+Object.defineProperty(Duplex.prototype, 'destroyed', {
+ get: function () {
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return false;
+ }
+ return this._readableState.destroyed && this._writableState.destroyed;
+ },
+ set: function (value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (this._readableState === undefined || this._writableState === undefined) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._readableState.destroyed = value;
+ this._writableState.destroyed = value;
+ }
+});
+
+Duplex.prototype._destroy = function (err, cb) {
+ this.push(null);
+ this.end();
+
+ pna.nextTick(cb, err);
+};
+},{"./_stream_readable":100,"./_stream_writable":102,"core-util-is":14,"inherits":80,"process-nextick-args":91}],99:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a passthrough stream.
+// basically just the most minimal sort of Transform stream.
+// Every written chunk gets output as-is.
+
+'use strict';
+
+module.exports = PassThrough;
+
+var Transform = require('./_stream_transform');
+
+/**/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/**/
+
+util.inherits(PassThrough, Transform);
+
+function PassThrough(options) {
+ if (!(this instanceof PassThrough)) return new PassThrough(options);
+
+ Transform.call(this, options);
+}
+
+PassThrough.prototype._transform = function (chunk, encoding, cb) {
+ cb(null, chunk);
+};
+},{"./_stream_transform":101,"core-util-is":14,"inherits":80}],100:[function(require,module,exports){
+(function (process,global){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+/**/
+
+var pna = require('process-nextick-args');
+/**/
+
+module.exports = Readable;
+
+/**/
+var isArray = require('isarray');
+/**/
+
+/**/
+var Duplex;
+/**/
+
+Readable.ReadableState = ReadableState;
+
+/**/
+var EE = require('events').EventEmitter;
+
+var EElistenerCount = function (emitter, type) {
+ return emitter.listeners(type).length;
+};
+/**/
+
+/**/
+var Stream = require('./internal/streams/stream');
+/**/
+
+/**/
+
+var Buffer = require('safe-buffer').Buffer;
+var OurUint8Array = global.Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+/**/
+
+/**/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/**/
+
+/**/
+var debugUtil = require('util');
+var debug = void 0;
+if (debugUtil && debugUtil.debuglog) {
+ debug = debugUtil.debuglog('stream');
+} else {
+ debug = function () {};
+}
+/**/
+
+var BufferList = require('./internal/streams/BufferList');
+var destroyImpl = require('./internal/streams/destroy');
+var StringDecoder;
+
+util.inherits(Readable, Stream);
+
+var kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];
+
+function prependListener(emitter, event, fn) {
+ // Sadly this is not cacheable as some libraries bundle their own
+ // event emitter implementation with them.
+ if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);
+
+ // This is a hack to make sure that our error handler is attached before any
+ // userland ones. NEVER DO THIS. This is here only because this code needs
+ // to continue to work with older versions of Node.js that do not include
+ // the prependListener() method. The goal is to eventually remove this hack.
+ if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
+}
+
+function ReadableState(options, stream) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ options = options || {};
+
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream.
+ // These options can be provided separately as readableXXX and writableXXX.
+ var isDuplex = stream instanceof Duplex;
+
+ // object stream flag. Used to make read(n) ignore n and to
+ // make all the buffer merging and length checks go away
+ this.objectMode = !!options.objectMode;
+
+ if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
+
+ // the point at which it stops calling _read() to fill the buffer
+ // Note: 0 is a valid value, means "don't call _read preemptively ever"
+ var hwm = options.highWaterMark;
+ var readableHwm = options.readableHighWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+
+ if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;
+
+ // cast to ints.
+ this.highWaterMark = Math.floor(this.highWaterMark);
+
+ // A linked list is used to store data chunks instead of an array because the
+ // linked list can remove elements from the beginning faster than
+ // array.shift()
+ this.buffer = new BufferList();
+ this.length = 0;
+ this.pipes = null;
+ this.pipesCount = 0;
+ this.flowing = null;
+ this.ended = false;
+ this.endEmitted = false;
+ this.reading = false;
+
+ // a flag to be able to tell if the event 'readable'/'data' is emitted
+ // immediately, or on a later tick. We set this to true at first, because
+ // any actions that shouldn't happen until "later" should generally also
+ // not happen before the first read call.
+ this.sync = true;
+
+ // whenever we return null, then we set a flag to say
+ // that we're awaiting a 'readable' event emission.
+ this.needReadable = false;
+ this.emittedReadable = false;
+ this.readableListening = false;
+ this.resumeScheduled = false;
+
+ // has it been destroyed
+ this.destroyed = false;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // the number of writers that are awaiting a drain event in .pipe()s
+ this.awaitDrain = 0;
+
+ // if true, a maybeReadMore has been scheduled
+ this.readingMore = false;
+
+ this.decoder = null;
+ this.encoding = null;
+ if (options.encoding) {
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+ this.decoder = new StringDecoder(options.encoding);
+ this.encoding = options.encoding;
+ }
+}
+
+function Readable(options) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ if (!(this instanceof Readable)) return new Readable(options);
+
+ this._readableState = new ReadableState(options, this);
+
+ // legacy
+ this.readable = true;
+
+ if (options) {
+ if (typeof options.read === 'function') this._read = options.read;
+
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+ }
+
+ Stream.call(this);
+}
+
+Object.defineProperty(Readable.prototype, 'destroyed', {
+ get: function () {
+ if (this._readableState === undefined) {
+ return false;
+ }
+ return this._readableState.destroyed;
+ },
+ set: function (value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._readableState) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._readableState.destroyed = value;
+ }
+});
+
+Readable.prototype.destroy = destroyImpl.destroy;
+Readable.prototype._undestroy = destroyImpl.undestroy;
+Readable.prototype._destroy = function (err, cb) {
+ this.push(null);
+ cb(err);
+};
+
+// Manually shove something into the read() buffer.
+// This returns true if the highWaterMark has not been hit yet,
+// similar to how Writable.write() returns true if you should
+// write() some more.
+Readable.prototype.push = function (chunk, encoding) {
+ var state = this._readableState;
+ var skipChunkCheck;
+
+ if (!state.objectMode) {
+ if (typeof chunk === 'string') {
+ encoding = encoding || state.defaultEncoding;
+ if (encoding !== state.encoding) {
+ chunk = Buffer.from(chunk, encoding);
+ encoding = '';
+ }
+ skipChunkCheck = true;
+ }
+ } else {
+ skipChunkCheck = true;
+ }
+
+ return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);
+};
+
+// Unshift should *always* be something directly out of read()
+Readable.prototype.unshift = function (chunk) {
+ return readableAddChunk(this, chunk, null, true, false);
+};
+
+function readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {
+ var state = stream._readableState;
+ if (chunk === null) {
+ state.reading = false;
+ onEofChunk(stream, state);
+ } else {
+ var er;
+ if (!skipChunkCheck) er = chunkInvalid(state, chunk);
+ if (er) {
+ stream.emit('error', er);
+ } else if (state.objectMode || chunk && chunk.length > 0) {
+ if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+
+ if (addToFront) {
+ if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);
+ } else if (state.ended) {
+ stream.emit('error', new Error('stream.push() after EOF'));
+ } else {
+ state.reading = false;
+ if (state.decoder && !encoding) {
+ chunk = state.decoder.write(chunk);
+ if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);
+ } else {
+ addChunk(stream, state, chunk, false);
+ }
+ }
+ } else if (!addToFront) {
+ state.reading = false;
+ }
+ }
+
+ return needMoreData(state);
+}
+
+function addChunk(stream, state, chunk, addToFront) {
+ if (state.flowing && state.length === 0 && !state.sync) {
+ stream.emit('data', chunk);
+ stream.read(0);
+ } else {
+ // update the buffer info.
+ state.length += state.objectMode ? 1 : chunk.length;
+ if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
+
+ if (state.needReadable) emitReadable(stream);
+ }
+ maybeReadMore(stream, state);
+}
+
+function chunkInvalid(state, chunk) {
+ var er;
+ if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+ return er;
+}
+
+// if it's past the high water mark, we can push in some more.
+// Also, if we have no data yet, we can stand some
+// more bytes. This is to work around cases where hwm=0,
+// such as the repl. Also, if the push() triggered a
+// readable event, and the user called read(largeNumber) such that
+// needReadable was set, then we ought to push more, so that another
+// 'readable' event will be triggered.
+function needMoreData(state) {
+ return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
+}
+
+Readable.prototype.isPaused = function () {
+ return this._readableState.flowing === false;
+};
+
+// backwards compatibility.
+Readable.prototype.setEncoding = function (enc) {
+ if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
+ this._readableState.decoder = new StringDecoder(enc);
+ this._readableState.encoding = enc;
+ return this;
+};
+
+// Don't raise the hwm > 8MB
+var MAX_HWM = 0x800000;
+function computeNewHighWaterMark(n) {
+ if (n >= MAX_HWM) {
+ n = MAX_HWM;
+ } else {
+ // Get the next highest power of 2 to prevent increasing hwm excessively in
+ // tiny amounts
+ n--;
+ n |= n >>> 1;
+ n |= n >>> 2;
+ n |= n >>> 4;
+ n |= n >>> 8;
+ n |= n >>> 16;
+ n++;
+ }
+ return n;
+}
+
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function howMuchToRead(n, state) {
+ if (n <= 0 || state.length === 0 && state.ended) return 0;
+ if (state.objectMode) return 1;
+ if (n !== n) {
+ // Only flow one buffer at a time
+ if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;
+ }
+ // If we're asking for more than the current hwm, then raise the hwm.
+ if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
+ if (n <= state.length) return n;
+ // Don't have enough
+ if (!state.ended) {
+ state.needReadable = true;
+ return 0;
+ }
+ return state.length;
+}
+
+// you can override either this method, or the async _read(n) below.
+Readable.prototype.read = function (n) {
+ debug('read', n);
+ n = parseInt(n, 10);
+ var state = this._readableState;
+ var nOrig = n;
+
+ if (n !== 0) state.emittedReadable = false;
+
+ // if we're doing read(0) to trigger a readable event, but we
+ // already have a bunch of data in the buffer, then just trigger
+ // the 'readable' event and move on.
+ if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
+ debug('read: emitReadable', state.length, state.ended);
+ if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
+ return null;
+ }
+
+ n = howMuchToRead(n, state);
+
+ // if we've ended, and we're now clear, then finish it up.
+ if (n === 0 && state.ended) {
+ if (state.length === 0) endReadable(this);
+ return null;
+ }
+
+ // All the actual chunk generation logic needs to be
+ // *below* the call to _read. The reason is that in certain
+ // synthetic stream cases, such as passthrough streams, _read
+ // may be a completely synchronous operation which may change
+ // the state of the read buffer, providing enough data when
+ // before there was *not* enough.
+ //
+ // So, the steps are:
+ // 1. Figure out what the state of things will be after we do
+ // a read from the buffer.
+ //
+ // 2. If that resulting state will trigger a _read, then call _read.
+ // Note that this may be asynchronous, or synchronous. Yes, it is
+ // deeply ugly to write APIs this way, but that still doesn't mean
+ // that the Readable class should behave improperly, as streams are
+ // designed to be sync/async agnostic.
+ // Take note if the _read call is sync or async (ie, if the read call
+ // has returned yet), so that we know whether or not it's safe to emit
+ // 'readable' etc.
+ //
+ // 3. Actually pull the requested chunks out of the buffer and return.
+
+ // if we need a readable event, then we need to do some reading.
+ var doRead = state.needReadable;
+ debug('need readable', doRead);
+
+ // if we currently have less than the highWaterMark, then also read some
+ if (state.length === 0 || state.length - n < state.highWaterMark) {
+ doRead = true;
+ debug('length less than watermark', doRead);
+ }
+
+ // however, if we've ended, then there's no point, and if we're already
+ // reading, then it's unnecessary.
+ if (state.ended || state.reading) {
+ doRead = false;
+ debug('reading or ended', doRead);
+ } else if (doRead) {
+ debug('do read');
+ state.reading = true;
+ state.sync = true;
+ // if the length is currently zero, then we *need* a readable event.
+ if (state.length === 0) state.needReadable = true;
+ // call internal read method
+ this._read(state.highWaterMark);
+ state.sync = false;
+ // If _read pushed data synchronously, then `reading` will be false,
+ // and we need to re-evaluate how much data we can return to the user.
+ if (!state.reading) n = howMuchToRead(nOrig, state);
+ }
+
+ var ret;
+ if (n > 0) ret = fromList(n, state);else ret = null;
+
+ if (ret === null) {
+ state.needReadable = true;
+ n = 0;
+ } else {
+ state.length -= n;
+ }
+
+ if (state.length === 0) {
+ // If we have nothing in the buffer, then we want to know
+ // as soon as we *do* get something into the buffer.
+ if (!state.ended) state.needReadable = true;
+
+ // If we tried to read() past the EOF, then emit end on the next tick.
+ if (nOrig !== n && state.ended) endReadable(this);
+ }
+
+ if (ret !== null) this.emit('data', ret);
+
+ return ret;
+};
+
+function onEofChunk(stream, state) {
+ if (state.ended) return;
+ if (state.decoder) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) {
+ state.buffer.push(chunk);
+ state.length += state.objectMode ? 1 : chunk.length;
+ }
+ }
+ state.ended = true;
+
+ // emit 'readable' now to make sure it gets picked up.
+ emitReadable(stream);
+}
+
+// Don't emit readable right away in sync mode, because this can trigger
+// another read() call => stack overflow. This way, it might trigger
+// a nextTick recursion warning, but that's not so bad.
+function emitReadable(stream) {
+ var state = stream._readableState;
+ state.needReadable = false;
+ if (!state.emittedReadable) {
+ debug('emitReadable', state.flowing);
+ state.emittedReadable = true;
+ if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);
+ }
+}
+
+function emitReadable_(stream) {
+ debug('emit readable');
+ stream.emit('readable');
+ flow(stream);
+}
+
+// at this point, the user has presumably seen the 'readable' event,
+// and called read() to consume some data. that may have triggered
+// in turn another _read(n) call, in which case reading = true if
+// it's in progress.
+// However, if we're not ended, or reading, and the length < hwm,
+// then go ahead and try to read some more preemptively.
+function maybeReadMore(stream, state) {
+ if (!state.readingMore) {
+ state.readingMore = true;
+ pna.nextTick(maybeReadMore_, stream, state);
+ }
+}
+
+function maybeReadMore_(stream, state) {
+ var len = state.length;
+ while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
+ debug('maybeReadMore read 0');
+ stream.read(0);
+ if (len === state.length)
+ // didn't get any data, stop spinning.
+ break;else len = state.length;
+ }
+ state.readingMore = false;
+}
+
+// abstract method. to be overridden in specific implementation classes.
+// call cb(er, data) where data is <= n in length.
+// for virtual (non-string, non-buffer) streams, "length" is somewhat
+// arbitrary, and perhaps not very meaningful.
+Readable.prototype._read = function (n) {
+ this.emit('error', new Error('_read() is not implemented'));
+};
+
+Readable.prototype.pipe = function (dest, pipeOpts) {
+ var src = this;
+ var state = this._readableState;
+
+ switch (state.pipesCount) {
+ case 0:
+ state.pipes = dest;
+ break;
+ case 1:
+ state.pipes = [state.pipes, dest];
+ break;
+ default:
+ state.pipes.push(dest);
+ break;
+ }
+ state.pipesCount += 1;
+ debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
+
+ var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
+
+ var endFn = doEnd ? onend : unpipe;
+ if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);
+
+ dest.on('unpipe', onunpipe);
+ function onunpipe(readable, unpipeInfo) {
+ debug('onunpipe');
+ if (readable === src) {
+ if (unpipeInfo && unpipeInfo.hasUnpiped === false) {
+ unpipeInfo.hasUnpiped = true;
+ cleanup();
+ }
+ }
+ }
+
+ function onend() {
+ debug('onend');
+ dest.end();
+ }
+
+ // when the dest drains, it reduces the awaitDrain counter
+ // on the source. This would be more elegant with a .once()
+ // handler in flow(), but adding and removing repeatedly is
+ // too slow.
+ var ondrain = pipeOnDrain(src);
+ dest.on('drain', ondrain);
+
+ var cleanedUp = false;
+ function cleanup() {
+ debug('cleanup');
+ // cleanup event handlers once the pipe is broken
+ dest.removeListener('close', onclose);
+ dest.removeListener('finish', onfinish);
+ dest.removeListener('drain', ondrain);
+ dest.removeListener('error', onerror);
+ dest.removeListener('unpipe', onunpipe);
+ src.removeListener('end', onend);
+ src.removeListener('end', unpipe);
+ src.removeListener('data', ondata);
+
+ cleanedUp = true;
+
+ // if the reader is waiting for a drain event from this
+ // specific writer, then it would cause it to never start
+ // flowing again.
+ // So, if this is awaiting a drain, then we just call it now.
+ // If we don't know, then assume that we are waiting for one.
+ if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
+ }
+
+ // If the user pushes more data while we're writing to dest then we'll end up
+ // in ondata again. However, we only want to increase awaitDrain once because
+ // dest will only emit one 'drain' event for the multiple writes.
+ // => Introduce a guard on increasing awaitDrain.
+ var increasedAwaitDrain = false;
+ src.on('data', ondata);
+ function ondata(chunk) {
+ debug('ondata');
+ increasedAwaitDrain = false;
+ var ret = dest.write(chunk);
+ if (false === ret && !increasedAwaitDrain) {
+ // If the user unpiped during `dest.write()`, it is possible
+ // to get stuck in a permanently paused state if that write
+ // also returned false.
+ // => Check whether `dest` is still a piping destination.
+ if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
+ debug('false write response, pause', src._readableState.awaitDrain);
+ src._readableState.awaitDrain++;
+ increasedAwaitDrain = true;
+ }
+ src.pause();
+ }
+ }
+
+ // if the dest has an error, then stop piping into it.
+ // however, don't suppress the throwing behavior for this.
+ function onerror(er) {
+ debug('onerror', er);
+ unpipe();
+ dest.removeListener('error', onerror);
+ if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
+ }
+
+ // Make sure our error handler is attached before userland ones.
+ prependListener(dest, 'error', onerror);
+
+ // Both close and finish should trigger unpipe, but only once.
+ function onclose() {
+ dest.removeListener('finish', onfinish);
+ unpipe();
+ }
+ dest.once('close', onclose);
+ function onfinish() {
+ debug('onfinish');
+ dest.removeListener('close', onclose);
+ unpipe();
+ }
+ dest.once('finish', onfinish);
+
+ function unpipe() {
+ debug('unpipe');
+ src.unpipe(dest);
+ }
+
+ // tell the dest that it's being piped to
+ dest.emit('pipe', src);
+
+ // start the flow if it hasn't been started already.
+ if (!state.flowing) {
+ debug('pipe resume');
+ src.resume();
+ }
+
+ return dest;
+};
+
+function pipeOnDrain(src) {
+ return function () {
+ var state = src._readableState;
+ debug('pipeOnDrain', state.awaitDrain);
+ if (state.awaitDrain) state.awaitDrain--;
+ if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
+ state.flowing = true;
+ flow(src);
+ }
+ };
+}
+
+Readable.prototype.unpipe = function (dest) {
+ var state = this._readableState;
+ var unpipeInfo = { hasUnpiped: false };
+
+ // if we're not piping anywhere, then do nothing.
+ if (state.pipesCount === 0) return this;
+
+ // just one destination. most common case.
+ if (state.pipesCount === 1) {
+ // passed in one, but it's not the right one.
+ if (dest && dest !== state.pipes) return this;
+
+ if (!dest) dest = state.pipes;
+
+ // got a match.
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+ if (dest) dest.emit('unpipe', this, unpipeInfo);
+ return this;
+ }
+
+ // slow case. multiple pipe destinations.
+
+ if (!dest) {
+ // remove all.
+ var dests = state.pipes;
+ var len = state.pipesCount;
+ state.pipes = null;
+ state.pipesCount = 0;
+ state.flowing = false;
+
+ for (var i = 0; i < len; i++) {
+ dests[i].emit('unpipe', this, unpipeInfo);
+ }return this;
+ }
+
+ // try to find the right one.
+ var index = indexOf(state.pipes, dest);
+ if (index === -1) return this;
+
+ state.pipes.splice(index, 1);
+ state.pipesCount -= 1;
+ if (state.pipesCount === 1) state.pipes = state.pipes[0];
+
+ dest.emit('unpipe', this, unpipeInfo);
+
+ return this;
+};
+
+// set up data events if they are asked for
+// Ensure readable listeners eventually get something
+Readable.prototype.on = function (ev, fn) {
+ var res = Stream.prototype.on.call(this, ev, fn);
+
+ if (ev === 'data') {
+ // Start flowing on next tick if stream isn't explicitly paused
+ if (this._readableState.flowing !== false) this.resume();
+ } else if (ev === 'readable') {
+ var state = this._readableState;
+ if (!state.endEmitted && !state.readableListening) {
+ state.readableListening = state.needReadable = true;
+ state.emittedReadable = false;
+ if (!state.reading) {
+ pna.nextTick(nReadingNextTick, this);
+ } else if (state.length) {
+ emitReadable(this);
+ }
+ }
+ }
+
+ return res;
+};
+Readable.prototype.addListener = Readable.prototype.on;
+
+function nReadingNextTick(self) {
+ debug('readable nexttick read 0');
+ self.read(0);
+}
+
+// pause() and resume() are remnants of the legacy readable stream API
+// If the user uses them, then switch into old mode.
+Readable.prototype.resume = function () {
+ var state = this._readableState;
+ if (!state.flowing) {
+ debug('resume');
+ state.flowing = true;
+ resume(this, state);
+ }
+ return this;
+};
+
+function resume(stream, state) {
+ if (!state.resumeScheduled) {
+ state.resumeScheduled = true;
+ pna.nextTick(resume_, stream, state);
+ }
+}
+
+function resume_(stream, state) {
+ if (!state.reading) {
+ debug('resume read 0');
+ stream.read(0);
+ }
+
+ state.resumeScheduled = false;
+ state.awaitDrain = 0;
+ stream.emit('resume');
+ flow(stream);
+ if (state.flowing && !state.reading) stream.read(0);
+}
+
+Readable.prototype.pause = function () {
+ debug('call pause flowing=%j', this._readableState.flowing);
+ if (false !== this._readableState.flowing) {
+ debug('pause');
+ this._readableState.flowing = false;
+ this.emit('pause');
+ }
+ return this;
+};
+
+function flow(stream) {
+ var state = stream._readableState;
+ debug('flow', state.flowing);
+ while (state.flowing && stream.read() !== null) {}
+}
+
+// wrap an old-style stream as the async data source.
+// This is *not* part of the readable stream interface.
+// It is an ugly unfortunate mess of history.
+Readable.prototype.wrap = function (stream) {
+ var _this = this;
+
+ var state = this._readableState;
+ var paused = false;
+
+ stream.on('end', function () {
+ debug('wrapped end');
+ if (state.decoder && !state.ended) {
+ var chunk = state.decoder.end();
+ if (chunk && chunk.length) _this.push(chunk);
+ }
+
+ _this.push(null);
+ });
+
+ stream.on('data', function (chunk) {
+ debug('wrapped data');
+ if (state.decoder) chunk = state.decoder.write(chunk);
+
+ // don't skip over falsy values in objectMode
+ if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
+
+ var ret = _this.push(chunk);
+ if (!ret) {
+ paused = true;
+ stream.pause();
+ }
+ });
+
+ // proxy all the other methods.
+ // important when wrapping filters and duplexes.
+ for (var i in stream) {
+ if (this[i] === undefined && typeof stream[i] === 'function') {
+ this[i] = function (method) {
+ return function () {
+ return stream[method].apply(stream, arguments);
+ };
+ }(i);
+ }
+ }
+
+ // proxy certain important events.
+ for (var n = 0; n < kProxyEvents.length; n++) {
+ stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));
+ }
+
+ // when we try to consume some more bytes, simply unpause the
+ // underlying stream.
+ this._read = function (n) {
+ debug('wrapped _read', n);
+ if (paused) {
+ paused = false;
+ stream.resume();
+ }
+ };
+
+ return this;
+};
+
+Object.defineProperty(Readable.prototype, 'readableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function () {
+ return this._readableState.highWaterMark;
+ }
+});
+
+// exposed for testing purposes only.
+Readable._fromList = fromList;
+
+// Pluck off n bytes from an array of buffers.
+// Length is the combined lengths of all the buffers in the list.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromList(n, state) {
+ // nothing buffered
+ if (state.length === 0) return null;
+
+ var ret;
+ if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {
+ // read it all, truncate the list
+ if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);
+ state.buffer.clear();
+ } else {
+ // read part of list
+ ret = fromListPartial(n, state.buffer, state.decoder);
+ }
+
+ return ret;
+}
+
+// Extracts only enough buffered data to satisfy the amount requested.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function fromListPartial(n, list, hasStrings) {
+ var ret;
+ if (n < list.head.data.length) {
+ // slice is the same for buffers and strings
+ ret = list.head.data.slice(0, n);
+ list.head.data = list.head.data.slice(n);
+ } else if (n === list.head.data.length) {
+ // first chunk is a perfect match
+ ret = list.shift();
+ } else {
+ // result spans more than one buffer
+ ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);
+ }
+ return ret;
+}
+
+// Copies a specified amount of characters from the list of buffered data
+// chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBufferString(n, list) {
+ var p = list.head;
+ var c = 1;
+ var ret = p.data;
+ n -= ret.length;
+ while (p = p.next) {
+ var str = p.data;
+ var nb = n > str.length ? str.length : n;
+ if (nb === str.length) ret += str;else ret += str.slice(0, n);
+ n -= nb;
+ if (n === 0) {
+ if (nb === str.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = str.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ list.length -= c;
+ return ret;
+}
+
+// Copies a specified amount of bytes from the list of buffered data chunks.
+// This function is designed to be inlinable, so please take care when making
+// changes to the function body.
+function copyFromBuffer(n, list) {
+ var ret = Buffer.allocUnsafe(n);
+ var p = list.head;
+ var c = 1;
+ p.data.copy(ret);
+ n -= p.data.length;
+ while (p = p.next) {
+ var buf = p.data;
+ var nb = n > buf.length ? buf.length : n;
+ buf.copy(ret, ret.length - n, 0, nb);
+ n -= nb;
+ if (n === 0) {
+ if (nb === buf.length) {
+ ++c;
+ if (p.next) list.head = p.next;else list.head = list.tail = null;
+ } else {
+ list.head = p;
+ p.data = buf.slice(nb);
+ }
+ break;
+ }
+ ++c;
+ }
+ list.length -= c;
+ return ret;
+}
+
+function endReadable(stream) {
+ var state = stream._readableState;
+
+ // If we get here before consuming all the bytes, then that is a
+ // bug in node. Should never happen.
+ if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
+
+ if (!state.endEmitted) {
+ state.ended = true;
+ pna.nextTick(endReadableNT, state, stream);
+ }
+}
+
+function endReadableNT(state, stream) {
+ // Check that we didn't get one last unshift.
+ if (!state.endEmitted && state.length === 0) {
+ state.endEmitted = true;
+ stream.readable = false;
+ stream.emit('end');
+ }
+}
+
+function indexOf(xs, x) {
+ for (var i = 0, l = xs.length; i < l; i++) {
+ if (xs[i] === x) return i;
+ }
+ return -1;
+}
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./_stream_duplex":98,"./internal/streams/BufferList":103,"./internal/streams/destroy":104,"./internal/streams/stream":105,"_process":92,"core-util-is":14,"events":13,"inherits":80,"isarray":106,"process-nextick-args":91,"safe-buffer":110,"string_decoder/":107,"util":11}],101:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// a transform stream is a readable/writable stream where you do
+// something with the data. Sometimes it's called a "filter",
+// but that's not a great name for it, since that implies a thing where
+// some bits pass through, and others are simply ignored. (That would
+// be a valid example of a transform, of course.)
+//
+// While the output is causally related to the input, it's not a
+// necessarily symmetric or synchronous transformation. For example,
+// a zlib stream might take multiple plain-text writes(), and then
+// emit a single compressed chunk some time in the future.
+//
+// Here's how this works:
+//
+// The Transform stream has all the aspects of the readable and writable
+// stream classes. When you write(chunk), that calls _write(chunk,cb)
+// internally, and returns false if there's a lot of pending writes
+// buffered up. When you call read(), that calls _read(n) until
+// there's enough pending readable data buffered up.
+//
+// In a transform stream, the written data is placed in a buffer. When
+// _read(n) is called, it transforms the queued up data, calling the
+// buffered _write cb's as it consumes chunks. If consuming a single
+// written chunk would result in multiple output chunks, then the first
+// outputted bit calls the readcb, and subsequent chunks just go into
+// the read buffer, and will cause it to emit 'readable' if necessary.
+//
+// This way, back-pressure is actually determined by the reading side,
+// since _read has to be called to start processing a new chunk. However,
+// a pathological inflate type of transform can cause excessive buffering
+// here. For example, imagine a stream where every byte of input is
+// interpreted as an integer from 0-255, and then results in that many
+// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in
+// 1kb of data being output. In this case, you could write a very small
+// amount of input, and end up with a very large amount of output. In
+// such a pathological inflating mechanism, there'd be no way to tell
+// the system to stop doing the transform. A single 4MB write could
+// cause the system to run out of memory.
+//
+// However, even in such a pathological case, only a single written chunk
+// would be consumed, and then the rest would wait (un-transformed) until
+// the results of the previous transformed chunk were consumed.
+
+'use strict';
+
+module.exports = Transform;
+
+var Duplex = require('./_stream_duplex');
+
+/**/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/**/
+
+util.inherits(Transform, Duplex);
+
+function afterTransform(er, data) {
+ var ts = this._transformState;
+ ts.transforming = false;
+
+ var cb = ts.writecb;
+
+ if (!cb) {
+ return this.emit('error', new Error('write callback called multiple times'));
+ }
+
+ ts.writechunk = null;
+ ts.writecb = null;
+
+ if (data != null) // single equals check for both `null` and `undefined`
+ this.push(data);
+
+ cb(er);
+
+ var rs = this._readableState;
+ rs.reading = false;
+ if (rs.needReadable || rs.length < rs.highWaterMark) {
+ this._read(rs.highWaterMark);
+ }
+}
+
+function Transform(options) {
+ if (!(this instanceof Transform)) return new Transform(options);
+
+ Duplex.call(this, options);
+
+ this._transformState = {
+ afterTransform: afterTransform.bind(this),
+ needTransform: false,
+ transforming: false,
+ writecb: null,
+ writechunk: null,
+ writeencoding: null
+ };
+
+ // start out asking for a readable event once data is transformed.
+ this._readableState.needReadable = true;
+
+ // we have implemented the _read method, and done the other things
+ // that Readable wants before the first _read call, so unset the
+ // sync guard flag.
+ this._readableState.sync = false;
+
+ if (options) {
+ if (typeof options.transform === 'function') this._transform = options.transform;
+
+ if (typeof options.flush === 'function') this._flush = options.flush;
+ }
+
+ // When the writable side finishes, then flush out anything remaining.
+ this.on('prefinish', prefinish);
+}
+
+function prefinish() {
+ var _this = this;
+
+ if (typeof this._flush === 'function') {
+ this._flush(function (er, data) {
+ done(_this, er, data);
+ });
+ } else {
+ done(this, null, null);
+ }
+}
+
+Transform.prototype.push = function (chunk, encoding) {
+ this._transformState.needTransform = false;
+ return Duplex.prototype.push.call(this, chunk, encoding);
+};
+
+// This is the part where you do stuff!
+// override this function in implementation classes.
+// 'chunk' is an input chunk.
+//
+// Call `push(newChunk)` to pass along transformed output
+// to the readable side. You may call 'push' zero or more times.
+//
+// Call `cb(err)` when you are done with this chunk. If you pass
+// an error, then that'll put the hurt on the whole operation. If you
+// never call cb(), then you'll never get another chunk.
+Transform.prototype._transform = function (chunk, encoding, cb) {
+ throw new Error('_transform() is not implemented');
+};
+
+Transform.prototype._write = function (chunk, encoding, cb) {
+ var ts = this._transformState;
+ ts.writecb = cb;
+ ts.writechunk = chunk;
+ ts.writeencoding = encoding;
+ if (!ts.transforming) {
+ var rs = this._readableState;
+ if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
+ }
+};
+
+// Doesn't matter what the args are here.
+// _transform does all the work.
+// That we got here means that the readable side wants more data.
+Transform.prototype._read = function (n) {
+ var ts = this._transformState;
+
+ if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
+ ts.transforming = true;
+ this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
+ } else {
+ // mark that we need a transform, so that any data that comes in
+ // will get processed, now that we've asked for it.
+ ts.needTransform = true;
+ }
+};
+
+Transform.prototype._destroy = function (err, cb) {
+ var _this2 = this;
+
+ Duplex.prototype._destroy.call(this, err, function (err2) {
+ cb(err2);
+ _this2.emit('close');
+ });
+};
+
+function done(stream, er, data) {
+ if (er) return stream.emit('error', er);
+
+ if (data != null) // single equals check for both `null` and `undefined`
+ stream.push(data);
+
+ // if there's nothing in the write buffer, then that means
+ // that nothing more will ever be provided
+ if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');
+
+ if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');
+
+ return stream.push(null);
+}
+},{"./_stream_duplex":98,"core-util-is":14,"inherits":80}],102:[function(require,module,exports){
+(function (process,global,setImmediate){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+// A bit simpler than readable streams.
+// Implement an async ._write(chunk, encoding, cb), and it'll handle all
+// the drain event emission and buffering.
+
+'use strict';
+
+/**/
+
+var pna = require('process-nextick-args');
+/**/
+
+module.exports = Writable;
+
+/* */
+function WriteReq(chunk, encoding, cb) {
+ this.chunk = chunk;
+ this.encoding = encoding;
+ this.callback = cb;
+ this.next = null;
+}
+
+// It seems a linked list but it is not
+// there will be only 2 of these for each stream
+function CorkedRequest(state) {
+ var _this = this;
+
+ this.next = null;
+ this.entry = null;
+ this.finish = function () {
+ onCorkedFinish(_this, state);
+ };
+}
+/* */
+
+/**/
+var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;
+/**/
+
+/**/
+var Duplex;
+/**/
+
+Writable.WritableState = WritableState;
+
+/**/
+var util = require('core-util-is');
+util.inherits = require('inherits');
+/**/
+
+/**/
+var internalUtil = {
+ deprecate: require('util-deprecate')
+};
+/**/
+
+/**/
+var Stream = require('./internal/streams/stream');
+/**/
+
+/**/
+
+var Buffer = require('safe-buffer').Buffer;
+var OurUint8Array = global.Uint8Array || function () {};
+function _uint8ArrayToBuffer(chunk) {
+ return Buffer.from(chunk);
+}
+function _isUint8Array(obj) {
+ return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
+}
+
+/**/
+
+var destroyImpl = require('./internal/streams/destroy');
+
+util.inherits(Writable, Stream);
+
+function nop() {}
+
+function WritableState(options, stream) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ options = options || {};
+
+ // Duplex streams are both readable and writable, but share
+ // the same options object.
+ // However, some cases require setting options to different
+ // values for the readable and the writable sides of the duplex stream.
+ // These options can be provided separately as readableXXX and writableXXX.
+ var isDuplex = stream instanceof Duplex;
+
+ // object stream flag to indicate whether or not this stream
+ // contains buffers or objects.
+ this.objectMode = !!options.objectMode;
+
+ if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
+
+ // the point at which write() starts returning false
+ // Note: 0 is a valid value, means that we always return false if
+ // the entire buffer is not flushed immediately on write()
+ var hwm = options.highWaterMark;
+ var writableHwm = options.writableHighWaterMark;
+ var defaultHwm = this.objectMode ? 16 : 16 * 1024;
+
+ if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;
+
+ // cast to ints.
+ this.highWaterMark = Math.floor(this.highWaterMark);
+
+ // if _final has been called
+ this.finalCalled = false;
+
+ // drain event flag.
+ this.needDrain = false;
+ // at the start of calling end()
+ this.ending = false;
+ // when end() has been called, and returned
+ this.ended = false;
+ // when 'finish' is emitted
+ this.finished = false;
+
+ // has it been destroyed
+ this.destroyed = false;
+
+ // should we decode strings into buffers before passing to _write?
+ // this is here so that some node-core streams can optimize string
+ // handling at a lower level.
+ var noDecode = options.decodeStrings === false;
+ this.decodeStrings = !noDecode;
+
+ // Crypto is kind of old and crusty. Historically, its default string
+ // encoding is 'binary' so we have to make this configurable.
+ // Everything else in the universe uses 'utf8', though.
+ this.defaultEncoding = options.defaultEncoding || 'utf8';
+
+ // not an actual buffer we keep track of, but a measurement
+ // of how much we're waiting to get pushed to some underlying
+ // socket or file.
+ this.length = 0;
+
+ // a flag to see when we're in the middle of a write.
+ this.writing = false;
+
+ // when true all writes will be buffered until .uncork() call
+ this.corked = 0;
+
+ // a flag to be able to tell if the onwrite cb is called immediately,
+ // or on a later tick. We set this to true at first, because any
+ // actions that shouldn't happen until "later" should generally also
+ // not happen before the first write call.
+ this.sync = true;
+
+ // a flag to know if we're processing previously buffered items, which
+ // may call the _write() callback in the same tick, so that we don't
+ // end up in an overlapped onwrite situation.
+ this.bufferProcessing = false;
+
+ // the callback that's passed to _write(chunk,cb)
+ this.onwrite = function (er) {
+ onwrite(stream, er);
+ };
+
+ // the callback that the user supplies to write(chunk,encoding,cb)
+ this.writecb = null;
+
+ // the amount that is being written when _write is called.
+ this.writelen = 0;
+
+ this.bufferedRequest = null;
+ this.lastBufferedRequest = null;
+
+ // number of pending user-supplied write callbacks
+ // this must be 0 before 'finish' can be emitted
+ this.pendingcb = 0;
+
+ // emit prefinish if the only thing we're waiting for is _write cbs
+ // This is relevant for synchronous Transform streams
+ this.prefinished = false;
+
+ // True if the error was already emitted and should not be thrown again
+ this.errorEmitted = false;
+
+ // count buffered requests
+ this.bufferedRequestCount = 0;
+
+ // allocate the first CorkedRequest, there is always
+ // one allocated and free to use, and we maintain at most two
+ this.corkedRequestsFree = new CorkedRequest(this);
+}
+
+WritableState.prototype.getBuffer = function getBuffer() {
+ var current = this.bufferedRequest;
+ var out = [];
+ while (current) {
+ out.push(current);
+ current = current.next;
+ }
+ return out;
+};
+
+(function () {
+ try {
+ Object.defineProperty(WritableState.prototype, 'buffer', {
+ get: internalUtil.deprecate(function () {
+ return this.getBuffer();
+ }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')
+ });
+ } catch (_) {}
+})();
+
+// Test _writableState for inheritance to account for Duplex streams,
+// whose prototype chain only points to Readable.
+var realHasInstance;
+if (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {
+ realHasInstance = Function.prototype[Symbol.hasInstance];
+ Object.defineProperty(Writable, Symbol.hasInstance, {
+ value: function (object) {
+ if (realHasInstance.call(this, object)) return true;
+ if (this !== Writable) return false;
+
+ return object && object._writableState instanceof WritableState;
+ }
+ });
+} else {
+ realHasInstance = function (object) {
+ return object instanceof this;
+ };
+}
+
+function Writable(options) {
+ Duplex = Duplex || require('./_stream_duplex');
+
+ // Writable ctor is applied to Duplexes, too.
+ // `realHasInstance` is necessary because using plain `instanceof`
+ // would return false, as no `_writableState` property is attached.
+
+ // Trying to use the custom `instanceof` for Writable here will also break the
+ // Node.js LazyTransform implementation, which has a non-trivial getter for
+ // `_writableState` that would lead to infinite recursion.
+ if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {
+ return new Writable(options);
+ }
+
+ this._writableState = new WritableState(options, this);
+
+ // legacy.
+ this.writable = true;
+
+ if (options) {
+ if (typeof options.write === 'function') this._write = options.write;
+
+ if (typeof options.writev === 'function') this._writev = options.writev;
+
+ if (typeof options.destroy === 'function') this._destroy = options.destroy;
+
+ if (typeof options.final === 'function') this._final = options.final;
+ }
+
+ Stream.call(this);
+}
+
+// Otherwise people can pipe Writable streams, which is just wrong.
+Writable.prototype.pipe = function () {
+ this.emit('error', new Error('Cannot pipe, not readable'));
+};
+
+function writeAfterEnd(stream, cb) {
+ var er = new Error('write after end');
+ // TODO: defer error events consistently everywhere, not just the cb
+ stream.emit('error', er);
+ pna.nextTick(cb, er);
+}
+
+// Checks that a user-supplied chunk is valid, especially for the particular
+// mode the stream is in. Currently this means that `null` is never accepted
+// and undefined/non-string values are only allowed in object mode.
+function validChunk(stream, state, chunk, cb) {
+ var valid = true;
+ var er = false;
+
+ if (chunk === null) {
+ er = new TypeError('May not write null values to stream');
+ } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
+ er = new TypeError('Invalid non-string/buffer chunk');
+ }
+ if (er) {
+ stream.emit('error', er);
+ pna.nextTick(cb, er);
+ valid = false;
+ }
+ return valid;
+}
+
+Writable.prototype.write = function (chunk, encoding, cb) {
+ var state = this._writableState;
+ var ret = false;
+ var isBuf = !state.objectMode && _isUint8Array(chunk);
+
+ if (isBuf && !Buffer.isBuffer(chunk)) {
+ chunk = _uint8ArrayToBuffer(chunk);
+ }
+
+ if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
+
+ if (typeof cb !== 'function') cb = nop;
+
+ if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {
+ state.pendingcb++;
+ ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);
+ }
+
+ return ret;
+};
+
+Writable.prototype.cork = function () {
+ var state = this._writableState;
+
+ state.corked++;
+};
+
+Writable.prototype.uncork = function () {
+ var state = this._writableState;
+
+ if (state.corked) {
+ state.corked--;
+
+ if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
+ }
+};
+
+Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
+ // node::ParseEncoding() requires lower case.
+ if (typeof encoding === 'string') encoding = encoding.toLowerCase();
+ if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
+ this._writableState.defaultEncoding = encoding;
+ return this;
+};
+
+function decodeChunk(state, chunk, encoding) {
+ if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
+ chunk = Buffer.from(chunk, encoding);
+ }
+ return chunk;
+}
+
+Object.defineProperty(Writable.prototype, 'writableHighWaterMark', {
+ // making it explicit this property is not enumerable
+ // because otherwise some prototype manipulation in
+ // userland will fail
+ enumerable: false,
+ get: function () {
+ return this._writableState.highWaterMark;
+ }
+});
+
+// if we're already writing something, then just put this
+// in the queue, and wait our turn. Otherwise, call _write
+// If we return false, then we need a drain event, so set that flag.
+function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
+ if (!isBuf) {
+ var newChunk = decodeChunk(state, chunk, encoding);
+ if (chunk !== newChunk) {
+ isBuf = true;
+ encoding = 'buffer';
+ chunk = newChunk;
+ }
+ }
+ var len = state.objectMode ? 1 : chunk.length;
+
+ state.length += len;
+
+ var ret = state.length < state.highWaterMark;
+ // we must ensure that previous needDrain will not be reset to false.
+ if (!ret) state.needDrain = true;
+
+ if (state.writing || state.corked) {
+ var last = state.lastBufferedRequest;
+ state.lastBufferedRequest = {
+ chunk: chunk,
+ encoding: encoding,
+ isBuf: isBuf,
+ callback: cb,
+ next: null
+ };
+ if (last) {
+ last.next = state.lastBufferedRequest;
+ } else {
+ state.bufferedRequest = state.lastBufferedRequest;
+ }
+ state.bufferedRequestCount += 1;
+ } else {
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ }
+
+ return ret;
+}
+
+function doWrite(stream, state, writev, len, chunk, encoding, cb) {
+ state.writelen = len;
+ state.writecb = cb;
+ state.writing = true;
+ state.sync = true;
+ if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
+ state.sync = false;
+}
+
+function onwriteError(stream, state, sync, er, cb) {
+ --state.pendingcb;
+
+ if (sync) {
+ // defer the callback if we are being called synchronously
+ // to avoid piling up things on the stack
+ pna.nextTick(cb, er);
+ // this can emit finish, and it will always happen
+ // after error
+ pna.nextTick(finishMaybe, stream, state);
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+ } else {
+ // the caller expect this to happen before if
+ // it is async
+ cb(er);
+ stream._writableState.errorEmitted = true;
+ stream.emit('error', er);
+ // this can emit finish, but finish must
+ // always follow error
+ finishMaybe(stream, state);
+ }
+}
+
+function onwriteStateUpdate(state) {
+ state.writing = false;
+ state.writecb = null;
+ state.length -= state.writelen;
+ state.writelen = 0;
+}
+
+function onwrite(stream, er) {
+ var state = stream._writableState;
+ var sync = state.sync;
+ var cb = state.writecb;
+
+ onwriteStateUpdate(state);
+
+ if (er) onwriteError(stream, state, sync, er, cb);else {
+ // Check if we're actually ready to finish, but don't emit yet
+ var finished = needFinish(state);
+
+ if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
+ clearBuffer(stream, state);
+ }
+
+ if (sync) {
+ /**/
+ asyncWrite(afterWrite, stream, state, finished, cb);
+ /**/
+ } else {
+ afterWrite(stream, state, finished, cb);
+ }
+ }
+}
+
+function afterWrite(stream, state, finished, cb) {
+ if (!finished) onwriteDrain(stream, state);
+ state.pendingcb--;
+ cb();
+ finishMaybe(stream, state);
+}
+
+// Must force callback to be called on nextTick, so that we don't
+// emit 'drain' before the write() consumer gets the 'false' return
+// value, and has a chance to attach a 'drain' listener.
+function onwriteDrain(stream, state) {
+ if (state.length === 0 && state.needDrain) {
+ state.needDrain = false;
+ stream.emit('drain');
+ }
+}
+
+// if there's something in the buffer waiting, then process it
+function clearBuffer(stream, state) {
+ state.bufferProcessing = true;
+ var entry = state.bufferedRequest;
+
+ if (stream._writev && entry && entry.next) {
+ // Fast case, write everything using _writev()
+ var l = state.bufferedRequestCount;
+ var buffer = new Array(l);
+ var holder = state.corkedRequestsFree;
+ holder.entry = entry;
+
+ var count = 0;
+ var allBuffers = true;
+ while (entry) {
+ buffer[count] = entry;
+ if (!entry.isBuf) allBuffers = false;
+ entry = entry.next;
+ count += 1;
+ }
+ buffer.allBuffers = allBuffers;
+
+ doWrite(stream, state, true, state.length, buffer, '', holder.finish);
+
+ // doWrite is almost always async, defer these to save a bit of time
+ // as the hot path ends with doWrite
+ state.pendingcb++;
+ state.lastBufferedRequest = null;
+ if (holder.next) {
+ state.corkedRequestsFree = holder.next;
+ holder.next = null;
+ } else {
+ state.corkedRequestsFree = new CorkedRequest(state);
+ }
+ state.bufferedRequestCount = 0;
+ } else {
+ // Slow case, write chunks one-by-one
+ while (entry) {
+ var chunk = entry.chunk;
+ var encoding = entry.encoding;
+ var cb = entry.callback;
+ var len = state.objectMode ? 1 : chunk.length;
+
+ doWrite(stream, state, false, len, chunk, encoding, cb);
+ entry = entry.next;
+ state.bufferedRequestCount--;
+ // if we didn't call the onwrite immediately, then
+ // it means that we need to wait until it does.
+ // also, that means that the chunk and cb are currently
+ // being processed, so move the buffer counter past them.
+ if (state.writing) {
+ break;
+ }
+ }
+
+ if (entry === null) state.lastBufferedRequest = null;
+ }
+
+ state.bufferedRequest = entry;
+ state.bufferProcessing = false;
+}
+
+Writable.prototype._write = function (chunk, encoding, cb) {
+ cb(new Error('_write() is not implemented'));
+};
+
+Writable.prototype._writev = null;
+
+Writable.prototype.end = function (chunk, encoding, cb) {
+ var state = this._writableState;
+
+ if (typeof chunk === 'function') {
+ cb = chunk;
+ chunk = null;
+ encoding = null;
+ } else if (typeof encoding === 'function') {
+ cb = encoding;
+ encoding = null;
+ }
+
+ if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
+
+ // .end() fully uncorks
+ if (state.corked) {
+ state.corked = 1;
+ this.uncork();
+ }
+
+ // ignore unnecessary end() calls.
+ if (!state.ending && !state.finished) endWritable(this, state, cb);
+};
+
+function needFinish(state) {
+ return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
+}
+function callFinal(stream, state) {
+ stream._final(function (err) {
+ state.pendingcb--;
+ if (err) {
+ stream.emit('error', err);
+ }
+ state.prefinished = true;
+ stream.emit('prefinish');
+ finishMaybe(stream, state);
+ });
+}
+function prefinish(stream, state) {
+ if (!state.prefinished && !state.finalCalled) {
+ if (typeof stream._final === 'function') {
+ state.pendingcb++;
+ state.finalCalled = true;
+ pna.nextTick(callFinal, stream, state);
+ } else {
+ state.prefinished = true;
+ stream.emit('prefinish');
+ }
+ }
+}
+
+function finishMaybe(stream, state) {
+ var need = needFinish(state);
+ if (need) {
+ prefinish(stream, state);
+ if (state.pendingcb === 0) {
+ state.finished = true;
+ stream.emit('finish');
+ }
+ }
+ return need;
+}
+
+function endWritable(stream, state, cb) {
+ state.ending = true;
+ finishMaybe(stream, state);
+ if (cb) {
+ if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);
+ }
+ state.ended = true;
+ stream.writable = false;
+}
+
+function onCorkedFinish(corkReq, state, err) {
+ var entry = corkReq.entry;
+ corkReq.entry = null;
+ while (entry) {
+ var cb = entry.callback;
+ state.pendingcb--;
+ cb(err);
+ entry = entry.next;
+ }
+ if (state.corkedRequestsFree) {
+ state.corkedRequestsFree.next = corkReq;
+ } else {
+ state.corkedRequestsFree = corkReq;
+ }
+}
+
+Object.defineProperty(Writable.prototype, 'destroyed', {
+ get: function () {
+ if (this._writableState === undefined) {
+ return false;
+ }
+ return this._writableState.destroyed;
+ },
+ set: function (value) {
+ // we ignore the value if the stream
+ // has not been initialized yet
+ if (!this._writableState) {
+ return;
+ }
+
+ // backward compatibility, the user is explicitly
+ // managing destroyed
+ this._writableState.destroyed = value;
+ }
+});
+
+Writable.prototype.destroy = destroyImpl.destroy;
+Writable.prototype._undestroy = destroyImpl.undestroy;
+Writable.prototype._destroy = function (err, cb) {
+ this.end();
+ cb(err);
+};
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("timers").setImmediate)
+},{"./_stream_duplex":98,"./internal/streams/destroy":104,"./internal/streams/stream":105,"_process":92,"core-util-is":14,"inherits":80,"process-nextick-args":91,"safe-buffer":110,"timers":112,"util-deprecate":115}],103:[function(require,module,exports){
+'use strict';
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+var Buffer = require('safe-buffer').Buffer;
+var util = require('util');
+
+function copyBuffer(src, target, offset) {
+ src.copy(target, offset);
+}
+
+module.exports = function () {
+ function BufferList() {
+ _classCallCheck(this, BufferList);
+
+ this.head = null;
+ this.tail = null;
+ this.length = 0;
+ }
+
+ BufferList.prototype.push = function push(v) {
+ var entry = { data: v, next: null };
+ if (this.length > 0) this.tail.next = entry;else this.head = entry;
+ this.tail = entry;
+ ++this.length;
+ };
+
+ BufferList.prototype.unshift = function unshift(v) {
+ var entry = { data: v, next: this.head };
+ if (this.length === 0) this.tail = entry;
+ this.head = entry;
+ ++this.length;
+ };
+
+ BufferList.prototype.shift = function shift() {
+ if (this.length === 0) return;
+ var ret = this.head.data;
+ if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;
+ --this.length;
+ return ret;
+ };
+
+ BufferList.prototype.clear = function clear() {
+ this.head = this.tail = null;
+ this.length = 0;
+ };
+
+ BufferList.prototype.join = function join(s) {
+ if (this.length === 0) return '';
+ var p = this.head;
+ var ret = '' + p.data;
+ while (p = p.next) {
+ ret += s + p.data;
+ }return ret;
+ };
+
+ BufferList.prototype.concat = function concat(n) {
+ if (this.length === 0) return Buffer.alloc(0);
+ if (this.length === 1) return this.head.data;
+ var ret = Buffer.allocUnsafe(n >>> 0);
+ var p = this.head;
+ var i = 0;
+ while (p) {
+ copyBuffer(p.data, ret, i);
+ i += p.data.length;
+ p = p.next;
+ }
+ return ret;
+ };
+
+ return BufferList;
+}();
+
+if (util && util.inspect && util.inspect.custom) {
+ module.exports.prototype[util.inspect.custom] = function () {
+ var obj = util.inspect({ length: this.length });
+ return this.constructor.name + ' ' + obj;
+ };
+}
+},{"safe-buffer":110,"util":11}],104:[function(require,module,exports){
+'use strict';
+
+/**/
+
+var pna = require('process-nextick-args');
+/**/
+
+// undocumented cb() API, needed for core, not for public API
+function destroy(err, cb) {
+ var _this = this;
+
+ var readableDestroyed = this._readableState && this._readableState.destroyed;
+ var writableDestroyed = this._writableState && this._writableState.destroyed;
+
+ if (readableDestroyed || writableDestroyed) {
+ if (cb) {
+ cb(err);
+ } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {
+ pna.nextTick(emitErrorNT, this, err);
+ }
+ return this;
+ }
+
+ // we set destroyed to true before firing error callbacks in order
+ // to make it re-entrance safe in case destroy() is called within callbacks
+
+ if (this._readableState) {
+ this._readableState.destroyed = true;
+ }
+
+ // if this is a duplex stream mark the writable part as destroyed as well
+ if (this._writableState) {
+ this._writableState.destroyed = true;
+ }
+
+ this._destroy(err || null, function (err) {
+ if (!cb && err) {
+ pna.nextTick(emitErrorNT, _this, err);
+ if (_this._writableState) {
+ _this._writableState.errorEmitted = true;
+ }
+ } else if (cb) {
+ cb(err);
+ }
+ });
+
+ return this;
+}
+
+function undestroy() {
+ if (this._readableState) {
+ this._readableState.destroyed = false;
+ this._readableState.reading = false;
+ this._readableState.ended = false;
+ this._readableState.endEmitted = false;
+ }
+
+ if (this._writableState) {
+ this._writableState.destroyed = false;
+ this._writableState.ended = false;
+ this._writableState.ending = false;
+ this._writableState.finished = false;
+ this._writableState.errorEmitted = false;
+ }
+}
+
+function emitErrorNT(self, err) {
+ self.emit('error', err);
+}
+
+module.exports = {
+ destroy: destroy,
+ undestroy: undestroy
+};
+},{"process-nextick-args":91}],105:[function(require,module,exports){
+module.exports = require('events').EventEmitter;
+
+},{"events":13}],106:[function(require,module,exports){
+var toString = {}.toString;
+
+module.exports = Array.isArray || function (arr) {
+ return toString.call(arr) == '[object Array]';
+};
+
+},{}],107:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+/**/
+
+var Buffer = require('safe-buffer').Buffer;
+/**/
+
+var isEncoding = Buffer.isEncoding || function (encoding) {
+ encoding = '' + encoding;
+ switch (encoding && encoding.toLowerCase()) {
+ case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':
+ return true;
+ default:
+ return false;
+ }
+};
+
+function _normalizeEncoding(enc) {
+ if (!enc) return 'utf8';
+ var retried;
+ while (true) {
+ switch (enc) {
+ case 'utf8':
+ case 'utf-8':
+ return 'utf8';
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return 'utf16le';
+ case 'latin1':
+ case 'binary':
+ return 'latin1';
+ case 'base64':
+ case 'ascii':
+ case 'hex':
+ return enc;
+ default:
+ if (retried) return; // undefined
+ enc = ('' + enc).toLowerCase();
+ retried = true;
+ }
+ }
+};
+
+// Do not cache `Buffer.isEncoding` when checking encoding names as some
+// modules monkey-patch it to support additional encodings
+function normalizeEncoding(enc) {
+ var nenc = _normalizeEncoding(enc);
+ if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);
+ return nenc || enc;
+}
+
+// StringDecoder provides an interface for efficiently splitting a series of
+// buffers into a series of JS strings without breaking apart multi-byte
+// characters.
+exports.StringDecoder = StringDecoder;
+function StringDecoder(encoding) {
+ this.encoding = normalizeEncoding(encoding);
+ var nb;
+ switch (this.encoding) {
+ case 'utf16le':
+ this.text = utf16Text;
+ this.end = utf16End;
+ nb = 4;
+ break;
+ case 'utf8':
+ this.fillLast = utf8FillLast;
+ nb = 4;
+ break;
+ case 'base64':
+ this.text = base64Text;
+ this.end = base64End;
+ nb = 3;
+ break;
+ default:
+ this.write = simpleWrite;
+ this.end = simpleEnd;
+ return;
+ }
+ this.lastNeed = 0;
+ this.lastTotal = 0;
+ this.lastChar = Buffer.allocUnsafe(nb);
+}
+
+StringDecoder.prototype.write = function (buf) {
+ if (buf.length === 0) return '';
+ var r;
+ var i;
+ if (this.lastNeed) {
+ r = this.fillLast(buf);
+ if (r === undefined) return '';
+ i = this.lastNeed;
+ this.lastNeed = 0;
+ } else {
+ i = 0;
+ }
+ if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);
+ return r || '';
+};
+
+StringDecoder.prototype.end = utf8End;
+
+// Returns only complete characters in a Buffer
+StringDecoder.prototype.text = utf8Text;
+
+// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer
+StringDecoder.prototype.fillLast = function (buf) {
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);
+ this.lastNeed -= buf.length;
+};
+
+// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a
+// continuation byte. If an invalid byte is detected, -2 is returned.
+function utf8CheckByte(byte) {
+ if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;
+ return byte >> 6 === 0x02 ? -1 : -2;
+}
+
+// Checks at most 3 bytes at the end of a Buffer in order to detect an
+// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)
+// needed to complete the UTF-8 character (if applicable) are returned.
+function utf8CheckIncomplete(self, buf, i) {
+ var j = buf.length - 1;
+ if (j < i) return 0;
+ var nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 1;
+ return nb;
+ }
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) self.lastNeed = nb - 2;
+ return nb;
+ }
+ if (--j < i || nb === -2) return 0;
+ nb = utf8CheckByte(buf[j]);
+ if (nb >= 0) {
+ if (nb > 0) {
+ if (nb === 2) nb = 0;else self.lastNeed = nb - 3;
+ }
+ return nb;
+ }
+ return 0;
+}
+
+// Validates as many continuation bytes for a multi-byte UTF-8 character as
+// needed or are available. If we see a non-continuation byte where we expect
+// one, we "replace" the validated continuation bytes we've seen so far with
+// a single UTF-8 replacement character ('\ufffd'), to match v8's UTF-8 decoding
+// behavior. The continuation byte check is included three times in the case
+// where all of the continuation bytes for a character exist in the same buffer.
+// It is also done this way as a slight performance increase instead of using a
+// loop.
+function utf8CheckExtraBytes(self, buf, p) {
+ if ((buf[0] & 0xC0) !== 0x80) {
+ self.lastNeed = 0;
+ return '\ufffd';
+ }
+ if (self.lastNeed > 1 && buf.length > 1) {
+ if ((buf[1] & 0xC0) !== 0x80) {
+ self.lastNeed = 1;
+ return '\ufffd';
+ }
+ if (self.lastNeed > 2 && buf.length > 2) {
+ if ((buf[2] & 0xC0) !== 0x80) {
+ self.lastNeed = 2;
+ return '\ufffd';
+ }
+ }
+ }
+}
+
+// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.
+function utf8FillLast(buf) {
+ var p = this.lastTotal - this.lastNeed;
+ var r = utf8CheckExtraBytes(this, buf, p);
+ if (r !== undefined) return r;
+ if (this.lastNeed <= buf.length) {
+ buf.copy(this.lastChar, p, 0, this.lastNeed);
+ return this.lastChar.toString(this.encoding, 0, this.lastTotal);
+ }
+ buf.copy(this.lastChar, p, 0, buf.length);
+ this.lastNeed -= buf.length;
+}
+
+// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a
+// partial character, the character's bytes are buffered until the required
+// number of bytes are available.
+function utf8Text(buf, i) {
+ var total = utf8CheckIncomplete(this, buf, i);
+ if (!this.lastNeed) return buf.toString('utf8', i);
+ this.lastTotal = total;
+ var end = buf.length - (total - this.lastNeed);
+ buf.copy(this.lastChar, 0, end);
+ return buf.toString('utf8', i, end);
+}
+
+// For UTF-8, a replacement character is added when ending on a partial
+// character.
+function utf8End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + '\ufffd';
+ return r;
+}
+
+// UTF-16LE typically needs two bytes per character, but even if we have an even
+// number of bytes available, we need to check if we end on a leading/high
+// surrogate. In that case, we need to wait for the next two bytes in order to
+// decode the last character properly.
+function utf16Text(buf, i) {
+ if ((buf.length - i) % 2 === 0) {
+ var r = buf.toString('utf16le', i);
+ if (r) {
+ var c = r.charCodeAt(r.length - 1);
+ if (c >= 0xD800 && c <= 0xDBFF) {
+ this.lastNeed = 2;
+ this.lastTotal = 4;
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ return r.slice(0, -1);
+ }
+ }
+ return r;
+ }
+ this.lastNeed = 1;
+ this.lastTotal = 2;
+ this.lastChar[0] = buf[buf.length - 1];
+ return buf.toString('utf16le', i, buf.length - 1);
+}
+
+// For UTF-16LE we do not explicitly append special replacement characters if we
+// end on a partial character, we simply let v8 handle that.
+function utf16End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) {
+ var end = this.lastTotal - this.lastNeed;
+ return r + this.lastChar.toString('utf16le', 0, end);
+ }
+ return r;
+}
+
+function base64Text(buf, i) {
+ var n = (buf.length - i) % 3;
+ if (n === 0) return buf.toString('base64', i);
+ this.lastNeed = 3 - n;
+ this.lastTotal = 3;
+ if (n === 1) {
+ this.lastChar[0] = buf[buf.length - 1];
+ } else {
+ this.lastChar[0] = buf[buf.length - 2];
+ this.lastChar[1] = buf[buf.length - 1];
+ }
+ return buf.toString('base64', i, buf.length - n);
+}
+
+function base64End(buf) {
+ var r = buf && buf.length ? this.write(buf) : '';
+ if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);
+ return r;
+}
+
+// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)
+function simpleWrite(buf) {
+ return buf.toString(this.encoding);
+}
+
+function simpleEnd(buf) {
+ return buf && buf.length ? this.write(buf) : '';
+}
+},{"safe-buffer":110}],108:[function(require,module,exports){
+exports = module.exports = require('./lib/_stream_readable.js');
+exports.Stream = exports;
+exports.Readable = exports;
+exports.Writable = require('./lib/_stream_writable.js');
+exports.Duplex = require('./lib/_stream_duplex.js');
+exports.Transform = require('./lib/_stream_transform.js');
+exports.PassThrough = require('./lib/_stream_passthrough.js');
+
+},{"./lib/_stream_duplex.js":98,"./lib/_stream_passthrough.js":99,"./lib/_stream_readable.js":100,"./lib/_stream_transform.js":101,"./lib/_stream_writable.js":102}],109:[function(require,module,exports){
+'use strict'
+
+function ReInterval (callback, interval, args) {
+ var self = this;
+
+ this._callback = callback;
+ this._args = args;
+
+ this._interval = setInterval(callback, interval, this._args);
+
+ this.reschedule = function (interval) {
+ // if no interval entered, use the interval passed in on creation
+ if (!interval)
+ interval = self._interval;
+
+ if (self._interval)
+ clearInterval(self._interval);
+ self._interval = setInterval(self._callback, interval, self._args);
+ };
+
+ this.clear = function () {
+ if (self._interval) {
+ clearInterval(self._interval);
+ self._interval = undefined;
+ }
+ };
+
+ this.destroy = function () {
+ if (self._interval) {
+ clearInterval(self._interval);
+ }
+ self._callback = undefined;
+ self._interval = undefined;
+ self._args = undefined;
+ };
+}
+
+function reInterval () {
+ if (typeof arguments[0] !== 'function')
+ throw new Error('callback needed');
+ if (typeof arguments[1] !== 'number')
+ throw new Error('interval needed');
+
+ var args;
+
+ if (arguments.length > 0) {
+ args = new Array(arguments.length - 2);
+
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i + 2];
+ }
+ }
+
+ return new ReInterval(arguments[0], arguments[1], args);
+}
+
+module.exports = reInterval;
+
+},{}],110:[function(require,module,exports){
+/* eslint-disable node/no-deprecated-api */
+var buffer = require('buffer')
+var Buffer = buffer.Buffer
+
+// alternative to using Object.keys for old browsers
+function copyProps (src, dst) {
+ for (var key in src) {
+ dst[key] = src[key]
+ }
+}
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+ module.exports = buffer
+} else {
+ // Copy properties from require('buffer')
+ copyProps(buffer, exports)
+ exports.Buffer = SafeBuffer
+}
+
+function SafeBuffer (arg, encodingOrOffset, length) {
+ return Buffer(arg, encodingOrOffset, length)
+}
+
+// Copy static methods from Buffer
+copyProps(Buffer, SafeBuffer)
+
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+ if (typeof arg === 'number') {
+ throw new TypeError('Argument must not be a number')
+ }
+ return Buffer(arg, encodingOrOffset, length)
+}
+
+SafeBuffer.alloc = function (size, fill, encoding) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ var buf = Buffer(size)
+ if (fill !== undefined) {
+ if (typeof encoding === 'string') {
+ buf.fill(fill, encoding)
+ } else {
+ buf.fill(fill)
+ }
+ } else {
+ buf.fill(0)
+ }
+ return buf
+}
+
+SafeBuffer.allocUnsafe = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return Buffer(size)
+}
+
+SafeBuffer.allocUnsafeSlow = function (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('Argument must be a number')
+ }
+ return buffer.SlowBuffer(size)
+}
+
+},{"buffer":12}],111:[function(require,module,exports){
+module.exports = shift
+
+function shift (stream) {
+ var rs = stream._readableState
+ if (!rs) return null
+ return rs.objectMode ? stream.read() : stream.read(getStateLength(rs))
+}
+
+function getStateLength (state) {
+ if (state.buffer.length) {
+ // Since node 6.3.0 state.buffer is a BufferList not an array
+ if (state.buffer.head) {
+ return state.buffer.head.data.length
+ }
+
+ return state.buffer[0].length
+ }
+
+ return state.length
+}
+
+},{}],112:[function(require,module,exports){
+(function (setImmediate,clearImmediate){
+var nextTick = require('process/browser.js').nextTick;
+var apply = Function.prototype.apply;
+var slice = Array.prototype.slice;
+var immediateIds = {};
+var nextImmediateId = 0;
+
+// DOM APIs, for completeness
+
+exports.setTimeout = function() {
+ return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);
+};
+exports.setInterval = function() {
+ return new Timeout(apply.call(setInterval, window, arguments), clearInterval);
+};
+exports.clearTimeout =
+exports.clearInterval = function(timeout) { timeout.close(); };
+
+function Timeout(id, clearFn) {
+ this._id = id;
+ this._clearFn = clearFn;
+}
+Timeout.prototype.unref = Timeout.prototype.ref = function() {};
+Timeout.prototype.close = function() {
+ this._clearFn.call(window, this._id);
+};
+
+// Does not start the time, just sets up the members needed.
+exports.enroll = function(item, msecs) {
+ clearTimeout(item._idleTimeoutId);
+ item._idleTimeout = msecs;
+};
+
+exports.unenroll = function(item) {
+ clearTimeout(item._idleTimeoutId);
+ item._idleTimeout = -1;
+};
+
+exports._unrefActive = exports.active = function(item) {
+ clearTimeout(item._idleTimeoutId);
+
+ var msecs = item._idleTimeout;
+ if (msecs >= 0) {
+ item._idleTimeoutId = setTimeout(function onTimeout() {
+ if (item._onTimeout)
+ item._onTimeout();
+ }, msecs);
+ }
+};
+
+// That's not how node.js implements it but the exposed api is the same.
+exports.setImmediate = typeof setImmediate === "function" ? setImmediate : function(fn) {
+ var id = nextImmediateId++;
+ var args = arguments.length < 2 ? false : slice.call(arguments, 1);
+
+ immediateIds[id] = true;
+
+ nextTick(function onNextTick() {
+ if (immediateIds[id]) {
+ // fn.call() is faster so we optimize for the common use-case
+ // @see http://jsperf.com/call-apply-segu
+ if (args) {
+ fn.apply(null, args);
+ } else {
+ fn.call(null);
+ }
+ // Prevent ids from leaking
+ exports.clearImmediate(id);
+ }
+ });
+
+ return id;
+};
+
+exports.clearImmediate = typeof clearImmediate === "function" ? clearImmediate : function(id) {
+ delete immediateIds[id];
+};
+}).call(this,require("timers").setImmediate,require("timers").clearImmediate)
+},{"process/browser.js":92,"timers":112}],113:[function(require,module,exports){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+'use strict';
+
+var punycode = require('punycode');
+var util = require('./util');
+
+exports.parse = urlParse;
+exports.resolve = urlResolve;
+exports.resolveObject = urlResolveObject;
+exports.format = urlFormat;
+
+exports.Url = Url;
+
+function Url() {
+ this.protocol = null;
+ this.slashes = null;
+ this.auth = null;
+ this.host = null;
+ this.port = null;
+ this.hostname = null;
+ this.hash = null;
+ this.search = null;
+ this.query = null;
+ this.pathname = null;
+ this.path = null;
+ this.href = null;
+}
+
+// Reference: RFC 3986, RFC 1808, RFC 2396
+
+// define these here so at least they only have to be
+// compiled once on the first module load.
+var protocolPattern = /^([a-z0-9.+-]+:)/i,
+ portPattern = /:[0-9]*$/,
+
+ // Special case for a simple path URL
+ simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
+
+ // RFC 2396: characters reserved for delimiting URLs.
+ // We actually just auto-escape these.
+ delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
+
+ // RFC 2396: characters not allowed for various reasons.
+ unwise = ['{', '}', '|', '\\', '^', '`'].concat(delims),
+
+ // Allowed by RFCs, but cause of XSS attacks. Always escape these.
+ autoEscape = ['\''].concat(unwise),
+ // Characters that are never ever allowed in a hostname.
+ // Note that any invalid chars are also handled, but these
+ // are the ones that are *expected* to be seen, so we fast-path
+ // them.
+ nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),
+ hostEndingChars = ['/', '?', '#'],
+ hostnameMaxLen = 255,
+ hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
+ hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
+ // protocols that can allow "unsafe" and "unwise" chars.
+ unsafeProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that never have a hostname.
+ hostlessProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that always contain a // bit.
+ slashedProtocol = {
+ 'http': true,
+ 'https': true,
+ 'ftp': true,
+ 'gopher': true,
+ 'file': true,
+ 'http:': true,
+ 'https:': true,
+ 'ftp:': true,
+ 'gopher:': true,
+ 'file:': true
+ },
+ querystring = require('querystring');
+
+function urlParse(url, parseQueryString, slashesDenoteHost) {
+ if (url && util.isObject(url) && url instanceof Url) return url;
+
+ var u = new Url;
+ u.parse(url, parseQueryString, slashesDenoteHost);
+ return u;
+}
+
+Url.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {
+ if (!util.isString(url)) {
+ throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
+ }
+
+ // Copy chrome, IE, opera backslash-handling behavior.
+ // Back slashes before the query string get converted to forward slashes
+ // See: https://code.google.com/p/chromium/issues/detail?id=25916
+ var queryIndex = url.indexOf('?'),
+ splitter =
+ (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',
+ uSplit = url.split(splitter),
+ slashRegex = /\\/g;
+ uSplit[0] = uSplit[0].replace(slashRegex, '/');
+ url = uSplit.join(splitter);
+
+ var rest = url;
+
+ // trim before proceeding.
+ // This is to support parse stuff like " http://foo.com \n"
+ rest = rest.trim();
+
+ if (!slashesDenoteHost && url.split('#').length === 1) {
+ // Try fast path regexp
+ var simplePath = simplePathPattern.exec(rest);
+ if (simplePath) {
+ this.path = rest;
+ this.href = rest;
+ this.pathname = simplePath[1];
+ if (simplePath[2]) {
+ this.search = simplePath[2];
+ if (parseQueryString) {
+ this.query = querystring.parse(this.search.substr(1));
+ } else {
+ this.query = this.search.substr(1);
+ }
+ } else if (parseQueryString) {
+ this.search = '';
+ this.query = {};
+ }
+ return this;
+ }
+ }
+
+ var proto = protocolPattern.exec(rest);
+ if (proto) {
+ proto = proto[0];
+ var lowerProto = proto.toLowerCase();
+ this.protocol = lowerProto;
+ rest = rest.substr(proto.length);
+ }
+
+ // figure out if it's got a host
+ // user@server is *always* interpreted as a hostname, and url
+ // resolution will treat //foo/bar as host=foo,path=bar because that's
+ // how the browser resolves relative URLs.
+ if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
+ var slashes = rest.substr(0, 2) === '//';
+ if (slashes && !(proto && hostlessProtocol[proto])) {
+ rest = rest.substr(2);
+ this.slashes = true;
+ }
+ }
+
+ if (!hostlessProtocol[proto] &&
+ (slashes || (proto && !slashedProtocol[proto]))) {
+
+ // there's a hostname.
+ // the first instance of /, ?, ;, or # ends the host.
+ //
+ // If there is an @ in the hostname, then non-host chars *are* allowed
+ // to the left of the last @ sign, unless some host-ending character
+ // comes *before* the @-sign.
+ // URLs are obnoxious.
+ //
+ // ex:
+ // http://a@b@c/ => user:a@b host:c
+ // http://a@b?@c => user:a host:c path:/?@c
+
+ // v0.12 TODO(isaacs): This is not quite how Chrome does things.
+ // Review our test case against browsers more comprehensively.
+
+ // find the first instance of any hostEndingChars
+ var hostEnd = -1;
+ for (var i = 0; i < hostEndingChars.length; i++) {
+ var hec = rest.indexOf(hostEndingChars[i]);
+ if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
+ hostEnd = hec;
+ }
+
+ // at this point, either we have an explicit point where the
+ // auth portion cannot go past, or the last @ char is the decider.
+ var auth, atSign;
+ if (hostEnd === -1) {
+ // atSign can be anywhere.
+ atSign = rest.lastIndexOf('@');
+ } else {
+ // atSign must be in auth portion.
+ // http://a@b/c@d => host:b auth:a path:/c@d
+ atSign = rest.lastIndexOf('@', hostEnd);
+ }
+
+ // Now we have a portion which is definitely the auth.
+ // Pull that off.
+ if (atSign !== -1) {
+ auth = rest.slice(0, atSign);
+ rest = rest.slice(atSign + 1);
+ this.auth = decodeURIComponent(auth);
+ }
+
+ // the host is the remaining to the left of the first non-host char
+ hostEnd = -1;
+ for (var i = 0; i < nonHostChars.length; i++) {
+ var hec = rest.indexOf(nonHostChars[i]);
+ if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
+ hostEnd = hec;
+ }
+ // if we still have not hit it, then the entire thing is a host.
+ if (hostEnd === -1)
+ hostEnd = rest.length;
+
+ this.host = rest.slice(0, hostEnd);
+ rest = rest.slice(hostEnd);
+
+ // pull out port.
+ this.parseHost();
+
+ // we've indicated that there is a hostname,
+ // so even if it's empty, it has to be present.
+ this.hostname = this.hostname || '';
+
+ // if hostname begins with [ and ends with ]
+ // assume that it's an IPv6 address.
+ var ipv6Hostname = this.hostname[0] === '[' &&
+ this.hostname[this.hostname.length - 1] === ']';
+
+ // validate a little.
+ if (!ipv6Hostname) {
+ var hostparts = this.hostname.split(/\./);
+ for (var i = 0, l = hostparts.length; i < l; i++) {
+ var part = hostparts[i];
+ if (!part) continue;
+ if (!part.match(hostnamePartPattern)) {
+ var newpart = '';
+ for (var j = 0, k = part.length; j < k; j++) {
+ if (part.charCodeAt(j) > 127) {
+ // we replace non-ASCII char with a temporary placeholder
+ // we need this to make sure size of hostname is not
+ // broken by replacing non-ASCII by nothing
+ newpart += 'x';
+ } else {
+ newpart += part[j];
+ }
+ }
+ // we test again with ASCII char only
+ if (!newpart.match(hostnamePartPattern)) {
+ var validParts = hostparts.slice(0, i);
+ var notHost = hostparts.slice(i + 1);
+ var bit = part.match(hostnamePartStart);
+ if (bit) {
+ validParts.push(bit[1]);
+ notHost.unshift(bit[2]);
+ }
+ if (notHost.length) {
+ rest = '/' + notHost.join('.') + rest;
+ }
+ this.hostname = validParts.join('.');
+ break;
+ }
+ }
+ }
+ }
+
+ if (this.hostname.length > hostnameMaxLen) {
+ this.hostname = '';
+ } else {
+ // hostnames are always lower case.
+ this.hostname = this.hostname.toLowerCase();
+ }
+
+ if (!ipv6Hostname) {
+ // IDNA Support: Returns a punycoded representation of "domain".
+ // It only converts parts of the domain name that
+ // have non-ASCII characters, i.e. it doesn't matter if
+ // you call it with a domain that already is ASCII-only.
+ this.hostname = punycode.toASCII(this.hostname);
+ }
+
+ var p = this.port ? ':' + this.port : '';
+ var h = this.hostname || '';
+ this.host = h + p;
+ this.href += this.host;
+
+ // strip [ and ] from the hostname
+ // the host field still retains them, though
+ if (ipv6Hostname) {
+ this.hostname = this.hostname.substr(1, this.hostname.length - 2);
+ if (rest[0] !== '/') {
+ rest = '/' + rest;
+ }
+ }
+ }
+
+ // now rest is set to the post-host stuff.
+ // chop off any delim chars.
+ if (!unsafeProtocol[lowerProto]) {
+
+ // First, make 100% sure that any "autoEscape" chars get
+ // escaped, even if encodeURIComponent doesn't think they
+ // need to be.
+ for (var i = 0, l = autoEscape.length; i < l; i++) {
+ var ae = autoEscape[i];
+ if (rest.indexOf(ae) === -1)
+ continue;
+ var esc = encodeURIComponent(ae);
+ if (esc === ae) {
+ esc = escape(ae);
+ }
+ rest = rest.split(ae).join(esc);
+ }
+ }
+
+
+ // chop off from the tail first.
+ var hash = rest.indexOf('#');
+ if (hash !== -1) {
+ // got a fragment string.
+ this.hash = rest.substr(hash);
+ rest = rest.slice(0, hash);
+ }
+ var qm = rest.indexOf('?');
+ if (qm !== -1) {
+ this.search = rest.substr(qm);
+ this.query = rest.substr(qm + 1);
+ if (parseQueryString) {
+ this.query = querystring.parse(this.query);
+ }
+ rest = rest.slice(0, qm);
+ } else if (parseQueryString) {
+ // no query string, but parseQueryString still requested
+ this.search = '';
+ this.query = {};
+ }
+ if (rest) this.pathname = rest;
+ if (slashedProtocol[lowerProto] &&
+ this.hostname && !this.pathname) {
+ this.pathname = '/';
+ }
+
+ //to support http.request
+ if (this.pathname || this.search) {
+ var p = this.pathname || '';
+ var s = this.search || '';
+ this.path = p + s;
+ }
+
+ // finally, reconstruct the href based on what has been validated.
+ this.href = this.format();
+ return this;
+};
+
+// format a parsed object into a url string
+function urlFormat(obj) {
+ // ensure it's an object, and not a string url.
+ // If it's an obj, this is a no-op.
+ // this way, you can call url_format() on strings
+ // to clean up potentially wonky urls.
+ if (util.isString(obj)) obj = urlParse(obj);
+ if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
+ return obj.format();
+}
+
+Url.prototype.format = function() {
+ var auth = this.auth || '';
+ if (auth) {
+ auth = encodeURIComponent(auth);
+ auth = auth.replace(/%3A/i, ':');
+ auth += '@';
+ }
+
+ var protocol = this.protocol || '',
+ pathname = this.pathname || '',
+ hash = this.hash || '',
+ host = false,
+ query = '';
+
+ if (this.host) {
+ host = auth + this.host;
+ } else if (this.hostname) {
+ host = auth + (this.hostname.indexOf(':') === -1 ?
+ this.hostname :
+ '[' + this.hostname + ']');
+ if (this.port) {
+ host += ':' + this.port;
+ }
+ }
+
+ if (this.query &&
+ util.isObject(this.query) &&
+ Object.keys(this.query).length) {
+ query = querystring.stringify(this.query);
+ }
+
+ var search = this.search || (query && ('?' + query)) || '';
+
+ if (protocol && protocol.substr(-1) !== ':') protocol += ':';
+
+ // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
+ // unless they had them to begin with.
+ if (this.slashes ||
+ (!protocol || slashedProtocol[protocol]) && host !== false) {
+ host = '//' + (host || '');
+ if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
+ } else if (!host) {
+ host = '';
+ }
+
+ if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
+ if (search && search.charAt(0) !== '?') search = '?' + search;
+
+ pathname = pathname.replace(/[?#]/g, function(match) {
+ return encodeURIComponent(match);
+ });
+ search = search.replace('#', '%23');
+
+ return protocol + host + pathname + search + hash;
+};
+
+function urlResolve(source, relative) {
+ return urlParse(source, false, true).resolve(relative);
+}
+
+Url.prototype.resolve = function(relative) {
+ return this.resolveObject(urlParse(relative, false, true)).format();
+};
+
+function urlResolveObject(source, relative) {
+ if (!source) return relative;
+ return urlParse(source, false, true).resolveObject(relative);
+}
+
+Url.prototype.resolveObject = function(relative) {
+ if (util.isString(relative)) {
+ var rel = new Url();
+ rel.parse(relative, false, true);
+ relative = rel;
+ }
+
+ var result = new Url();
+ var tkeys = Object.keys(this);
+ for (var tk = 0; tk < tkeys.length; tk++) {
+ var tkey = tkeys[tk];
+ result[tkey] = this[tkey];
+ }
+
+ // hash is always overridden, no matter what.
+ // even href="" will remove it.
+ result.hash = relative.hash;
+
+ // if the relative url is empty, then there's nothing left to do here.
+ if (relative.href === '') {
+ result.href = result.format();
+ return result;
+ }
+
+ // hrefs like //foo/bar always cut to the protocol.
+ if (relative.slashes && !relative.protocol) {
+ // take everything except the protocol from relative
+ var rkeys = Object.keys(relative);
+ for (var rk = 0; rk < rkeys.length; rk++) {
+ var rkey = rkeys[rk];
+ if (rkey !== 'protocol')
+ result[rkey] = relative[rkey];
+ }
+
+ //urlParse appends trailing / to urls like http://www.example.com
+ if (slashedProtocol[result.protocol] &&
+ result.hostname && !result.pathname) {
+ result.path = result.pathname = '/';
+ }
+
+ result.href = result.format();
+ return result;
+ }
+
+ if (relative.protocol && relative.protocol !== result.protocol) {
+ // if it's a known url protocol, then changing
+ // the protocol does weird things
+ // first, if it's not file:, then we MUST have a host,
+ // and if there was a path
+ // to begin with, then we MUST have a path.
+ // if it is file:, then the host is dropped,
+ // because that's known to be hostless.
+ // anything else is assumed to be absolute.
+ if (!slashedProtocol[relative.protocol]) {
+ var keys = Object.keys(relative);
+ for (var v = 0; v < keys.length; v++) {
+ var k = keys[v];
+ result[k] = relative[k];
+ }
+ result.href = result.format();
+ return result;
+ }
+
+ result.protocol = relative.protocol;
+ if (!relative.host && !hostlessProtocol[relative.protocol]) {
+ var relPath = (relative.pathname || '').split('/');
+ while (relPath.length && !(relative.host = relPath.shift()));
+ if (!relative.host) relative.host = '';
+ if (!relative.hostname) relative.hostname = '';
+ if (relPath[0] !== '') relPath.unshift('');
+ if (relPath.length < 2) relPath.unshift('');
+ result.pathname = relPath.join('/');
+ } else {
+ result.pathname = relative.pathname;
+ }
+ result.search = relative.search;
+ result.query = relative.query;
+ result.host = relative.host || '';
+ result.auth = relative.auth;
+ result.hostname = relative.hostname || relative.host;
+ result.port = relative.port;
+ // to support http.request
+ if (result.pathname || result.search) {
+ var p = result.pathname || '';
+ var s = result.search || '';
+ result.path = p + s;
+ }
+ result.slashes = result.slashes || relative.slashes;
+ result.href = result.format();
+ return result;
+ }
+
+ var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),
+ isRelAbs = (
+ relative.host ||
+ relative.pathname && relative.pathname.charAt(0) === '/'
+ ),
+ mustEndAbs = (isRelAbs || isSourceAbs ||
+ (result.host && relative.pathname)),
+ removeAllDots = mustEndAbs,
+ srcPath = result.pathname && result.pathname.split('/') || [],
+ relPath = relative.pathname && relative.pathname.split('/') || [],
+ psychotic = result.protocol && !slashedProtocol[result.protocol];
+
+ // if the url is a non-slashed url, then relative
+ // links like ../.. should be able
+ // to crawl up to the hostname, as well. This is strange.
+ // result.protocol has already been set by now.
+ // Later on, put the first path part into the host field.
+ if (psychotic) {
+ result.hostname = '';
+ result.port = null;
+ if (result.host) {
+ if (srcPath[0] === '') srcPath[0] = result.host;
+ else srcPath.unshift(result.host);
+ }
+ result.host = '';
+ if (relative.protocol) {
+ relative.hostname = null;
+ relative.port = null;
+ if (relative.host) {
+ if (relPath[0] === '') relPath[0] = relative.host;
+ else relPath.unshift(relative.host);
+ }
+ relative.host = null;
+ }
+ mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
+ }
+
+ if (isRelAbs) {
+ // it's absolute.
+ result.host = (relative.host || relative.host === '') ?
+ relative.host : result.host;
+ result.hostname = (relative.hostname || relative.hostname === '') ?
+ relative.hostname : result.hostname;
+ result.search = relative.search;
+ result.query = relative.query;
+ srcPath = relPath;
+ // fall through to the dot-handling below.
+ } else if (relPath.length) {
+ // it's relative
+ // throw away the existing file, and take the new path instead.
+ if (!srcPath) srcPath = [];
+ srcPath.pop();
+ srcPath = srcPath.concat(relPath);
+ result.search = relative.search;
+ result.query = relative.query;
+ } else if (!util.isNullOrUndefined(relative.search)) {
+ // just pull out the search.
+ // like href='?foo'.
+ // Put this after the other two cases because it simplifies the booleans
+ if (psychotic) {
+ result.hostname = result.host = srcPath.shift();
+ //occationaly the auth can get stuck only in host
+ //this especially happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = result.host && result.host.indexOf('@') > 0 ?
+ result.host.split('@') : false;
+ if (authInHost) {
+ result.auth = authInHost.shift();
+ result.host = result.hostname = authInHost.shift();
+ }
+ }
+ result.search = relative.search;
+ result.query = relative.query;
+ //to support http.request
+ if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
+ result.path = (result.pathname ? result.pathname : '') +
+ (result.search ? result.search : '');
+ }
+ result.href = result.format();
+ return result;
+ }
+
+ if (!srcPath.length) {
+ // no path at all. easy.
+ // we've already handled the other stuff above.
+ result.pathname = null;
+ //to support http.request
+ if (result.search) {
+ result.path = '/' + result.search;
+ } else {
+ result.path = null;
+ }
+ result.href = result.format();
+ return result;
+ }
+
+ // if a url ENDs in . or .., then it must get a trailing slash.
+ // however, if it ends in anything else non-slashy,
+ // then it must NOT get a trailing slash.
+ var last = srcPath.slice(-1)[0];
+ var hasTrailingSlash = (
+ (result.host || relative.host || srcPath.length > 1) &&
+ (last === '.' || last === '..') || last === '');
+
+ // strip single dots, resolve double dots to parent dir
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = srcPath.length; i >= 0; i--) {
+ last = srcPath[i];
+ if (last === '.') {
+ srcPath.splice(i, 1);
+ } else if (last === '..') {
+ srcPath.splice(i, 1);
+ up++;
+ } else if (up) {
+ srcPath.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (!mustEndAbs && !removeAllDots) {
+ for (; up--; up) {
+ srcPath.unshift('..');
+ }
+ }
+
+ if (mustEndAbs && srcPath[0] !== '' &&
+ (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
+ srcPath.unshift('');
+ }
+
+ if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
+ srcPath.push('');
+ }
+
+ var isAbsolute = srcPath[0] === '' ||
+ (srcPath[0] && srcPath[0].charAt(0) === '/');
+
+ // put the host back
+ if (psychotic) {
+ result.hostname = result.host = isAbsolute ? '' :
+ srcPath.length ? srcPath.shift() : '';
+ //occationaly the auth can get stuck only in host
+ //this especially happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = result.host && result.host.indexOf('@') > 0 ?
+ result.host.split('@') : false;
+ if (authInHost) {
+ result.auth = authInHost.shift();
+ result.host = result.hostname = authInHost.shift();
+ }
+ }
+
+ mustEndAbs = mustEndAbs || (result.host && srcPath.length);
+
+ if (mustEndAbs && !isAbsolute) {
+ srcPath.unshift('');
+ }
+
+ if (!srcPath.length) {
+ result.pathname = null;
+ result.path = null;
+ } else {
+ result.pathname = srcPath.join('/');
+ }
+
+ //to support request.http
+ if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
+ result.path = (result.pathname ? result.pathname : '') +
+ (result.search ? result.search : '');
+ }
+ result.auth = relative.auth || result.auth;
+ result.slashes = result.slashes || relative.slashes;
+ result.href = result.format();
+ return result;
+};
+
+Url.prototype.parseHost = function() {
+ var host = this.host;
+ var port = portPattern.exec(host);
+ if (port) {
+ port = port[0];
+ if (port !== ':') {
+ this.port = port.substr(1);
+ }
+ host = host.substr(0, host.length - port.length);
+ }
+ if (host) this.hostname = host;
+};
+
+},{"./util":114,"punycode":93,"querystring":96}],114:[function(require,module,exports){
+'use strict';
+
+module.exports = {
+ isString: function(arg) {
+ return typeof(arg) === 'string';
+ },
+ isObject: function(arg) {
+ return typeof(arg) === 'object' && arg !== null;
+ },
+ isNull: function(arg) {
+ return arg === null;
+ },
+ isNullOrUndefined: function(arg) {
+ return arg == null;
+ }
+};
+
+},{}],115:[function(require,module,exports){
+(function (global){
+
+/**
+ * Module exports.
+ */
+
+module.exports = deprecate;
+
+/**
+ * Mark that a method should not be used.
+ * Returns a modified function which warns once by default.
+ *
+ * If `localStorage.noDeprecation = true` is set, then it is a no-op.
+ *
+ * If `localStorage.throwDeprecation = true` is set, then deprecated functions
+ * will throw an Error when invoked.
+ *
+ * If `localStorage.traceDeprecation = true` is set, then deprecated functions
+ * will invoke `console.trace()` instead of `console.error()`.
+ *
+ * @param {Function} fn - the function to deprecate
+ * @param {String} msg - the string to print to the console when `fn` is invoked
+ * @returns {Function} a new "deprecated" version of `fn`
+ * @api public
+ */
+
+function deprecate (fn, msg) {
+ if (config('noDeprecation')) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (config('throwDeprecation')) {
+ throw new Error(msg);
+ } else if (config('traceDeprecation')) {
+ console.trace(msg);
+ } else {
+ console.warn(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+}
+
+/**
+ * Checks `localStorage` for boolean values for the given `name`.
+ *
+ * @param {String} name
+ * @returns {Boolean}
+ * @api private
+ */
+
+function config (name) {
+ // accessing global.localStorage can trigger a DOMException in sandboxed iframes
+ try {
+ if (!global.localStorage) return false;
+ } catch (_) {
+ return false;
+ }
+ var val = global.localStorage[name];
+ if (null == val) return false;
+ return String(val).toLowerCase() === 'true';
+}
+
+}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{}],116:[function(require,module,exports){
+module.exports = function isBuffer(arg) {
+ return arg && typeof arg === 'object'
+ && typeof arg.copy === 'function'
+ && typeof arg.fill === 'function'
+ && typeof arg.readUInt8 === 'function';
+}
+},{}],117:[function(require,module,exports){
+(function (process,global){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+ if (!isString(f)) {
+ var objects = [];
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function(x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+ switch (x) {
+ case '%s': return String(args[i++]);
+ case '%d': return Number(args[i++]);
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+ default:
+ return x;
+ }
+ });
+ for (var x = args[i]; i < len; x = args[++i]) {
+ if (isNull(x) || !isObject(x)) {
+ str += ' ' + x;
+ } else {
+ str += ' ' + inspect(x);
+ }
+ }
+ return str;
+};
+
+
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+ // Allow for deprecating things in the process of starting up.
+ if (isUndefined(global.process)) {
+ return function() {
+ return exports.deprecate(fn, msg).apply(this, arguments);
+ };
+ }
+
+ if (process.noDeprecation === true) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (process.throwDeprecation) {
+ throw new Error(msg);
+ } else if (process.traceDeprecation) {
+ console.trace(msg);
+ } else {
+ console.error(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+};
+
+
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+ if (isUndefined(debugEnviron))
+ debugEnviron = process.env.NODE_DEBUG || '';
+ set = set.toUpperCase();
+ if (!debugs[set]) {
+ if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+ var pid = process.pid;
+ debugs[set] = function() {
+ var msg = exports.format.apply(exports, arguments);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function() {};
+ }
+ }
+ return debugs[set];
+};
+
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+ // default options
+ var ctx = {
+ seen: [],
+ stylize: stylizeNoColor
+ };
+ // legacy...
+ if (arguments.length >= 3) ctx.depth = arguments[2];
+ if (arguments.length >= 4) ctx.colors = arguments[3];
+ if (isBoolean(opts)) {
+ // legacy...
+ ctx.showHidden = opts;
+ } else if (opts) {
+ // got an "options" object
+ exports._extend(ctx, opts);
+ }
+ // set default options
+ if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+ if (isUndefined(ctx.depth)) ctx.depth = 2;
+ if (isUndefined(ctx.colors)) ctx.colors = false;
+ if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+ if (ctx.colors) ctx.stylize = stylizeWithColor;
+ return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+
+
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.colors = {
+ 'bold' : [1, 22],
+ 'italic' : [3, 23],
+ 'underline' : [4, 24],
+ 'inverse' : [7, 27],
+ 'white' : [37, 39],
+ 'grey' : [90, 39],
+ 'black' : [30, 39],
+ 'blue' : [34, 39],
+ 'cyan' : [36, 39],
+ 'green' : [32, 39],
+ 'magenta' : [35, 39],
+ 'red' : [31, 39],
+ 'yellow' : [33, 39]
+};
+
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+ 'special': 'cyan',
+ 'number': 'yellow',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red'
+};
+
+
+function stylizeWithColor(str, styleType) {
+ var style = inspect.styles[styleType];
+
+ if (style) {
+ return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+ '\u001b[' + inspect.colors[style][1] + 'm';
+ } else {
+ return str;
+ }
+}
+
+
+function stylizeNoColor(str, styleType) {
+ return str;
+}
+
+
+function arrayToHash(array) {
+ var hash = {};
+
+ array.forEach(function(val, idx) {
+ hash[val] = true;
+ });
+
+ return hash;
+}
+
+
+function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (ctx.customInspect &&
+ value &&
+ isFunction(value.inspect) &&
+ // Filter out the util module, it's inspect function is special
+ value.inspect !== exports.inspect &&
+ // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes, ctx);
+ if (!isString(ret)) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
+ }
+
+ // Primitive types cannot have properties
+ var primitive = formatPrimitive(ctx, value);
+ if (primitive) {
+ return primitive;
+ }
+
+ // Look up the keys of the object.
+ var keys = Object.keys(value);
+ var visibleKeys = arrayToHash(keys);
+
+ if (ctx.showHidden) {
+ keys = Object.getOwnPropertyNames(value);
+ }
+
+ // IE doesn't make error fields non-enumerable
+ // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+ if (isError(value)
+ && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+ return formatError(value);
+ }
+
+ // Some type of object without properties can be shortcutted.
+ if (keys.length === 0) {
+ if (isFunction(value)) {
+ var name = value.name ? ': ' + value.name : '';
+ return ctx.stylize('[Function' + name + ']', 'special');
+ }
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toString.call(value), 'date');
+ }
+ if (isError(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '', array = false, braces = ['{', '}'];
+
+ // Make Array say that they are Array
+ if (isArray(value)) {
+ array = true;
+ braces = ['[', ']'];
+ }
+
+ // Make functions say that they are functions
+ if (isFunction(value)) {
+ var n = value.name ? ': ' + value.name : '';
+ base = ' [Function' + n + ']';
+ }
+
+ // Make RegExps say that they are RegExps
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ }
+
+ // Make dates with properties first say the date
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ }
+
+ // Make error with message first say the error
+ if (isError(value)) {
+ base = ' ' + formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+
+ return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+ if (isUndefined(value))
+ return ctx.stylize('undefined', 'undefined');
+ if (isString(value)) {
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+ .replace(/'/g, "\\'")
+ .replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+ }
+ if (isNumber(value))
+ return ctx.stylize('' + value, 'number');
+ if (isBoolean(value))
+ return ctx.stylize('' + value, 'boolean');
+ // For some reason typeof null is "object", so special case here.
+ if (isNull(value))
+ return ctx.stylize('null', 'null');
+}
+
+
+function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (hasOwnProperty(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str, desc;
+ desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+ if (desc.get) {
+ if (desc.set) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (desc.set) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+ if (!hasOwnProperty(visibleKeys, key)) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (ctx.seen.indexOf(desc.value) < 0) {
+ if (isNull(recurseTimes)) {
+ str = formatValue(ctx, desc.value, null);
+ } else {
+ str = formatValue(ctx, desc.value, recurseTimes - 1);
+ }
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n');
+ }
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+ if (isUndefined(name)) {
+ if (array && key.match(/^\d+$/)) {
+ return str;
+ }
+ name = JSON.stringify('' + key);
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'")
+ .replace(/\\"/g, '"')
+ .replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
+
+ return name + ': ' + str;
+}
+
+
+function reduceToSingleString(output, base, braces) {
+ var numLinesEst = 0;
+ var length = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
+ return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+ }, 0);
+
+ if (length > 60) {
+ return braces[0] +
+ (base === '' ? '' : base + '\n ') +
+ ' ' +
+ output.join(',\n ') +
+ ' ' +
+ braces[1];
+ }
+
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+ return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return isObject(e) &&
+ (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = require('./support/isBuffer');
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+
+function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+ 'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()),
+ pad(d.getMinutes()),
+ pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+ console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = require('inherits');
+
+exports._extend = function(origin, add) {
+ // Don't do anything if add isn't an object
+ if (!add || !isObject(add)) return origin;
+
+ var keys = Object.keys(add);
+ var i = keys.length;
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+ return origin;
+};
+
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./support/isBuffer":116,"_process":92,"inherits":80}],118:[function(require,module,exports){
+(function (process,global){
+'use strict'
+
+var Transform = require('readable-stream').Transform
+var duplexify = require('duplexify')
+var WS = require('ws')
+var Buffer = require('safe-buffer').Buffer
+
+module.exports = WebSocketStream
+
+function buildProxy (options, socketWrite, socketEnd) {
+ var proxy = new Transform({
+ objectMode: options.objectMode
+ })
+
+ proxy._write = socketWrite
+ proxy._flush = socketEnd
+
+ return proxy
+}
+
+function WebSocketStream(target, protocols, options) {
+ var stream, socket
+
+ var isBrowser = process.title === 'browser'
+ var isNative = !!global.WebSocket
+ var socketWrite = isBrowser ? socketWriteBrowser : socketWriteNode
+
+ if (protocols && !Array.isArray(protocols) && 'object' === typeof protocols) {
+ // accept the "options" Object as the 2nd argument
+ options = protocols
+ protocols = null
+
+ if (typeof options.protocol === 'string' || Array.isArray(options.protocol)) {
+ protocols = options.protocol;
+ }
+ }
+
+ if (!options) options = {}
+
+ if (options.objectMode === undefined) {
+ options.objectMode = !(options.binary === true || options.binary === undefined)
+ }
+
+ var proxy = buildProxy(options, socketWrite, socketEnd)
+
+ if (!options.objectMode) {
+ proxy._writev = writev
+ }
+
+ // browser only: sets the maximum socket buffer size before throttling
+ var bufferSize = options.browserBufferSize || 1024 * 512
+
+ // browser only: how long to wait when throttling
+ var bufferTimeout = options.browserBufferTimeout || 1000
+
+ // use existing WebSocket object that was passed in
+ if (typeof target === 'object') {
+ socket = target
+ // otherwise make a new one
+ } else {
+ // special constructor treatment for native websockets in browsers, see
+ // https://github.com/maxogden/websocket-stream/issues/82
+ if (isNative && isBrowser) {
+ socket = new WS(target, protocols)
+ } else {
+ socket = new WS(target, protocols, options)
+ }
+
+ socket.binaryType = 'arraybuffer'
+ }
+
+ // was already open when passed in
+ if (socket.readyState === socket.OPEN) {
+ stream = proxy
+ } else {
+ stream = duplexify.obj()
+ socket.onopen = onopen
+ }
+
+ stream.socket = socket
+
+ socket.onclose = onclose
+ socket.onerror = onerror
+ socket.onmessage = onmessage
+
+ proxy.on('close', destroy)
+
+ var coerceToBuffer = !options.objectMode
+
+ function socketWriteNode(chunk, enc, next) {
+ // avoid errors, this never happens unless
+ // destroy() is called
+ if (socket.readyState !== socket.OPEN) {
+ next()
+ return
+ }
+
+ if (coerceToBuffer && typeof chunk === 'string') {
+ chunk = Buffer.from(chunk, 'utf8')
+ }
+ socket.send(chunk, next)
+ }
+
+ function socketWriteBrowser(chunk, enc, next) {
+ if (socket.bufferedAmount > bufferSize) {
+ setTimeout(socketWriteBrowser, bufferTimeout, chunk, enc, next)
+ return
+ }
+
+ if (coerceToBuffer && typeof chunk === 'string') {
+ chunk = Buffer.from(chunk, 'utf8')
+ }
+
+ try {
+ socket.send(chunk)
+ } catch(err) {
+ return next(err)
+ }
+
+ next()
+ }
+
+ function socketEnd(done) {
+ socket.close()
+ done()
+ }
+
+ function onopen() {
+ stream.setReadable(proxy)
+ stream.setWritable(proxy)
+ stream.emit('connect')
+ }
+
+ function onclose() {
+ stream.end()
+ stream.destroy()
+ }
+
+ function onerror(err) {
+ stream.destroy(err)
+ }
+
+ function onmessage(event) {
+ var data = event.data
+ if (data instanceof ArrayBuffer) data = Buffer.from(data)
+ else data = Buffer.from(data, 'utf8')
+ proxy.push(data)
+ }
+
+ function destroy() {
+ socket.close()
+ }
+
+ // this is to be enabled only if objectMode is false
+ function writev (chunks, cb) {
+ var buffers = new Array(chunks.length)
+ for (var i = 0; i < chunks.length; i++) {
+ if (typeof chunks[i].chunk === 'string') {
+ buffers[i] = Buffer.from(chunks[i], 'utf8')
+ } else {
+ buffers[i] = chunks[i].chunk
+ }
+ }
+
+ this._write(Buffer.concat(buffers), 'binary', cb)
+ }
+
+ return stream
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"_process":92,"duplexify":17,"readable-stream":108,"safe-buffer":110,"ws":119}],119:[function(require,module,exports){
+
+var ws = null
+
+if (typeof WebSocket !== 'undefined') {
+ ws = WebSocket
+} else if (typeof MozWebSocket !== 'undefined') {
+ ws = MozWebSocket
+} else if (typeof window !== 'undefined') {
+ ws = window.WebSocket || window.MozWebSocket
+}
+
+module.exports = ws
+
+},{}],120:[function(require,module,exports){
+// Returns a wrapper function that returns a wrapped callback
+// The wrapper function should do some stuff, and return a
+// presumably different callback function.
+// This makes sure that own properties are retained, so that
+// decorations and such are not lost along the way.
+module.exports = wrappy
+function wrappy (fn, cb) {
+ if (fn && cb) return wrappy(fn)(cb)
+
+ if (typeof fn !== 'function')
+ throw new TypeError('need wrapper function')
+
+ Object.keys(fn).forEach(function (k) {
+ wrapper[k] = fn[k]
+ })
+
+ return wrapper
+
+ function wrapper() {
+ var args = new Array(arguments.length)
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i]
+ }
+ var ret = fn.apply(this, args)
+ var cb = args[args.length-1]
+ if (typeof ret === 'function' && ret !== cb) {
+ Object.keys(cb).forEach(function (k) {
+ ret[k] = cb[k]
+ })
+ }
+ return ret
+ }
+}
+
+},{}],121:[function(require,module,exports){
+module.exports = extend
+
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function extend() {
+ var target = {}
+
+ for (var i = 0; i < arguments.length; i++) {
+ var source = arguments[i]
+
+ for (var key in source) {
+ if (hasOwnProperty.call(source, key)) {
+ target[key] = source[key]
+ }
+ }
+ }
+
+ return target
+}
+
+},{}]},{},[9])(9)
+});
diff --git a/src/components/kk-printer/utils/mqtt.min.js b/src/components/kk-printer/utils/mqtt.min.js
new file mode 100644
index 0000000..7fdd259
--- /dev/null
+++ b/src/components/kk-printer/utils/mqtt.min.js
@@ -0,0 +1 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.mqtt=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;ioptions.properties.topicAliasMaximum||!options.properties.topicAliasMaximum&&opts.properties.topicAlias)){delete packet.properties.topicAlias}}switch(opts.qos){case 1:case 2:this.outgoing[packet.messageId]={volatile:false,cb:callback||nop};if(this._storeProcessing){this._packetIdsDuringStoreProcessing[packet.messageId]=false;this._storePacket(packet,undefined,opts.cbStorePut)}else{this._sendPacket(packet,undefined,opts.cbStorePut)}break;default:if(this._storeProcessing){this._storePacket(packet,callback,opts.cbStorePut)}else{this._sendPacket(packet,callback,opts.cbStorePut)}break}return this};MqttClient.prototype.subscribe=function(){var packet;var args=new Array(arguments.length);for(var i=0;i0){var topic={qos:sub.qos};if(version===5){topic.nl=sub.nl||false;topic.rap=sub.rap||false;topic.rh=sub.rh||0;topic.properties=sub.properties}that._resubscribeTopics[sub.topic]=topic;topics.push(sub.topic)}});that.messageIdToTopic[packet.messageId]=topics}this.outgoing[packet.messageId]={volatile:true,cb:function(err,packet){if(!err){var granted=packet.granted;for(var i=0;i0){this.once("outgoingEmpty",setTimeout.bind(null,finish,10))}else{finish()}return this};MqttClient.prototype.removeOutgoingMessage=function(mid){var cb=this.outgoing[mid]?this.outgoing[mid].cb:null;delete this.outgoing[mid];this.outgoingStore.del({messageId:mid},function(){cb(new Error("Message removed"))});return this};MqttClient.prototype.reconnect=function(opts){var that=this;var f=function(){if(opts){that.options.incomingStore=opts.incomingStore;that.options.outgoingStore=opts.outgoingStore}else{that.options.incomingStore=null;that.options.outgoingStore=null}that.incomingStore=that.options.incomingStore||new Store;that.outgoingStore=that.options.outgoingStore||new Store;that.disconnecting=false;that.disconnected=false;that._deferredReconnect=null;that._reconnect()};if(this.disconnecting&&!this.disconnected){this._deferredReconnect=f}else{f()}return this};MqttClient.prototype._reconnect=function(){this.emit("reconnect");this._setupStream()};MqttClient.prototype._setupReconnect=function(){var that=this;if(!that.disconnecting&&!that.reconnectTimer&&that.options.reconnectPeriod>0){if(!this.reconnecting){this.emit("offline");this.reconnecting=true}that.reconnectTimer=setInterval(function(){that._reconnect()},that.options.reconnectPeriod)}};MqttClient.prototype._clearReconnect=function(){if(this.reconnectTimer){clearInterval(this.reconnectTimer);this.reconnectTimer=null}};MqttClient.prototype._cleanUp=function(forced,done){var opts=arguments[2];if(done){this.stream.on("close",done)}if(forced){if(this.options.reconnectPeriod===0&&this.options.clean){flush(this.outgoing)}this.stream.destroy()}else{var packet=xtend({cmd:"disconnect"},opts);this._sendPacket(packet,setImmediate.bind(null,this.stream.end.bind(this.stream)))}if(!this.disconnecting){this._clearReconnect();this._setupReconnect()}if(this.pingTimer!==null){this.pingTimer.clear();this.pingTimer=null}if(done&&!this.connected){this.stream.removeListener("close",done);done()}};MqttClient.prototype._sendPacket=function(packet,cb,cbStorePut){cbStorePut=cbStorePut||nop;if(!this.connected){this._storePacket(packet,cb,cbStorePut);return}this._shiftPingInterval();switch(packet.cmd){case"publish":break;case"pubrel":storeAndSend(this,packet,cb,cbStorePut);return;default:sendPacket(this,packet,cb);return}switch(packet.qos){case 2:case 1:storeAndSend(this,packet,cb,cbStorePut);break;case 0:default:sendPacket(this,packet,cb);break}};MqttClient.prototype._storePacket=function(packet,cb,cbStorePut){cbStorePut=cbStorePut||nop;if((packet.qos||0)===0&&this.queueQoSZero||packet.cmd!=="publish"){this.queue.push({packet:packet,cb:cb})}else if(packet.qos>0){cb=this.outgoing[packet.messageId]?this.outgoing[packet.messageId].cb:null;this.outgoingStore.put(packet,function(err){if(err){return cb&&cb(err)}cbStorePut()})}else if(cb){cb(new Error("No connection to broker"))}};MqttClient.prototype._setupPingTimer=function(){var that=this;if(!this.pingTimer&&this.options.keepalive){this.pingResp=true;this.pingTimer=reInterval(function(){that._checkPing()},this.options.keepalive*1e3)}};MqttClient.prototype._shiftPingInterval=function(){if(this.pingTimer&&this.options.keepalive&&this.options.reschedulePings){this.pingTimer.reschedule(this.options.keepalive*1e3)}};MqttClient.prototype._checkPing=function(){if(this.pingResp){this.pingResp=false;this._sendPacket({cmd:"pingreq"})}else{this._cleanUp(true)}};MqttClient.prototype._handlePingresp=function(){this.pingResp=true};MqttClient.prototype._handleConnack=function(packet){var options=this.options;var version=options.protocolVersion;var rc=version===5?packet.reasonCode:packet.returnCode;clearTimeout(this.connackTimer);if(packet.properties){if(packet.properties.topicAliasMaximum){if(!options.properties){options.properties={}}options.properties.topicAliasMaximum=packet.properties.topicAliasMaximum}if(packet.properties.serverKeepAlive&&options.keepalive){options.keepalive=packet.properties.serverKeepAlive;this._shiftPingInterval()}if(packet.properties.maximumPacketSize){if(!options.properties){options.properties={}}options.properties.maximumPacketSize=packet.properties.maximumPacketSize}}if(rc===0){this.reconnecting=false;this._onConnect(packet)}else if(rc>0){var err=new Error("Connection refused: "+errors[rc]);err.code=rc;this.emit("error",err)}};MqttClient.prototype._handlePublish=function(packet,done){done=typeof done!=="undefined"?done:nop;var topic=packet.topic.toString();var message=packet.payload;var qos=packet.qos;var mid=packet.messageId;var that=this;var options=this.options;var validReasonCodes=[0,16,128,131,135,144,145,151,153];switch(qos){case 2:{options.customHandleAcks(topic,message,packet,function(error,code){if(!(error instanceof Error)){code=error;error=null}if(error){return that.emit("error",error)}if(validReasonCodes.indexOf(code)===-1){return that.emit("error",new Error("Wrong reason code for pubrec"))}if(code){that._sendPacket({cmd:"pubrec",messageId:mid,reasonCode:code},done)}else{that.incomingStore.put(packet,function(){that._sendPacket({cmd:"pubrec",messageId:mid},done)})}});break}case 1:{options.customHandleAcks(topic,message,packet,function(error,code){if(!(error instanceof Error)){code=error;error=null}if(error){return that.emit("error",error)}if(validReasonCodes.indexOf(code)===-1){return that.emit("error",new Error("Wrong reason code for puback"))}if(!code){that.emit("message",topic,message,packet)}that.handleMessage(packet,function(err){if(err){return done&&done(err)}that._sendPacket({cmd:"puback",messageId:mid,reasonCode:code},done)})});break}case 0:this.emit("message",topic,message,packet);this.handleMessage(packet,done);break;default:break}};MqttClient.prototype.handleMessage=function(packet,callback){callback()};MqttClient.prototype._handleAck=function(packet){var mid=packet.messageId;var type=packet.cmd;var response=null;var cb=this.outgoing[mid]?this.outgoing[mid].cb:null;var that=this;var err;if(!cb){return}switch(type){case"pubcomp":case"puback":var pubackRC=packet.reasonCode;if(pubackRC&&pubackRC>0&&pubackRC!==16){err=new Error("Publish error: "+errors[pubackRC]);err.code=pubackRC;cb(err,packet)}delete this.outgoing[mid];this.outgoingStore.del(packet,cb);break;case"pubrec":response={cmd:"pubrel",qos:2,messageId:mid};var pubrecRC=packet.reasonCode;if(pubrecRC&&pubrecRC>0&&pubrecRC!==16){err=new Error("Publish error: "+errors[pubrecRC]);err.code=pubrecRC;cb(err,packet)}else{this._sendPacket(response)}break;case"suback":delete this.outgoing[mid];for(var grantedI=0;grantedI0){if(this.options.resubscribe){if(this.options.protocolVersion===5){for(var topicI=0;topicI<_resubscribeTopicsKeys.length;topicI++){var resubscribeTopic={};resubscribeTopic[_resubscribeTopicsKeys[topicI]]=this._resubscribeTopics[_resubscribeTopicsKeys[topicI]];resubscribeTopic.resubscribe=true;this.subscribe(resubscribeTopic,{properties:resubscribeTopic[_resubscribeTopicsKeys[topicI]].properties})}}else{this._resubscribeTopics.resubscribe=true;this.subscribe(this._resubscribeTopics)}}else{this._resubscribeTopics={}}}this._firstConnection=false};MqttClient.prototype._onConnect=function(packet){if(this.disconnected){this.emit("connect",packet);return}var that=this;this._setupPingTimer();this._resubscribe(packet);this.connected=true;function startStreamProcess(){var outStore=that.outgoingStore.createStream();function clearStoreProcessing(){that._storeProcessing=false;that._packetIdsDuringStoreProcessing={}}that.once("close",remove);outStore.on("error",function(err){clearStoreProcessing();that.removeListener("close",remove);that.emit("error",err)});function remove(){outStore.destroy();outStore=null;clearStoreProcessing()}function storeDeliver(){if(!outStore){return}that._storeProcessing=true;var packet=outStore.read(1);var cb;if(!packet){outStore.once("readable",storeDeliver);return}if(that._packetIdsDuringStoreProcessing[packet.messageId]){storeDeliver();return}if(!that.disconnecting&&!that.reconnectTimer){cb=that.outgoing[packet.messageId]?that.outgoing[packet.messageId].cb:null;that.outgoing[packet.messageId]={volatile:false,cb:function(err,status){if(cb){cb(err,status)}storeDeliver()}};that._packetIdsDuringStoreProcessing[packet.messageId]=true;that._sendPacket(packet)}else if(outStore.destroy){outStore.destroy()}}outStore.on("end",function(){var allProcessed=true;for(var id in that._packetIdsDuringStoreProcessing){if(!that._packetIdsDuringStoreProcessing[id]){allProcessed=false;break}}if(allProcessed){clearStoreProcessing();that.removeListener("close",remove);that.emit("connect",packet)}else{startStreamProcess()}});storeDeliver()}startStreamProcess()};module.exports=MqttClient}).call(this,require("_process"),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./store":7,"./validations":8,_process:92,events:13,inherits:80,"mqtt-packet":84,"readable-stream":108,reinterval:109,xtend:121}],2:[function(require,module,exports){(function(Buffer){"use strict";var Transform=require("readable-stream").Transform;var duplexify=require("duplexify");var base64=require("base64-js");var my;var proxy;var stream;var isInitialized=false;function buildProxy(){var proxy=new Transform;proxy._write=function(chunk,encoding,next){my.sendSocketMessage({data:chunk.buffer,success:function(){next()},fail:function(){next(new Error)}})};proxy._flush=function socketEnd(done){my.closeSocket({success:function(){done()}})};return proxy}function setDefaultOpts(opts){if(!opts.hostname){opts.hostname="localhost"}if(!opts.path){opts.path="/"}if(!opts.wsOptions){opts.wsOptions={}}}function buildUrl(opts,client){var protocol=opts.protocol==="alis"?"wss":"ws";var url=protocol+"://"+opts.hostname+opts.path;if(opts.port&&opts.port!==80&&opts.port!==443){url=protocol+"://"+opts.hostname+":"+opts.port+opts.path}if(typeof opts.transformWsUrl==="function"){url=opts.transformWsUrl(url,opts,client)}return url}function bindEventHandler(){if(isInitialized)return;isInitialized=true;my.onSocketOpen(function(){stream.setReadable(proxy);stream.setWritable(proxy);stream.emit("connect")});my.onSocketMessage(function(res){if(typeof res.data==="string"){var array=base64.toByteArray(res.data);var buffer=Buffer.from(array);proxy.push(buffer)}else{var reader=new FileReader;reader.addEventListener("load",function(){var data=reader.result;if(data instanceof ArrayBuffer)data=Buffer.from(data);else data=Buffer.from(data,"utf8");proxy.push(data)});reader.readAsArrayBuffer(res.data)}});my.onSocketClose(function(){stream.end();stream.destroy()});my.onSocketError(function(res){stream.destroy(res)})}function buildStream(client,opts){opts.hostname=opts.hostname||opts.host;if(!opts.hostname){throw new Error("Could not determine host. Specify host manually.")}var websocketSubProtocol=opts.protocolId==="MQIsdp"&&opts.protocolVersion===3?"mqttv3.1":"mqtt";setDefaultOpts(opts);var url=buildUrl(opts,client);my=opts.my;my.connectSocket({url:url,protocols:websocketSubProtocol});proxy=buildProxy();stream=duplexify.obj();bindEventHandler();return stream}module.exports=buildStream}).call(this,require("buffer").Buffer)},{"base64-js":10,buffer:12,duplexify:17,"readable-stream":108}],3:[function(require,module,exports){"use strict";var net=require("net");function buildBuilder(client,opts){var port,host;opts.port=opts.port||1883;opts.hostname=opts.hostname||opts.host||"localhost";port=opts.port;host=opts.hostname;return net.createConnection(port,host)}module.exports=buildBuilder},{net:11}],4:[function(require,module,exports){"use strict";var tls=require("tls");function buildBuilder(mqttClient,opts){var connection;opts.port=opts.port||8883;opts.host=opts.hostname||opts.host||"localhost";opts.rejectUnauthorized=opts.rejectUnauthorized!==false;delete opts.path;connection=tls.connect(opts);connection.on("secureConnect",function(){if(opts.rejectUnauthorized&&!connection.authorized){connection.emit("error",new Error("TLS not authorized"))}else{connection.removeListener("error",handleTLSerrors)}});function handleTLSerrors(err){if(opts.rejectUnauthorized){mqttClient.emit("error",err)}connection.end()}connection.on("error",handleTLSerrors);return connection}module.exports=buildBuilder},{tls:11}],5:[function(require,module,exports){(function(process){"use strict";var websocket=require("websocket-stream");var urlModule=require("url");var WSS_OPTIONS=["rejectUnauthorized","ca","cert","key","pfx","passphrase"];var IS_BROWSER=process.title==="browser";function buildUrl(opts,client){var url=opts.protocol+"://"+opts.hostname+":"+opts.port+opts.path;if(typeof opts.transformWsUrl==="function"){url=opts.transformWsUrl(url,opts,client)}return url}function setDefaultOpts(opts){if(!opts.hostname){opts.hostname="localhost"}if(!opts.port){if(opts.protocol==="wss"){opts.port=443}else{opts.port=80}}if(!opts.path){opts.path="/"}if(!opts.wsOptions){opts.wsOptions={}}if(!IS_BROWSER&&opts.protocol==="wss"){WSS_OPTIONS.forEach(function(prop){if(opts.hasOwnProperty(prop)&&!opts.wsOptions.hasOwnProperty(prop)){opts.wsOptions[prop]=opts[prop]}})}}function createWebSocket(client,opts){var websocketSubProtocol=opts.protocolId==="MQIsdp"&&opts.protocolVersion===3?"mqttv3.1":"mqtt";setDefaultOpts(opts);var url=buildUrl(opts,client);return websocket(url,[websocketSubProtocol],opts.wsOptions)}function buildBuilder(client,opts){return createWebSocket(client,opts)}function buildBuilderBrowser(client,opts){if(!opts.hostname){opts.hostname=opts.host}if(!opts.hostname){if(typeof document==="undefined"){throw new Error("Could not determine host. Specify host manually.")}var parsed=urlModule.parse(document.URL);opts.hostname=parsed.hostname;if(!opts.port){opts.port=parsed.port}}return createWebSocket(client,opts)}if(IS_BROWSER){module.exports=buildBuilderBrowser}else{module.exports=buildBuilder}}).call(this,require("_process"))},{_process:92,url:113,"websocket-stream":118}],6:[function(require,module,exports){(function(process,Buffer){"use strict";var Transform=require("readable-stream").Transform;var duplexify=require("duplexify");var socketTask;var proxy;var stream;function buildProxy(){var proxy=new Transform;proxy._write=function(chunk,encoding,next){socketTask.send({data:chunk.buffer,success:function(){next()},fail:function(errMsg){next(new Error(errMsg))}})};proxy._flush=function socketEnd(done){socketTask.close({success:function(){done()}})};return proxy}function setDefaultOpts(opts){if(!opts.hostname){opts.hostname="localhost"}if(!opts.path){opts.path="/"}if(!opts.wsOptions){opts.wsOptions={}}}function buildUrl(opts,client){var protocol=opts.protocol==="wxs"?"wss":"ws";var url=protocol+"://"+opts.hostname+opts.path;if(opts.port&&opts.port!==80&&opts.port!==443){url=protocol+"://"+opts.hostname+":"+opts.port+opts.path}if(typeof opts.transformWsUrl==="function"){url=opts.transformWsUrl(url,opts,client)}return url}function bindEventHandler(){socketTask.onOpen(function(){stream.setReadable(proxy);stream.setWritable(proxy);stream.emit("connect")});socketTask.onMessage(function(res){var data=res.data;if(data instanceof ArrayBuffer)data=Buffer.from(data);else data=Buffer.from(data,"utf8");proxy.push(data)});socketTask.onClose(function(){stream.end();stream.destroy()});socketTask.onError(function(res){stream.destroy(new Error(res.errMsg))})}function buildStream(client,opts){opts.hostname=opts.hostname||opts.host;if(!opts.hostname){throw new Error("Could not determine host. Specify host manually.")}var websocketSubProtocol=opts.protocolId==="MQIsdp"&&opts.protocolVersion===3?"mqttv3.1":"mqtt";setDefaultOpts(opts);var url=buildUrl(opts,client);socketTask=wx.connectSocket({url:url,protocols:websocketSubProtocol});proxy=buildProxy();stream=duplexify.obj();stream._destroy=function(err,cb){socketTask.close({success:function(){cb&&cb(err)}})};var destroyRef=stream.destroy;stream.destroy=function(){stream.destroy=destroyRef;var self=this;process.nextTick(function(){socketTask.close({fail:function(){self._destroy(new Error)}})})}.bind(stream);bindEventHandler();return stream}module.exports=buildStream}).call(this,require("_process"),require("buffer").Buffer)},{_process:92,buffer:12,duplexify:17,"readable-stream":108}],7:[function(require,module,exports){(function(process){"use strict";var xtend=require("xtend");var Readable=require("readable-stream").Readable;var streamsOpts={objectMode:true};var defaultStoreOptions={clean:true};var Map=require("es6-map");function Store(options){if(!(this instanceof Store)){return new Store(options)}this.options=options||{};this.options=xtend(defaultStoreOptions,options);this._inflights=new Map}Store.prototype.put=function(packet,cb){this._inflights.set(packet.messageId,packet);if(cb){cb()}return this};Store.prototype.createStream=function(){var stream=new Readable(streamsOpts);var destroyed=false;var values=[];var i=0;this._inflights.forEach(function(value,key){values.push(value)});stream._read=function(){if(!destroyed&&i0){throw new Error("Invalid string. Length must be a multiple of 4")}var validLen=b64.indexOf("=");if(validLen===-1)validLen=len;var placeHoldersLen=validLen===len?0:4-validLen%4;return[validLen,placeHoldersLen]}function byteLength(b64){var lens=getLens(b64);var validLen=lens[0];var placeHoldersLen=lens[1];return(validLen+placeHoldersLen)*3/4-placeHoldersLen}function _byteLength(b64,validLen,placeHoldersLen){return(validLen+placeHoldersLen)*3/4-placeHoldersLen}function toByteArray(b64){var tmp;var lens=getLens(b64);var validLen=lens[0];var placeHoldersLen=lens[1];var arr=new Arr(_byteLength(b64,validLen,placeHoldersLen));var curByte=0;var len=placeHoldersLen>0?validLen-4:validLen;for(var i=0;i>16&255;arr[curByte++]=tmp>>8&255;arr[curByte++]=tmp&255}if(placeHoldersLen===2){tmp=revLookup[b64.charCodeAt(i)]<<2|revLookup[b64.charCodeAt(i+1)]>>4;arr[curByte++]=tmp&255}if(placeHoldersLen===1){tmp=revLookup[b64.charCodeAt(i)]<<10|revLookup[b64.charCodeAt(i+1)]<<4|revLookup[b64.charCodeAt(i+2)]>>2;arr[curByte++]=tmp>>8&255;arr[curByte++]=tmp&255}return arr}function tripletToBase64(num){return lookup[num>>18&63]+lookup[num>>12&63]+lookup[num>>6&63]+lookup[num&63]}function encodeChunk(uint8,start,end){var tmp;var output=[];for(var i=start;ilen2?len2:i+maxChunkLength))}if(extraBytes===1){tmp=uint8[len-1];parts.push(lookup[tmp>>2]+lookup[tmp<<4&63]+"==")}else if(extraBytes===2){tmp=(uint8[len-2]<<8)+uint8[len-1];parts.push(lookup[tmp>>10]+lookup[tmp>>4&63]+lookup[tmp<<2&63]+"=")}return parts.join("")}},{}],11:[function(require,module,exports){},{}],12:[function(require,module,exports){"use strict";var base64=require("base64-js");var ieee754=require("ieee754");exports.Buffer=Buffer;exports.SlowBuffer=SlowBuffer;exports.INSPECT_MAX_BYTES=50;var K_MAX_LENGTH=2147483647;exports.kMaxLength=K_MAX_LENGTH;Buffer.TYPED_ARRAY_SUPPORT=typedArraySupport();if(!Buffer.TYPED_ARRAY_SUPPORT&&typeof console!=="undefined"&&typeof console.error==="function"){console.error("This browser lacks typed array (Uint8Array) support which is required by "+"`buffer` v5.x. Use `buffer` v4.x if you require old browser support.")}function typedArraySupport(){try{var arr=new Uint8Array(1);arr.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}};return arr.foo()===42}catch(e){return false}}Object.defineProperty(Buffer.prototype,"parent",{enumerable:true,get:function(){if(!Buffer.isBuffer(this))return undefined;return this.buffer}});Object.defineProperty(Buffer.prototype,"offset",{enumerable:true,get:function(){if(!Buffer.isBuffer(this))return undefined;return this.byteOffset}});function createBuffer(length){if(length>K_MAX_LENGTH){throw new RangeError('The value "'+length+'" is invalid for option "size"')}var buf=new Uint8Array(length);buf.__proto__=Buffer.prototype;return buf}function Buffer(arg,encodingOrOffset,length){if(typeof arg==="number"){if(typeof encodingOrOffset==="string"){throw new TypeError('The "string" argument must be of type string. Received type number')}return allocUnsafe(arg)}return from(arg,encodingOrOffset,length)}if(typeof Symbol!=="undefined"&&Symbol.species!=null&&Buffer[Symbol.species]===Buffer){Object.defineProperty(Buffer,Symbol.species,{value:null,configurable:true,enumerable:false,writable:false})}Buffer.poolSize=8192;function from(value,encodingOrOffset,length){if(typeof value==="string"){return fromString(value,encodingOrOffset)}if(ArrayBuffer.isView(value)){return fromArrayLike(value)}if(value==null){throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, "+"or Array-like Object. Received type "+typeof value)}if(isInstance(value,ArrayBuffer)||value&&isInstance(value.buffer,ArrayBuffer)){return fromArrayBuffer(value,encodingOrOffset,length)}if(typeof value==="number"){throw new TypeError('The "value" argument must not be of type number. Received type number')}var valueOf=value.valueOf&&value.valueOf();if(valueOf!=null&&valueOf!==value){return Buffer.from(valueOf,encodingOrOffset,length)}var b=fromObject(value);if(b)return b;if(typeof Symbol!=="undefined"&&Symbol.toPrimitive!=null&&typeof value[Symbol.toPrimitive]==="function"){return Buffer.from(value[Symbol.toPrimitive]("string"),encodingOrOffset,length)}throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, "+"or Array-like Object. Received type "+typeof value)}Buffer.from=function(value,encodingOrOffset,length){return from(value,encodingOrOffset,length)};Buffer.prototype.__proto__=Uint8Array.prototype;Buffer.__proto__=Uint8Array;function assertSize(size){if(typeof size!=="number"){throw new TypeError('"size" argument must be of type number')}else if(size<0){throw new RangeError('The value "'+size+'" is invalid for option "size"')}}function alloc(size,fill,encoding){assertSize(size);if(size<=0){return createBuffer(size)}if(fill!==undefined){return typeof encoding==="string"?createBuffer(size).fill(fill,encoding):createBuffer(size).fill(fill)}return createBuffer(size)}Buffer.alloc=function(size,fill,encoding){return alloc(size,fill,encoding)};function allocUnsafe(size){assertSize(size);return createBuffer(size<0?0:checked(size)|0)}Buffer.allocUnsafe=function(size){return allocUnsafe(size)};Buffer.allocUnsafeSlow=function(size){return allocUnsafe(size)};function fromString(string,encoding){if(typeof encoding!=="string"||encoding===""){encoding="utf8"}if(!Buffer.isEncoding(encoding)){throw new TypeError("Unknown encoding: "+encoding)}var length=byteLength(string,encoding)|0;var buf=createBuffer(length);var actual=buf.write(string,encoding);if(actual!==length){buf=buf.slice(0,actual)}return buf}function fromArrayLike(array){var length=array.length<0?0:checked(array.length)|0;var buf=createBuffer(length);for(var i=0;i=K_MAX_LENGTH){throw new RangeError("Attempt to allocate Buffer larger than maximum "+"size: 0x"+K_MAX_LENGTH.toString(16)+" bytes")}return length|0}function SlowBuffer(length){if(+length!=length){length=0}return Buffer.alloc(+length)}Buffer.isBuffer=function isBuffer(b){return b!=null&&b._isBuffer===true&&b!==Buffer.prototype};Buffer.compare=function compare(a,b){if(isInstance(a,Uint8Array))a=Buffer.from(a,a.offset,a.byteLength);if(isInstance(b,Uint8Array))b=Buffer.from(b,b.offset,b.byteLength);if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b)){throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array')}if(a===b)return 0;var x=a.length;var y=b.length;for(var i=0,len=Math.min(x,y);i2&&arguments[2]===true;if(!mustMatch&&len===0)return 0;var loweredCase=false;for(;;){switch(encoding){case"ascii":case"latin1":case"binary":return len;case"utf8":case"utf-8":return utf8ToBytes(string).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return len*2;case"hex":return len>>>1;case"base64":return base64ToBytes(string).length;default:if(loweredCase){return mustMatch?-1:utf8ToBytes(string).length}encoding=(""+encoding).toLowerCase();loweredCase=true}}}Buffer.byteLength=byteLength;function slowToString(encoding,start,end){var loweredCase=false;if(start===undefined||start<0){start=0}if(start>this.length){return""}if(end===undefined||end>this.length){end=this.length}if(end<=0){return""}end>>>=0;start>>>=0;if(end<=start){return""}if(!encoding)encoding="utf8";while(true){switch(encoding){case"hex":return hexSlice(this,start,end);case"utf8":case"utf-8":return utf8Slice(this,start,end);case"ascii":return asciiSlice(this,start,end);case"latin1":case"binary":return latin1Slice(this,start,end);case"base64":return base64Slice(this,start,end);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return utf16leSlice(this,start,end);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(encoding+"").toLowerCase();loweredCase=true}}}Buffer.prototype._isBuffer=true;function swap(b,n,m){var i=b[n];b[n]=b[m];b[m]=i}Buffer.prototype.swap16=function swap16(){var len=this.length;if(len%2!==0){throw new RangeError("Buffer size must be a multiple of 16-bits")}for(var i=0;imax)str+=" ... ";return""};Buffer.prototype.compare=function compare(target,start,end,thisStart,thisEnd){if(isInstance(target,Uint8Array)){target=Buffer.from(target,target.offset,target.byteLength)}if(!Buffer.isBuffer(target)){throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. '+"Received type "+typeof target)}if(start===undefined){start=0}if(end===undefined){end=target?target.length:0}if(thisStart===undefined){thisStart=0}if(thisEnd===undefined){thisEnd=this.length}if(start<0||end>target.length||thisStart<0||thisEnd>this.length){throw new RangeError("out of range index")}if(thisStart>=thisEnd&&start>=end){return 0}if(thisStart>=thisEnd){return-1}if(start>=end){return 1}start>>>=0;end>>>=0;thisStart>>>=0;thisEnd>>>=0;if(this===target)return 0;var x=thisEnd-thisStart;var y=end-start;var len=Math.min(x,y);var thisCopy=this.slice(thisStart,thisEnd);var targetCopy=target.slice(start,end);for(var i=0;i2147483647){byteOffset=2147483647}else if(byteOffset<-2147483648){byteOffset=-2147483648}byteOffset=+byteOffset;if(numberIsNaN(byteOffset)){byteOffset=dir?0:buffer.length-1}if(byteOffset<0)byteOffset=buffer.length+byteOffset;if(byteOffset>=buffer.length){if(dir)return-1;else byteOffset=buffer.length-1}else if(byteOffset<0){if(dir)byteOffset=0;else return-1}if(typeof val==="string"){val=Buffer.from(val,encoding)}if(Buffer.isBuffer(val)){if(val.length===0){return-1}return arrayIndexOf(buffer,val,byteOffset,encoding,dir)}else if(typeof val==="number"){val=val&255;if(typeof Uint8Array.prototype.indexOf==="function"){if(dir){return Uint8Array.prototype.indexOf.call(buffer,val,byteOffset)}else{return Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset)}}return arrayIndexOf(buffer,[val],byteOffset,encoding,dir)}throw new TypeError("val must be string, number or Buffer")}function arrayIndexOf(arr,val,byteOffset,encoding,dir){var indexSize=1;var arrLength=arr.length;var valLength=val.length;if(encoding!==undefined){encoding=String(encoding).toLowerCase();if(encoding==="ucs2"||encoding==="ucs-2"||encoding==="utf16le"||encoding==="utf-16le"){if(arr.length<2||val.length<2){return-1}indexSize=2;arrLength/=2;valLength/=2;byteOffset/=2}}function read(buf,i){if(indexSize===1){return buf[i]}else{return buf.readUInt16BE(i*indexSize)}}var i;if(dir){var foundIndex=-1;for(i=byteOffset;iarrLength)byteOffset=arrLength-valLength;for(i=byteOffset;i>=0;i--){var found=true;for(var j=0;jremaining){length=remaining}}var strLen=string.length;if(length>strLen/2){length=strLen/2}for(var i=0;i>>0;if(isFinite(length)){length=length>>>0;if(encoding===undefined)encoding="utf8"}else{encoding=length;length=undefined}}else{throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported")}var remaining=this.length-offset;if(length===undefined||length>remaining)length=remaining;if(string.length>0&&(length<0||offset<0)||offset>this.length){throw new RangeError("Attempt to write outside buffer bounds")}if(!encoding)encoding="utf8";var loweredCase=false;for(;;){switch(encoding){case"hex":return hexWrite(this,string,offset,length);case"utf8":case"utf-8":return utf8Write(this,string,offset,length);case"ascii":return asciiWrite(this,string,offset,length);case"latin1":case"binary":return latin1Write(this,string,offset,length);case"base64":return base64Write(this,string,offset,length);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return ucs2Write(this,string,offset,length);default:if(loweredCase)throw new TypeError("Unknown encoding: "+encoding);encoding=(""+encoding).toLowerCase();loweredCase=true}}};Buffer.prototype.toJSON=function toJSON(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function base64Slice(buf,start,end){if(start===0&&end===buf.length){return base64.fromByteArray(buf)}else{return base64.fromByteArray(buf.slice(start,end))}}function utf8Slice(buf,start,end){end=Math.min(buf.length,end);var res=[];var i=start;while(i239?4:firstByte>223?3:firstByte>191?2:1;if(i+bytesPerSequence<=end){var secondByte,thirdByte,fourthByte,tempCodePoint;switch(bytesPerSequence){case 1:if(firstByte<128){codePoint=firstByte}break;case 2:secondByte=buf[i+1];if((secondByte&192)===128){tempCodePoint=(firstByte&31)<<6|secondByte&63;if(tempCodePoint>127){codePoint=tempCodePoint}}break;case 3:secondByte=buf[i+1];thirdByte=buf[i+2];if((secondByte&192)===128&&(thirdByte&192)===128){tempCodePoint=(firstByte&15)<<12|(secondByte&63)<<6|thirdByte&63;if(tempCodePoint>2047&&(tempCodePoint<55296||tempCodePoint>57343)){codePoint=tempCodePoint}}break;case 4:secondByte=buf[i+1];thirdByte=buf[i+2];fourthByte=buf[i+3];if((secondByte&192)===128&&(thirdByte&192)===128&&(fourthByte&192)===128){tempCodePoint=(firstByte&15)<<18|(secondByte&63)<<12|(thirdByte&63)<<6|fourthByte&63;if(tempCodePoint>65535&&tempCodePoint<1114112){codePoint=tempCodePoint}}}}if(codePoint===null){codePoint=65533;bytesPerSequence=1}else if(codePoint>65535){codePoint-=65536;res.push(codePoint>>>10&1023|55296);codePoint=56320|codePoint&1023}res.push(codePoint);i+=bytesPerSequence}return decodeCodePointsArray(res)}var MAX_ARGUMENTS_LENGTH=4096;function decodeCodePointsArray(codePoints){var len=codePoints.length;if(len<=MAX_ARGUMENTS_LENGTH){return String.fromCharCode.apply(String,codePoints)}var res="";var i=0;while(ilen)end=len;var out="";for(var i=start;ilen){start=len}if(end<0){end+=len;if(end<0)end=0}else if(end>len){end=len}if(endlength)throw new RangeError("Trying to access beyond buffer length")}Buffer.prototype.readUIntLE=function readUIntLE(offset,byteLength,noAssert){offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i>>0;byteLength=byteLength>>>0;if(!noAssert){checkOffset(offset,byteLength,this.length)}var val=this[offset+--byteLength];var mul=1;while(byteLength>0&&(mul*=256)){val+=this[offset+--byteLength]*mul}return val};Buffer.prototype.readUInt8=function readUInt8(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,1,this.length);return this[offset]};Buffer.prototype.readUInt16LE=function readUInt16LE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,2,this.length);return this[offset]|this[offset+1]<<8};Buffer.prototype.readUInt16BE=function readUInt16BE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,2,this.length);return this[offset]<<8|this[offset+1]};Buffer.prototype.readUInt32LE=function readUInt32LE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,4,this.length);return(this[offset]|this[offset+1]<<8|this[offset+2]<<16)+this[offset+3]*16777216};Buffer.prototype.readUInt32BE=function readUInt32BE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,4,this.length);return this[offset]*16777216+(this[offset+1]<<16|this[offset+2]<<8|this[offset+3])};Buffer.prototype.readIntLE=function readIntLE(offset,byteLength,noAssert){offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert)checkOffset(offset,byteLength,this.length);var val=this[offset];var mul=1;var i=0;while(++i=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readIntBE=function readIntBE(offset,byteLength,noAssert){offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert)checkOffset(offset,byteLength,this.length);var i=byteLength;var mul=1;var val=this[offset+--i];while(i>0&&(mul*=256)){val+=this[offset+--i]*mul}mul*=128;if(val>=mul)val-=Math.pow(2,8*byteLength);return val};Buffer.prototype.readInt8=function readInt8(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,1,this.length);if(!(this[offset]&128))return this[offset];return(255-this[offset]+1)*-1};Buffer.prototype.readInt16LE=function readInt16LE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset]|this[offset+1]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt16BE=function readInt16BE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,2,this.length);var val=this[offset+1]|this[offset]<<8;return val&32768?val|4294901760:val};Buffer.prototype.readInt32LE=function readInt32LE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,4,this.length);return this[offset]|this[offset+1]<<8|this[offset+2]<<16|this[offset+3]<<24};Buffer.prototype.readInt32BE=function readInt32BE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,4,this.length);return this[offset]<<24|this[offset+1]<<16|this[offset+2]<<8|this[offset+3]};Buffer.prototype.readFloatLE=function readFloatLE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,true,23,4)};Buffer.prototype.readFloatBE=function readFloatBE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,4,this.length);return ieee754.read(this,offset,false,23,4)};Buffer.prototype.readDoubleLE=function readDoubleLE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,true,52,8)};Buffer.prototype.readDoubleBE=function readDoubleBE(offset,noAssert){offset=offset>>>0;if(!noAssert)checkOffset(offset,8,this.length);return ieee754.read(this,offset,false,52,8)};function checkInt(buf,value,offset,ext,max,min){if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');if(value>max||valuebuf.length)throw new RangeError("Index out of range")}Buffer.prototype.writeUIntLE=function writeUIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset>>>0;byteLength=byteLength>>>0;if(!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var mul=1;var i=0;this[offset]=value&255;while(++i>>0;byteLength=byteLength>>>0;if(!noAssert){var maxBytes=Math.pow(2,8*byteLength)-1;checkInt(this,value,offset,byteLength,maxBytes,0)}var i=byteLength-1;var mul=1;this[offset+i]=value&255;while(--i>=0&&(mul*=256)){this[offset+i]=value/mul&255}return offset+byteLength};Buffer.prototype.writeUInt8=function writeUInt8(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,1,255,0);this[offset]=value&255;return offset+1};Buffer.prototype.writeUInt16LE=function writeUInt16LE(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,2,65535,0);this[offset]=value&255;this[offset+1]=value>>>8;return offset+2};Buffer.prototype.writeUInt16BE=function writeUInt16BE(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,2,65535,0);this[offset]=value>>>8;this[offset+1]=value&255;return offset+2};Buffer.prototype.writeUInt32LE=function writeUInt32LE(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);this[offset+3]=value>>>24;this[offset+2]=value>>>16;this[offset+1]=value>>>8;this[offset]=value&255;return offset+4};Buffer.prototype.writeUInt32BE=function writeUInt32BE(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,4,4294967295,0);this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255;return offset+4};Buffer.prototype.writeIntLE=function writeIntLE(value,offset,byteLength,noAssert){value=+value;offset=offset>>>0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=0;var mul=1;var sub=0;this[offset]=value&255;while(++i>0)-sub&255}return offset+byteLength};Buffer.prototype.writeIntBE=function writeIntBE(value,offset,byteLength,noAssert){value=+value;offset=offset>>>0;if(!noAssert){var limit=Math.pow(2,8*byteLength-1);checkInt(this,value,offset,byteLength,limit-1,-limit)}var i=byteLength-1;var mul=1;var sub=0;this[offset+i]=value&255;while(--i>=0&&(mul*=256)){if(value<0&&sub===0&&this[offset+i+1]!==0){sub=1}this[offset+i]=(value/mul>>0)-sub&255}return offset+byteLength};Buffer.prototype.writeInt8=function writeInt8(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,1,127,-128);if(value<0)value=255+value+1;this[offset]=value&255;return offset+1};Buffer.prototype.writeInt16LE=function writeInt16LE(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);this[offset]=value&255;this[offset+1]=value>>>8;return offset+2};Buffer.prototype.writeInt16BE=function writeInt16BE(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,2,32767,-32768);this[offset]=value>>>8;this[offset+1]=value&255;return offset+2};Buffer.prototype.writeInt32LE=function writeInt32LE(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);this[offset]=value&255;this[offset+1]=value>>>8;this[offset+2]=value>>>16;this[offset+3]=value>>>24;return offset+4};Buffer.prototype.writeInt32BE=function writeInt32BE(value,offset,noAssert){value=+value;offset=offset>>>0;if(!noAssert)checkInt(this,value,offset,4,2147483647,-2147483648);if(value<0)value=4294967295+value+1;this[offset]=value>>>24;this[offset+1]=value>>>16;this[offset+2]=value>>>8;this[offset+3]=value&255;return offset+4};function checkIEEE754(buf,value,offset,ext,max,min){if(offset+ext>buf.length)throw new RangeError("Index out of range");if(offset<0)throw new RangeError("Index out of range")}function writeFloat(buf,value,offset,littleEndian,noAssert){value=+value;offset=offset>>>0;if(!noAssert){checkIEEE754(buf,value,offset,4,34028234663852886e22,-34028234663852886e22)}ieee754.write(buf,value,offset,littleEndian,23,4);return offset+4}Buffer.prototype.writeFloatLE=function writeFloatLE(value,offset,noAssert){return writeFloat(this,value,offset,true,noAssert)};Buffer.prototype.writeFloatBE=function writeFloatBE(value,offset,noAssert){return writeFloat(this,value,offset,false,noAssert)};function writeDouble(buf,value,offset,littleEndian,noAssert){value=+value;offset=offset>>>0;if(!noAssert){checkIEEE754(buf,value,offset,8,17976931348623157e292,-17976931348623157e292)}ieee754.write(buf,value,offset,littleEndian,52,8);return offset+8}Buffer.prototype.writeDoubleLE=function writeDoubleLE(value,offset,noAssert){return writeDouble(this,value,offset,true,noAssert)};Buffer.prototype.writeDoubleBE=function writeDoubleBE(value,offset,noAssert){return writeDouble(this,value,offset,false,noAssert)};Buffer.prototype.copy=function copy(target,targetStart,start,end){if(!Buffer.isBuffer(target))throw new TypeError("argument should be a Buffer");if(!start)start=0;if(!end&&end!==0)end=this.length;if(targetStart>=target.length)targetStart=target.length;if(!targetStart)targetStart=0;if(end>0&&end=this.length)throw new RangeError("Index out of range");if(end<0)throw new RangeError("sourceEnd out of bounds");if(end>this.length)end=this.length;if(target.length-targetStart=0;--i){target[i+targetStart]=this[i+start]}}else{Uint8Array.prototype.set.call(target,this.subarray(start,end),targetStart)}return len};Buffer.prototype.fill=function fill(val,start,end,encoding){if(typeof val==="string"){if(typeof start==="string"){encoding=start;start=0;end=this.length}else if(typeof end==="string"){encoding=end;end=this.length}if(encoding!==undefined&&typeof encoding!=="string"){throw new TypeError("encoding must be a string")}if(typeof encoding==="string"&&!Buffer.isEncoding(encoding)){throw new TypeError("Unknown encoding: "+encoding)}if(val.length===1){var code=val.charCodeAt(0);if(encoding==="utf8"&&code<128||encoding==="latin1"){val=code}}}else if(typeof val==="number"){val=val&255}if(start<0||this.length>>0;end=end===undefined?this.length:end>>>0;if(!val)val=0;var i;if(typeof val==="number"){for(i=start;i55295&&codePoint<57344){if(!leadSurrogate){if(codePoint>56319){if((units-=3)>-1)bytes.push(239,191,189);continue}else if(i+1===length){if((units-=3)>-1)bytes.push(239,191,189);continue}leadSurrogate=codePoint;continue}if(codePoint<56320){if((units-=3)>-1)bytes.push(239,191,189);leadSurrogate=codePoint;continue}codePoint=(leadSurrogate-55296<<10|codePoint-56320)+65536}else if(leadSurrogate){if((units-=3)>-1)bytes.push(239,191,189)}leadSurrogate=null;if(codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,codePoint&63|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,codePoint&63|128)}else if(codePoint<1114112){if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,codePoint&63|128)}else{throw new Error("Invalid code point")}}return bytes}function asciiToBytes(str){var byteArray=[];for(var i=0;i>8;lo=c%256;byteArray.push(lo);byteArray.push(hi)}return byteArray}function base64ToBytes(str){return base64.toByteArray(base64clean(str))}function blitBuffer(src,dst,offset,length){for(var i=0;i=dst.length||i>=src.length)break;dst[i+offset]=src[i]}return i}function isInstance(obj,type){return obj instanceof type||obj!=null&&obj.constructor!=null&&obj.constructor.name!=null&&obj.constructor.name===type.name}function numberIsNaN(obj){return obj!==obj}},{"base64-js":10,ieee754:79}],13:[function(require,module,exports){var objectCreate=Object.create||objectCreatePolyfill;var objectKeys=Object.keys||objectKeysPolyfill;var bind=Function.prototype.bind||functionBindPolyfill;function EventEmitter(){if(!this._events||!Object.prototype.hasOwnProperty.call(this,"_events")){this._events=objectCreate(null);this._eventsCount=0}this._maxListeners=this._maxListeners||undefined}module.exports=EventEmitter;EventEmitter.EventEmitter=EventEmitter;EventEmitter.prototype._events=undefined;EventEmitter.prototype._maxListeners=undefined;var defaultMaxListeners=10;var hasDefineProperty;try{var o={};if(Object.defineProperty)Object.defineProperty(o,"x",{value:0});hasDefineProperty=o.x===0}catch(err){hasDefineProperty=false}if(hasDefineProperty){Object.defineProperty(EventEmitter,"defaultMaxListeners",{enumerable:true,get:function(){return defaultMaxListeners},set:function(arg){if(typeof arg!=="number"||arg<0||arg!==arg)throw new TypeError('"defaultMaxListeners" must be a positive number');defaultMaxListeners=arg}})}else{EventEmitter.defaultMaxListeners=defaultMaxListeners}EventEmitter.prototype.setMaxListeners=function setMaxListeners(n){if(typeof n!=="number"||n<0||isNaN(n))throw new TypeError('"n" argument must be a positive number');this._maxListeners=n;return this};function $getMaxListeners(that){if(that._maxListeners===undefined)return EventEmitter.defaultMaxListeners;return that._maxListeners}EventEmitter.prototype.getMaxListeners=function getMaxListeners(){return $getMaxListeners(this)};function emitNone(handler,isFn,self){if(isFn)handler.call(self);else{var len=handler.length;var listeners=arrayClone(handler,len);for(var i=0;i1)er=arguments[1];if(er instanceof Error){throw er}else{var err=new Error('Unhandled "error" event. ('+er+")");err.context=er;throw err}return false}handler=events[type];if(!handler)return false;var isFn=typeof handler==="function";len=arguments.length;switch(len){case 1:emitNone(handler,isFn,this);break;case 2:emitOne(handler,isFn,this,arguments[1]);break;case 3:emitTwo(handler,isFn,this,arguments[1],arguments[2]);break;case 4:emitThree(handler,isFn,this,arguments[1],arguments[2],arguments[3]);break;default:args=new Array(len-1);for(i=1;i0&&existing.length>m){existing.warned=true;var w=new Error("Possible EventEmitter memory leak detected. "+existing.length+' "'+String(type)+'" listeners '+"added. Use emitter.setMaxListeners() to "+"increase limit.");w.name="MaxListenersExceededWarning";w.emitter=target;w.type=type;w.count=existing.length;if(typeof console==="object"&&console.warn){console.warn("%s: %s",w.name,w.message)}}}}return target}EventEmitter.prototype.addListener=function addListener(type,listener){return _addListener(this,type,listener,false)};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.prependListener=function prependListener(type,listener){return _addListener(this,type,listener,true)};function onceWrapper(){if(!this.fired){this.target.removeListener(this.type,this.wrapFn);this.fired=true;switch(arguments.length){case 0:return this.listener.call(this.target);case 1:return this.listener.call(this.target,arguments[0]);case 2:return this.listener.call(this.target,arguments[0],arguments[1]);case 3:return this.listener.call(this.target,arguments[0],arguments[1],arguments[2]);default:var args=new Array(arguments.length);for(var i=0;i=0;i--){if(list[i]===listener||list[i].listener===listener){originalListener=list[i].listener;position=i;break}}if(position<0)return this;if(position===0)list.shift();else spliceOne(list,position);if(list.length===1)events[type]=list[0];if(events.removeListener)this.emit("removeListener",type,originalListener||listener)}return this};EventEmitter.prototype.removeAllListeners=function removeAllListeners(type){var listeners,events,i;events=this._events;if(!events)return this;if(!events.removeListener){if(arguments.length===0){this._events=objectCreate(null);this._eventsCount=0}else if(events[type]){if(--this._eventsCount===0)this._events=objectCreate(null);else delete events[type]}return this}if(arguments.length===0){var keys=objectKeys(events);var key;for(i=0;i=0;i--){this.removeListener(type,listeners[i])}}return this};function _listeners(target,type,unwrap){var events=target._events;if(!events)return[];var evlistener=events[type];if(!evlistener)return[];if(typeof evlistener==="function")return unwrap?[evlistener.listener||evlistener]:[evlistener];return unwrap?unwrapListeners(evlistener):arrayClone(evlistener,evlistener.length)}EventEmitter.prototype.listeners=function listeners(type){return _listeners(this,type,true)};EventEmitter.prototype.rawListeners=function rawListeners(type){return _listeners(this,type,false)};EventEmitter.listenerCount=function(emitter,type){if(typeof emitter.listenerCount==="function"){return emitter.listenerCount(type)}else{return listenerCount.call(emitter,type)}};EventEmitter.prototype.listenerCount=listenerCount;function listenerCount(type){var events=this._events;if(events){var evlistener=events[type];if(typeof evlistener==="function"){return 1}else if(evlistener){return evlistener.length}}return 0}EventEmitter.prototype.eventNames=function eventNames(){return this._eventsCount>0?Reflect.ownKeys(this._events):[]};function spliceOne(list,index){for(var i=index,k=i+1,n=list.length;k=0)fromIndex=floor(fromIndex);else fromIndex=toPosInt(this.length)-floor(abs(fromIndex));for(i=fromIndex;i=55296&&code<=56319)value+=arrayLike[++i]}value=mapFn?call.call(mapFn,thisArg,value,j):value;if(Context){desc.value=value;defineProperty(arr,j,desc)}else{arr[j]=value}++j}length=j}}if(length===undefined){length=toPosInt(arrayLike.length);if(Context)arr=new Context(length);for(i=0;i0?1:-1}},{}],30:[function(require,module,exports){"use strict";module.exports=require("./is-implemented")()?Number.isNaN:require("./shim")},{"./is-implemented":31,"./shim":32}],31:[function(require,module,exports){"use strict";module.exports=function(){var numberIsNaN=Number.isNaN;if(typeof numberIsNaN!=="function")return false;return!numberIsNaN({})&&numberIsNaN(NaN)&&!numberIsNaN(34)}},{}],32:[function(require,module,exports){"use strict";module.exports=function(value){return value!==value}},{}],33:[function(require,module,exports){"use strict";var sign=require("../math/sign"),abs=Math.abs,floor=Math.floor;module.exports=function(value){if(isNaN(value))return 0;value=Number(value);if(value===0||!isFinite(value))return value;return sign(value)*floor(abs(value))}},{"../math/sign":27}],34:[function(require,module,exports){"use strict";var toInteger=require("./to-integer"),max=Math.max;module.exports=function(value){return max(0,toInteger(value))}},{"./to-integer":33}],35:[function(require,module,exports){"use strict";var callable=require("./valid-callable"),value=require("./valid-value"),bind=Function.prototype.bind,call=Function.prototype.call,keys=Object.keys,objPropertyIsEnumerable=Object.prototype.propertyIsEnumerable;module.exports=function(method,defVal){return function(obj,cb){var list,thisArg=arguments[2],compareFn=arguments[3];obj=Object(value(obj));callable(cb);list=keys(obj);if(compareFn){list.sort(typeof compareFn==="function"?bind.call(compareFn,obj):undefined)}if(typeof method!=="function")method=list[method];return call.call(method,list,function(key,index){if(!objPropertyIsEnumerable.call(obj,key))return defVal;return call.call(cb,thisArg,obj[key],key,obj,index)})}}},{"./valid-callable":54,"./valid-value":55}],36:[function(require,module,exports){"use strict";module.exports=require("./is-implemented")()?Object.assign:require("./shim")},{"./is-implemented":37,"./shim":38}],37:[function(require,module,exports){"use strict";module.exports=function(){var assign=Object.assign,obj;if(typeof assign!=="function")return false;obj={foo:"raz"};assign(obj,{bar:"dwa"},{trzy:"trzy"});return obj.foo+obj.bar+obj.trzy==="razdwatrzy"}},{}],38:[function(require,module,exports){"use strict";var keys=require("../keys"),value=require("../valid-value"),max=Math.max;module.exports=function(dest,src){var error,i,length=max(arguments.length,2),assign;dest=Object(value(dest));assign=function(key){try{dest[key]=src[key]}catch(e){if(!error)error=e}};for(i=1;i-1}},{}],59:[function(require,module,exports){"use strict";var objToString=Object.prototype.toString,id=objToString.call("");module.exports=function(value){return typeof value==="string"||value&&typeof value==="object"&&(value instanceof String||objToString.call(value)===id)||false}},{}],60:[function(require,module,exports){"use strict";var setPrototypeOf=require("es5-ext/object/set-prototype-of"),contains=require("es5-ext/string/#/contains"),d=require("d"),Symbol=require("es6-symbol"),Iterator=require("./");var defineProperty=Object.defineProperty,ArrayIterator;ArrayIterator=module.exports=function(arr,kind){if(!(this instanceof ArrayIterator))throw new TypeError("Constructor requires 'new'");Iterator.call(this,arr);if(!kind)kind="value";else if(contains.call(kind,"key+value"))kind="key+value";else if(contains.call(kind,"key"))kind="key";else kind="value";defineProperty(this,"__kind__",d("",kind))};if(setPrototypeOf)setPrototypeOf(ArrayIterator,Iterator);delete ArrayIterator.prototype.constructor;ArrayIterator.prototype=Object.create(Iterator.prototype,{_resolve:d(function(i){if(this.__kind__==="value")return this.__list__[i];if(this.__kind__==="key+value")return[i,this.__list__[i]];return i})});defineProperty(ArrayIterator.prototype,Symbol.toStringTag,d("c","Array Iterator"))},{"./":63,d:16,"es5-ext/object/set-prototype-of":51,"es5-ext/string/#/contains":56,"es6-symbol":73}],61:[function(require,module,exports){"use strict";var isArguments=require("es5-ext/function/is-arguments"),callable=require("es5-ext/object/valid-callable"),isString=require("es5-ext/string/is-string"),get=require("./get");var isArray=Array.isArray,call=Function.prototype.call,some=Array.prototype.some;module.exports=function(iterable,cb){var mode,thisArg=arguments[2],result,doBreak,broken,i,length,char,code;if(isArray(iterable)||isArguments(iterable))mode="array";else if(isString(iterable))mode="string";else iterable=get(iterable);callable(cb);doBreak=function(){broken=true};if(mode==="array"){some.call(iterable,function(value){call.call(cb,thisArg,value,doBreak);return broken});return}if(mode==="string"){length=iterable.length;for(i=0;i=55296&&code<=56319)char+=iterable[++i]}call.call(cb,thisArg,char,doBreak);if(broken)break}return}result=iterable.next();while(!result.done){call.call(cb,thisArg,result.value,doBreak);if(broken)return;result=iterable.next()}}},{"./get":62,"es5-ext/function/is-arguments":24,"es5-ext/object/valid-callable":54,"es5-ext/string/is-string":59}],62:[function(require,module,exports){"use strict";var isArguments=require("es5-ext/function/is-arguments"),isString=require("es5-ext/string/is-string"),ArrayIterator=require("./array"),StringIterator=require("./string"),iterable=require("./valid-iterable"),iteratorSymbol=require("es6-symbol").iterator;module.exports=function(obj){if(typeof iterable(obj)[iteratorSymbol]==="function")return obj[iteratorSymbol]();if(isArguments(obj))return new ArrayIterator(obj);if(isString(obj))return new StringIterator(obj);return new ArrayIterator(obj)}},{"./array":60,"./string":65,"./valid-iterable":66,"es5-ext/function/is-arguments":24,"es5-ext/string/is-string":59,"es6-symbol":73}],63:[function(require,module,exports){"use strict";var clear=require("es5-ext/array/#/clear"),assign=require("es5-ext/object/assign"),callable=require("es5-ext/object/valid-callable"),value=require("es5-ext/object/valid-value"),d=require("d"),autoBind=require("d/auto-bind"),Symbol=require("es6-symbol");var defineProperty=Object.defineProperty,defineProperties=Object.defineProperties,Iterator;module.exports=Iterator=function(list,context){if(!(this instanceof Iterator))throw new TypeError("Constructor requires 'new'");defineProperties(this,{__list__:d("w",value(list)),__context__:d("w",context),__nextIndex__:d("w",0)});if(!context)return;callable(context.on);context.on("_add",this._onAdd);context.on("_delete",this._onDelete);context.on("_clear",this._onClear)};delete Iterator.prototype.constructor;defineProperties(Iterator.prototype,assign({_next:d(function(){var i;if(!this.__list__)return undefined;if(this.__redo__){i=this.__redo__.shift();if(i!==undefined)return i}if(this.__nextIndex__=this.__nextIndex__)return;++this.__nextIndex__;if(!this.__redo__){defineProperty(this,"__redo__",d("c",[index]));return}this.__redo__.forEach(function(redo,i){if(redo>=index)this.__redo__[i]=++redo},this);this.__redo__.push(index)}),_onDelete:d(function(index){var i;if(index>=this.__nextIndex__)return;--this.__nextIndex__;if(!this.__redo__)return;i=this.__redo__.indexOf(index);if(i!==-1)this.__redo__.splice(i,1);this.__redo__.forEach(function(redo,j){if(redo>index)this.__redo__[j]=--redo},this)}),_onClear:d(function(){if(this.__redo__)clear.call(this.__redo__);this.__nextIndex__=0})})));defineProperty(Iterator.prototype,Symbol.iterator,d(function(){return this}))},{d:16,"d/auto-bind":15,"es5-ext/array/#/clear":19,"es5-ext/object/assign":36,"es5-ext/object/valid-callable":54,"es5-ext/object/valid-value":55,"es6-symbol":73}],64:[function(require,module,exports){"use strict";var isArguments=require("es5-ext/function/is-arguments"),isValue=require("es5-ext/object/is-value"),isString=require("es5-ext/string/is-string");var iteratorSymbol=require("es6-symbol").iterator,isArray=Array.isArray;module.exports=function(value){if(!isValue(value))return false;if(isArray(value))return true;if(isString(value))return true;if(isArguments(value))return true;return typeof value[iteratorSymbol]==="function"}},{"es5-ext/function/is-arguments":24,"es5-ext/object/is-value":44,"es5-ext/string/is-string":59,"es6-symbol":73}],65:[function(require,module,exports){"use strict";var setPrototypeOf=require("es5-ext/object/set-prototype-of"),d=require("d"),Symbol=require("es6-symbol"),Iterator=require("./");var defineProperty=Object.defineProperty,StringIterator;StringIterator=module.exports=function(str){if(!(this instanceof StringIterator))throw new TypeError("Constructor requires 'new'");str=String(str);Iterator.call(this,str);defineProperty(this,"__length__",d("",str.length))};if(setPrototypeOf)setPrototypeOf(StringIterator,Iterator);delete StringIterator.prototype.constructor;StringIterator.prototype=Object.create(Iterator.prototype,{_next:d(function(){if(!this.__list__)return undefined;if(this.__nextIndex__=55296&&code<=56319)return char+this.__list__[this.__nextIndex__++];return char})});defineProperty(StringIterator.prototype,Symbol.toStringTag,d("c","String Iterator"))},{"./":63,d:16,"es5-ext/object/set-prototype-of":51,"es6-symbol":73}],66:[function(require,module,exports){"use strict";var isIterable=require("./is-iterable");module.exports=function(value){if(!isIterable(value))throw new TypeError(value+" is not iterable");return value}},{"./is-iterable":64}],67:[function(require,module,exports){"use strict";module.exports=require("./is-implemented")()?Map:require("./polyfill")},{"./is-implemented":68,"./polyfill":72}],68:[function(require,module,exports){"use strict";module.exports=function(){var map,iterator,result;if(typeof Map!=="function")return false;try{map=new Map([["raz","one"],["dwa","two"],["trzy","three"]])}catch(e){return false}if(String(map)!=="[object Map]")return false;if(map.size!==3)return false;if(typeof map.clear!=="function")return false;if(typeof map.delete!=="function")return false;if(typeof map.entries!=="function")return false;if(typeof map.forEach!=="function")return false;if(typeof map.get!=="function")return false;if(typeof map.has!=="function")return false;if(typeof map.keys!=="function")return false;if(typeof map.set!=="function")return false;if(typeof map.values!=="function")return false;iterator=map.entries();result=iterator.next();if(result.done!==false)return false;if(!result.value)return false;if(result.value[0]!=="raz")return false;if(result.value[1]!=="one")return false;return true}},{}],69:[function(require,module,exports){"use strict";module.exports=function(){if(typeof Map==="undefined")return false;return Object.prototype.toString.call(new Map)==="[object Map]"}()},{}],70:[function(require,module,exports){"use strict";module.exports=require("es5-ext/object/primitive-set")("key","value","key+value")},{"es5-ext/object/primitive-set":50}],71:[function(require,module,exports){"use strict";var setPrototypeOf=require("es5-ext/object/set-prototype-of"),d=require("d"),Iterator=require("es6-iterator"),toStringTagSymbol=require("es6-symbol").toStringTag,kinds=require("./iterator-kinds"),defineProperties=Object.defineProperties,unBind=Iterator.prototype._unBind,MapIterator;MapIterator=module.exports=function(map,kind){if(!(this instanceof MapIterator))return new MapIterator(map,kind);Iterator.call(this,map.__mapKeysData__,map);if(!kind||!kinds[kind])kind="key+value";defineProperties(this,{__kind__:d("",kind),__values__:d("w",map.__mapValuesData__)})};if(setPrototypeOf)setPrototypeOf(MapIterator,Iterator);MapIterator.prototype=Object.create(Iterator.prototype,{constructor:d(MapIterator),_resolve:d(function(i){if(this.__kind__==="value")return this.__values__[i];if(this.__kind__==="key")return this.__list__[i];return[this.__list__[i],this.__values__[i]]}),_unBind:d(function(){this.__values__=null;unBind.call(this)}),toString:d(function(){return"[object Map Iterator]"})});Object.defineProperty(MapIterator.prototype,toStringTagSymbol,d("c","Map Iterator"))},{"./iterator-kinds":70,d:16,"es5-ext/object/set-prototype-of":51,"es6-iterator":63,"es6-symbol":73}],72:[function(require,module,exports){"use strict";var clear=require("es5-ext/array/#/clear"),eIndexOf=require("es5-ext/array/#/e-index-of"),setPrototypeOf=require("es5-ext/object/set-prototype-of"),callable=require("es5-ext/object/valid-callable"),validValue=require("es5-ext/object/valid-value"),d=require("d"),ee=require("event-emitter"),Symbol=require("es6-symbol"),iterator=require("es6-iterator/valid-iterable"),forOf=require("es6-iterator/for-of"),Iterator=require("./lib/iterator"),isNative=require("./is-native-implemented"),call=Function.prototype.call,defineProperties=Object.defineProperties,getPrototypeOf=Object.getPrototypeOf,MapPoly;module.exports=MapPoly=function(){var iterable=arguments[0],keys,values,self;if(!(this instanceof MapPoly))throw new TypeError("Constructor requires 'new'");if(isNative&&setPrototypeOf&&Map!==MapPoly){self=setPrototypeOf(new Map,getPrototypeOf(this))}else{self=this}if(iterable!=null)iterator(iterable);defineProperties(self,{__mapKeysData__:d("c",keys=[]),__mapValuesData__:d("c",values=[])});if(!iterable)return self;forOf(iterable,function(value){var key=validValue(value)[0];value=value[1];if(eIndexOf.call(keys,key)!==-1)return;keys.push(key);values.push(value)},self);return self};if(isNative){if(setPrototypeOf)setPrototypeOf(MapPoly,Map);MapPoly.prototype=Object.create(Map.prototype,{constructor:d(MapPoly)})}ee(defineProperties(MapPoly.prototype,{clear:d(function(){if(!this.__mapKeysData__.length)return;clear.call(this.__mapKeysData__);clear.call(this.__mapValuesData__);this.emit("_clear")}),delete:d(function(key){var index=eIndexOf.call(this.__mapKeysData__,key);if(index===-1)return false;this.__mapKeysData__.splice(index,1);this.__mapValuesData__.splice(index,1);this.emit("_delete",index,key);return true}),entries:d(function(){return new Iterator(this,"key+value")}),forEach:d(function(cb){var thisArg=arguments[1],iterator,result;callable(cb);iterator=this.entries();result=iterator._next();while(result!==undefined){call.call(cb,thisArg,this.__mapValuesData__[result],this.__mapKeysData__[result],this);result=iterator._next()}}),get:d(function(key){var index=eIndexOf.call(this.__mapKeysData__,key);if(index===-1)return;return this.__mapValuesData__[index]}),has:d(function(key){return eIndexOf.call(this.__mapKeysData__,key)!==-1}),keys:d(function(){return new Iterator(this,"key")}),set:d(function(key,value){var index=eIndexOf.call(this.__mapKeysData__,key),emit;if(index===-1){index=this.__mapKeysData__.push(key)-1;emit=true}this.__mapValuesData__[index]=value;if(emit)this.emit("_add",index,key);return this}),size:d.gs(function(){return this.__mapKeysData__.length}),values:d(function(){return new Iterator(this,"value")}),toString:d(function(){return"[object Map]"})}));Object.defineProperty(MapPoly.prototype,Symbol.iterator,d(function(){return this.entries()}));Object.defineProperty(MapPoly.prototype,Symbol.toStringTag,d("c","Map"))},{"./is-native-implemented":69,"./lib/iterator":71,d:16,"es5-ext/array/#/clear":19,"es5-ext/array/#/e-index-of":20,"es5-ext/object/set-prototype-of":51,"es5-ext/object/valid-callable":54,"es5-ext/object/valid-value":55,"es6-iterator/for-of":61,"es6-iterator/valid-iterable":66,"es6-symbol":73,"event-emitter":78}],73:[function(require,module,exports){"use strict";module.exports=require("./is-implemented")()?Symbol:require("./polyfill")},{"./is-implemented":74,"./polyfill":76}],74:[function(require,module,exports){"use strict";var validTypes={object:true,symbol:true};module.exports=function(){var symbol;if(typeof Symbol!=="function")return false;symbol=Symbol("test symbol");try{String(symbol)}catch(e){return false}if(!validTypes[typeof Symbol.iterator])return false;if(!validTypes[typeof Symbol.toPrimitive])return false;if(!validTypes[typeof Symbol.toStringTag])return false;return true}},{}],75:[function(require,module,exports){"use strict";module.exports=function(x){if(!x)return false;if(typeof x==="symbol")return true;if(!x.constructor)return false;if(x.constructor.name!=="Symbol")return false;return x[x.constructor.toStringTag]==="Symbol"}},{}],76:[function(require,module,exports){"use strict";var d=require("d"),validateSymbol=require("./validate-symbol"),create=Object.create,defineProperties=Object.defineProperties,defineProperty=Object.defineProperty,objPrototype=Object.prototype,NativeSymbol,SymbolPolyfill,HiddenSymbol,globalSymbols=create(null),isNativeSafe;if(typeof Symbol==="function"){NativeSymbol=Symbol;try{String(NativeSymbol());isNativeSafe=true}catch(ignore){}}var generateName=function(){var created=create(null);return function(desc){var postfix=0,name,ie11BugWorkaround;while(created[desc+(postfix||"")])++postfix;desc+=postfix||"";created[desc]=true;name="@@"+desc;defineProperty(objPrototype,name,d.gs(null,function(value){if(ie11BugWorkaround)return;ie11BugWorkaround=true;defineProperty(this,name,d(value));ie11BugWorkaround=false}));return name}}();HiddenSymbol=function Symbol(description){if(this instanceof HiddenSymbol)throw new TypeError("Symbol is not a constructor");return SymbolPolyfill(description)};module.exports=SymbolPolyfill=function Symbol(description){var symbol;if(this instanceof Symbol)throw new TypeError("Symbol is not a constructor");if(isNativeSafe)return NativeSymbol(description);symbol=create(HiddenSymbol.prototype);description=description===undefined?"":String(description);return defineProperties(symbol,{__description__:d("",description),__name__:d("",generateName(description))})};defineProperties(SymbolPolyfill,{for:d(function(key){if(globalSymbols[key])return globalSymbols[key];return globalSymbols[key]=SymbolPolyfill(String(key))}),keyFor:d(function(s){var key;validateSymbol(s);for(key in globalSymbols)if(globalSymbols[key]===s)return key}),hasInstance:d("",NativeSymbol&&NativeSymbol.hasInstance||SymbolPolyfill("hasInstance")),isConcatSpreadable:d("",NativeSymbol&&NativeSymbol.isConcatSpreadable||SymbolPolyfill("isConcatSpreadable")),iterator:d("",NativeSymbol&&NativeSymbol.iterator||SymbolPolyfill("iterator")),match:d("",NativeSymbol&&NativeSymbol.match||SymbolPolyfill("match")),replace:d("",NativeSymbol&&NativeSymbol.replace||SymbolPolyfill("replace")),search:d("",NativeSymbol&&NativeSymbol.search||SymbolPolyfill("search")),species:d("",NativeSymbol&&NativeSymbol.species||SymbolPolyfill("species")),split:d("",NativeSymbol&&NativeSymbol.split||SymbolPolyfill("split")),toPrimitive:d("",NativeSymbol&&NativeSymbol.toPrimitive||SymbolPolyfill("toPrimitive")),toStringTag:d("",NativeSymbol&&NativeSymbol.toStringTag||SymbolPolyfill("toStringTag")),unscopables:d("",NativeSymbol&&NativeSymbol.unscopables||SymbolPolyfill("unscopables"))});defineProperties(HiddenSymbol.prototype,{constructor:d(SymbolPolyfill),toString:d("",function(){return this.__name__})});defineProperties(SymbolPolyfill.prototype,{toString:d(function(){return"Symbol ("+validateSymbol(this).__description__+")"}),valueOf:d(function(){return validateSymbol(this)})});defineProperty(SymbolPolyfill.prototype,SymbolPolyfill.toPrimitive,d("",function(){var symbol=validateSymbol(this);if(typeof symbol==="symbol")return symbol;return symbol.toString()}));defineProperty(SymbolPolyfill.prototype,SymbolPolyfill.toStringTag,d("c","Symbol"));defineProperty(HiddenSymbol.prototype,SymbolPolyfill.toStringTag,d("c",SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));defineProperty(HiddenSymbol.prototype,SymbolPolyfill.toPrimitive,d("c",SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]))},{"./validate-symbol":77,d:16}],77:[function(require,module,exports){"use strict";var isSymbol=require("./is-symbol");module.exports=function(value){if(!isSymbol(value))throw new TypeError(value+" is not a symbol");return value}},{"./is-symbol":75}],78:[function(require,module,exports){"use strict";var d=require("d"),callable=require("es5-ext/object/valid-callable"),apply=Function.prototype.apply,call=Function.prototype.call,create=Object.create,defineProperty=Object.defineProperty,defineProperties=Object.defineProperties,hasOwnProperty=Object.prototype.hasOwnProperty,descriptor={configurable:true,enumerable:false,writable:true},on,once,off,emit,methods,descriptors,base;on=function(type,listener){var data;callable(listener);if(!hasOwnProperty.call(this,"__ee__")){data=descriptor.value=create(null);defineProperty(this,"__ee__",descriptor);descriptor.value=null}else{data=this.__ee__}if(!data[type])data[type]=listener;else if(typeof data[type]==="object")data[type].push(listener);else data[type]=[data[type],listener];return this};once=function(type,listener){var once,self;callable(listener);self=this;on.call(this,type,once=function(){off.call(self,type,once);apply.call(listener,this,arguments)});once.__eeOnceListener__=listener;return this};off=function(type,listener){var data,listeners,candidate,i;callable(listener);if(!hasOwnProperty.call(this,"__ee__"))return this;data=this.__ee__;if(!data[type])return this;listeners=data[type];if(typeof listeners==="object"){for(i=0;candidate=listeners[i];++i){if(candidate===listener||candidate.__eeOnceListener__===listener){if(listeners.length===2)data[type]=listeners[i?0:1];else listeners.splice(i,1)}}}else{if(listeners===listener||listeners.__eeOnceListener__===listener){delete data[type]}}return this};emit=function(type){var i,l,listener,listeners,args;if(!hasOwnProperty.call(this,"__ee__"))return;listeners=this.__ee__[type];if(!listeners)return;if(typeof listeners==="object"){l=arguments.length;args=new Array(l-1);for(i=1;i>1;var nBits=-7;var i=isLE?nBytes-1:0;var d=isLE?-1:1;var s=buffer[offset+i];i+=d;e=s&(1<<-nBits)-1;s>>=-nBits;nBits+=eLen;for(;nBits>0;e=e*256+buffer[offset+i],i+=d,nBits-=8){}m=e&(1<<-nBits)-1;e>>=-nBits;nBits+=mLen;for(;nBits>0;m=m*256+buffer[offset+i],i+=d,nBits-=8){}if(e===0){e=1-eBias}else if(e===eMax){return m?NaN:(s?-1:1)*Infinity}else{m=m+Math.pow(2,mLen);e=e-eBias}return(s?-1:1)*m*Math.pow(2,e-mLen)};exports.write=function(buffer,value,offset,isLE,mLen,nBytes){var e,m,c;var eLen=nBytes*8-mLen-1;var eMax=(1<>1;var rt=mLen===23?Math.pow(2,-24)-Math.pow(2,-77):0;var i=isLE?0:nBytes-1;var d=isLE?1:-1;var s=value<0||value===0&&1/value<0?1:0;value=Math.abs(value);if(isNaN(value)||value===Infinity){m=isNaN(value)?1:0;e=eMax}else{e=Math.floor(Math.log(value)/Math.LN2);if(value*(c=Math.pow(2,-e))<1){e--;c*=2}if(e+eBias>=1){value+=rt/c}else{value+=rt*Math.pow(2,1-eBias)}if(value*c>=2){e++;c/=2}if(e+eBias>=eMax){m=0;e=eMax}else if(e+eBias>=1){m=(value*c-1)*Math.pow(2,mLen);e=e+eBias}else{m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen);e=0}}for(;mLen>=8;buffer[offset+i]=m&255,i+=d,m/=256,mLen-=8){}e=e<0;buffer[offset+i]=e&255,i+=d,e/=256,eLen-=8){}buffer[offset+i-d]|=s*128}},{}],80:[function(require,module,exports){if(typeof Object.create==="function"){module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:false,writable:true,configurable:true}})}}else{module.exports=function inherits(ctor,superCtor){ctor.super_=superCtor;var TempCtor=function(){};TempCtor.prototype=superCtor.prototype;ctor.prototype=new TempCtor;ctor.prototype.constructor=ctor}}},{}],81:[function(require,module,exports){module.exports=function(obj){return obj!=null&&(isBuffer(obj)||isSlowBuffer(obj)||!!obj._isBuffer)};function isBuffer(obj){return!!obj.constructor&&typeof obj.constructor.isBuffer==="function"&&obj.constructor.isBuffer(obj)}function isSlowBuffer(obj){return typeof obj.readFloatLE==="function"&&typeof obj.slice==="function"&&isBuffer(obj.slice(0,0))}},{}],82:[function(require,module,exports){"use strict";var Buffer=require("safe-buffer").Buffer;var protocol=module.exports;protocol.types={0:"reserved",1:"connect",2:"connack",3:"publish",4:"puback",5:"pubrec",6:"pubrel",7:"pubcomp",8:"subscribe",9:"suback",10:"unsubscribe",11:"unsuback",12:"pingreq",13:"pingresp",14:"disconnect",15:"auth"};protocol.codes={};for(var k in protocol.types){var v=protocol.types[k];protocol.codes[v]=k}protocol.CMD_SHIFT=4;protocol.CMD_MASK=240;protocol.DUP_MASK=8;protocol.QOS_MASK=3;protocol.QOS_SHIFT=1;protocol.RETAIN_MASK=1;protocol.LENGTH_MASK=127;protocol.LENGTH_FIN_MASK=128;protocol.SESSIONPRESENT_MASK=1;protocol.SESSIONPRESENT_HEADER=Buffer.from([protocol.SESSIONPRESENT_MASK]);protocol.CONNACK_HEADER=Buffer.from([protocol.codes["connack"]<this.length)srcEnd=this.length;if(srcStart>=this.length)return dst||Buffer.alloc(0);if(srcEnd<=0)return dst||Buffer.alloc(0);var copy=!!dst,off=this._offset(srcStart),len=srcEnd-srcStart,bytes=len,bufoff=copy&&dstStart||0,start=off[1],l,i;if(srcStart===0&&srcEnd==this.length){if(!copy){return this._bufs.length===1?this._bufs[0]:Buffer.concat(this._bufs,this.length)}for(i=0;il){this._bufs[i].copy(dst,bufoff,start)}else{this._bufs[i].copy(dst,bufoff,start,start+bytes);break}bufoff+=l;bytes-=l;if(start)start=0}return dst};BufferList.prototype.shallowSlice=function shallowSlice(start,end){start=start||0;end=end||this.length;if(start<0)start+=this.length;if(end<0)end+=this.length;var startOffset=this._offset(start),endOffset=this._offset(end),buffers=this._bufs.slice(startOffset[0],endOffset[0]+1);if(endOffset[1]==0)buffers.pop();else buffers[buffers.length-1]=buffers[buffers.length-1].slice(0,endOffset[1]);if(startOffset[1]!=0)buffers[0]=buffers[0].slice(startOffset[1]);return new BufferList(buffers)};BufferList.prototype.toString=function toString(encoding,start,end){return this.slice(start,end).toString(encoding)};BufferList.prototype.consume=function consume(bytes){while(this._bufs.length){if(bytes>=this._bufs[0].length){bytes-=this._bufs[0].length;this.length-=this._bufs[0].length;this._bufs.shift()}else{this._bufs[0]=this._bufs[0].slice(bytes);this.length-=bytes;break}}return this};BufferList.prototype.duplicate=function duplicate(){var i=0,copy=new BufferList;for(;i>8,0);buffer.writeUInt8(i&255,0+1);return buffer}function generateCache(){for(var i=0;i=0&&length<128)return 1;else if(length>=128&&length<16384)return 2;else if(length>=16384&&length<2097152)return 3;else if(length>=2097152&&length<268435456)return 4;else return 0}function genBufVariableByteInt(num){var digit=0;var pos=0;var length=calcVariableByteIntLength(num);var buffer=Buffer.allocUnsafe(length);do{digit=num%128|0;num=num/128|0;if(num>0)digit=digit|128;buffer.writeUInt8(digit,pos++)}while(num>0);return{data:buffer,length:length}}function generate4ByteBuffer(num){var buffer=Buffer.allocUnsafe(4);buffer.writeUInt32BE(num,0);return buffer}module.exports={cache:cache,generateCache:generateCache,generateNumber:generateBuffer,genBufVariableByteInt:genBufVariableByteInt,generate4ByteBuffer:generate4ByteBuffer}},{"safe-buffer":110}],87:[function(require,module,exports){function Packet(){this.cmd=null;this.retain=false;this.qos=0;this.dup=false;this.length=-1;this.topic=null;this.payload=null}module.exports=Packet},{}],88:[function(require,module,exports){"use strict";var bl=require("bl");var inherits=require("inherits");var EE=require("events").EventEmitter;var Packet=require("./packet");var constants=require("./constants");function Parser(opt){if(!(this instanceof Parser))return new Parser(opt);this.settings=opt||{};this._states=["_parseHeader","_parseLength","_parsePayload","_newPacket"];this._resetState()}inherits(Parser,EE);Parser.prototype._resetState=function(){this.packet=new Packet;this.error=null;this._list=bl();this._stateCounter=0};Parser.prototype.parse=function(buf){if(this.error)this._resetState();this._list.append(buf);while((this.packet.length!==-1||this._list.length>0)&&this[this._states[this._stateCounter]]()&&!this.error){this._stateCounter++;if(this._stateCounter>=this._states.length)this._stateCounter=0}return this._list.length};Parser.prototype._parseHeader=function(){var zero=this._list.readUInt8(0);this.packet.cmd=constants.types[zero>>constants.CMD_SHIFT];this.packet.retain=(zero&constants.RETAIN_MASK)!==0;this.packet.qos=zero>>constants.QOS_SHIFT&constants.QOS_MASK;this.packet.dup=(zero&constants.DUP_MASK)!==0;this._list.consume(1);return true};Parser.prototype._parseLength=function(){var result=this._parseVarByteNum(true);if(result){this.packet.length=result.value;this._list.consume(result.bytes)}return!!result};Parser.prototype._parsePayload=function(){var result=false;if(this.packet.length===0||this._list.length>=this.packet.length){this._pos=0;switch(this.packet.cmd){case"connect":this._parseConnect();break;case"connack":this._parseConnack();break;case"publish":this._parsePublish();break;case"puback":case"pubrec":case"pubrel":case"pubcomp":this._parseConfirmation();break;case"subscribe":this._parseSubscribe();break;case"suback":this._parseSuback();break;case"unsubscribe":this._parseUnsubscribe();break;case"unsuback":this._parseUnsuback();break;case"pingreq":case"pingresp":break;case"disconnect":this._parseDisconnect();break;case"auth":this._parseAuth();break;default:this._emitError(new Error("Not supported"))}result=true}return result};Parser.prototype._parseConnect=function(){var protocolId;var clientId;var topic;var payload;var password;var username;var flags={};var packet=this.packet;protocolId=this._parseString();if(protocolId===null)return this._emitError(new Error("Cannot parse protocolId"));if(protocolId!=="MQTT"&&protocolId!=="MQIsdp"){return this._emitError(new Error("Invalid protocolId"))}packet.protocolId=protocolId;if(this._pos>=this._list.length)return this._emitError(new Error("Packet too short"));packet.protocolVersion=this._list.readUInt8(this._pos);if(packet.protocolVersion!==3&&packet.protocolVersion!==4&&packet.protocolVersion!==5){return this._emitError(new Error("Invalid protocol version"))}this._pos++;if(this._pos>=this._list.length){return this._emitError(new Error("Packet too short"))}flags.username=this._list.readUInt8(this._pos)&constants.USERNAME_MASK;flags.password=this._list.readUInt8(this._pos)&constants.PASSWORD_MASK;flags.will=this._list.readUInt8(this._pos)&constants.WILL_FLAG_MASK;if(flags.will){packet.will={};packet.will.retain=(this._list.readUInt8(this._pos)&constants.WILL_RETAIN_MASK)!==0;packet.will.qos=(this._list.readUInt8(this._pos)&constants.WILL_QOS_MASK)>>constants.WILL_QOS_SHIFT}packet.clean=(this._list.readUInt8(this._pos)&constants.CLEAN_SESSION_MASK)!==0;this._pos++;packet.keepalive=this._parseNum();if(packet.keepalive===-1)return this._emitError(new Error("Packet too short"));if(packet.protocolVersion===5){var properties=this._parseProperties();if(Object.getOwnPropertyNames(properties).length){packet.properties=properties}}clientId=this._parseString();if(clientId===null)return this._emitError(new Error("Packet too short"));packet.clientId=clientId;if(flags.will){if(packet.protocolVersion===5){var willProperties=this._parseProperties();if(Object.getOwnPropertyNames(willProperties).length){packet.will.properties=willProperties}}topic=this._parseString();if(topic===null)return this._emitError(new Error("Cannot parse will topic"));packet.will.topic=topic;payload=this._parseBuffer();if(payload===null)return this._emitError(new Error("Cannot parse will payload"));packet.will.payload=payload}if(flags.username){username=this._parseString();if(username===null)return this._emitError(new Error("Cannot parse username"));packet.username=username}if(flags.password){password=this._parseBuffer();if(password===null)return this._emitError(new Error("Cannot parse password"));packet.password=password}this.settings=packet;return packet};Parser.prototype._parseConnack=function(){var packet=this.packet;if(this._list.length<2)return null;packet.sessionPresent=!!(this._list.readUInt8(this._pos++)&constants.SESSIONPRESENT_MASK);if(this.settings.protocolVersion===5){packet.reasonCode=this._list.readUInt8(this._pos++)}else{packet.returnCode=this._list.readUInt8(this._pos++)}if(packet.returnCode===-1||packet.reasonCode===-1)return this._emitError(new Error("Cannot parse return code"));if(this.settings.protocolVersion===5){var properties=this._parseProperties();if(Object.getOwnPropertyNames(properties).length){packet.properties=properties}}};Parser.prototype._parsePublish=function(){var packet=this.packet;packet.topic=this._parseString();if(packet.topic===null)return this._emitError(new Error("Cannot parse topic"));if(packet.qos>0)if(!this._parseMessageId()){return}if(this.settings.protocolVersion===5){var properties=this._parseProperties();if(Object.getOwnPropertyNames(properties).length){packet.properties=properties}}packet.payload=this._list.slice(this._pos,packet.length)};Parser.prototype._parseSubscribe=function(){var packet=this.packet;var topic;var options;var qos;var rh;var rap;var nl;var subscription;if(packet.qos!==1){return this._emitError(new Error("Wrong subscribe header"))}packet.subscriptions=[];if(!this._parseMessageId()){return}if(this.settings.protocolVersion===5){var properties=this._parseProperties();if(Object.getOwnPropertyNames(properties).length){packet.properties=properties}}while(this._pos>constants.SUBSCRIBE_OPTIONS_NL_SHIFT&constants.SUBSCRIBE_OPTIONS_NL_MASK)!==0;rap=(options>>constants.SUBSCRIBE_OPTIONS_RAP_SHIFT&constants.SUBSCRIBE_OPTIONS_RAP_MASK)!==0;rh=options>>constants.SUBSCRIBE_OPTIONS_RH_SHIFT&constants.SUBSCRIBE_OPTIONS_RH_MASK;subscription={topic:topic,qos:qos};if(this.settings.protocolVersion===5){subscription.nl=nl;subscription.rap=rap;subscription.rh=rh}packet.subscriptions.push(subscription)}};Parser.prototype._parseSuback=function(){var packet=this.packet;this.packet.granted=[];if(!this._parseMessageId()){return}if(this.settings.protocolVersion===5){var properties=this._parseProperties();if(Object.getOwnPropertyNames(properties).length){packet.properties=properties}}while(this._pos2){packet.reasonCode=this._parseByte();var properties=this._parseProperties();if(Object.getOwnPropertyNames(properties).length){packet.properties=properties}}}return true};Parser.prototype._parseDisconnect=function(){var packet=this.packet;if(this.settings.protocolVersion===5){packet.reasonCode=this._parseByte();var properties=this._parseProperties();if(Object.getOwnPropertyNames(properties).length){packet.properties=properties}}return true};Parser.prototype._parseAuth=function(){var packet=this.packet;if(this.settings.protocolVersion!==5){return this._emitError(new Error("Not supported auth packet for this version MQTT"))}packet.reasonCode=this._parseByte();var properties=this._parseProperties();if(Object.getOwnPropertyNames(properties).length){packet.properties=properties}return true};Parser.prototype._parseMessageId=function(){var packet=this.packet;packet.messageId=this._parseNum();if(packet.messageId===null){this._emitError(new Error("Cannot parse messageId"));return false}return true};Parser.prototype._parseString=function(maybeBuffer){var length=this._parseNum();var result;var end=length+this._pos;if(length===-1||end>this._list.length||end>this.packet.length)return null;result=this._list.toString("utf8",this._pos,end);this._pos+=length;return result};Parser.prototype._parseStringPair=function(){return{name:this._parseString(),value:this._parseString()}};Parser.prototype._parseBuffer=function(){var length=this._parseNum();var result;var end=length+this._pos;if(length===-1||end>this._list.length||end>this.packet.length)return null;result=this._list.slice(this._pos,end);this._pos+=length;return result};Parser.prototype._parseNum=function(){if(this._list.length-this._pos<2)return-1;var result=this._list.readUInt16BE(this._pos);this._pos+=2;return result};Parser.prototype._parse4ByteNum=function(){if(this._list.length-this._pos<4)return-1;var result=this._list.readUInt32BE(this._pos);this._pos+=4;return result};Parser.prototype._parseVarByteNum=function(fullInfoFlag){var bytes=0;var mul=1;var length=0;var result=true;var current;var padding=this._pos?this._pos:0;while(bytes<5){current=this._list.readUInt8(padding+bytes++);length+=mul*(current&constants.LENGTH_MASK);mul*=128;if((current&constants.LENGTH_FIN_MASK)===0)break;if(this._list.length<=bytes){result=false;break}}if(padding){this._pos+=bytes}result=result?fullInfoFlag?{bytes:bytes,value:length}:length:false;return result};Parser.prototype._parseByte=function(){var result=this._list.readUInt8(this._pos);this._pos++;return result};Parser.prototype._parseByType=function(type){switch(type){case"byte":{return this._parseByte()!==0}case"int8":{return this._parseByte()}case"int16":{return this._parseNum()}case"int32":{return this._parse4ByteNum()}case"var":{return this._parseVarByteNum()}case"string":{return this._parseString()}case"pair":{return this._parseStringPair()}case"binary":{return this._parseBuffer()}}};Parser.prototype._parseProperties=function(){var length=this._parseVarByteNum();var start=this._pos;var end=start+length;var result={};while(this._pos65535||keepalive%1!==0){stream.emit("error",new Error("Invalid keepalive"));return false}else length+=2;length+=1;if(protocolVersion===5){var propertiesData=getProperties(stream,properties);length+=propertiesData.length}if(will){if(typeof will!=="object"){stream.emit("error",new Error("Invalid will"));return false}if(!will.topic||typeof will.topic!=="string"){stream.emit("error",new Error("Invalid will topic"));return false}else{length+=Buffer.byteLength(will.topic)+2}if(will.payload){if(will.payload.length>=0){if(typeof will.payload==="string"){length+=Buffer.byteLength(will.payload)+2}else{length+=will.payload.length+2}}else{stream.emit("error",new Error("Invalid will payload"));return false}var willProperties={};if(protocolVersion===5){willProperties=getProperties(stream,will.properties);length+=willProperties.length}}}var providedUsername=false;if(username!=null){if(isStringOrBuffer(username)){providedUsername=true;length+=Buffer.byteLength(username)+2}else{stream.emit("error",new Error("Invalid username"));return false}}if(password!=null){if(!providedUsername){stream.emit("error",new Error("Username is required to use password"));return false}if(isStringOrBuffer(password)){length+=byteLength(password)+2}else{stream.emit("error",new Error("Invalid password"));return false}}stream.write(protocol.CONNECT_HEADER);writeVarByteInt(stream,length);writeStringOrBuffer(stream,protocolId);stream.write(protocolVersion===4?protocol.VERSION4:protocolVersion===5?protocol.VERSION5:protocol.VERSION3);var flags=0;flags|=username!=null?protocol.USERNAME_MASK:0;flags|=password!=null?protocol.PASSWORD_MASK:0;flags|=will&&will.retain?protocol.WILL_RETAIN_MASK:0;flags|=will&&will.qos?will.qos<0)writeNumber(stream,id);if(propertiesData!=null){propertiesData.write()}return stream.write(payload)}function confirmation(packet,stream,opts){var version=opts?opts.protocolVersion:4;var settings=packet||{};var type=settings.cmd||"puback";var id=settings.messageId;var dup=settings.dup&&type==="pubrel"?protocol.DUP_MASK:0;var qos=0;var reasonCode=settings.reasonCode;var properties=settings.properties;var length=version===5?3:2;if(type==="pubrel")qos=1;if(typeof id!=="number"){stream.emit("error",new Error("Invalid messageId"));return false}var propertiesData=null;if(version===5){propertiesData=getPropertiesByMaximumPacketSize(stream,properties,opts,length);if(!propertiesData){return false}length+=propertiesData.length}stream.write(protocol.ACKS[type][qos][dup][0]);writeVarByteInt(stream,length);writeNumber(stream,id);if(version===5){stream.write(Buffer.from([reasonCode]))}if(propertiesData!==null){propertiesData.write()}return true}function subscribe(packet,stream,opts){var version=opts?opts.protocolVersion:4;var settings=packet||{};var dup=settings.dup?protocol.DUP_MASK:0;var id=settings.messageId;var subs=settings.subscriptions;var properties=settings.properties;var length=0;if(typeof id!=="number"){stream.emit("error",new Error("Invalid messageId"));return false}else length+=2;var propertiesData=null;if(version===5){propertiesData=getProperties(stream,properties);length+=propertiesData.length}if(typeof subs==="object"&&subs.length){for(var i=0;i2){stream.emit("error",new Error("Invalid subscriptions - invalid Retain Handling"));return false}}length+=Buffer.byteLength(itopic)+2+1}}else{stream.emit("error",new Error("Invalid subscriptions"));return false}stream.write(protocol.SUBSCRIBE_HEADER[1][dup?1:0][0]);writeVarByteInt(stream,length);writeNumber(stream,id);if(propertiesData!==null){propertiesData.write()}var result=true;for(var j=0;jmaximumPacketSize){var currentMayEmptyProp=mayEmptyProps.shift();if(currentMayEmptyProp&&properties[currentMayEmptyProp]){delete properties[currentMayEmptyProp];propertiesData=getProperties(stream,properties)}else{return false}}}return propertiesData}function writeProperties(stream,properties,propertiesLength){writeVarByteInt(stream,propertiesLength);for(var propName in properties){if(properties.hasOwnProperty(propName)&&properties[propName]!==null){var value=properties[propName];var type=protocol.propertiesTypes[propName];switch(type){case"byte":{stream.write(Buffer.from([protocol.properties[propName]]));stream.write(Buffer.from([+value]));break}case"int8":{stream.write(Buffer.from([protocol.properties[propName]]));stream.write(Buffer.from([value]));break}case"binary":{stream.write(Buffer.from([protocol.properties[propName]]));writeStringOrBuffer(stream,value);break}case"int16":{stream.write(Buffer.from([protocol.properties[propName]]));writeNumber(stream,value);break}case"int32":{stream.write(Buffer.from([protocol.properties[propName]]));write4ByteNumber(stream,value);break}case"var":{stream.write(Buffer.from([protocol.properties[propName]]));writeVarByteInt(stream,value);break}case"string":{stream.write(Buffer.from([protocol.properties[propName]]));writeString(stream,value);break}case"pair":{Object.getOwnPropertyNames(value).forEach(function(name){stream.write(Buffer.from([protocol.properties[propName]]));writeStringPair(stream,name.toString(),value[name].toString())});break}default:{stream.emit("error",new Error("Invalid property "+propName));return false}}}}}function byteLength(bufOrString){if(!bufOrString)return 0;else if(bufOrString instanceof Buffer)return bufOrString.length;else return Buffer.byteLength(bufOrString)}function isStringOrBuffer(field){return typeof field==="string"||field instanceof Buffer}module.exports=generate},{"./constants":82,"./numbers":86,"process-nextick-args":91,"safe-buffer":110}],90:[function(require,module,exports){var wrappy=require("wrappy");module.exports=wrappy(once);module.exports.strict=wrappy(onceStrict);once.proto=once(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return once(this)},configurable:true});Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return onceStrict(this)},configurable:true})});function once(fn){var f=function(){if(f.called)return f.value;f.called=true;return f.value=fn.apply(this,arguments)};f.called=false;return f}function onceStrict(fn){var f=function(){if(f.called)throw new Error(f.onceError);f.called=true;return f.value=fn.apply(this,arguments)};var name=fn.name||"Function wrapped with `once`";f.onceError=name+" shouldn't be called more than once";f.called=false;return f}},{wrappy:120}],91:[function(require,module,exports){(function(process){"use strict";if(!process.version||process.version.indexOf("v0.")===0||process.version.indexOf("v1.")===0&&process.version.indexOf("v1.8.")!==0){module.exports={nextTick:nextTick}}else{module.exports=process}function nextTick(fn,arg1,arg2,arg3){if(typeof fn!=="function"){throw new TypeError('"callback" argument must be a function')}var len=arguments.length;var args,i;switch(len){case 0:case 1:return process.nextTick(fn);case 2:return process.nextTick(function afterTickOne(){fn.call(null,arg1)});case 3:return process.nextTick(function afterTickTwo(){fn.call(null,arg1,arg2)});case 4:return process.nextTick(function afterTickThree(){fn.call(null,arg1,arg2,arg3)});default:args=new Array(len-1);i=0;while(i1){for(var i=1;i= 0x80 (not a basic code point)","invalid-input":"Invalid input"},baseMinusTMin=base-tMin,floor=Math.floor,stringFromCharCode=String.fromCharCode,key;function error(type){throw new RangeError(errors[type])}function map(array,fn){var length=array.length;var result=[];while(length--){result[length]=fn(array[length])}return result}function mapDomain(string,fn){var parts=string.split("@");var result="";if(parts.length>1){result=parts[0]+"@";string=parts[1]}string=string.replace(regexSeparators,".");var labels=string.split(".");var encoded=map(labels,fn).join(".");return result+encoded}function ucs2decode(string){var output=[],counter=0,length=string.length,value,extra;while(counter=55296&&value<=56319&&counter65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value);return output}).join("")}function basicToDigit(codePoint){if(codePoint-48<10){return codePoint-22}if(codePoint-65<26){return codePoint-65}if(codePoint-97<26){return codePoint-97}return base}function digitToBasic(digit,flag){return digit+22+75*(digit<26)-((flag!=0)<<5)}function adapt(delta,numPoints,firstTime){var k=0;delta=firstTime?floor(delta/damp):delta>>1;delta+=floor(delta/numPoints);for(;delta>baseMinusTMin*tMax>>1;k+=base){delta=floor(delta/baseMinusTMin)}return floor(k+(baseMinusTMin+1)*delta/(delta+skew))}function decode(input){var output=[],inputLength=input.length,out,i=0,n=initialN,bias=initialBias,basic,j,index,oldi,w,k,digit,t,baseMinusT;basic=input.lastIndexOf(delimiter);if(basic<0){basic=0}for(j=0;j=128){error("not-basic")}output.push(input.charCodeAt(j))}for(index=basic>0?basic+1:0;index=inputLength){error("invalid-input")}digit=basicToDigit(input.charCodeAt(index++));if(digit>=base||digit>floor((maxInt-i)/w)){error("overflow")}i+=digit*w;t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias;if(digitfloor(maxInt/baseMinusT)){error("overflow")}w*=baseMinusT}out=output.length+1;bias=adapt(i-oldi,out,oldi==0);if(floor(i/out)>maxInt-n){error("overflow")}n+=floor(i/out);i%=out;output.splice(i++,0,n)}return ucs2encode(output)}function encode(input){var n,delta,handledCPCount,basicLength,bias,j,m,q,k,t,currentValue,output=[],inputLength,handledCPCountPlusOne,baseMinusT,qMinusT;input=ucs2decode(input);inputLength=input.length;n=initialN;delta=0;bias=initialBias;for(j=0;j=n&¤tValuefloor((maxInt-delta)/handledCPCountPlusOne)){error("overflow")}delta+=(m-n)*handledCPCountPlusOne;n=m;for(j=0;jmaxInt){error("overflow")}if(currentValue==n){for(q=delta,k=base;;k+=base){t=k<=bias?tMin:k>=bias+tMax?tMax:k-bias;if(q0&&len>maxKeys){len=maxKeys}for(var i=0;i=0){kstr=x.substr(0,idx);vstr=x.substr(idx+1)}else{kstr=x;vstr=""}k=decodeURIComponent(kstr);v=decodeURIComponent(vstr);if(!hasOwnProperty(obj,k)){obj[k]=v}else if(isArray(obj[k])){obj[k].push(v)}else{obj[k]=[obj[k],v]}}return obj};var isArray=Array.isArray||function(xs){return Object.prototype.toString.call(xs)==="[object Array]"}},{}],95:[function(require,module,exports){"use strict";var stringifyPrimitive=function(v){switch(typeof v){case"string":return v;case"boolean":return v?"true":"false";case"number":return isFinite(v)?v:"";default:return""}};module.exports=function(obj,sep,eq,name){sep=sep||"&";eq=eq||"=";if(obj===null){obj=undefined}if(typeof obj==="object"){return map(objectKeys(obj),function(k){var ks=encodeURIComponent(stringifyPrimitive(k))+eq;if(isArray(obj[k])){return map(obj[k],function(v){return ks+encodeURIComponent(stringifyPrimitive(v))}).join(sep)}else{return ks+encodeURIComponent(stringifyPrimitive(obj[k]))}}).join(sep)}if(!name)return"";return encodeURIComponent(stringifyPrimitive(name))+eq+encodeURIComponent(stringifyPrimitive(obj))};var isArray=Array.isArray||function(xs){return Object.prototype.toString.call(xs)==="[object Array]"};function map(xs,f){if(xs.map)return xs.map(f);var res=[];for(var i=0;i0){if(typeof chunk!=="string"&&!state.objectMode&&Object.getPrototypeOf(chunk)!==Buffer.prototype){chunk=_uint8ArrayToBuffer(chunk)}if(addToFront){if(state.endEmitted)stream.emit("error",new Error("stream.unshift() after end event"));else addChunk(stream,state,chunk,true)}else if(state.ended){stream.emit("error",new Error("stream.push() after EOF"))}else{state.reading=false;if(state.decoder&&!encoding){chunk=state.decoder.write(chunk);if(state.objectMode||chunk.length!==0)addChunk(stream,state,chunk,false);else maybeReadMore(stream,state)}else{addChunk(stream,state,chunk,false)}}}else if(!addToFront){state.reading=false}}return needMoreData(state)}function addChunk(stream,state,chunk,addToFront){if(state.flowing&&state.length===0&&!state.sync){stream.emit("data",chunk);stream.read(0)}else{state.length+=state.objectMode?1:chunk.length;if(addToFront)state.buffer.unshift(chunk);else state.buffer.push(chunk);if(state.needReadable)emitReadable(stream)}maybeReadMore(stream,state)}function chunkInvalid(state,chunk){var er;if(!_isUint8Array(chunk)&&typeof chunk!=="string"&&chunk!==undefined&&!state.objectMode){er=new TypeError("Invalid non-string/buffer chunk")}return er}function needMoreData(state){return!state.ended&&(state.needReadable||state.length=MAX_HWM){n=MAX_HWM}else{n--;n|=n>>>1;n|=n>>>2;n|=n>>>4;n|=n>>>8;n|=n>>>16;n++}return n}function howMuchToRead(n,state){if(n<=0||state.length===0&&state.ended)return 0;if(state.objectMode)return 1;if(n!==n){if(state.flowing&&state.length)return state.buffer.head.data.length;else return state.length}if(n>state.highWaterMark)state.highWaterMark=computeNewHighWaterMark(n);if(n<=state.length)return n;if(!state.ended){state.needReadable=true;return 0}return state.length}Readable.prototype.read=function(n){debug("read",n);n=parseInt(n,10);var state=this._readableState;var nOrig=n;if(n!==0)state.emittedReadable=false;if(n===0&&state.needReadable&&(state.length>=state.highWaterMark||state.ended)){debug("read: emitReadable",state.length,state.ended);if(state.length===0&&state.ended)endReadable(this);else emitReadable(this);return null}n=howMuchToRead(n,state);if(n===0&&state.ended){if(state.length===0)endReadable(this);return null}var doRead=state.needReadable;debug("need readable",doRead);if(state.length===0||state.length-n0)ret=fromList(n,state);else ret=null;if(ret===null){state.needReadable=true;n=0}else{state.length-=n}if(state.length===0){if(!state.ended)state.needReadable=true;if(nOrig!==n&&state.ended)endReadable(this)}if(ret!==null)this.emit("data",ret);return ret};function onEofChunk(stream,state){if(state.ended)return;if(state.decoder){var chunk=state.decoder.end();if(chunk&&chunk.length){state.buffer.push(chunk);state.length+=state.objectMode?1:chunk.length}}state.ended=true;emitReadable(stream)}function emitReadable(stream){var state=stream._readableState;state.needReadable=false;if(!state.emittedReadable){debug("emitReadable",state.flowing);state.emittedReadable=true;if(state.sync)pna.nextTick(emitReadable_,stream);else emitReadable_(stream)}}function emitReadable_(stream){debug("emit readable");stream.emit("readable");flow(stream)}function maybeReadMore(stream,state){if(!state.readingMore){state.readingMore=true;pna.nextTick(maybeReadMore_,stream,state)}}function maybeReadMore_(stream,state){var len=state.length;while(!state.reading&&!state.flowing&&!state.ended&&state.length1&&indexOf(state.pipes,dest)!==-1)&&!cleanedUp){debug("false write response, pause",src._readableState.awaitDrain);src._readableState.awaitDrain++;increasedAwaitDrain=true}src.pause()}}function onerror(er){debug("onerror",er);unpipe();dest.removeListener("error",onerror);if(EElistenerCount(dest,"error")===0)dest.emit("error",er)}prependListener(dest,"error",onerror);function onclose(){dest.removeListener("finish",onfinish);unpipe()}dest.once("close",onclose);function onfinish(){debug("onfinish");dest.removeListener("close",onclose);unpipe()}dest.once("finish",onfinish);function unpipe(){debug("unpipe");src.unpipe(dest)}dest.emit("pipe",src);if(!state.flowing){debug("pipe resume");src.resume()}return dest};function pipeOnDrain(src){return function(){var state=src._readableState;debug("pipeOnDrain",state.awaitDrain);if(state.awaitDrain)state.awaitDrain--;if(state.awaitDrain===0&&EElistenerCount(src,"data")){state.flowing=true;flow(src)}}}Readable.prototype.unpipe=function(dest){var state=this._readableState;var unpipeInfo={hasUnpiped:false};if(state.pipesCount===0)return this;if(state.pipesCount===1){if(dest&&dest!==state.pipes)return this;if(!dest)dest=state.pipes;state.pipes=null;state.pipesCount=0;state.flowing=false;if(dest)dest.emit("unpipe",this,unpipeInfo);return this}if(!dest){var dests=state.pipes;var len=state.pipesCount;state.pipes=null;state.pipesCount=0;state.flowing=false;for(var i=0;i=state.length){if(state.decoder)ret=state.buffer.join("");else if(state.buffer.length===1)ret=state.buffer.head.data;else ret=state.buffer.concat(state.length);state.buffer.clear()}else{ret=fromListPartial(n,state.buffer,state.decoder)}return ret}function fromListPartial(n,list,hasStrings){var ret;if(nstr.length?str.length:n;if(nb===str.length)ret+=str;else ret+=str.slice(0,n);n-=nb;if(n===0){if(nb===str.length){++c;if(p.next)list.head=p.next;else list.head=list.tail=null}else{list.head=p;p.data=str.slice(nb)}break}++c}list.length-=c;return ret}function copyFromBuffer(n,list){var ret=Buffer.allocUnsafe(n);var p=list.head;var c=1;p.data.copy(ret);n-=p.data.length;while(p=p.next){var buf=p.data;var nb=n>buf.length?buf.length:n;buf.copy(ret,ret.length-n,0,nb);n-=nb;if(n===0){if(nb===buf.length){++c;if(p.next)list.head=p.next;else list.head=list.tail=null}else{list.head=p;p.data=buf.slice(nb)}break}++c}list.length-=c;return ret}function endReadable(stream){var state=stream._readableState;if(state.length>0)throw new Error('"endReadable()" called on non-empty stream');if(!state.endEmitted){state.ended=true;pna.nextTick(endReadableNT,state,stream)}}function endReadableNT(state,stream){if(!state.endEmitted&&state.length===0){state.endEmitted=true;stream.readable=false;stream.emit("end")}}function indexOf(xs,x){for(var i=0,l=xs.length;i-1?setImmediate:pna.nextTick;var Duplex;Writable.WritableState=WritableState;var util=require("core-util-is");util.inherits=require("inherits");var internalUtil={deprecate:require("util-deprecate")};var Stream=require("./internal/streams/stream");var Buffer=require("safe-buffer").Buffer;var OurUint8Array=global.Uint8Array||function(){};function _uint8ArrayToBuffer(chunk){return Buffer.from(chunk)}function _isUint8Array(obj){return Buffer.isBuffer(obj)||obj instanceof OurUint8Array}var destroyImpl=require("./internal/streams/destroy");util.inherits(Writable,Stream);function nop(){}function WritableState(options,stream){Duplex=Duplex||require("./_stream_duplex");options=options||{};var isDuplex=stream instanceof Duplex;this.objectMode=!!options.objectMode;if(isDuplex)this.objectMode=this.objectMode||!!options.writableObjectMode;var hwm=options.highWaterMark;var writableHwm=options.writableHighWaterMark;var defaultHwm=this.objectMode?16:16*1024;if(hwm||hwm===0)this.highWaterMark=hwm;else if(isDuplex&&(writableHwm||writableHwm===0))this.highWaterMark=writableHwm;else this.highWaterMark=defaultHwm;this.highWaterMark=Math.floor(this.highWaterMark);this.finalCalled=false;this.needDrain=false;this.ending=false;this.ended=false;this.finished=false;this.destroyed=false;var noDecode=options.decodeStrings===false;this.decodeStrings=!noDecode;this.defaultEncoding=options.defaultEncoding||"utf8";this.length=0;this.writing=false;this.corked=0;this.sync=true;this.bufferProcessing=false;this.onwrite=function(er){onwrite(stream,er)};this.writecb=null;this.writelen=0;this.bufferedRequest=null;this.lastBufferedRequest=null;this.pendingcb=0;this.prefinished=false;this.errorEmitted=false;this.bufferedRequestCount=0;this.corkedRequestsFree=new CorkedRequest(this)}WritableState.prototype.getBuffer=function getBuffer(){var current=this.bufferedRequest;var out=[];while(current){out.push(current);current=current.next}return out};(function(){try{Object.defineProperty(WritableState.prototype,"buffer",{get:internalUtil.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer "+"instead.","DEP0003")})}catch(_){}})();var realHasInstance;if(typeof Symbol==="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==="function"){realHasInstance=Function.prototype[Symbol.hasInstance];Object.defineProperty(Writable,Symbol.hasInstance,{value:function(object){if(realHasInstance.call(this,object))return true;if(this!==Writable)return false;return object&&object._writableState instanceof WritableState}})}else{realHasInstance=function(object){return object instanceof this}}function Writable(options){Duplex=Duplex||require("./_stream_duplex");if(!realHasInstance.call(Writable,this)&&!(this instanceof Duplex)){return new Writable(options)}this._writableState=new WritableState(options,this);this.writable=true;if(options){if(typeof options.write==="function")this._write=options.write;if(typeof options.writev==="function")this._writev=options.writev;if(typeof options.destroy==="function")this._destroy=options.destroy;if(typeof options.final==="function")this._final=options.final}Stream.call(this)}Writable.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe, not readable"))};function writeAfterEnd(stream,cb){var er=new Error("write after end");stream.emit("error",er);pna.nextTick(cb,er)}function validChunk(stream,state,chunk,cb){var valid=true;var er=false;if(chunk===null){er=new TypeError("May not write null values to stream")}else if(typeof chunk!=="string"&&chunk!==undefined&&!state.objectMode){er=new TypeError("Invalid non-string/buffer chunk")}if(er){stream.emit("error",er);pna.nextTick(cb,er);valid=false}return valid}Writable.prototype.write=function(chunk,encoding,cb){var state=this._writableState;var ret=false;var isBuf=!state.objectMode&&_isUint8Array(chunk);if(isBuf&&!Buffer.isBuffer(chunk)){chunk=_uint8ArrayToBuffer(chunk)}if(typeof encoding==="function"){cb=encoding;encoding=null}if(isBuf)encoding="buffer";else if(!encoding)encoding=state.defaultEncoding;if(typeof cb!=="function")cb=nop;if(state.ended)writeAfterEnd(this,cb);else if(isBuf||validChunk(this,state,chunk,cb)){state.pendingcb++;ret=writeOrBuffer(this,state,isBuf,chunk,encoding,cb)}return ret};Writable.prototype.cork=function(){var state=this._writableState;state.corked++};Writable.prototype.uncork=function(){var state=this._writableState;if(state.corked){state.corked--;if(!state.writing&&!state.corked&&!state.finished&&!state.bufferProcessing&&state.bufferedRequest)clearBuffer(this,state)}};Writable.prototype.setDefaultEncoding=function setDefaultEncoding(encoding){if(typeof encoding==="string")encoding=encoding.toLowerCase();if(!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((encoding+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+encoding);this._writableState.defaultEncoding=encoding;return this};function decodeChunk(state,chunk,encoding){if(!state.objectMode&&state.decodeStrings!==false&&typeof chunk==="string"){chunk=Buffer.from(chunk,encoding)}return chunk}Object.defineProperty(Writable.prototype,"writableHighWaterMark",{enumerable:false,get:function(){return this._writableState.highWaterMark}});function writeOrBuffer(stream,state,isBuf,chunk,encoding,cb){if(!isBuf){var newChunk=decodeChunk(state,chunk,encoding);if(chunk!==newChunk){isBuf=true;encoding="buffer";chunk=newChunk}}var len=state.objectMode?1:chunk.length;state.length+=len;var ret=state.length0)this.tail.next=entry;else this.head=entry;this.tail=entry;++this.length};BufferList.prototype.unshift=function unshift(v){var entry={data:v,next:this.head};if(this.length===0)this.tail=entry;this.head=entry;++this.length};BufferList.prototype.shift=function shift(){if(this.length===0)return;var ret=this.head.data;if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;--this.length;return ret};BufferList.prototype.clear=function clear(){this.head=this.tail=null;this.length=0};BufferList.prototype.join=function join(s){if(this.length===0)return"";var p=this.head;var ret=""+p.data;while(p=p.next){ret+=s+p.data}return ret};BufferList.prototype.concat=function concat(n){if(this.length===0)return Buffer.alloc(0);if(this.length===1)return this.head.data;var ret=Buffer.allocUnsafe(n>>>0);var p=this.head;var i=0;while(p){copyBuffer(p.data,ret,i);i+=p.data.length;p=p.next}return ret};return BufferList}();if(util&&util.inspect&&util.inspect.custom){module.exports.prototype[util.inspect.custom]=function(){var obj=util.inspect({length:this.length});return this.constructor.name+" "+obj}}},{"safe-buffer":110,util:11}],104:[function(require,module,exports){"use strict";var pna=require("process-nextick-args");function destroy(err,cb){var _this=this;var readableDestroyed=this._readableState&&this._readableState.destroyed;var writableDestroyed=this._writableState&&this._writableState.destroyed;if(readableDestroyed||writableDestroyed){if(cb){cb(err)}else if(err&&(!this._writableState||!this._writableState.errorEmitted)){pna.nextTick(emitErrorNT,this,err)}return this}if(this._readableState){this._readableState.destroyed=true}if(this._writableState){this._writableState.destroyed=true}this._destroy(err||null,function(err){if(!cb&&err){pna.nextTick(emitErrorNT,_this,err);if(_this._writableState){_this._writableState.errorEmitted=true}}else if(cb){cb(err)}});return this}function undestroy(){if(this._readableState){this._readableState.destroyed=false;this._readableState.reading=false;this._readableState.ended=false;this._readableState.endEmitted=false}if(this._writableState){this._writableState.destroyed=false;this._writableState.ended=false;this._writableState.ending=false;this._writableState.finished=false;this._writableState.errorEmitted=false}}function emitErrorNT(self,err){self.emit("error",err)}module.exports={destroy:destroy,undestroy:undestroy}},{"process-nextick-args":91}],105:[function(require,module,exports){module.exports=require("events").EventEmitter},{events:13}],106:[function(require,module,exports){var toString={}.toString;module.exports=Array.isArray||function(arr){return toString.call(arr)=="[object Array]"}},{}],107:[function(require,module,exports){"use strict";var Buffer=require("safe-buffer").Buffer;var isEncoding=Buffer.isEncoding||function(encoding){encoding=""+encoding;switch(encoding&&encoding.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return true;default:return false}};function _normalizeEncoding(enc){if(!enc)return"utf8";var retried;while(true){switch(enc){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return enc;default:if(retried)return;enc=(""+enc).toLowerCase();retried=true}}}function normalizeEncoding(enc){var nenc=_normalizeEncoding(enc);if(typeof nenc!=="string"&&(Buffer.isEncoding===isEncoding||!isEncoding(enc)))throw new Error("Unknown encoding: "+enc);return nenc||enc}exports.StringDecoder=StringDecoder;function StringDecoder(encoding){this.encoding=normalizeEncoding(encoding);var nb;switch(this.encoding){case"utf16le":this.text=utf16Text;this.end=utf16End;nb=4;break;case"utf8":this.fillLast=utf8FillLast;nb=4;break;case"base64":this.text=base64Text;this.end=base64End;nb=3;break;default:this.write=simpleWrite;this.end=simpleEnd;return}this.lastNeed=0;this.lastTotal=0;this.lastChar=Buffer.allocUnsafe(nb)}StringDecoder.prototype.write=function(buf){if(buf.length===0)return"";var r;var i;if(this.lastNeed){r=this.fillLast(buf);if(r===undefined)return"";i=this.lastNeed;this.lastNeed=0}else{i=0}if(i>5===6)return 2;else if(byte>>4===14)return 3;else if(byte>>3===30)return 4;return byte>>6===2?-1:-2}function utf8CheckIncomplete(self,buf,i){var j=buf.length-1;if(j=0){if(nb>0)self.lastNeed=nb-1;return nb}if(--j=0){if(nb>0)self.lastNeed=nb-2;return nb}if(--j=0){if(nb>0){if(nb===2)nb=0;else self.lastNeed=nb-3}return nb}return 0}function utf8CheckExtraBytes(self,buf,p){if((buf[0]&192)!==128){self.lastNeed=0;return"�"}if(self.lastNeed>1&&buf.length>1){if((buf[1]&192)!==128){self.lastNeed=1;return"�"}if(self.lastNeed>2&&buf.length>2){if((buf[2]&192)!==128){self.lastNeed=2;return"�"}}}}function utf8FillLast(buf){var p=this.lastTotal-this.lastNeed;var r=utf8CheckExtraBytes(this,buf,p);if(r!==undefined)return r;if(this.lastNeed<=buf.length){buf.copy(this.lastChar,p,0,this.lastNeed);return this.lastChar.toString(this.encoding,0,this.lastTotal)}buf.copy(this.lastChar,p,0,buf.length);this.lastNeed-=buf.length}function utf8Text(buf,i){var total=utf8CheckIncomplete(this,buf,i);if(!this.lastNeed)return buf.toString("utf8",i);this.lastTotal=total;var end=buf.length-(total-this.lastNeed);buf.copy(this.lastChar,0,end);return buf.toString("utf8",i,end)}function utf8End(buf){var r=buf&&buf.length?this.write(buf):"";if(this.lastNeed)return r+"�";return r}function utf16Text(buf,i){if((buf.length-i)%2===0){var r=buf.toString("utf16le",i);if(r){var c=r.charCodeAt(r.length-1);if(c>=55296&&c<=56319){this.lastNeed=2;this.lastTotal=4;this.lastChar[0]=buf[buf.length-2];this.lastChar[1]=buf[buf.length-1];return r.slice(0,-1)}}return r}this.lastNeed=1;this.lastTotal=2;this.lastChar[0]=buf[buf.length-1];return buf.toString("utf16le",i,buf.length-1)}function utf16End(buf){var r=buf&&buf.length?this.write(buf):"";if(this.lastNeed){var end=this.lastTotal-this.lastNeed;return r+this.lastChar.toString("utf16le",0,end)}return r}function base64Text(buf,i){var n=(buf.length-i)%3;if(n===0)return buf.toString("base64",i);this.lastNeed=3-n;this.lastTotal=3;if(n===1){this.lastChar[0]=buf[buf.length-1]}else{this.lastChar[0]=buf[buf.length-2];this.lastChar[1]=buf[buf.length-1]}return buf.toString("base64",i,buf.length-n)}function base64End(buf){var r=buf&&buf.length?this.write(buf):"";if(this.lastNeed)return r+this.lastChar.toString("base64",0,3-this.lastNeed);return r}function simpleWrite(buf){return buf.toString(this.encoding)}function simpleEnd(buf){return buf&&buf.length?this.write(buf):""}},{"safe-buffer":110}],108:[function(require,module,exports){exports=module.exports=require("./lib/_stream_readable.js");exports.Stream=exports;exports.Readable=exports;exports.Writable=require("./lib/_stream_writable.js");exports.Duplex=require("./lib/_stream_duplex.js");exports.Transform=require("./lib/_stream_transform.js");exports.PassThrough=require("./lib/_stream_passthrough.js")},{"./lib/_stream_duplex.js":98,"./lib/_stream_passthrough.js":99,"./lib/_stream_readable.js":100,"./lib/_stream_transform.js":101,"./lib/_stream_writable.js":102}],109:[function(require,module,exports){"use strict";function ReInterval(callback,interval,args){var self=this;this._callback=callback;this._args=args;this._interval=setInterval(callback,interval,this._args);this.reschedule=function(interval){if(!interval)interval=self._interval;if(self._interval)clearInterval(self._interval);self._interval=setInterval(self._callback,interval,self._args)};this.clear=function(){if(self._interval){clearInterval(self._interval);self._interval=undefined}};this.destroy=function(){if(self._interval){clearInterval(self._interval)}self._callback=undefined;self._interval=undefined;self._args=undefined}}function reInterval(){if(typeof arguments[0]!=="function")throw new Error("callback needed");if(typeof arguments[1]!=="number")throw new Error("interval needed");var args;if(arguments.length>0){args=new Array(arguments.length-2);for(var i=0;i=0){item._idleTimeoutId=setTimeout(function onTimeout(){if(item._onTimeout)item._onTimeout()},msecs)}};exports.setImmediate=typeof setImmediate==="function"?setImmediate:function(fn){var id=nextImmediateId++;var args=arguments.length<2?false:slice.call(arguments,1);immediateIds[id]=true;nextTick(function onNextTick(){if(immediateIds[id]){if(args){fn.apply(null,args)}else{fn.call(null)}exports.clearImmediate(id)}});return id};exports.clearImmediate=typeof clearImmediate==="function"?clearImmediate:function(id){delete immediateIds[id]}}).call(this,require("timers").setImmediate,require("timers").clearImmediate)},{"process/browser.js":92,timers:112}],113:[function(require,module,exports){"use strict";var punycode=require("punycode");var util=require("./util");exports.parse=urlParse;exports.resolve=urlResolve;exports.resolveObject=urlResolveObject;exports.format=urlFormat;exports.Url=Url;function Url(){this.protocol=null;this.slashes=null;this.auth=null;this.host=null;this.port=null;this.hostname=null;this.hash=null;this.search=null;this.query=null;this.pathname=null;this.path=null;this.href=null}var protocolPattern=/^([a-z0-9.+-]+:)/i,portPattern=/:[0-9]*$/,simplePathPattern=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,delims=["<",">",'"',"`"," ","\r","\n","\t"],unwise=["{","}","|","\\","^","`"].concat(delims),autoEscape=["'"].concat(unwise),nonHostChars=["%","/","?",";","#"].concat(autoEscape),hostEndingChars=["/","?","#"],hostnameMaxLen=255,hostnamePartPattern=/^[+a-z0-9A-Z_-]{0,63}$/,hostnamePartStart=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,unsafeProtocol={javascript:true,"javascript:":true},hostlessProtocol={javascript:true,"javascript:":true},slashedProtocol={http:true,https:true,ftp:true,gopher:true,file:true,"http:":true,"https:":true,"ftp:":true,"gopher:":true,"file:":true},querystring=require("querystring");function urlParse(url,parseQueryString,slashesDenoteHost){if(url&&util.isObject(url)&&url instanceof Url)return url;var u=new Url;u.parse(url,parseQueryString,slashesDenoteHost);return u}Url.prototype.parse=function(url,parseQueryString,slashesDenoteHost){if(!util.isString(url)){throw new TypeError("Parameter 'url' must be a string, not "+typeof url)}var queryIndex=url.indexOf("?"),splitter=queryIndex!==-1&&queryIndex127){newpart+="x"}else{newpart+=part[j]}}if(!newpart.match(hostnamePartPattern)){var validParts=hostparts.slice(0,i);var notHost=hostparts.slice(i+1);var bit=part.match(hostnamePartStart);if(bit){validParts.push(bit[1]);notHost.unshift(bit[2])}if(notHost.length){rest="/"+notHost.join(".")+rest}this.hostname=validParts.join(".");break}}}}if(this.hostname.length>hostnameMaxLen){this.hostname=""}else{this.hostname=this.hostname.toLowerCase()}if(!ipv6Hostname){this.hostname=punycode.toASCII(this.hostname)}var p=this.port?":"+this.port:"";var h=this.hostname||"";this.host=h+p;this.href+=this.host;if(ipv6Hostname){this.hostname=this.hostname.substr(1,this.hostname.length-2);if(rest[0]!=="/"){rest="/"+rest}}}if(!unsafeProtocol[lowerProto]){for(var i=0,l=autoEscape.length;i0?result.host.split("@"):false;if(authInHost){result.auth=authInHost.shift();result.host=result.hostname=authInHost.shift()}}result.search=relative.search;result.query=relative.query;if(!util.isNull(result.pathname)||!util.isNull(result.search)){result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")}result.href=result.format();return result}if(!srcPath.length){result.pathname=null;if(result.search){result.path="/"+result.search}else{result.path=null}result.href=result.format();return result}var last=srcPath.slice(-1)[0];var hasTrailingSlash=(result.host||relative.host||srcPath.length>1)&&(last==="."||last==="..")||last==="";var up=0;for(var i=srcPath.length;i>=0;i--){last=srcPath[i];if(last==="."){srcPath.splice(i,1)}else if(last===".."){srcPath.splice(i,1);up++}else if(up){srcPath.splice(i,1);up--}}if(!mustEndAbs&&!removeAllDots){for(;up--;up){srcPath.unshift("..")}}if(mustEndAbs&&srcPath[0]!==""&&(!srcPath[0]||srcPath[0].charAt(0)!=="/")){srcPath.unshift("")}if(hasTrailingSlash&&srcPath.join("/").substr(-1)!=="/"){srcPath.push("")}var isAbsolute=srcPath[0]===""||srcPath[0]&&srcPath[0].charAt(0)==="/";if(psychotic){result.hostname=result.host=isAbsolute?"":srcPath.length?srcPath.shift():"";var authInHost=result.host&&result.host.indexOf("@")>0?result.host.split("@"):false;if(authInHost){result.auth=authInHost.shift();result.host=result.hostname=authInHost.shift()}}mustEndAbs=mustEndAbs||result.host&&srcPath.length;if(mustEndAbs&&!isAbsolute){srcPath.unshift("")}if(!srcPath.length){result.pathname=null;result.path=null}else{result.pathname=srcPath.join("/")}if(!util.isNull(result.pathname)||!util.isNull(result.search)){result.path=(result.pathname?result.pathname:"")+(result.search?result.search:"")}result.auth=relative.auth||result.auth;result.slashes=result.slashes||relative.slashes;result.href=result.format();return result};Url.prototype.parseHost=function(){var host=this.host;var port=portPattern.exec(host);if(port){port=port[0];if(port!==":"){this.port=port.substr(1)}host=host.substr(0,host.length-port.length)}if(host)this.hostname=host}},{"./util":114,punycode:93,querystring:96}],114:[function(require,module,exports){"use strict";module.exports={isString:function(arg){return typeof arg==="string"},isObject:function(arg){return typeof arg==="object"&&arg!==null},isNull:function(arg){return arg===null},isNullOrUndefined:function(arg){return arg==null}}},{}],115:[function(require,module,exports){(function(global){module.exports=deprecate;function deprecate(fn,msg){if(config("noDeprecation")){return fn}var warned=false;function deprecated(){if(!warned){if(config("throwDeprecation")){throw new Error(msg)}else if(config("traceDeprecation")){console.trace(msg)}else{console.warn(msg)}warned=true}return fn.apply(this,arguments)}return deprecated}function config(name){try{if(!global.localStorage)return false}catch(_){return false}var val=global.localStorage[name];if(null==val)return false;return String(val).toLowerCase()==="true"}}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],116:[function(require,module,exports){module.exports=function isBuffer(arg){return arg&&typeof arg==="object"&&typeof arg.copy==="function"&&typeof arg.fill==="function"&&typeof arg.readUInt8==="function"}},{}],117:[function(require,module,exports){(function(process,global){var formatRegExp=/%[sdj%]/g;exports.format=function(f){if(!isString(f)){var objects=[];for(var i=0;i=len)return x;switch(x){case"%s":return String(args[i++]);case"%d":return Number(args[i++]);case"%j":try{return JSON.stringify(args[i++])}catch(_){return"[Circular]"}default:return x}});for(var x=args[i];i=3)ctx.depth=arguments[2];if(arguments.length>=4)ctx.colors=arguments[3];if(isBoolean(opts)){ctx.showHidden=opts}else if(opts){exports._extend(ctx,opts)}if(isUndefined(ctx.showHidden))ctx.showHidden=false;if(isUndefined(ctx.depth))ctx.depth=2;if(isUndefined(ctx.colors))ctx.colors=false;if(isUndefined(ctx.customInspect))ctx.customInspect=true;if(ctx.colors)ctx.stylize=stylizeWithColor;return formatValue(ctx,obj,ctx.depth)}exports.inspect=inspect;inspect.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]};inspect.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"};function stylizeWithColor(str,styleType){var style=inspect.styles[styleType];if(style){return"["+inspect.colors[style][0]+"m"+str+"["+inspect.colors[style][1]+"m"}else{return str}}function stylizeNoColor(str,styleType){return str}function arrayToHash(array){var hash={};array.forEach(function(val,idx){hash[val]=true});return hash}function formatValue(ctx,value,recurseTimes){if(ctx.customInspect&&value&&isFunction(value.inspect)&&value.inspect!==exports.inspect&&!(value.constructor&&value.constructor.prototype===value)){var ret=value.inspect(recurseTimes,ctx);if(!isString(ret)){ret=formatValue(ctx,ret,recurseTimes)}return ret}var primitive=formatPrimitive(ctx,value);if(primitive){return primitive}var keys=Object.keys(value);var visibleKeys=arrayToHash(keys);if(ctx.showHidden){keys=Object.getOwnPropertyNames(value)}if(isError(value)&&(keys.indexOf("message")>=0||keys.indexOf("description")>=0)){return formatError(value)}if(keys.length===0){if(isFunction(value)){var name=value.name?": "+value.name:"";return ctx.stylize("[Function"+name+"]","special")}if(isRegExp(value)){return ctx.stylize(RegExp.prototype.toString.call(value),"regexp")}if(isDate(value)){return ctx.stylize(Date.prototype.toString.call(value),"date")}if(isError(value)){return formatError(value)}}var base="",array=false,braces=["{","}"];if(isArray(value)){array=true;braces=["[","]"]}if(isFunction(value)){var n=value.name?": "+value.name:"";base=" [Function"+n+"]"}if(isRegExp(value)){base=" "+RegExp.prototype.toString.call(value)}if(isDate(value)){base=" "+Date.prototype.toUTCString.call(value)}if(isError(value)){base=" "+formatError(value)}if(keys.length===0&&(!array||value.length==0)){return braces[0]+base+braces[1]}if(recurseTimes<0){if(isRegExp(value)){return ctx.stylize(RegExp.prototype.toString.call(value),"regexp")}else{return ctx.stylize("[Object]","special")}}ctx.seen.push(value);var output;if(array){output=formatArray(ctx,value,recurseTimes,visibleKeys,keys)}else{output=keys.map(function(key){return formatProperty(ctx,value,recurseTimes,visibleKeys,key,array)})}ctx.seen.pop();return reduceToSingleString(output,base,braces)}function formatPrimitive(ctx,value){if(isUndefined(value))return ctx.stylize("undefined","undefined");if(isString(value)){var simple="'"+JSON.stringify(value).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return ctx.stylize(simple,"string")}if(isNumber(value))return ctx.stylize(""+value,"number");if(isBoolean(value))return ctx.stylize(""+value,"boolean");if(isNull(value))return ctx.stylize("null","null")}function formatError(value){return"["+Error.prototype.toString.call(value)+"]"}function formatArray(ctx,value,recurseTimes,visibleKeys,keys){var output=[];for(var i=0,l=value.length;i-1){if(array){str=str.split("\n").map(function(line){return" "+line}).join("\n").substr(2)}else{str="\n"+str.split("\n").map(function(line){return" "+line}).join("\n")}}}else{str=ctx.stylize("[Circular]","special")}}if(isUndefined(name)){if(array&&key.match(/^\d+$/)){return str}name=JSON.stringify(""+key);if(name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)){name=name.substr(1,name.length-2);name=ctx.stylize(name,"name")}else{name=name.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'");name=ctx.stylize(name,"string")}}return name+": "+str}function reduceToSingleString(output,base,braces){var numLinesEst=0;var length=output.reduce(function(prev,cur){numLinesEst++;if(cur.indexOf("\n")>=0)numLinesEst++;return prev+cur.replace(/\u001b\[\d\d?m/g,"").length+1},0);if(length>60){return braces[0]+(base===""?"":base+"\n ")+" "+output.join(",\n ")+" "+braces[1]}return braces[0]+base+" "+output.join(", ")+" "+braces[1]}function isArray(ar){return Array.isArray(ar)}exports.isArray=isArray;function isBoolean(arg){return typeof arg==="boolean"}exports.isBoolean=isBoolean;function isNull(arg){return arg===null}exports.isNull=isNull;function isNullOrUndefined(arg){return arg==null}exports.isNullOrUndefined=isNullOrUndefined;function isNumber(arg){return typeof arg==="number"}exports.isNumber=isNumber;function isString(arg){return typeof arg==="string"}exports.isString=isString;function isSymbol(arg){return typeof arg==="symbol"}exports.isSymbol=isSymbol;function isUndefined(arg){return arg===void 0}exports.isUndefined=isUndefined;function isRegExp(re){return isObject(re)&&objectToString(re)==="[object RegExp]"}exports.isRegExp=isRegExp;function isObject(arg){return typeof arg==="object"&&arg!==null}exports.isObject=isObject;function isDate(d){return isObject(d)&&objectToString(d)==="[object Date]"}exports.isDate=isDate;function isError(e){return isObject(e)&&(objectToString(e)==="[object Error]"||e instanceof Error)}exports.isError=isError;function isFunction(arg){return typeof arg==="function"}exports.isFunction=isFunction;function isPrimitive(arg){return arg===null||typeof arg==="boolean"||typeof arg==="number"||typeof arg==="string"||typeof arg==="symbol"||typeof arg==="undefined"}exports.isPrimitive=isPrimitive;exports.isBuffer=require("./support/isBuffer");function objectToString(o){return Object.prototype.toString.call(o)}function pad(n){return n<10?"0"+n.toString(10):n.toString(10)}var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function timestamp(){var d=new Date;var time=[pad(d.getHours()),pad(d.getMinutes()),pad(d.getSeconds())].join(":");return[d.getDate(),months[d.getMonth()],time].join(" ")}exports.log=function(){console.log("%s - %s",timestamp(),exports.format.apply(exports,arguments))};exports.inherits=require("inherits");exports._extend=function(origin,add){if(!add||!isObject(add))return origin;var keys=Object.keys(add);var i=keys.length;while(i--){origin[keys[i]]=add[keys[i]]}return origin};function hasOwnProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}}).call(this,require("_process"),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./support/isBuffer":116,_process:92,inherits:80}],118:[function(require,module,exports){(function(process,global){"use strict";var Transform=require("readable-stream").Transform;var duplexify=require("duplexify");var WS=require("ws");var Buffer=require("safe-buffer").Buffer;module.exports=WebSocketStream;function buildProxy(options,socketWrite,socketEnd){var proxy=new Transform({objectMode:options.objectMode});proxy._write=socketWrite;proxy._flush=socketEnd;return proxy}function WebSocketStream(target,protocols,options){var stream,socket;var isBrowser=process.title==="browser";var isNative=!!global.WebSocket;var socketWrite=isBrowser?socketWriteBrowser:socketWriteNode;if(protocols&&!Array.isArray(protocols)&&"object"===typeof protocols){options=protocols;protocols=null;if(typeof options.protocol==="string"||Array.isArray(options.protocol)){protocols=options.protocol}}if(!options)options={};if(options.objectMode===undefined){options.objectMode=!(options.binary===true||options.binary===undefined)}var proxy=buildProxy(options,socketWrite,socketEnd);if(!options.objectMode){proxy._writev=writev}var bufferSize=options.browserBufferSize||1024*512;var bufferTimeout=options.browserBufferTimeout||1e3;if(typeof target==="object"){socket=target}else{if(isNative&&isBrowser){socket=new WS(target,protocols)}else{socket=new WS(target,protocols,options)}socket.binaryType="arraybuffer"}if(socket.readyState===socket.OPEN){stream=proxy}else{stream=duplexify.obj();socket.onopen=onopen}stream.socket=socket;socket.onclose=onclose;socket.onerror=onerror;socket.onmessage=onmessage;proxy.on("close",destroy);var coerceToBuffer=!options.objectMode;function socketWriteNode(chunk,enc,next){if(socket.readyState!==socket.OPEN){next();return}if(coerceToBuffer&&typeof chunk==="string"){chunk=Buffer.from(chunk,"utf8")}socket.send(chunk,next)}function socketWriteBrowser(chunk,enc,next){if(socket.bufferedAmount>bufferSize){setTimeout(socketWriteBrowser,bufferTimeout,chunk,enc,next);return}if(coerceToBuffer&&typeof chunk==="string"){chunk=Buffer.from(chunk,"utf8")}try{socket.send(chunk)}catch(err){return next(err)}next()}function socketEnd(done){socket.close();done()}function onopen(){stream.setReadable(proxy);stream.setWritable(proxy);stream.emit("connect")}function onclose(){stream.end();stream.destroy()}function onerror(err){stream.destroy(err)}function onmessage(event){var data=event.data;if(data instanceof ArrayBuffer)data=Buffer.from(data);else data=Buffer.from(data,"utf8");proxy.push(data)}function destroy(){socket.close()}function writev(chunks,cb){var buffers=new Array(chunks.length);for(var i=0;i> 6),
+ 0x80 | (charcode & 0x3f));
+ }
+ else if (charcode < 0xd800 || charcode >= 0xe000) {
+ utf8.push(0xe0 | (charcode >> 12),
+ 0x80 | ((charcode >> 6) & 0x3f),
+ 0x80 | (charcode & 0x3f));
+ }
+ // surrogate pair
+ else {
+ i++;
+ // UTF-16 encodes 0x10000-0x10FFFF by
+ // subtracting 0x10000 and splitting the
+ // 20 bits of 0x0-0xFFFFF into two halves
+ charcode = 0x10000 + (((charcode & 0x3ff) << 10)
+ | (str.charCodeAt(i) & 0x3ff));
+ utf8.push(0xf0 | (charcode >> 18),
+ 0x80 | ((charcode >> 12) & 0x3f),
+ 0x80 | ((charcode >> 6) & 0x3f),
+ 0x80 | (charcode & 0x3f));
+ }
+ }
+ return utf8;
+}
+
+//字符串转GBK十六进制内码
+export function strToGBKHex(str) {
+ var ch, pos, val, ret = "", strSpecial = "!\"#$%&'()*+,/:;<=>?@[\]^`{|}~%";
+ console.log('GBK123');
+ for (var i = 0; i < str.length; i++) {
+ ch = str.charAt(i);
+ val = str.charCodeAt(i);
+ if (val >= 0x4e00 && val < 0x9FA5){
+ if ((pos = GBhz.indexOf(ch)) != -1)
+ ret += ("%" + (0xB0 + parseInt(pos / 94)).toString(16) + "%" + (0xA1 + pos % 94).toString(16)).toUpperCase();
+ }
+ else if ((pos = GBfh.indexOf(ch)) != -1){
+ console.log('GBfh'+ch)
+ ret += ("%" + (0xA1 + parseInt(pos / 94)).toString(16) + "%" + (0xA1 + pos % 94).toString(16)).toUpperCase();
+ }
+ else if ((pos = GBK_A940.indexOf(ch)) != -1){
+ console.log(pos)
+ ret += ("%" + (0xA9).toString(16) + "%" + (0x40 + pos).toString(16)).toUpperCase();
+ }
+ else if (strSpecial.indexOf(ch) != -1) {
+ // ret += "%" + val.toString(16);
+ ret += val.toString(16);
+ }
+ else if (ch == " ") {
+ // ret += "+";
+ ret += "20";
+ }
+ else {
+ //
+ ret += strToHexCharCode(ch);
+ }
+
+ }
+ return ret;
+}
+
+export function stringToByte(str) {
+ var bytes = new Array();
+ var len, c;
+ len = str.length;
+ for (var i = 0; i < len; i++) {
+ c = str.charCodeAt(i);
+ console.log('c', c)
+ if (c >= 0x010000 && c <= 0x10FFFF) {
+ bytes.push(((c >> 18) & 0x07) | 0xF0);
+ bytes.push(((c >> 12) & 0x3F) | 0x80);
+ bytes.push(((c >> 6) & 0x3F) | 0x80);
+ bytes.push((c & 0x3F) | 0x80);
+ } else if (c >= 0x000800 && c <= 0x00FFFF) {
+ bytes.push(((c >> 12) & 0x0F) | 0xE0);
+ bytes.push(((c >> 6) & 0x3F) | 0x80);
+ bytes.push((c & 0x3F) | 0x80);
+ } else if (c >= 0x000080 && c <= 0x0007FF) {
+ bytes.push(((c >> 6) & 0x1F) | 0xC0);
+ bytes.push((c & 0x3F) | 0x80);
+ } else {
+ bytes.push(c & 0xFF);
+ }
+ }
+ return bytes;
+}
+
+export function strToGBKByte(str) {
+ var bytes = new Array();
+ /*********改自qiushuiwuhen(2002-9-16)********/
+ var ch, pos, val, strSpecial = "!\"#$%&'()*+,/:;<=>?@[\]^`{|}~%";
+ for (var i = 0; i < str.length; i++) {
+ ch = str.charAt(i);
+ val = str.charCodeAt(i);
+ //console.log(ch, val)
+ if (val >= 0x4e00 && val < 0x9FA5) {
+ if ((pos = GBhz.indexOf(ch)) != -1){ bytes.push(0xB0 + parseInt(pos / 94)); bytes.push(0xA1 + pos % 94);}
+ }
+ else if ((pos = GBfh.indexOf(ch)) != -1){
+ bytes.push(0xA1 + parseInt(pos / 94)); bytes.push(0xA1 + pos % 94);
+ }
+ else if((pos = GBK_A940.indexOf(ch)) != -1){
+ bytes.push(0xA9); bytes.push(0x40+pos);
+ }
+ else if (strSpecial.indexOf(ch) != -1) {
+ bytes.push(val);
+ }
+ else if (ch == " ") {
+ bytes.push(0x20);
+ }
+ else {
+ bytes.push(val);
+ }
+ }
+
+ const buffer = new Uint8Array(bytes).buffer;;
+ return buffer;
+}
+
+/**
+ * utf8 byte to unicode string
+ * @param utf8Bytes
+ * @returns {string}
+ */
+export function utf8ByteToUnicodeStr(utf8Bytes) {
+ var unicodeStr = "";
+ for (var pos = 0; pos < utf8Bytes.length;) {
+ // var flag = utf8Bytes[pos];
+ var flag = utf8Bytes.charCodeAt(pos);
+ var unicode = 0;
+ if ((flag >>> 7) === 0) {
+ unicodeStr += String.fromCharCode(utf8Bytes[pos]);
+ pos += 1;
+
+ } else if ((flag & 0xFC) === 0xFC) {
+ unicode = (utf8Bytes[pos] & 0x3) << 30;
+ unicode |= (utf8Bytes[pos + 1] & 0x3F) << 24;
+ unicode |= (utf8Bytes[pos + 2] & 0x3F) << 18;
+ unicode |= (utf8Bytes[pos + 3] & 0x3F) << 12;
+ unicode |= (utf8Bytes[pos + 4] & 0x3F) << 6;
+ unicode |= (utf8Bytes[pos + 5] & 0x3F);
+ unicodeStr += String.fromCharCode(unicode);
+ pos += 6;
+
+ } else if ((flag & 0xF8) === 0xF8) {
+ unicode = (utf8Bytes[pos] & 0x7) << 24;
+ unicode |= (utf8Bytes[pos + 1] & 0x3F) << 18;
+ unicode |= (utf8Bytes[pos + 2] & 0x3F) << 12;
+ unicode |= (utf8Bytes[pos + 3] & 0x3F) << 6;
+ unicode |= (utf8Bytes[pos + 4] & 0x3F);
+ unicodeStr += String.fromCharCode(unicode);
+ pos += 5;
+
+ } else if ((flag & 0xF0) === 0xF0) {
+ unicode = (utf8Bytes[pos] & 0xF) << 18;
+ unicode |= (utf8Bytes[pos + 1] & 0x3F) << 12;
+ unicode |= (utf8Bytes[pos + 2] & 0x3F) << 6;
+ unicode |= (utf8Bytes[pos + 3] & 0x3F);
+ unicodeStr += String.fromCharCode(unicode);
+ pos += 4;
+
+ } else if ((flag & 0xE0) === 0xE0) {
+ unicode = (utf8Bytes[pos] & 0x1F) << 12;;
+ unicode |= (utf8Bytes[pos + 1] & 0x3F) << 6;
+ unicode |= (utf8Bytes[pos + 2] & 0x3F);
+ unicodeStr += String.fromCharCode(unicode);
+ pos += 3;
+
+ } else if ((flag & 0xC0) === 0xC0) { //110
+ unicode = (utf8Bytes[pos] & 0x3F) << 6;
+ unicode |= (utf8Bytes[pos + 1] & 0x3F);
+ unicodeStr += String.fromCharCode(unicode);
+ pos += 2;
+
+ } else {
+ unicodeStr += String.fromCharCode(utf8Bytes[pos]);
+ pos += 1;
+ }
+ }
+ return unicodeStr;
+}
\ No newline at end of file
diff --git a/src/components/kk-printer/utils/qrcode.js b/src/components/kk-printer/utils/qrcode.js
new file mode 100644
index 0000000..e4c994e
--- /dev/null
+++ b/src/components/kk-printer/utils/qrcode.js
@@ -0,0 +1,778 @@
+var QR = (function () {
+
+ // alignment pattern
+ var adelta = [
+ 0, 11, 15, 19, 23, 27, 31, // force 1 pat
+ 16, 18, 20, 22, 24, 26, 28, 20, 22, 24, 24, 26, 28, 28, 22, 24, 24,
+ 26, 26, 28, 28, 24, 24, 26, 26, 26, 28, 28, 24, 26, 26, 26, 28, 28
+ ];
+
+ // version block
+ var vpat = [
+ 0xc94, 0x5bc, 0xa99, 0x4d3, 0xbf6, 0x762, 0x847, 0x60d,
+ 0x928, 0xb78, 0x45d, 0xa17, 0x532, 0x9a6, 0x683, 0x8c9,
+ 0x7ec, 0xec4, 0x1e1, 0xfab, 0x08e, 0xc1a, 0x33f, 0xd75,
+ 0x250, 0x9d5, 0x6f0, 0x8ba, 0x79f, 0xb0b, 0x42e, 0xa64,
+ 0x541, 0xc69
+ ];
+
+ // final format bits with mask: level << 3 | mask
+ var fmtword = [
+ 0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976, //L
+ 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, //M
+ 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed, //Q
+ 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b //H
+ ];
+
+ // 4 per version: number of blocks 1,2; data width; ecc width
+ var eccblocks = [
+ 1, 0, 19, 7, 1, 0, 16, 10, 1, 0, 13, 13, 1, 0, 9, 17,
+ 1, 0, 34, 10, 1, 0, 28, 16, 1, 0, 22, 22, 1, 0, 16, 28,
+ 1, 0, 55, 15, 1, 0, 44, 26, 2, 0, 17, 18, 2, 0, 13, 22,
+ 1, 0, 80, 20, 2, 0, 32, 18, 2, 0, 24, 26, 4, 0, 9, 16,
+ 1, 0, 108, 26, 2, 0, 43, 24, 2, 2, 15, 18, 2, 2, 11, 22,
+ 2, 0, 68, 18, 4, 0, 27, 16, 4, 0, 19, 24, 4, 0, 15, 28,
+ 2, 0, 78, 20, 4, 0, 31, 18, 2, 4, 14, 18, 4, 1, 13, 26,
+ 2, 0, 97, 24, 2, 2, 38, 22, 4, 2, 18, 22, 4, 2, 14, 26,
+ 2, 0, 116, 30, 3, 2, 36, 22, 4, 4, 16, 20, 4, 4, 12, 24,
+ 2, 2, 68, 18, 4, 1, 43, 26, 6, 2, 19, 24, 6, 2, 15, 28,
+ 4, 0, 81, 20, 1, 4, 50, 30, 4, 4, 22, 28, 3, 8, 12, 24,
+ 2, 2, 92, 24, 6, 2, 36, 22, 4, 6, 20, 26, 7, 4, 14, 28,
+ 4, 0, 107, 26, 8, 1, 37, 22, 8, 4, 20, 24, 12, 4, 11, 22,
+ 3, 1, 115, 30, 4, 5, 40, 24, 11, 5, 16, 20, 11, 5, 12, 24,
+ 5, 1, 87, 22, 5, 5, 41, 24, 5, 7, 24, 30, 11, 7, 12, 24,
+ 5, 1, 98, 24, 7, 3, 45, 28, 15, 2, 19, 24, 3, 13, 15, 30,
+ 1, 5, 107, 28, 10, 1, 46, 28, 1, 15, 22, 28, 2, 17, 14, 28,
+ 5, 1, 120, 30, 9, 4, 43, 26, 17, 1, 22, 28, 2, 19, 14, 28,
+ 3, 4, 113, 28, 3, 11, 44, 26, 17, 4, 21, 26, 9, 16, 13, 26,
+ 3, 5, 107, 28, 3, 13, 41, 26, 15, 5, 24, 30, 15, 10, 15, 28,
+ 4, 4, 116, 28, 17, 0, 42, 26, 17, 6, 22, 28, 19, 6, 16, 30,
+ 2, 7, 111, 28, 17, 0, 46, 28, 7, 16, 24, 30, 34, 0, 13, 24,
+ 4, 5, 121, 30, 4, 14, 47, 28, 11, 14, 24, 30, 16, 14, 15, 30,
+ 6, 4, 117, 30, 6, 14, 45, 28, 11, 16, 24, 30, 30, 2, 16, 30,
+ 8, 4, 106, 26, 8, 13, 47, 28, 7, 22, 24, 30, 22, 13, 15, 30,
+ 10, 2, 114, 28, 19, 4, 46, 28, 28, 6, 22, 28, 33, 4, 16, 30,
+ 8, 4, 122, 30, 22, 3, 45, 28, 8, 26, 23, 30, 12, 28, 15, 30,
+ 3, 10, 117, 30, 3, 23, 45, 28, 4, 31, 24, 30, 11, 31, 15, 30,
+ 7, 7, 116, 30, 21, 7, 45, 28, 1, 37, 23, 30, 19, 26, 15, 30,
+ 5, 10, 115, 30, 19, 10, 47, 28, 15, 25, 24, 30, 23, 25, 15, 30,
+ 13, 3, 115, 30, 2, 29, 46, 28, 42, 1, 24, 30, 23, 28, 15, 30,
+ 17, 0, 115, 30, 10, 23, 46, 28, 10, 35, 24, 30, 19, 35, 15, 30,
+ 17, 1, 115, 30, 14, 21, 46, 28, 29, 19, 24, 30, 11, 46, 15, 30,
+ 13, 6, 115, 30, 14, 23, 46, 28, 44, 7, 24, 30, 59, 1, 16, 30,
+ 12, 7, 121, 30, 12, 26, 47, 28, 39, 14, 24, 30, 22, 41, 15, 30,
+ 6, 14, 121, 30, 6, 34, 47, 28, 46, 10, 24, 30, 2, 64, 15, 30,
+ 17, 4, 122, 30, 29, 14, 46, 28, 49, 10, 24, 30, 24, 46, 15, 30,
+ 4, 18, 122, 30, 13, 32, 46, 28, 48, 14, 24, 30, 42, 32, 15, 30,
+ 20, 4, 117, 30, 40, 7, 47, 28, 43, 22, 24, 30, 10, 67, 15, 30,
+ 19, 6, 118, 30, 18, 31, 47, 28, 34, 34, 24, 30, 20, 61, 15, 30
+ ];
+
+ // Galois field log table
+ var glog = [
+ 0xff, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6, 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,
+ 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,
+ 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,
+ 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,
+ 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,
+ 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,
+ 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,
+ 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,
+ 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,
+ 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,
+ 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,
+ 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,
+ 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,
+ 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,
+ 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,
+ 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf
+ ];
+
+ // Galios field exponent table
+ var gexp = [
+ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,
+ 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,
+ 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,
+ 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,
+ 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,
+ 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,
+ 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,
+ 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,
+ 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,
+ 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,
+ 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,
+ 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,
+ 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,
+ 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,
+ 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,
+ 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x00
+ ];
+
+ // Working buffers:
+ // data input and ecc append, image working buffer, fixed part of image, run lengths for badness
+ var strinbuf=[], eccbuf=[], qrframe=[], framask=[], rlens=[];
+ // Control values - width is based on version, last 4 are from table.
+ var version, width, neccblk1, neccblk2, datablkw, eccblkwid;
+ var ecclevel = 2;
+ // set bit to indicate cell in qrframe is immutable. symmetric around diagonal
+ function setmask(x, y)
+ {
+ var bt;
+ if (x > y) {
+ bt = x;
+ x = y;
+ y = bt;
+ }
+ // y*y = 1+3+5...
+ bt = y;
+ bt *= y;
+ bt += y;
+ bt >>= 1;
+ bt += x;
+ framask[bt] = 1;
+ }
+
+ // enter alignment pattern - black to qrframe, white to mask (later black frame merged to mask)
+ function putalign(x, y)
+ {
+ var j;
+
+ qrframe[x + width * y] = 1;
+ for (j = -2; j < 2; j++) {
+ qrframe[(x + j) + width * (y - 2)] = 1;
+ qrframe[(x - 2) + width * (y + j + 1)] = 1;
+ qrframe[(x + 2) + width * (y + j)] = 1;
+ qrframe[(x + j + 1) + width * (y + 2)] = 1;
+ }
+ for (j = 0; j < 2; j++) {
+ setmask(x - 1, y + j);
+ setmask(x + 1, y - j);
+ setmask(x - j, y - 1);
+ setmask(x + j, y + 1);
+ }
+ }
+
+ //========================================================================
+ // Reed Solomon error correction
+ // exponentiation mod N
+ function modnn(x)
+ {
+ while (x >= 255) {
+ x -= 255;
+ x = (x >> 8) + (x & 255);
+ }
+ return x;
+ }
+
+ var genpoly = [];
+
+ // Calculate and append ECC data to data block. Block is in strinbuf, indexes to buffers given.
+ function appendrs(data, dlen, ecbuf, eclen)
+ {
+ var i, j, fb;
+
+ for (i = 0; i < eclen; i++)
+ strinbuf[ecbuf + i] = 0;
+ for (i = 0; i < dlen; i++) {
+ fb = glog[strinbuf[data + i] ^ strinbuf[ecbuf]];
+ if (fb != 255) /* fb term is non-zero */
+ for (j = 1; j < eclen; j++)
+ strinbuf[ecbuf + j - 1] = strinbuf[ecbuf + j] ^ gexp[modnn(fb + genpoly[eclen - j])];
+ else
+ for( j = ecbuf ; j < ecbuf + eclen; j++ )
+ strinbuf[j] = strinbuf[j + 1];
+ strinbuf[ ecbuf + eclen - 1] = fb == 255 ? 0 : gexp[modnn(fb + genpoly[0])];
+ }
+ }
+
+ //========================================================================
+ // Frame data insert following the path rules
+
+ // check mask - since symmetrical use half.
+ function ismasked(x, y)
+ {
+ var bt;
+ if (x > y) {
+ bt = x;
+ x = y;
+ y = bt;
+ }
+ bt = y;
+ bt += y * y;
+ bt >>= 1;
+ bt += x;
+ return framask[bt];
+ }
+
+ //========================================================================
+ // Apply the selected mask out of the 8.
+ function applymask(m)
+ {
+ var x, y, r3x, r3y;
+
+ switch (m) {
+ case 0:
+ for (y = 0; y < width; y++)
+ for (x = 0; x < width; x++)
+ if (!((x + y) & 1) && !ismasked(x, y))
+ qrframe[x + y * width] ^= 1;
+ break;
+ case 1:
+ for (y = 0; y < width; y++)
+ for (x = 0; x < width; x++)
+ if (!(y & 1) && !ismasked(x, y))
+ qrframe[x + y * width] ^= 1;
+ break;
+ case 2:
+ for (y = 0; y < width; y++)
+ for (r3x = 0, x = 0; x < width; x++, r3x++) {
+ if (r3x == 3)
+ r3x = 0;
+ if (!r3x && !ismasked(x, y))
+ qrframe[x + y * width] ^= 1;
+ }
+ break;
+ case 3:
+ for (r3y = 0, y = 0; y < width; y++, r3y++) {
+ if (r3y == 3)
+ r3y = 0;
+ for (r3x = r3y, x = 0; x < width; x++, r3x++) {
+ if (r3x == 3)
+ r3x = 0;
+ if (!r3x && !ismasked(x, y))
+ qrframe[x + y * width] ^= 1;
+ }
+ }
+ break;
+ case 4:
+ for (y = 0; y < width; y++)
+ for (r3x = 0, r3y = ((y >> 1) & 1), x = 0; x < width; x++, r3x++) {
+ if (r3x == 3) {
+ r3x = 0;
+ r3y = !r3y;
+ }
+ if (!r3y && !ismasked(x, y))
+ qrframe[x + y * width] ^= 1;
+ }
+ break;
+ case 5:
+ for (r3y = 0, y = 0; y < width; y++, r3y++) {
+ if (r3y == 3)
+ r3y = 0;
+ for (r3x = 0, x = 0; x < width; x++, r3x++) {
+ if (r3x == 3)
+ r3x = 0;
+ if (!((x & y & 1) + !(!r3x | !r3y)) && !ismasked(x, y))
+ qrframe[x + y * width] ^= 1;
+ }
+ }
+ break;
+ case 6:
+ for (r3y = 0, y = 0; y < width; y++, r3y++) {
+ if (r3y == 3)
+ r3y = 0;
+ for (r3x = 0, x = 0; x < width; x++, r3x++) {
+ if (r3x == 3)
+ r3x = 0;
+ if (!(((x & y & 1) + (r3x && (r3x == r3y))) & 1) && !ismasked(x, y))
+ qrframe[x + y * width] ^= 1;
+ }
+ }
+ break;
+ case 7:
+ for (r3y = 0, y = 0; y < width; y++, r3y++) {
+ if (r3y == 3)
+ r3y = 0;
+ for (r3x = 0, x = 0; x < width; x++, r3x++) {
+ if (r3x == 3)
+ r3x = 0;
+ if (!(((r3x && (r3x == r3y)) + ((x + y) & 1)) & 1) && !ismasked(x, y))
+ qrframe[x + y * width] ^= 1;
+ }
+ }
+ break;
+ }
+ return;
+ }
+
+ // Badness coefficients.
+ var N1 = 3, N2 = 3, N3 = 40, N4 = 10;
+
+ // Using the table of the length of each run, calculate the amount of bad image
+ // - long runs or those that look like finders; called twice, once each for X and Y
+ function badruns(length)
+ {
+ var i;
+ var runsbad = 0;
+ for (i = 0; i <= length; i++)
+ if (rlens[i] >= 5)
+ runsbad += N1 + rlens[i] - 5;
+ // BwBBBwB as in finder
+ for (i = 3; i < length - 1; i += 2)
+ if (rlens[i - 2] == rlens[i + 2]
+ && rlens[i + 2] == rlens[i - 1]
+ && rlens[i - 1] == rlens[i + 1]
+ && rlens[i - 1] * 3 == rlens[i]
+ // white around the black pattern? Not part of spec
+ && (rlens[i - 3] == 0 // beginning
+ || i + 3 > length // end
+ || rlens[i - 3] * 3 >= rlens[i] * 4 || rlens[i + 3] * 3 >= rlens[i] * 4)
+ )
+ runsbad += N3;
+ return runsbad;
+ }
+
+ // Calculate how bad the masked image is - blocks, imbalance, runs, or finders.
+ function badcheck()
+ {
+ var x, y, h, b, b1;
+ var thisbad = 0;
+ var bw = 0;
+
+ // blocks of same color.
+ for (y = 0; y < width - 1; y++)
+ for (x = 0; x < width - 1; x++)
+ if ((qrframe[x + width * y] && qrframe[(x + 1) + width * y]
+ && qrframe[x + width * (y + 1)] && qrframe[(x + 1) + width * (y + 1)]) // all black
+ || !(qrframe[x + width * y] || qrframe[(x + 1) + width * y]
+ || qrframe[x + width * (y + 1)] || qrframe[(x + 1) + width * (y + 1)])) // all white
+ thisbad += N2;
+
+ // X runs
+ for (y = 0; y < width; y++) {
+ rlens[0] = 0;
+ for (h = b = x = 0; x < width; x++) {
+ if ((b1 = qrframe[x + width * y]) == b)
+ rlens[h]++;
+ else
+ rlens[++h] = 1;
+ b = b1;
+ bw += b ? 1 : -1;
+ }
+ thisbad += badruns(h);
+ }
+
+ // black/white imbalance
+ if (bw < 0)
+ bw = -bw;
+
+ var big = bw;
+ var count = 0;
+ big += big << 2;
+ big <<= 1;
+ while (big > width * width)
+ big -= width * width, count++;
+ thisbad += count * N4;
+
+ // Y runs
+ for (x = 0; x < width; x++) {
+ rlens[0] = 0;
+ for (h = b = y = 0; y < width; y++) {
+ if ((b1 = qrframe[x + width * y]) == b)
+ rlens[h]++;
+ else
+ rlens[++h] = 1;
+ b = b1;
+ }
+ thisbad += badruns(h);
+ }
+ return thisbad;
+ }
+
+ function genframe(instring)
+ {
+ var x, y, k, t, v, i, j, m;
+
+ // find the smallest version that fits the string
+ t = instring.length;
+ version = 0;
+ do {
+ version++;
+ k = (ecclevel - 1) * 4 + (version - 1) * 16;
+ neccblk1 = eccblocks[k++];
+ neccblk2 = eccblocks[k++];
+ datablkw = eccblocks[k++];
+ eccblkwid = eccblocks[k];
+ k = datablkw * (neccblk1 + neccblk2) + neccblk2 - 3 + (version <= 9);
+ if (t <= k)
+ break;
+ } while (version < 40);
+
+ // FIXME - insure that it fits insted of being truncated
+ width = 17 + 4 * version;
+
+ // allocate, clear and setup data structures
+ v = datablkw + (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
+ for( t = 0; t < v; t++ )
+ eccbuf[t] = 0;
+ strinbuf = instring.slice(0);
+
+ for( t = 0; t < width * width; t++ )
+ qrframe[t] = 0;
+
+ for( t = 0 ; t < (width * (width + 1) + 1) / 2; t++)
+ framask[t] = 0;
+
+ // insert finders - black to frame, white to mask
+ for (t = 0; t < 3; t++) {
+ k = 0;
+ y = 0;
+ if (t == 1)
+ k = (width - 7);
+ if (t == 2)
+ y = (width - 7);
+ qrframe[(y + 3) + width * (k + 3)] = 1;
+ for (x = 0; x < 6; x++) {
+ qrframe[(y + x) + width * k] = 1;
+ qrframe[y + width * (k + x + 1)] = 1;
+ qrframe[(y + 6) + width * (k + x)] = 1;
+ qrframe[(y + x + 1) + width * (k + 6)] = 1;
+ }
+ for (x = 1; x < 5; x++) {
+ setmask(y + x, k + 1);
+ setmask(y + 1, k + x + 1);
+ setmask(y + 5, k + x);
+ setmask(y + x + 1, k + 5);
+ }
+ for (x = 2; x < 4; x++) {
+ qrframe[(y + x) + width * (k + 2)] = 1;
+ qrframe[(y + 2) + width * (k + x + 1)] = 1;
+ qrframe[(y + 4) + width * (k + x)] = 1;
+ qrframe[(y + x + 1) + width * (k + 4)] = 1;
+ }
+ }
+
+ // alignment blocks
+ if (version > 1) {
+ t = adelta[version];
+ y = width - 7;
+ for (;;) {
+ x = width - 7;
+ while (x > t - 3) {
+ putalign(x, y);
+ if (x < t)
+ break;
+ x -= t;
+ }
+ if (y <= t + 9)
+ break;
+ y -= t;
+ putalign(6, y);
+ putalign(y, 6);
+ }
+ }
+
+ // single black
+ qrframe[8 + width * (width - 8)] = 1;
+
+ // timing gap - mask only
+ for (y = 0; y < 7; y++) {
+ setmask(7, y);
+ setmask(width - 8, y);
+ setmask(7, y + width - 7);
+ }
+ for (x = 0; x < 8; x++) {
+ setmask(x, 7);
+ setmask(x + width - 8, 7);
+ setmask(x, width - 8);
+ }
+
+ // reserve mask-format area
+ for (x = 0; x < 9; x++)
+ setmask(x, 8);
+ for (x = 0; x < 8; x++) {
+ setmask(x + width - 8, 8);
+ setmask(8, x);
+ }
+ for (y = 0; y < 7; y++)
+ setmask(8, y + width - 7);
+
+ // timing row/col
+ for (x = 0; x < width - 14; x++)
+ if (x & 1) {
+ setmask(8 + x, 6);
+ setmask(6, 8 + x);
+ }
+ else {
+ qrframe[(8 + x) + width * 6] = 1;
+ qrframe[6 + width * (8 + x)] = 1;
+ }
+
+ // version block
+ if (version > 6) {
+ t = vpat[version - 7];
+ k = 17;
+ for (x = 0; x < 6; x++)
+ for (y = 0; y < 3; y++, k--)
+ if (1 & (k > 11 ? version >> (k - 12) : t >> k)) {
+ qrframe[(5 - x) + width * (2 - y + width - 11)] = 1;
+ qrframe[(2 - y + width - 11) + width * (5 - x)] = 1;
+ }
+ else {
+ setmask(5 - x, 2 - y + width - 11);
+ setmask(2 - y + width - 11, 5 - x);
+ }
+ }
+
+ // sync mask bits - only set above for white spaces, so add in black bits
+ for (y = 0; y < width; y++)
+ for (x = 0; x <= y; x++)
+ if (qrframe[x + width * y])
+ setmask(x, y);
+
+ // convert string to bitstream
+ // 8 bit data to QR-coded 8 bit data (numeric or alphanum, or kanji not supported)
+ v = strinbuf.length;
+
+ // string to array
+ for( i = 0 ; i < v; i++ )
+ eccbuf[i] = strinbuf.charCodeAt(i);
+ strinbuf = eccbuf.slice(0);
+
+ // calculate max string length
+ x = datablkw * (neccblk1 + neccblk2) + neccblk2;
+ if (v >= x - 2) {
+ v = x - 2;
+ if (version > 9)
+ v--;
+ }
+
+ // shift and repack to insert length prefix
+ i = v;
+ if (version > 9) {
+ strinbuf[i + 2] = 0;
+ strinbuf[i + 3] = 0;
+ while (i--) {
+ t = strinbuf[i];
+ strinbuf[i + 3] |= 255 & (t << 4);
+ strinbuf[i + 2] = t >> 4;
+ }
+ strinbuf[2] |= 255 & (v << 4);
+ strinbuf[1] = v >> 4;
+ strinbuf[0] = 0x40 | (v >> 12);
+ }
+ else {
+ strinbuf[i + 1] = 0;
+ strinbuf[i + 2] = 0;
+ while (i--) {
+ t = strinbuf[i];
+ strinbuf[i + 2] |= 255 & (t << 4);
+ strinbuf[i + 1] = t >> 4;
+ }
+ strinbuf[1] |= 255 & (v << 4);
+ strinbuf[0] = 0x40 | (v >> 4);
+ }
+ // fill to end with pad pattern
+ i = v + 3 - (version < 10);
+ while (i < x) {
+ strinbuf[i++] = 0xec;
+ // buffer has room if (i == x) break;
+ strinbuf[i++] = 0x11;
+ }
+
+ // calculate and append ECC
+
+ // calculate generator polynomial
+ genpoly[0] = 1;
+ for (i = 0; i < eccblkwid; i++) {
+ genpoly[i + 1] = 1;
+ for (j = i; j > 0; j--)
+ genpoly[j] = genpoly[j]
+ ? genpoly[j - 1] ^ gexp[modnn(glog[genpoly[j]] + i)] : genpoly[j - 1];
+ genpoly[0] = gexp[modnn(glog[genpoly[0]] + i)];
+ }
+ for (i = 0; i <= eccblkwid; i++)
+ genpoly[i] = glog[genpoly[i]]; // use logs for genpoly[] to save calc step
+
+ // append ecc to data buffer
+ k = x;
+ y = 0;
+ for (i = 0; i < neccblk1; i++) {
+ appendrs(y, datablkw, k, eccblkwid);
+ y += datablkw;
+ k += eccblkwid;
+ }
+ for (i = 0; i < neccblk2; i++) {
+ appendrs(y, datablkw + 1, k, eccblkwid);
+ y += datablkw + 1;
+ k += eccblkwid;
+ }
+ // interleave blocks
+ y = 0;
+ for (i = 0; i < datablkw; i++) {
+ for (j = 0; j < neccblk1; j++)
+ eccbuf[y++] = strinbuf[i + j * datablkw];
+ for (j = 0; j < neccblk2; j++)
+ eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
+ }
+ for (j = 0; j < neccblk2; j++)
+ eccbuf[y++] = strinbuf[(neccblk1 * datablkw) + i + (j * (datablkw + 1))];
+ for (i = 0; i < eccblkwid; i++)
+ for (j = 0; j < neccblk1 + neccblk2; j++)
+ eccbuf[y++] = strinbuf[x + i + j * eccblkwid];
+ strinbuf = eccbuf;
+
+ // pack bits into frame avoiding masked area.
+ x = y = width - 1;
+ k = v = 1; // up, minus
+ /* inteleaved data and ecc codes */
+ m = (datablkw + eccblkwid) * (neccblk1 + neccblk2) + neccblk2;
+ for (i = 0; i < m; i++) {
+ t = strinbuf[i];
+ for (j = 0; j < 8; j++, t <<= 1) {
+ if (0x80 & t)
+ qrframe[x + width * y] = 1;
+ do { // find next fill position
+ if (v)
+ x--;
+ else {
+ x++;
+ if (k) {
+ if (y != 0)
+ y--;
+ else {
+ x -= 2;
+ k = !k;
+ if (x == 6) {
+ x--;
+ y = 9;
+ }
+ }
+ }
+ else {
+ if (y != width - 1)
+ y++;
+ else {
+ x -= 2;
+ k = !k;
+ if (x == 6) {
+ x--;
+ y -= 8;
+ }
+ }
+ }
+ }
+ v = !v;
+ } while (ismasked(x, y));
+ }
+ }
+
+ // save pre-mask copy of frame
+ strinbuf = qrframe.slice(0);
+ t = 0; // best
+ y = 30000; // demerit
+ // for instead of while since in original arduino code
+ // if an early mask was "good enough" it wouldn't try for a better one
+ // since they get more complex and take longer.
+ for (k = 0; k < 8; k++) {
+ applymask(k); // returns black-white imbalance
+ x = badcheck();
+ if (x < y) { // current mask better than previous best?
+ y = x;
+ t = k;
+ }
+ if (t == 7)
+ break; // don't increment i to a void redoing mask
+ qrframe = strinbuf.slice(0); // reset for next pass
+ }
+ if (t != k) // redo best mask - none good enough, last wasn't t
+ applymask(t);
+
+ // add in final mask/ecclevel bytes
+ y = fmtword[t + ((ecclevel - 1) << 3)];
+ // low byte
+ for (k = 0; k < 8; k++, y >>= 1)
+ if (y & 1) {
+ qrframe[(width - 1 - k) + width * 8] = 1;
+ if (k < 6)
+ qrframe[8 + width * k] = 1;
+ else
+ qrframe[8 + width * (k + 1)] = 1;
+ }
+ // high byte
+ for (k = 0; k < 7; k++, y >>= 1)
+ if (y & 1) {
+ qrframe[8 + width * (width - 7 + k)] = 1;
+ if (k)
+ qrframe[(6 - k) + width * 8] = 1;
+ else
+ qrframe[7 + width * 8] = 1;
+ }
+
+ // return image
+ return qrframe;
+ }
+
+ var _canvas = null,
+ _size = null;
+
+ var api = {
+
+ get ecclevel () {
+ return ecclevel;
+ },
+
+ set ecclevel (val) {
+ ecclevel = val;
+ },
+
+ get size () {
+ return _size;
+ },
+
+ set size (val) {
+ _size = val
+ },
+
+ get canvas () {
+ return _canvas;
+ },
+
+ set canvas (el) {
+ _canvas = el;
+ },
+
+ getFrame: function (string) {
+ return genframe(string);
+ },
+
+ draw: function (string, canvas, size, ecc) {
+
+ ecclevel = ecc || ecclevel;
+ canvas = canvas || _canvas;
+
+ if (!canvas) {
+ console.warn('No canvas provided to draw QR code in!')
+ return;
+ }
+
+ size = size || _size || Math.min(canvas.width, canvas.height);
+
+ var frame = genframe(string),
+ ctx = canvas.ctx,
+ px = Math.round(size / (width + 8));
+
+ var roundedSize = px * (width + 8),
+ offset = Math.floor((size - roundedSize) / 2);
+
+ size = roundedSize;
+
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
+ ctx.setFillStyle('#000000');
+
+ for (var i = 0; i < width; i++) {
+ for (var j = 0; j < width; j++) {
+ if (frame[j * width + i]) {
+ ctx.fillRect(px * (4 + i) + offset, px * (4 + j) + offset, px, px);
+ }
+ }
+ }
+ ctx.draw();
+ }
+ }
+
+ module.exports = {
+ api: api
+ }
+
+})()
\ No newline at end of file
diff --git a/src/components/kk-printer/utils/util.js b/src/components/kk-printer/utils/util.js
new file mode 100644
index 0000000..80c04d2
--- /dev/null
+++ b/src/components/kk-printer/utils/util.js
@@ -0,0 +1,171 @@
+//const gbk = require('./gbk.js');
+//console.log("sasas" + gbk);
+const formatTime = date => {
+ const year = date.getFullYear()
+ const month = date.getMonth() + 1
+ const day = date.getDate()
+ const hour = date.getHours()
+ const minute = date.getMinutes()
+ const second = date.getSeconds()
+
+ return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
+}
+
+const formatNumber = n => {
+ n = n.toString()
+ return n[1] ? n : '0' + n
+}
+
+/*
+const hexStringToBuff = str => { //str='中国:WXHSH'
+ const buffer = new ArrayBuffer((sumStrLength(str)) * 4)
+ const dataView = new DataView(buffer)
+ var data = str.toString();
+ var p = 0; //ArrayBuffer 偏移量
+ for (var i = 0; i < data.length; i++) {
+ if (isCN(data[i])) { //是中文
+ //调用GBK 转码
+ var t = gbk.encode(data[i]);
+ for (var j = 0; j < 2; j++) {
+ //var code = t[j * 2] + t[j * 2 + 1];
+ var code = t[j * 3 + 1] + t[j * 3 + 2];
+ var temp = parseInt(code, 16)
+ //var temp = strToHexCharCode(code);
+ dataView.setUint8(p++, temp)
+ }
+ } else {
+ var temp = data.charCodeAt(i);
+ dataView.setUint8(p++, temp)
+ }
+ }
+ return buffer;
+}
+*/
+function toUnicode(s) {
+ var str = "";
+ for (var i = 0; i < s.length; i++) {
+ str += "\\u" + s.charCodeAt(i).toString(16) + "\t";
+ }
+ return str;
+}
+
+function strToHexCharCode(str) {
+ if (str === "")
+ return "";
+ var hexCharCode = [];
+ hexCharCode.push("0x");
+ for (var i = 0; i < str.length; i++) {
+ hexCharCode.push((str.charCodeAt(i)).toString(16));
+ }
+ return hexCharCode.join("");
+}
+
+function sumStrLength(str) {
+ var length = 0;
+ var data = str.toString();
+ for (var i = 0; i < data.length; i++) {
+ if (isCN(data[i])) { //是中文
+ length += 2;
+ } else {
+ length += 1;
+ }
+ }
+ return length;
+}
+
+function isCN(str) {
+ if (/^[\u3220-\uFA29]+$/.test(str)) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+//汉字转码
+export function hexStringToArrayBuffer(str) {
+ const buffer = new ArrayBuffer((str.length / 2) + 1)
+ const dataView = new DataView(buffer)
+ for (var i = 0; i < str.length / 2; i++) {
+ var temp = parseInt(str[i * 2] + str[i * 2 + 1], 16)
+ dataView.setUint8(i, temp)
+ }
+ dataView.setUint8((str.length / 2), 0x0a)
+ return buffer;
+}
+
+//返回八位数组
+function subString(str) {
+ var arr = [];
+ if (str.length > 8) { //大于8
+ for (var i = 0;
+ (i * 8) < str.length; i++) {
+ var temp = str.substring(i * 8, 8 * i + 8);
+ arr.push(temp)
+ }
+ return arr;
+ } else {
+ return str
+ }
+}
+
+//不带有汉字
+function hexStringToArrayBufferstr(str) {
+ let val = ""
+ for (let i = 0; i < str.length; i++) {
+ if (val === '') {
+ val = str.charCodeAt(i).toString(16)
+ } else {
+ val += ',' + str.charCodeAt(i).toString(16)
+ }
+ }
+ val += "," + "0x0a";
+ console.log(val)
+ // 将16进制转化为ArrayBuffer
+ return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function(h) {
+ return parseInt(h, 16)
+ })).buffer
+}
+
+export function ab2hex(buffer) {
+ let hexArr = Array.prototype.map.call(
+ new Uint8Array(buffer),
+ function (bit) {
+ return ('00' + bit.toString(16)).slice(-2)
+ })
+ return hexArr.join('');
+}
+
+// ArrayBuffer转为字符串,参数为ArrayBuffer对象
+export function ab2str(buf) {
+ return String.fromCharCode.apply(null, new Uint8Array(buf));
+}
+
+// 字符串转为ArrayBuffer对象,参数为字符串
+export function str2ab(str) {
+ var buf = new ArrayBuffer(str.length+1); // 补充/0
+ var bufView = new Uint8Array(buf);
+ for (var i = 0, strLen = str.length; i < strLen; i++) {
+ bufView[i] = str.charCodeAt(i);
+ }
+ return buf;
+}
+
+export function send0X0A() {
+ const buffer = new ArrayBuffer(1)
+ const dataView = new DataView(buffer)
+ dataView.setUint8(0, 0x0a)
+ return buffer;
+}
+
+export function buf2hex(buffer) {
+ return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
+}
+
+// module.exports = {
+// hexStringToArrayBuffer: hexStringToArrayBuffer,
+// send0X0A: send0X0A,
+// ab2hex: ab2hex,
+// str2ab: str2ab,
+// ab2str: ab2str,
+// buf2hex: buf2hex
+// }
\ No newline at end of file
diff --git a/src/hybrid/html/point.html b/src/hybrid/html/point.html
new file mode 100644
index 0000000..bdb2d69
--- /dev/null
+++ b/src/hybrid/html/point.html
@@ -0,0 +1,95 @@
+
+
+
+
+
+
+
+
+
+
+
+mainBody
+
+
\ No newline at end of file
diff --git a/src/hybrid/html/pointPutawayJob.html b/src/hybrid/html/pointPutawayJob.html
new file mode 100644
index 0000000..bbe2399
--- /dev/null
+++ b/src/hybrid/html/pointPutawayJob.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+mainBody
+
+
\ No newline at end of file
diff --git a/src/hybrid/html/purchaseReceiptJob.html b/src/hybrid/html/purchaseReceiptJob.html
new file mode 100644
index 0000000..bbe2399
--- /dev/null
+++ b/src/hybrid/html/purchaseReceiptJob.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+mainBody
+
+
\ No newline at end of file
diff --git a/src/libs/versionUpdate.js b/src/libs/versionUpdate.js
new file mode 100644
index 0000000..4417176
--- /dev/null
+++ b/src/libs/versionUpdate.js
@@ -0,0 +1,24 @@
+import axios from 'axios'
+
+const isNewVersion = () => {
+ let updae_url=""
+ // let updae_url = getApp().globalData.text;
+ let url = updae_url+ `/static/version.json?t=${new Date().getTime()}`
+ axios.get(url).then(res => {
+ if (res.status === 200) {
+ let vueVersion = res.data.version;
+ let localVueVersion = localStorage.getItem('vueVersion');
+ if (localVueVersion && localVueVersion != vueVersion) {
+ localStorage.setItem('vueVersion', vueVersion);
+ window.location.reload();
+ return;
+ } else {
+ localStorage.setItem('vueVersion', vueVersion);
+ }
+ }
+ })
+}
+
+export default {
+ isNewVersion
+}
diff --git a/src/mycomponents/balance/handleBalanceBatch.vue b/src/mycomponents/balance/handleBalanceBatch.vue
new file mode 100644
index 0000000..2e243ab
--- /dev/null
+++ b/src/mycomponents/balance/handleBalanceBatch.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/balance/level.vue b/src/mycomponents/balance/level.vue
new file mode 100644
index 0000000..a5f5c72
--- /dev/null
+++ b/src/mycomponents/balance/level.vue
@@ -0,0 +1,27 @@
+
+
+ {{ title }}
+ {{ getPriorityName1() }}
+
+
+
+
+
+
diff --git a/src/mycomponents/balance/light.vue b/src/mycomponents/balance/light.vue
new file mode 100644
index 0000000..11e9622
--- /dev/null
+++ b/src/mycomponents/balance/light.vue
@@ -0,0 +1,21 @@
+
+
+ {{ title }}
+ {{ lightCode }}
+
+
+
+
+
+
diff --git a/src/mycomponents/balance/recommendBalanceBatch.vue b/src/mycomponents/balance/recommendBalanceBatch.vue
new file mode 100644
index 0000000..f128e56
--- /dev/null
+++ b/src/mycomponents/balance/recommendBalanceBatch.vue
@@ -0,0 +1,55 @@
+
+
+
+
+
+ 推荐
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/button/comCheckAll.vue b/src/mycomponents/button/comCheckAll.vue
new file mode 100644
index 0000000..d3be936
--- /dev/null
+++ b/src/mycomponents/button/comCheckAll.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+ 全选({{checkCount}}/{{allCount}})
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/detail/comDetailCardBatch.vue b/src/mycomponents/detail/comDetailCardBatch.vue
new file mode 100644
index 0000000..b2cb79f
--- /dev/null
+++ b/src/mycomponents/detail/comDetailCardBatch.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+ swipeClick(event,item,'parent')"
+ v-if='index==0'>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/detail/comJobDetailCard.vue b/src/mycomponents/detail/comJobDetailCard.vue
new file mode 100644
index 0000000..a3ddcac
--- /dev/null
+++ b/src/mycomponents/detail/comJobDetailCard.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/detail/comJobDetailCardBatch.vue b/src/mycomponents/detail/comJobDetailCardBatch.vue
new file mode 100644
index 0000000..268d30b
--- /dev/null
+++ b/src/mycomponents/detail/comJobDetailCardBatch.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/detail/comLableDetailCard.vue b/src/mycomponents/detail/comLableDetailCard.vue
new file mode 100644
index 0000000..392fc3a
--- /dev/null
+++ b/src/mycomponents/detail/comLableDetailCard.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+ swipeClick(event,item)"
+ style='padding:0px 0px 5px 0px;align-items: center;'
+ :options="item.scaned?scanOptions:detailOptions">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/detail/comRecommendDetailCard.vue b/src/mycomponents/detail/comRecommendDetailCard.vue
new file mode 100644
index 0000000..e300da8
--- /dev/null
+++ b/src/mycomponents/detail/comRecommendDetailCard.vue
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+
+
+
+ swipeClick(event,item)">
+
+
+ 推 荐
+
+
+
+
+
+ 实
+ 际
+
+
+
+
+
+
+
+ <
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/detail/comRecommendDetailCardBatch.vue b/src/mycomponents/detail/comRecommendDetailCardBatch.vue
new file mode 100644
index 0000000..dc923a5
--- /dev/null
+++ b/src/mycomponents/detail/comRecommendDetailCardBatch.vue
@@ -0,0 +1,229 @@
+
+
+
+
+
+ swipeClick(event,item)">
+
+
+ 推
+ 荐
+
+
+
+
+
+ 复制
+
+
+
+ 实
+ 际
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/detail/detailList.vue b/src/mycomponents/detail/detailList.vue
new file mode 100644
index 0000000..b14fe54
--- /dev/null
+++ b/src/mycomponents/detail/detailList.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/item/itemFilter.vue b/src/mycomponents/item/itemFilter.vue
new file mode 100644
index 0000000..f34598b
--- /dev/null
+++ b/src/mycomponents/item/itemFilter.vue
@@ -0,0 +1,127 @@
+
+
+
+
+ 筛选条件
+
+
+ 库位
+
+
+
+ 库存状态 :
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/job/jobAccept.vue b/src/mycomponents/job/jobAccept.vue
new file mode 100644
index 0000000..7fbc666
--- /dev/null
+++ b/src/mycomponents/job/jobAccept.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+ 承接人: {{dataContent.acceptUserName}}
+
+
+ 承接时间 : {{formatDate(dataContent.acceptTime)}}
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/job/jobComMainCardAsn.vue b/src/mycomponents/job/jobComMainCardAsn.vue
new file mode 100644
index 0000000..6ddde22
--- /dev/null
+++ b/src/mycomponents/job/jobComMainCardAsn.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/job/jobComMainDetailCard.vue b/src/mycomponents/job/jobComMainDetailCard.vue
new file mode 100644
index 0000000..7e617a5
--- /dev/null
+++ b/src/mycomponents/job/jobComMainDetailCard.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/job/jobTopAsn.vue b/src/mycomponents/job/jobTopAsn.vue
new file mode 100644
index 0000000..6400d04
--- /dev/null
+++ b/src/mycomponents/job/jobTopAsn.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/jobList/jobList.vue b/src/mycomponents/jobList/jobList.vue
new file mode 100644
index 0000000..35e424c
--- /dev/null
+++ b/src/mycomponents/jobList/jobList.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+ 物料代码:{{ item.itemCode }}
+ 物料名称:{{ item.itemName }}
+
+
+
+
+ Go
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/location/locationCompare.vue b/src/mycomponents/location/locationCompare.vue
new file mode 100644
index 0000000..54d968b
--- /dev/null
+++ b/src/mycomponents/location/locationCompare.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+ {{title}}
+   {{recommendLocationCode}}
+  / {{locationCode}}
+
+
+
+
+
+
+ {{title}}
+   {{recommendLocationCode}}
+
+
+
+
+
+
+ 复制
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/package/PackageAndItemCard.vue b/src/mycomponents/package/PackageAndItemCard.vue
new file mode 100644
index 0000000..63bd374
--- /dev/null
+++ b/src/mycomponents/package/PackageAndItemCard.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/package/packageCard.vue b/src/mycomponents/package/packageCard.vue
new file mode 100644
index 0000000..c9f7b34
--- /dev/null
+++ b/src/mycomponents/package/packageCard.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/package/packageList.vue b/src/mycomponents/package/packageList.vue
new file mode 100644
index 0000000..9ce268a
--- /dev/null
+++ b/src/mycomponents/package/packageList.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+ swipeClick(event, item, 'parent', index)">
+
+
+
+ swipeClick(event, cur, 'child', key, item)">
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/package/packageRecordCard.vue b/src/mycomponents/package/packageRecordCard.vue
new file mode 100644
index 0000000..0154367
--- /dev/null
+++ b/src/mycomponents/package/packageRecordCard.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/package/packageRecordList.vue b/src/mycomponents/package/packageRecordList.vue
new file mode 100644
index 0000000..f5499c8
--- /dev/null
+++ b/src/mycomponents/package/packageRecordList.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+ swipeClick(event,item)">
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/print/print.vue b/src/mycomponents/print/print.vue
new file mode 100644
index 0000000..7170373
--- /dev/null
+++ b/src/mycomponents/print/print.vue
@@ -0,0 +1,144 @@
+
+
+
+ 打印机 :
+
+
+ {{ printName }}
+
+
+
+
+
+
+
+
+
+
+ 模版 :
+
+
+
+ {{ templateName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/qty/numbeIntegerrBox.vue b/src/mycomponents/qty/numbeIntegerrBox.vue
new file mode 100644
index 0000000..45df04a
--- /dev/null
+++ b/src/mycomponents/qty/numbeIntegerrBox.vue
@@ -0,0 +1,213 @@
+
+
+
+ -
+
+
+
+ +
+
+
+
+
+
diff --git a/src/mycomponents/qty/numberBox.vue b/src/mycomponents/qty/numberBox.vue
new file mode 100644
index 0000000..527ab08
--- /dev/null
+++ b/src/mycomponents/qty/numberBox.vue
@@ -0,0 +1,205 @@
+
+
+
+ -
+
+
+
+ +
+
+
+
+
+
diff --git a/src/mycomponents/qty/packQty.vue b/src/mycomponents/qty/packQty.vue
new file mode 100644
index 0000000..b966056
--- /dev/null
+++ b/src/mycomponents/qty/packQty.vue
@@ -0,0 +1,26 @@
+
+
+
+ {{Number(dataContent.packQty)}}•{{getPackUnit(dataContent.packUnit)}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/qty/packUnit.vue b/src/mycomponents/qty/packUnit.vue
new file mode 100644
index 0000000..fb7473c
--- /dev/null
+++ b/src/mycomponents/qty/packUnit.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+ {{ dataContent.packUnit }}({{ Number(dataContent.packQty) }}{{ getUom(dataContent.uom) }})
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/qty/qtyEdit.vue b/src/mycomponents/qty/qtyEdit.vue
new file mode 100644
index 0000000..8350f01
--- /dev/null
+++ b/src/mycomponents/qty/qtyEdit.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+ {{title}}
+
+
+
+
+
+
+
+
+ 数量 :
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/qty/recommendHandleQty.vue b/src/mycomponents/qty/recommendHandleQty.vue
new file mode 100644
index 0000000..b96ea38
--- /dev/null
+++ b/src/mycomponents/qty/recommendHandleQty.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+ {{ Number(recommendQty) }}/
+
+
+ {{ Number(dataContent.qty) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/query/balanceQuery.vue b/src/mycomponents/query/balanceQuery.vue
new file mode 100644
index 0000000..4179efa
--- /dev/null
+++ b/src/mycomponents/query/balanceQuery.vue
@@ -0,0 +1,205 @@
+
+
+
+
+
+ 库存查询
+
+
+
+
+
+ 物料号:
+
+
+
+
+
+
+
+
+
+
+ ({{index+1}}) 物料代码 : {{item.code}}
+
+
+ 名称 : {{item.name}}
+
+
+ 描述1 : {{item.desc1}}
+
+
+ 描述2 : {{item.desc1}}
+
+
+
+
+
+
+
+
+
+ 批次
+ 库位
+ 状态
+ 数量
+
+
+
+ {{item.batch}}
+ {{item.locationCode}}
+ {{statusDesc(item.inventoryStatus)}}
+ {{item.totalQty}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/query/fifoQuery.vue b/src/mycomponents/query/fifoQuery.vue
new file mode 100644
index 0000000..2b7b239
--- /dev/null
+++ b/src/mycomponents/query/fifoQuery.vue
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+ 先进先出查询
+
+
+ 关闭
+
+
+
+
+
+
+
+ 物料号:
+
+
+
+
+
+
+
+
+ 仓库:
+
+
+
+
+
+
+
+
+ ({{ index + 1 }}) 物料代码 : {{ item.code }}
+
+
+ 名称 : {{ item.name }}
+
+
+ 描述1 : {{ item.desc1 }}
+
+
+ 描述2 : {{ item.desc1 }}
+
+
+
+
+
+
+
+
+
+
+ 批次
+ 库位
+ 状态
+ 数量
+ 单位
+
+
+
+ {{ item.batch }}
+ {{ item.locationCode }}
+ {{ statusDesc(item.inventoryStatus) }}
+ {{ item.totalQty }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/query/showListItem.vue b/src/mycomponents/query/showListItem.vue
new file mode 100644
index 0000000..41e9db6
--- /dev/null
+++ b/src/mycomponents/query/showListItem.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+ Go
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/receive/receiveBottom.vue b/src/mycomponents/receive/receiveBottom.vue
new file mode 100644
index 0000000..690e333
--- /dev/null
+++ b/src/mycomponents/receive/receiveBottom.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+ {{dataContent.creator}}
+
+
+
+ {{formatDate(dataContent.createTime)}}
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/receive/receiveNumber.vue b/src/mycomponents/receive/receiveNumber.vue
new file mode 100644
index 0000000..79a7dd4
--- /dev/null
+++ b/src/mycomponents/receive/receiveNumber.vue
@@ -0,0 +1,22 @@
+
+
+
+ {{number}}
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/receive/receiveStatus.vue b/src/mycomponents/receive/receiveStatus.vue
new file mode 100644
index 0000000..fe7a7cf
--- /dev/null
+++ b/src/mycomponents/receive/receiveStatus.vue
@@ -0,0 +1,30 @@
+
+
+
+ {{ receiveStatusInfo.label}}
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/receive/receiveTop.vue b/src/mycomponents/receive/receiveTop.vue
new file mode 100644
index 0000000..78eae37
--- /dev/null
+++ b/src/mycomponents/receive/receiveTop.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/receive/recordComDetailCard.vue b/src/mycomponents/receive/recordComDetailCard.vue
new file mode 100644
index 0000000..ada8ad7
--- /dev/null
+++ b/src/mycomponents/receive/recordComDetailCard.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/receive/recordComMainCard.vue b/src/mycomponents/receive/recordComMainCard.vue
new file mode 100644
index 0000000..ae9d070
--- /dev/null
+++ b/src/mycomponents/receive/recordComMainCard.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/recommend/recommendBatch.vue b/src/mycomponents/recommend/recommendBatch.vue
new file mode 100644
index 0000000..9ff7b3e
--- /dev/null
+++ b/src/mycomponents/recommend/recommendBatch.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 复制
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/record/recordComDetailCardBatch.vue b/src/mycomponents/record/recordComDetailCardBatch.vue
new file mode 100644
index 0000000..42eb702
--- /dev/null
+++ b/src/mycomponents/record/recordComDetailCardBatch.vue
@@ -0,0 +1,207 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/record/recordComMainCard.vue b/src/mycomponents/record/recordComMainCard.vue
new file mode 100644
index 0000000..42a2fbc
--- /dev/null
+++ b/src/mycomponents/record/recordComMainCard.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/record/recordDetailCard.vue b/src/mycomponents/record/recordDetailCard.vue
new file mode 100644
index 0000000..4e7e5e3
--- /dev/null
+++ b/src/mycomponents/record/recordDetailCard.vue
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/scan/winCheckFgLabel.vue b/src/mycomponents/scan/winCheckFgLabel.vue
new file mode 100644
index 0000000..c23c76f
--- /dev/null
+++ b/src/mycomponents/scan/winCheckFgLabel.vue
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/scan/winComScanBalance.vue b/src/mycomponents/scan/winComScanBalance.vue
new file mode 100644
index 0000000..06e2635
--- /dev/null
+++ b/src/mycomponents/scan/winComScanBalance.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/scan/winComScanBalanceLocation.vue b/src/mycomponents/scan/winComScanBalanceLocation.vue
new file mode 100644
index 0000000..a62d8cf
--- /dev/null
+++ b/src/mycomponents/scan/winComScanBalanceLocation.vue
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/scan/winComScanCustomerLabel.vue b/src/mycomponents/scan/winComScanCustomerLabel.vue
new file mode 100644
index 0000000..d49d5bb
--- /dev/null
+++ b/src/mycomponents/scan/winComScanCustomerLabel.vue
@@ -0,0 +1,198 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ customerItemCode }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/scan/winComScanFg.vue b/src/mycomponents/scan/winComScanFg.vue
new file mode 100644
index 0000000..8428979
--- /dev/null
+++ b/src/mycomponents/scan/winComScanFg.vue
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 历史记录
+
+
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/scan/winScanFgLabel.vue b/src/mycomponents/scan/winScanFgLabel.vue
new file mode 100644
index 0000000..e6f5864
--- /dev/null
+++ b/src/mycomponents/scan/winScanFgLabel.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/scan/winScanPackAndLocationNoBalance.vue b/src/mycomponents/scan/winScanPackAndLocationNoBalance.vue
new file mode 100644
index 0000000..06ec99f
--- /dev/null
+++ b/src/mycomponents/scan/winScanPackAndLocationNoBalance.vue
@@ -0,0 +1,271 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/scan/winScanPackJob.vue b/src/mycomponents/scan/winScanPackJob.vue
new file mode 100644
index 0000000..9069454
--- /dev/null
+++ b/src/mycomponents/scan/winScanPackJob.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/scan/winScanPackLevel.vue b/src/mycomponents/scan/winScanPackLevel.vue
new file mode 100644
index 0000000..9d82bca
--- /dev/null
+++ b/src/mycomponents/scan/winScanPackLevel.vue
@@ -0,0 +1,156 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/mycomponents/scan/winScanPackage.vue b/src/mycomponents/scan/winScanPackage.vue
new file mode 100644
index 0000000..62ed32d
--- /dev/null
+++ b/src/mycomponents/scan/winScanPackage.vue
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/mycomponents/scan/winScanParentPackage.vue b/src/mycomponents/scan/winScanParentPackage.vue
new file mode 100644
index 0000000..838ed09
--- /dev/null
+++ b/src/mycomponents/scan/winScanParentPackage.vue
@@ -0,0 +1,224 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/check/checkFgLabel.vue b/src/pages/check/checkFgLabel.vue
new file mode 100644
index 0000000..cb4946f
--- /dev/null
+++ b/src/pages/check/checkFgLabel.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
+
+
+
+
+ 箱码
+ {{ item.packingNumber }}
+
+
+ WMS 物料
+ {{ item.itemCode }}
+
+
+ 客户 物料
+ {{ item.customerItemCode }}
+
+
+ 实际校验 物料
+ {{ item.customerItemCode_reality }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/count/coms/comCountDetailcards.vue b/src/pages/count/coms/comCountDetailcards.vue
new file mode 100644
index 0000000..89b38d3
--- /dev/null
+++ b/src/pages/count/coms/comCountDetailcards.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 复制采购
+ |制品
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/count/coms/comFuzzyCountJobCard.vue b/src/pages/count/coms/comFuzzyCountJobCard.vue
new file mode 100644
index 0000000..49380a8
--- /dev/null
+++ b/src/pages/count/coms/comFuzzyCountJobCard.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+ 盘点计划
+ {{ dataContent.planNumber }}
+
+
+
+
+
+
+ {{ getCountScopeName(range.type) }}
+ {{ range.value }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/count/job/countBlindDetail.vue b/src/pages/count/job/countBlindDetail.vue
new file mode 100644
index 0000000..173aa14
--- /dev/null
+++ b/src/pages/count/job/countBlindDetail.vue
@@ -0,0 +1,528 @@
+
+
+
+
+
+
+
+
+ swipeClick(event, item)">
+
+ {{ index + 1 }}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/count/job/countDetail1.vue b/src/pages/count/job/countDetail1.vue
new file mode 100644
index 0000000..bbd7f30
--- /dev/null
+++ b/src/pages/count/job/countDetail1.vue
@@ -0,0 +1,525 @@
+
+
+
+
+
+
+
+
+ swipeClick(event, item)">
+
+ {{ index + 1 }}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/count/job/countLightDetail.vue b/src/pages/count/job/countLightDetail.vue
new file mode 100644
index 0000000..dfa83a7
--- /dev/null
+++ b/src/pages/count/job/countLightDetail.vue
@@ -0,0 +1,662 @@
+
+
+
+
+
+
+
+
+ swipeClick(event, item)">
+
+ {{ index + 1 }}.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/count/job/fuzzyCountDetail.vue b/src/pages/count/job/fuzzyCountDetail.vue
new file mode 100644
index 0000000..34b2920
--- /dev/null
+++ b/src/pages/count/job/fuzzyCountDetail.vue
@@ -0,0 +1,524 @@
+
+
+
+
+
+
+ swipeClick(event, item, index)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/count/job/fuzzyCountJob.vue b/src/pages/count/job/fuzzyCountJob.vue
new file mode 100644
index 0000000..87cd6c1
--- /dev/null
+++ b/src/pages/count/job/fuzzyCountJob.vue
@@ -0,0 +1,438 @@
+
+
+
+
+
+ swipeClick(event, item)"
+ :options="item.status == '2' ? detailGiveupOptions : detailOptions">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+s
diff --git a/src/pages/customerReturn/coms/comReturnRecordCard.vue b/src/pages/customerReturn/coms/comReturnRecordCard.vue
new file mode 100644
index 0000000..58c6fa1
--- /dev/null
+++ b/src/pages/customerReturn/coms/comReturnRecordCard.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/customerReturn/record/recordList.vue b/src/pages/customerReturn/record/recordList.vue
new file mode 100644
index 0000000..6c1eaec
--- /dev/null
+++ b/src/pages/customerReturn/record/recordList.vue
@@ -0,0 +1,306 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/customerReturn/record/recordListDetail.vue b/src/pages/customerReturn/record/recordListDetail.vue
new file mode 100644
index 0000000..8b39b27
--- /dev/null
+++ b/src/pages/customerReturn/record/recordListDetail.vue
@@ -0,0 +1,401 @@
+
+
+
+
+
+
+ 整单接收
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/deliver/coms/comDeliverDetailCardBatch.vue b/src/pages/deliver/coms/comDeliverDetailCardBatch.vue
new file mode 100644
index 0000000..5f86b4c
--- /dev/null
+++ b/src/pages/deliver/coms/comDeliverDetailCardBatch.vue
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
+ itemCoceClick(event,item,index)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/deliver/coms/comScanDeliverPackBatch.vue b/src/pages/deliver/coms/comScanDeliverPackBatch.vue
new file mode 100644
index 0000000..848aad7
--- /dev/null
+++ b/src/pages/deliver/coms/comScanDeliverPackBatch.vue
@@ -0,0 +1,780 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/deliver/coms/comScanDeliverPackss.vue b/src/pages/deliver/coms/comScanDeliverPackss.vue
new file mode 100644
index 0000000..07b9ed6
--- /dev/null
+++ b/src/pages/deliver/coms/comScanDeliverPackss.vue
@@ -0,0 +1,554 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/deliver/job/deliverDetailBatch.vue b/src/pages/deliver/job/deliverDetailBatch.vue
new file mode 100644
index 0000000..9d70e51
--- /dev/null
+++ b/src/pages/deliver/job/deliverDetailBatch.vue
@@ -0,0 +1,727 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/fg/coms/comNoReceiptPopup.vue b/src/pages/fg/coms/comNoReceiptPopup.vue
new file mode 100644
index 0000000..2e3f935
--- /dev/null
+++ b/src/pages/fg/coms/comNoReceiptPopup.vue
@@ -0,0 +1,522 @@
+
+
+
+
+
+
+
+ {{title}}
+
+
+
+
+
+
+
+ 生产线:
+
+ {{productionLineName}}
+
+
+
+
+
+
+
+
+
+
+
+ 物料代码:
+
+ {{itemCode}}
+
+
+ Bom版本{{bomVersion}}
+
+
+
+
+
+
+
+
+
+ 数量:
+
+ ({{getUomInfo(uom)}})
+
+
+
+
+
+
+
+
+ 包装规格:
+
+ {{packUnitName}}
+
+
+
+
+
+
+
+
+
+
+ 批次:
+
+
+
+
+
+
+
+
+
+
+
+ 创建上架申请
+
+
+
+
+
+
+
+
+
+
+ 创建检验申请
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/fg/coms/comReceiptPopup.vue b/src/pages/fg/coms/comReceiptPopup.vue
new file mode 100644
index 0000000..29cfaad
--- /dev/null
+++ b/src/pages/fg/coms/comReceiptPopup.vue
@@ -0,0 +1,524 @@
+
+
+
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
+ 生产线:
+
+ {{ productionLineName }}
+
+
+
+
+
+
+
+
+
+ 计划日期:
+
+ {{ planDate }}
+
+
+
+
+
+
+
+
+
+ 物料代码:
+
+ {{ itemCode }}
+
+ {{ planQty }}({{ getUomInfo(uom) }})
+
+
+
+
+
+
+
+
+
+ 包装规格:
+
+ {{ packUnitName }}
+
+
+
+
+
+
+
+
+
+ 批次:
+
+
+
+
+
+
+
+
+ 创建上架申请
+
+
+
+
+
+
+
+
+
+ 创建检验申请
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/fg/fgChange.vue b/src/pages/fg/fgChange.vue
new file mode 100644
index 0000000..5c309a9
--- /dev/null
+++ b/src/pages/fg/fgChange.vue
@@ -0,0 +1,397 @@
+
+
+
+
+
+
+
+
+
+
+ 变更信息
+
+
+
+ 变更前物料
+
+ {{ currentPackage.itemCode }}
+
+
+
+ 变更后物料
+
+
+ {{ toItemCode }}
+
+
+
+
+
+
+
+ 变更原因
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/fg/receiptByPlan.vue b/src/pages/fg/receiptByPlan.vue
new file mode 100644
index 0000000..74fb523
--- /dev/null
+++ b/src/pages/fg/receiptByPlan.vue
@@ -0,0 +1,506 @@
+
+
+
+
+
+
+
+
+
+ swipeClick(event,item,index)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/fg/receiptNoPlan.vue b/src/pages/fg/receiptNoPlan.vue
new file mode 100644
index 0000000..ab70684
--- /dev/null
+++ b/src/pages/fg/receiptNoPlan.vue
@@ -0,0 +1,510 @@
+
+
+
+
+
+
+ swipeClick(event,item,index)">
+ <
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/inventoryMove/coms/comInventoryDetailCardBatch.vue b/src/pages/inventoryMove/coms/comInventoryDetailCardBatch.vue
new file mode 100644
index 0000000..5769ea4
--- /dev/null
+++ b/src/pages/inventoryMove/coms/comInventoryDetailCardBatch.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+
+ swipeClick(event,item)"
+ :class="item.scaned?'scan_view':''">
+
+
+
+
+
+
+
+
+ 复制
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/inventoryMove/coms/okToHoldRecordPack.vue b/src/pages/inventoryMove/coms/okToHoldRecordPack.vue
new file mode 100644
index 0000000..22d45d2
--- /dev/null
+++ b/src/pages/inventoryMove/coms/okToHoldRecordPack.vue
@@ -0,0 +1,261 @@
+
+
+
+
+
+ 需求信息
+
+
+
+
+ 来源库位:
+
+
+
+
+
+
+
+
+
+ 零件:
+
+
+
+
+
+
+
+
+
+ 批次:
+
+
+
+
+
+
+
+ 数量:
+
+
+ EA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/inventoryMove/job/holdToWipMoveJob.vue b/src/pages/inventoryMove/job/holdToWipMoveJob.vue
new file mode 100644
index 0000000..8be33cd
--- /dev/null
+++ b/src/pages/inventoryMove/job/holdToWipMoveJob.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/inventoryMove/job/nokToHoldMoveJob.vue b/src/pages/inventoryMove/job/nokToHoldMoveJob.vue
new file mode 100644
index 0000000..df98075
--- /dev/null
+++ b/src/pages/inventoryMove/job/nokToHoldMoveJob.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
diff --git a/src/pages/issue/coms/comIssueDetailCardBatch.vue b/src/pages/issue/coms/comIssueDetailCardBatch.vue
new file mode 100644
index 0000000..38a973f
--- /dev/null
+++ b/src/pages/issue/coms/comIssueDetailCardBatch.vue
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ itemCoceClick(event,item,index)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/issue/coms/comScanIssuePack0816.vue b/src/pages/issue/coms/comScanIssuePack0816.vue
new file mode 100644
index 0000000..0854cc8
--- /dev/null
+++ b/src/pages/issue/coms/comScanIssuePack0816.vue
@@ -0,0 +1,732 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/issue/job/issueDetail0816.vue b/src/pages/issue/job/issueDetail0816.vue
new file mode 100644
index 0000000..9209094
--- /dev/null
+++ b/src/pages/issue/job/issueDetail0816.vue
@@ -0,0 +1,608 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/issue/job/issueDetailBatch.vue b/src/pages/issue/job/issueDetailBatch.vue
new file mode 100644
index 0000000..90d3b13
--- /dev/null
+++ b/src/pages/issue/job/issueDetailBatch.vue
@@ -0,0 +1,785 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/issue/job/issueJob0816.vue b/src/pages/issue/job/issueJob0816.vue
new file mode 100644
index 0000000..7714169
--- /dev/null
+++ b/src/pages/issue/job/issueJob0816.vue
@@ -0,0 +1,746 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/issue/record/directIssue.vue b/src/pages/issue/record/directIssue.vue
new file mode 100644
index 0000000..364f603
--- /dev/null
+++ b/src/pages/issue/record/directIssue.vue
@@ -0,0 +1,704 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/issue/record/directIssue0816.vue b/src/pages/issue/record/directIssue0816.vue
new file mode 100644
index 0000000..7734d6b
--- /dev/null
+++ b/src/pages/issue/record/directIssue0816.vue
@@ -0,0 +1,645 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/issue/record/directIssue2.vue b/src/pages/issue/record/directIssue2.vue
new file mode 100644
index 0000000..ac58e06
--- /dev/null
+++ b/src/pages/issue/record/directIssue2.vue
@@ -0,0 +1,660 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/issue/record/directIssueByBatch.vue b/src/pages/issue/record/directIssueByBatch.vue
new file mode 100644
index 0000000..e79736e
--- /dev/null
+++ b/src/pages/issue/record/directIssueByBatch.vue
@@ -0,0 +1,502 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/issue/record/issueRecordV1.vue b/src/pages/issue/record/issueRecordV1.vue
new file mode 100644
index 0000000..e9edc22
--- /dev/null
+++ b/src/pages/issue/record/issueRecordV1.vue
@@ -0,0 +1,349 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/issue/request/issueScanRequest.vue b/src/pages/issue/request/issueScanRequest.vue
new file mode 100644
index 0000000..2c512aa
--- /dev/null
+++ b/src/pages/issue/request/issueScanRequest.vue
@@ -0,0 +1,137 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/itemHold/coms/comDetailCard.vue b/src/pages/itemHold/coms/comDetailCard.vue
new file mode 100644
index 0000000..c4f7964
--- /dev/null
+++ b/src/pages/itemHold/coms/comDetailCard.vue
@@ -0,0 +1,166 @@
+
+
+
+
+
+
+
+
+
+
+ swipeClick(event,item)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/itemHold/coms/comMoveRecordCard.vue b/src/pages/itemHold/coms/comMoveRecordCard.vue
new file mode 100644
index 0000000..a114d42
--- /dev/null
+++ b/src/pages/itemHold/coms/comMoveRecordCard.vue
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/itemHold/record/recordList.vue b/src/pages/itemHold/record/recordList.vue
new file mode 100644
index 0000000..14ed059
--- /dev/null
+++ b/src/pages/itemHold/record/recordList.vue
@@ -0,0 +1,337 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/itemHold/record/recordListDetail.vue b/src/pages/itemHold/record/recordListDetail.vue
new file mode 100644
index 0000000..7b0e69c
--- /dev/null
+++ b/src/pages/itemHold/record/recordListDetail.vue
@@ -0,0 +1,414 @@
+
+
+
+
+
+
+ 整单接收
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/material/materialDowngrade.vue b/src/pages/material/materialDowngrade.vue
new file mode 100644
index 0000000..ae44e8a
--- /dev/null
+++ b/src/pages/material/materialDowngrade.vue
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/package/coms/comOverPackJobCard.vue b/src/pages/package/coms/comOverPackJobCard.vue
new file mode 100644
index 0000000..d1a4df6
--- /dev/null
+++ b/src/pages/package/coms/comOverPackJobCard.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/package/coms/comOverPackJobDetailCard.vue b/src/pages/package/coms/comOverPackJobDetailCard.vue
new file mode 100644
index 0000000..7206331
--- /dev/null
+++ b/src/pages/package/coms/comOverPackJobDetailCard.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+ itemCoceClick(event, item)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 扫描
+
+ swipeClick(event, batch, record)" style="width: 100%">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/package/coms/comScanPackagePack.vue b/src/pages/package/coms/comScanPackagePack.vue
new file mode 100644
index 0000000..8858877
--- /dev/null
+++ b/src/pages/package/coms/comScanPackagePack.vue
@@ -0,0 +1,395 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/package/job/overPackageJob.vue b/src/pages/package/job/overPackageJob.vue
new file mode 100644
index 0000000..9f3edc8
--- /dev/null
+++ b/src/pages/package/job/overPackageJob.vue
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/package/job/overPackageJobDetail.vue b/src/pages/package/job/overPackageJobDetail.vue
new file mode 100644
index 0000000..83242f4
--- /dev/null
+++ b/src/pages/package/job/overPackageJobDetail.vue
@@ -0,0 +1,574 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 打印设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/package/js/package.js b/src/pages/package/js/package.js
new file mode 100644
index 0000000..f7766c4
--- /dev/null
+++ b/src/pages/package/js/package.js
@@ -0,0 +1,114 @@
+ import {
+ calc
+ } from '@/common/calc.js';
+export function getDataSource(list, subList) {
+ for (var i = 0; i < subList.length; i++) {
+ let detail = subList[i];
+ var location = list.find(r =>
+ r.toLocationCode == detail.toLocationCode)
+ if (location == undefined) {
+ location = {
+ toLocationCode: detail.toLocationCode,
+ productionLineCode: detail.productionLineCode,
+ workStationCode: detail.workStationCode,
+ Items: []
+ }
+ list.push(location);
+ }
+ createDetailInfo(location, detail);
+ }
+ return list;
+}
+
+//树形结构:需求库位 -> 物料Items -> 库位 Locations-> 批次Batchs -> 记录Records
+export function createDetailInfo(location, detail) {
+ var item = location.Items.find(r =>
+ r.itemCode == detail.itemCode)
+ if (item == undefined) {
+ item = createItemInfo(detail);
+ location.Items.push(item)
+ } else {
+ item.qty = calc.add(item.qty,detail.qty)
+ //在物料下查找库位
+ let location = item.Locations.find(r => r.fromLocationCode == detail.fromLocationCode);
+ if (location == undefined) {
+ location = createLocationInfo(detail);
+ item.Locations.push(location);
+ } else {
+ //在库位下查找批次
+ let batch = location.Batchs.find(r => r.batch == detail.batch);
+ if (batch == undefined) {
+ let batch = createBatchInfo(detail);
+ location.Batchs.push(batch);
+ } else {
+ if (detail.packingNumber != "" && detail.packingNumber != null) {
+ batch.Recommends.push(detail);
+ }
+ }
+ }
+ }
+}
+
+export function createItemInfo(detail) {
+ let item = {
+ itemCode: detail.itemCode,
+ itemName: detail.itemName,
+ productionLineCode: detail.productionLineCode,
+ workStationCode: detail.workStationCode,
+ stdPackQty: detail.stdPackQty,
+ packUnit: detail.packUnit,
+ qty: detail.qty,
+ uom: detail.uom,
+ handleQty: 0,
+ Locations: []
+ }
+ let location = createLocationInfo(detail);
+ item.Locations.push(location);
+ return item;
+}
+
+export function createLocationInfo(detail) {
+ let location = {
+ fromLocationCode: detail.fromLocationCode,
+ qty: detail.qty,
+ uom: detail.uom,
+ handleQty: 0,
+ Batchs: []
+ }
+ let batch = createBatchInfo(detail);
+ location.Batchs.push(batch);
+ return location;
+}
+
+export function createBatchInfo(detail) {
+ let batch = {
+ detail: detail,
+ batch: detail.batch,
+ packingNumber: detail.packingNumber,
+ qty: detail.qty,
+ uom: detail.uom,
+ handleQty: 0,
+ fromPackUnit:detail.fromPackUnit,
+ toPackUnit:detail.toPackUnit,
+ fromPackQty:detail.fromPackQty,
+ toPackQty:detail.toPackQty,
+ Recommends: [],
+ Records: [],
+ }
+
+ //推荐到了箱码和批次
+ if (detail.packingNumber != "" && detail.packingNumber != null) {
+ batch.Recommends.push(detail);
+ }
+ return batch;
+}
+
+export function createRecordInfo(detail) {
+ var record = {}
+ detail.scaned = true;
+ // let record = JSON.parse(JSON.stringify(detail));
+ //克隆对象,深度克隆,防止双向绑定同一个变量
+ Object.assign(record, detail)
+ record.toLocationCode = this.toLocationCode;
+ return record;
+}
diff --git a/src/pages/point/index.vue b/src/pages/point/index.vue
new file mode 100644
index 0000000..a32305d
--- /dev/null
+++ b/src/pages/point/index.vue
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+ 物品代码
+ {{ item.itemCode }}
+
+
+ 物品名称
+ {{ item.itemName }}
+
+
+ 包装名称
+ {{ item.packName }}
+
+
+ 包装号
+ {{ item.packageCode }}
+
+
+ 生产线
+ {{ item.productionLineCode }}
+
+
+ 父包装号
+ {{ item.parentNumber }}
+
+
+ ASN
+ {{ item.asnNumber }}
+
+
+ 数量
+ {{ item.qty }}
+
+
+ 来源库位
+ {{ item.fromLocationCode }}
+
+
+
+
+
+
+
+
+ 批次
+ {{ item.batch }}
+
+
+ 物料类型
+ {{ item.itemType }}
+
+
+ 供应商
+ {{ item.supplierCode }}
+
+
+ 打印时间
+ {{ item.printTimes }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/pointProductReceipt/index.vue b/src/pages/pointProductReceipt/index.vue
new file mode 100644
index 0000000..b6ca284
--- /dev/null
+++ b/src/pages/pointProductReceipt/index.vue
@@ -0,0 +1,250 @@
+
+
+
+
+
+
+ 物品代码
+ {{item.itemCode}}
+
+
+ 物品名称
+ {{item.itemName}}
+
+
+ 包装名称
+ {{item.packName}}
+
+
+ 包装号
+ {{item.relateNumber}}
+
+
+ 生产线
+ {{item.productionLineCode}}
+
+
+ 数量
+ {{item.qty}}
+
+
+
+
+
+
+
+ 批次
+ {{item.batch}}
+
+
+ 物料类型
+ {{item.itemType}}
+
+
+ 打印时间
+ {{item.printTimes}}
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/pointProductReceipt/webview.vue b/src/pages/pointProductReceipt/webview.vue
new file mode 100644
index 0000000..b1b355f
--- /dev/null
+++ b/src/pages/pointProductReceipt/webview.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/src/pages/pointPutawayJob/index.vue b/src/pages/pointPutawayJob/index.vue
new file mode 100644
index 0000000..d2b9de4
--- /dev/null
+++ b/src/pages/pointPutawayJob/index.vue
@@ -0,0 +1,474 @@
+
+
+
+
+ 检验指引单
+ 上架指引单
+
+
+
+
+ Q
+
+
+ 发货单号
+ {{ data1.asnNumber }}
+
+
+ 物料代码
+ {{ item.itemCode }}
+
+
+ 物料名称
+ {{ item.itemName }}
+
+
+ 供应商
+ {{ item.supplierCode }}
+
+
+ 供应商批次
+ {{ item.supplierBatch }}
+
+
+ 到货数量
+ {{ item.quantityQty }}
+
+
+ 抽检数量
+ {{ item.sampleQty }}
+
+
+ 未生成检验申请
+
+
+ 没有检验方案
+
+
+ 检验阶段不存在
+
+
+
+
+
+
+
+
+
+
+
+ 目标库位:
+ {{ item.toLocationCode }}
+
+
+
+
+ 物料号:
+ {{ item.itemCode }}
+
+
+ 托包装号:
+ {{ item.packingNumber }}
+
+
+
+
+ 数量:
+ {{ item.qty }}{{ item.uom }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/productPutaway/job/fgProductPutawayJob.vue b/src/pages/productPutaway/job/fgProductPutawayJob.vue
new file mode 100644
index 0000000..6fd5fa9
--- /dev/null
+++ b/src/pages/productPutaway/job/fgProductPutawayJob.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productPutaway/job/semiProductPutawayJob.vue b/src/pages/productPutaway/job/semiProductPutawayJob.vue
new file mode 100644
index 0000000..163ee34
--- /dev/null
+++ b/src/pages/productPutaway/job/semiProductPutawayJob.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productPutaway/record/fgDirectPutaway.vue b/src/pages/productPutaway/record/fgDirectPutaway.vue
new file mode 100644
index 0000000..9fd9fe6
--- /dev/null
+++ b/src/pages/productPutaway/record/fgDirectPutaway.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productPutaway/record/semiDirectPutaway.vue b/src/pages/productPutaway/record/semiDirectPutaway.vue
new file mode 100644
index 0000000..5b262c5
--- /dev/null
+++ b/src/pages/productPutaway/record/semiDirectPutaway.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/coms/comFgCard.vue b/src/pages/productReceipt/coms/comFgCard.vue
new file mode 100644
index 0000000..16f92ac
--- /dev/null
+++ b/src/pages/productReceipt/coms/comFgCard.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+ 零件号
+ {{ detail.itemCode }}
+
+
+
+
+
+
+ 流水
+ {{ detail.order }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/coms/comProductDetailCardBatch.vue b/src/pages/productReceipt/coms/comProductDetailCardBatch.vue
new file mode 100644
index 0000000..783670a
--- /dev/null
+++ b/src/pages/productReceipt/coms/comProductDetailCardBatch.vue
@@ -0,0 +1,179 @@
+
+
+
+
+ swipeClick(event,item,'parent')"
+ :class="item.scaned?'scan_view':''">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/productReceipt/job/ccProductReceiptDetail.vue b/src/pages/productReceipt/job/ccProductReceiptDetail.vue
new file mode 100644
index 0000000..dc30abd
--- /dev/null
+++ b/src/pages/productReceipt/job/ccProductReceiptDetail.vue
@@ -0,0 +1,484 @@
+
+
+
+
+
+ 车间
+
+ {{ jobContent.workShopCode }}
+
+
+
+ 生产线
+
+ {{jobContent.subList[0].productionLineCode}}
+
+
+
+ 班组
+
+ {{ jobContent.team }}
+
+
+
+ 班次
+
+ {{ jobContent.shift }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/productReceipt/job/ccProductReceiptJob.vue b/src/pages/productReceipt/job/ccProductReceiptJob.vue
new file mode 100644
index 0000000..36f1265
--- /dev/null
+++ b/src/pages/productReceipt/job/ccProductReceiptJob.vue
@@ -0,0 +1,403 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/productReceipt/job/completeReceiveJob.vue b/src/pages/productReceipt/job/completeReceiveJob.vue
new file mode 100644
index 0000000..a35a570
--- /dev/null
+++ b/src/pages/productReceipt/job/completeReceiveJob.vue
@@ -0,0 +1,274 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/job/completeReceiveJobDetail.vue b/src/pages/productReceipt/job/completeReceiveJobDetail.vue
new file mode 100644
index 0000000..1cbcdac
--- /dev/null
+++ b/src/pages/productReceipt/job/completeReceiveJobDetail.vue
@@ -0,0 +1,388 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/job/fgProductReceiptDetail.vue b/src/pages/productReceipt/job/fgProductReceiptDetail.vue
new file mode 100644
index 0000000..257102c
--- /dev/null
+++ b/src/pages/productReceipt/job/fgProductReceiptDetail.vue
@@ -0,0 +1,542 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/job/fgProductReceiptJob.vue b/src/pages/productReceipt/job/fgProductReceiptJob.vue
new file mode 100644
index 0000000..62ed1f0
--- /dev/null
+++ b/src/pages/productReceipt/job/fgProductReceiptJob.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/job/scrapReceiptDetail.vue b/src/pages/productReceipt/job/scrapReceiptDetail.vue
new file mode 100644
index 0000000..dbe7a1b
--- /dev/null
+++ b/src/pages/productReceipt/job/scrapReceiptDetail.vue
@@ -0,0 +1,404 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/job/scrapReceiptJob.vue b/src/pages/productReceipt/job/scrapReceiptJob.vue
new file mode 100644
index 0000000..8438c4f
--- /dev/null
+++ b/src/pages/productReceipt/job/scrapReceiptJob.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/job/semiProductReceiptDetail.vue b/src/pages/productReceipt/job/semiProductReceiptDetail.vue
new file mode 100644
index 0000000..eec86d7
--- /dev/null
+++ b/src/pages/productReceipt/job/semiProductReceiptDetail.vue
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/job/semiProductReceiptJob.vue b/src/pages/productReceipt/job/semiProductReceiptJob.vue
new file mode 100644
index 0000000..f9c35f3
--- /dev/null
+++ b/src/pages/productReceipt/job/semiProductReceiptJob.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/record/productReceiptRecordByBatch.vue b/src/pages/productReceipt/record/productReceiptRecordByBatch.vue
new file mode 100644
index 0000000..9229491
--- /dev/null
+++ b/src/pages/productReceipt/record/productReceiptRecordByBatch.vue
@@ -0,0 +1,447 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productReceipt/record/recordList.vue b/src/pages/productReceipt/record/recordList.vue
new file mode 100644
index 0000000..5c94479
--- /dev/null
+++ b/src/pages/productReceipt/record/recordList.vue
@@ -0,0 +1,347 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/productReceipt/record/recordListDetail.vue b/src/pages/productReceipt/record/recordListDetail.vue
new file mode 100644
index 0000000..df67d05
--- /dev/null
+++ b/src/pages/productReceipt/record/recordListDetail.vue
@@ -0,0 +1,414 @@
+
+
+
+
+
+
+ 整单接收
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/productReceipt/record/semiDirectReceipt.vue b/src/pages/productReceipt/record/semiDirectReceipt.vue
new file mode 100644
index 0000000..7b8c0a0
--- /dev/null
+++ b/src/pages/productReceipt/record/semiDirectReceipt.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/coms/comRecycleJobCard.vue b/src/pages/productRecycle/coms/comRecycleJobCard.vue
new file mode 100644
index 0000000..109c7da
--- /dev/null
+++ b/src/pages/productRecycle/coms/comRecycleJobCard.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/coms/comReturnRequestCard.vue b/src/pages/productRecycle/coms/comReturnRequestCard.vue
new file mode 100644
index 0000000..ee1589b
--- /dev/null
+++ b/src/pages/productRecycle/coms/comReturnRequestCard.vue
@@ -0,0 +1,39 @@
+
+
+
+
+ 收货单号 : {{dataContent.purchaseReceiptRecordNumber}}
+
+
+ 供应商代码 : {{dataContent.supplierCode}}
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/coms/recycleDetailInfoPopup.vue b/src/pages/productRecycle/coms/recycleDetailInfoPopup.vue
new file mode 100644
index 0000000..9868598
--- /dev/null
+++ b/src/pages/productRecycle/coms/recycleDetailInfoPopup.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+ 订单号 :
+ {{ dataContent.poNumber }}
+
+
+ 订单行 :
+ {{ dataContent.poLine }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/coms/requestDetailInfoPopup.vue b/src/pages/productRecycle/coms/requestDetailInfoPopup.vue
new file mode 100644
index 0000000..c3c0e08
--- /dev/null
+++ b/src/pages/productRecycle/coms/requestDetailInfoPopup.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+ 订单号 :
+ {{dataContent.poNumber}}
+
+
+ 订单行 :
+ {{dataContent.poLine}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/coms/requestInfoPopup.vue b/src/pages/productRecycle/coms/requestInfoPopup.vue
new file mode 100644
index 0000000..62821cc
--- /dev/null
+++ b/src/pages/productRecycle/coms/requestInfoPopup.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/coms/returnInfoPopup.vue b/src/pages/productRecycle/coms/returnInfoPopup.vue
new file mode 100644
index 0000000..9ad6447
--- /dev/null
+++ b/src/pages/productRecycle/coms/returnInfoPopup.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+ 发货单号 :
+ {{ dataContent.asnNumber }}
+
+
+ 要货计划单号 :
+ {{ dataContent.ppNumber }}
+
+
+ 供应商代码 :
+ {{ dataContent.supplierCode }}
+
+
+ 承运商 :
+ {{ dataContent.carrierCode }}
+
+
+ 运输方式 :
+ {{ handleGetTransferModeName(dataContent.transferMode) }}
+
+
+ 车牌号 :
+ {{ dataContent.vehiclePlateNumber }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/coms/returnJobListPopup.vue b/src/pages/productRecycle/coms/returnJobListPopup.vue
new file mode 100644
index 0000000..1e4984f
--- /dev/null
+++ b/src/pages/productRecycle/coms/returnJobListPopup.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/job/productRecycleJob.vue b/src/pages/productRecycle/job/productRecycleJob.vue
new file mode 100644
index 0000000..fd81005
--- /dev/null
+++ b/src/pages/productRecycle/job/productRecycleJob.vue
@@ -0,0 +1,269 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/job/productRecycleJobDetail.vue b/src/pages/productRecycle/job/productRecycleJobDetail.vue
new file mode 100644
index 0000000..682a8af
--- /dev/null
+++ b/src/pages/productRecycle/job/productRecycleJobDetail.vue
@@ -0,0 +1,455 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productRecycle/record/productRecycleRecord.vue b/src/pages/productRecycle/record/productRecycleRecord.vue
new file mode 100644
index 0000000..9087fb8
--- /dev/null
+++ b/src/pages/productRecycle/record/productRecycleRecord.vue
@@ -0,0 +1,333 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productionReturn/job/holdToReturnDetail.vue b/src/pages/productionReturn/job/holdToReturnDetail.vue
new file mode 100644
index 0000000..7653097
--- /dev/null
+++ b/src/pages/productionReturn/job/holdToReturnDetail.vue
@@ -0,0 +1,456 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/productionReturn/job/holdToReturnJob.vue b/src/pages/productionReturn/job/holdToReturnJob.vue
new file mode 100644
index 0000000..a4f3b30
--- /dev/null
+++ b/src/pages/productionReturn/job/holdToReturnJob.vue
@@ -0,0 +1,308 @@
+
+
+
+
+
+
+ swipeClick(event,item)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productionReturn/job/okToReturnDetail.vue b/src/pages/productionReturn/job/okToReturnDetail.vue
new file mode 100644
index 0000000..72a4839
--- /dev/null
+++ b/src/pages/productionReturn/job/okToReturnDetail.vue
@@ -0,0 +1,457 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/productionReturn/job/okToReturnJob.vue b/src/pages/productionReturn/job/okToReturnJob.vue
new file mode 100644
index 0000000..3c6292e
--- /dev/null
+++ b/src/pages/productionReturn/job/okToReturnJob.vue
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+ swipeClick(event,item)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/productionReturn/record/returnToHoldRecordList.vue b/src/pages/productionReturn/record/returnToHoldRecordList.vue
new file mode 100644
index 0000000..e65dcee
--- /dev/null
+++ b/src/pages/productionReturn/record/returnToHoldRecordList.vue
@@ -0,0 +1,343 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/productionReturn/record/returnToHoldRecordListDetail.vue b/src/pages/productionReturn/record/returnToHoldRecordListDetail.vue
new file mode 100644
index 0000000..6dc6c75
--- /dev/null
+++ b/src/pages/productionReturn/record/returnToHoldRecordListDetail.vue
@@ -0,0 +1,424 @@
+
+
+
+
+
+
+ 整单接收
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/purchaseReceipt/coms/comReceiptDetailCardBacth.vue b/src/pages/purchaseReceipt/coms/comReceiptDetailCardBacth.vue
new file mode 100644
index 0000000..5490b6c
--- /dev/null
+++ b/src/pages/purchaseReceipt/coms/comReceiptDetailCardBacth.vue
@@ -0,0 +1,206 @@
+
+
+
+
+
+
+ swipeClick(event,dataContent)"
+ :options="dataContent.handleQty>0? removeOptions:options"
+ :class="dataContent.scaned?'scan_view':''">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/purchaseReceipt/job/purchaseReceipt.vue b/src/pages/purchaseReceipt/job/purchaseReceipt.vue
new file mode 100644
index 0000000..c2b0142
--- /dev/null
+++ b/src/pages/purchaseReceipt/job/purchaseReceipt.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/purchaseReceipt/job/purchaseReceiptDevelop.vue b/src/pages/purchaseReceipt/job/purchaseReceiptDevelop.vue
new file mode 100644
index 0000000..670cdee
--- /dev/null
+++ b/src/pages/purchaseReceipt/job/purchaseReceiptDevelop.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/purchaseReceipt/job/purchaseReceiptTool.vue b/src/pages/purchaseReceipt/job/purchaseReceiptTool.vue
new file mode 100644
index 0000000..dbeb073
--- /dev/null
+++ b/src/pages/purchaseReceipt/job/purchaseReceiptTool.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/purchaseReceipt/job/purchaseReject.vue b/src/pages/purchaseReceipt/job/purchaseReject.vue
new file mode 100644
index 0000000..e031595
--- /dev/null
+++ b/src/pages/purchaseReceipt/job/purchaseReject.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/purchaseReturn/coms/comReturnDetailCard.vue b/src/pages/purchaseReturn/coms/comReturnDetailCard.vue
new file mode 100644
index 0000000..907a29a
--- /dev/null
+++ b/src/pages/purchaseReturn/coms/comReturnDetailCard.vue
@@ -0,0 +1,176 @@
+
+
+
+
+
+
+
+
+
+ itemCoceClick(event,item,index)" :options="removeOptions">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 扫描
+
+
+
+ swipeClick(event,batch,record,recordIndex,batchIndex,loacation.Batchs,locatonIndex,item.Locations)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/purchaseReturn/coms/comReturnDetailCardBatch.vue b/src/pages/purchaseReturn/coms/comReturnDetailCardBatch.vue
new file mode 100644
index 0000000..aa0d760
--- /dev/null
+++ b/src/pages/purchaseReturn/coms/comReturnDetailCardBatch.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+ itemCoceClick(event,item,index)" >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/purchaseReturn/coms/comScanReturnPack.vue b/src/pages/purchaseReturn/coms/comScanReturnPack.vue
new file mode 100644
index 0000000..73a0299
--- /dev/null
+++ b/src/pages/purchaseReturn/coms/comScanReturnPack.vue
@@ -0,0 +1,594 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/purchaseReturn/coms/comScanReturnPackBatch.vue b/src/pages/purchaseReturn/coms/comScanReturnPackBatch.vue
new file mode 100644
index 0000000..c74ed75
--- /dev/null
+++ b/src/pages/purchaseReturn/coms/comScanReturnPackBatch.vue
@@ -0,0 +1,558 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/purchaseReturn/job/returnDetailBatch.vue b/src/pages/purchaseReturn/job/returnDetailBatch.vue
new file mode 100644
index 0000000..0863478
--- /dev/null
+++ b/src/pages/purchaseReturn/job/returnDetailBatch.vue
@@ -0,0 +1,426 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/purchaseReturn/js/return.js b/src/pages/purchaseReturn/js/return.js
new file mode 100644
index 0000000..97b8b8b
--- /dev/null
+++ b/src/pages/purchaseReturn/js/return.js
@@ -0,0 +1,111 @@
+ import {
+ calc
+ } from '@/common/calc.js';
+export function getDataSource(list, subList) {
+ for (var i = 0; i < subList.length; i++) {
+ let detail = subList[i];
+ var location = list.find(r =>
+ r.toLocationCode == detail.toLocationCode)
+ if (location == undefined) {
+ location = {
+ toLocationCode: detail.toLocationCode,
+ productionLineCode: detail.productionLineCode,
+ workStationCode: detail.workStationCode,
+ Items: []
+ }
+ list.push(location);
+ }
+ createDetailInfo(location, detail);
+ }
+ return list;
+}
+
+//树形结构:需求库位 -> 物料Items -> 库位 Locations-> 批次Batchs -> 记录Records
+export function createDetailInfo(location, detail) {
+ var item = location.Items.find(r =>
+ r.itemCode == detail.itemCode)
+ if (item == undefined) {
+ item = createItemInfo(detail);
+ location.Items.push(item)
+ } else {
+ item.qty = calc.add(item.qty,detail.qty)
+ //在物料下查找库位
+ let location = item.Locations.find(r => r.fromLocationCode == detail.fromLocationCode);
+ if (location == undefined) {
+ location = createLocationInfo(detail);
+ item.Locations.push(location);
+ } else {
+ //在库位下查找批次
+ let batch = location.Batchs.find(r => r.batch == detail.batch);
+ if (batch == undefined) {
+ let batch = createBatchInfo(detail);
+ location.Batchs.push(batch);
+ } else {
+ if (detail.packingNumber != "" && detail.packingNumber != null) {
+ batch.Recommends.push(detail);
+ }
+ }
+ }
+ }
+}
+
+export function createItemInfo(detail) {
+ let item = {
+ itemCode: detail.itemCode,
+ itemName: detail.itemName,
+ onTheWayLocationCode:detail.onTheWayLocationCode,
+ productionLineCode: detail.productionLineCode,
+ workStationCode: detail.workStationCode,
+ packQty: detail.packQty,
+ packUnit: detail.packUnit,
+ qty: detail.qty,
+ uom: detail.uom,
+ handleQty: 0,
+ Locations: []
+ }
+ let location = createLocationInfo(detail);
+ item.Locations.push(location);
+ return item;
+}
+
+export function createLocationInfo(detail) {
+ let location = {
+ fromLocationCode: detail.fromLocationCode,
+ qty: detail.qty,
+ uom: detail.uom,
+ handleQty: 0,
+ Batchs: []
+ }
+ let batch = createBatchInfo(detail);
+ location.Batchs.push(batch);
+ return location;
+}
+
+export function createBatchInfo(detail) {
+ let batch = {
+ detail: detail,
+ batch: detail.batch,
+ packingNumber: detail.packingNumber,
+ qty: detail.qty,
+ uom: detail.uom,
+ handleQty: 0,
+ Recommends: [],
+ Records: [],
+ }
+
+ //推荐到了箱码和批次
+ if (detail.packingNumber != "" && detail.packingNumber != null) {
+ batch.Recommends.push(detail);
+ }
+ return batch;
+}
+
+export function createRecordInfo(detail) {
+ var record = {}
+ detail.scaned = true;
+ // let record = JSON.parse(JSON.stringify(detail));
+ //克隆对象,深度克隆,防止双向绑定同一个变量
+ Object.assign(record, detail)
+ record.toLocationCode = this.toLocationCode;
+ return record;
+}
diff --git a/src/pages/putaway/job/quantityPutawayJob.vue b/src/pages/putaway/job/quantityPutawayJob.vue
new file mode 100644
index 0000000..3584b61
--- /dev/null
+++ b/src/pages/putaway/job/quantityPutawayJob.vue
@@ -0,0 +1,517 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ 当前页({{ jobList.length }})
+
+
+
+
+ 第{{ pageNo }}页,每页/{{ pageSize }}, 共:{{ totalCount }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ({{ index + 1 }})
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/putaway/job/quantityPutawayJobDetail.vue b/src/pages/putaway/job/quantityPutawayJobDetail.vue
new file mode 100644
index 0000000..b3c4401
--- /dev/null
+++ b/src/pages/putaway/job/quantityPutawayJobDetail.vue
@@ -0,0 +1,509 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/putaway/record/putawayRecord_bat.vue b/src/pages/putaway/record/putawayRecord_bat.vue
new file mode 100644
index 0000000..bbbb891
--- /dev/null
+++ b/src/pages/putaway/record/putawayRecord_bat.vue
@@ -0,0 +1,443 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/query/coms/comPackDetailCard.vue b/src/pages/query/coms/comPackDetailCard.vue
new file mode 100644
index 0000000..1e13e86
--- /dev/null
+++ b/src/pages/query/coms/comPackDetailCard.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 任务号
+ {{ dataContent.jobNumber }}
+
+
+ 业务类型
+ {{ businessTypeDesc(dataContent.businessType) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/query/pack.vue b/src/pages/query/pack.vue
new file mode 100644
index 0000000..11cbbb8
--- /dev/null
+++ b/src/pages/query/pack.vue
@@ -0,0 +1,444 @@
+
+
+
+
+
+
+
+
+
+
+ 总数 : {{ totalCount }}
+
+
+ ({{ index + 1 }})
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/repleinsh/coms/comRepleishDetailCardBatch.vue b/src/pages/repleinsh/coms/comRepleishDetailCardBatch.vue
new file mode 100644
index 0000000..0b54eba
--- /dev/null
+++ b/src/pages/repleinsh/coms/comRepleishDetailCardBatch.vue
@@ -0,0 +1,126 @@
+
+
+
+ swipeClick(event,item,index)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/repleinsh/coms/comScanReplishPackBatch.vue b/src/pages/repleinsh/coms/comScanReplishPackBatch.vue
new file mode 100644
index 0000000..edad9b9
--- /dev/null
+++ b/src/pages/repleinsh/coms/comScanReplishPackBatch.vue
@@ -0,0 +1,624 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/repleinsh/job/repleinshDetailBatch.vue b/src/pages/repleinsh/job/repleinshDetailBatch.vue
new file mode 100644
index 0000000..d66925c
--- /dev/null
+++ b/src/pages/repleinsh/job/repleinshDetailBatch.vue
@@ -0,0 +1,514 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/repleinsh/record/directRepleinshRecord.vue b/src/pages/repleinsh/record/directRepleinshRecord.vue
new file mode 100644
index 0000000..ae7ed19
--- /dev/null
+++ b/src/pages/repleinsh/record/directRepleinshRecord.vue
@@ -0,0 +1,557 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/repleinsh/record/directRepleinshRecord1.vue b/src/pages/repleinsh/record/directRepleinshRecord1.vue
new file mode 100644
index 0000000..f59fe08
--- /dev/null
+++ b/src/pages/repleinsh/record/directRepleinshRecord1.vue
@@ -0,0 +1,514 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/repleinsh/record/repleinshRecordV1.vue b/src/pages/repleinsh/record/repleinshRecordV1.vue
new file mode 100644
index 0000000..9c305a2
--- /dev/null
+++ b/src/pages/repleinsh/record/repleinshRecordV1.vue
@@ -0,0 +1,465 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/scrap/coms/comScrapDetailCardBatch.vue b/src/pages/scrap/coms/comScrapDetailCardBatch.vue
new file mode 100644
index 0000000..dabf09e
--- /dev/null
+++ b/src/pages/scrap/coms/comScrapDetailCardBatch.vue
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/coms/comScanStockUpPack.vue b/src/pages/stockUp/coms/comScanStockUpPack.vue
new file mode 100644
index 0000000..b26c3d9
--- /dev/null
+++ b/src/pages/stockUp/coms/comScanStockUpPack.vue
@@ -0,0 +1,450 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/coms/comScanStockUpPackBatch.vue b/src/pages/stockUp/coms/comScanStockUpPackBatch.vue
new file mode 100644
index 0000000..a1d69d1
--- /dev/null
+++ b/src/pages/stockUp/coms/comScanStockUpPackBatch.vue
@@ -0,0 +1,475 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/stockUp/coms/comStockUpDetailCard.vue b/src/pages/stockUp/coms/comStockUpDetailCard.vue
new file mode 100644
index 0000000..09da804
--- /dev/null
+++ b/src/pages/stockUp/coms/comStockUpDetailCard.vue
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 实际
+
+ swipeClick(event, batch, record)" style="width: 100%">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/coms/comStockUpDetailCardBatch.vue b/src/pages/stockUp/coms/comStockUpDetailCardBatch.vue
new file mode 100644
index 0000000..a3da2c1
--- /dev/null
+++ b/src/pages/stockUp/coms/comStockUpDetailCardBatch.vue
@@ -0,0 +1,129 @@
+
+
+
+
+ swipeClick(event,item,index)">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/coms/comStockUpJobCard.vue b/src/pages/stockUp/coms/comStockUpJobCard.vue
new file mode 100644
index 0000000..109c7da
--- /dev/null
+++ b/src/pages/stockUp/coms/comStockUpJobCard.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/coms/jobInfoPopup.vue b/src/pages/stockUp/coms/jobInfoPopup.vue
new file mode 100644
index 0000000..032c4ec
--- /dev/null
+++ b/src/pages/stockUp/coms/jobInfoPopup.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+ 发货计划单号 :
+ {{ dataContent.DeliverPlanNumber }}
+
+
+ 客户发货单号 :
+ {{ dataContent.CustomerDeliverNumber }}
+
+
+ 客户代码 :
+ {{ dataContent.CustomerCode }}
+
+
+ 客户月台代码 :
+ {{ dataContent.CustomerDockCode }}
+
+
+ 承运商 :
+ {{ dataContent.carrierCode }}
+
+
+ 运输方式 :
+ {{ dataContent.transferMode }}
+
+
+ 车牌号 :
+ {{ dataContent.vehiclePlateNumber }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/coms/jobListPopup.vue b/src/pages/stockUp/coms/jobListPopup.vue
new file mode 100644
index 0000000..f1c9b15
--- /dev/null
+++ b/src/pages/stockUp/coms/jobListPopup.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/coms/stockUpDetailInfoPopup.vue b/src/pages/stockUp/coms/stockUpDetailInfoPopup.vue
new file mode 100644
index 0000000..960ecbb
--- /dev/null
+++ b/src/pages/stockUp/coms/stockUpDetailInfoPopup.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+ 标包数量 :
+ {{dataContent.packQty}}
+
+
+ 标包单位 :
+ {{getPackUnitInfo(dataContent.packUnit)}}
+
+
+
+
+
+
+
+
+ 订单号 :
+ {{dataContent.poNumber}}
+
+
+ 订单行 :
+ {{dataContent.poLine}}
+
+
+ 项目代码 :
+ {{dataContent.projectCode}}
+
+
+ 到货日期 :
+ {{dateFormat(dataContent.arriveDate)}}
+
+
+ 生产日期 :
+ {{dateFormat(dataContent.produceDate)}}
+
+
+ 过期日期 :
+ {{dateFormat(dataContent.expireDate)}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/job/stockUpJob.vue b/src/pages/stockUp/job/stockUpJob.vue
new file mode 100644
index 0000000..fd1e711
--- /dev/null
+++ b/src/pages/stockUp/job/stockUpJob.vue
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/job/stockUpJobDetail.vue b/src/pages/stockUp/job/stockUpJobDetail.vue
new file mode 100644
index 0000000..53d4da3
--- /dev/null
+++ b/src/pages/stockUp/job/stockUpJobDetail.vue
@@ -0,0 +1,418 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/stockUp/job/stockUpJobDetailBatch.vue b/src/pages/stockUp/job/stockUpJobDetailBatch.vue
new file mode 100644
index 0000000..90373fa
--- /dev/null
+++ b/src/pages/stockUp/job/stockUpJobDetailBatch.vue
@@ -0,0 +1,408 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/unPlanned/coms/comReceiptDetailCardBatch.vue b/src/pages/unPlanned/coms/comReceiptDetailCardBatch.vue
new file mode 100644
index 0000000..950f0d6
--- /dev/null
+++ b/src/pages/unPlanned/coms/comReceiptDetailCardBatch.vue
@@ -0,0 +1,185 @@
+
+
+
+
+
+
+ swipeClick(event,item)">
+
+
+
+
+
+
+
+
+ 复制
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/pages/unPlanned/record/receiptRecordByBatch.vue b/src/pages/unPlanned/record/receiptRecordByBatch.vue
new file mode 100644
index 0000000..b1dde0b
--- /dev/null
+++ b/src/pages/unPlanned/record/receiptRecordByBatch.vue
@@ -0,0 +1,346 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/plugins/storage.js b/src/plugins/storage.js
new file mode 100644
index 0000000..10a94da
--- /dev/null
+++ b/src/plugins/storage.js
@@ -0,0 +1,42 @@
+export default {
+ // 获取本地存储对应key
+ getStorage(key){
+ return uni.getStorageSync( key );
+ },
+ // 设置本地存储对应key
+ setStorage(key,value){
+ return uni.setStorageSync( key,value );
+ },
+// 清除全部本地存储
+ clearStorage (){
+ let overPackageRecordPointParams = ''
+ if( uni.getStorageSync('overPackageRecordPointParams')){
+ overPackageRecordPointParams = uni.getStorageSync('overPackageRecordPointParams')
+ }
+ let overPackageJobDetailPointParams = ''
+ if( uni.getStorageSync('overPackageJobDetailPointParams')){
+ overPackageJobDetailPointParams = uni.getStorageSync('overPackageJobDetailPointParams')
+ }
+ uni.clearStorageSync();
+ if(overPackageRecordPointParams){
+ uni.setStorageSync('overPackageRecordPointParams',overPackageRecordPointParams)
+ }
+ if(overPackageJobDetailPointParams){
+ uni.setStorageSync('overPackageJobDetailPointParams',overPackageJobDetailPointParams)
+ }
+
+ },
+// 清除指定key本地存储
+ removeStorage ( key ){
+ uni.removeStorageSync( key );
+ },
+ // 关闭当前页面,返回上一页面或多级页面
+ constant:{
+ id:"id",
+ token:"token",
+ avatar: 'avatar',
+ name: 'name',
+ roles: 'roles',
+ permissions: 'permissions'
+ }
+}
diff --git a/src/static/icons/icon_copy.svg b/src/static/icons/icon_copy.svg
new file mode 100644
index 0000000..a14b8f4
--- /dev/null
+++ b/src/static/icons/icon_copy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/uni_modules/lime-qrcode/changelog.md b/src/uni_modules/lime-qrcode/changelog.md
new file mode 100644
index 0000000..c3fdbbf
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/changelog.md
@@ -0,0 +1,31 @@
+## 0.1.5(2024-04-14)
+- fix: 修复缺少依赖
+## 0.1.4(2024-04-10)
+- chore: 更新文档
+## 0.1.3(2024-04-01)
+- chore: 兼容uniapp x ios(app-js)
+## 0.1.2(2023-12-14)
+- fix: uvue 引入 API 自定义包出错
+## 0.1.1(2023-12-11)
+- chore: uvue的二维码API独立,需要单独下载
+## 0.1.0(2023-12-07)
+- fix: 修复因utssdk目录导致无法运行
+## 0.0.9(2023-12-06)
+- feat: 支持uvue
+## 0.0.8(2023-12-06)
+- feat: 支持uvue
+## 0.0.7(2023-12-06)
+- feat: 支持uvue
+## 0.0.6(2023-12-06)
+- feat: 支持uvue
+## 0.0.5(2023-07-30)
+- fix: 修复再次生成前没有清空,导致图形叠加
+## 0.0.4(2023-07-27)
+- fix: 修复相同尺寸无法再次生成
+## 0.0.3(2023-06-09)
+- feat: 支持通过`@vue/composition-api`在`vue2`上使用
+- chore: 更新文档
+## 0.0.2(2023-06-08)
+- chore: 更新文档
+## 0.0.1(2023-06-08)
+- 首次
diff --git a/src/uni_modules/lime-qrcode/components/l-qrcode/l-qrcode.uvue b/src/uni_modules/lime-qrcode/components/l-qrcode/l-qrcode.uvue
new file mode 100644
index 0000000..abf129e
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/components/l-qrcode/l-qrcode.uvue
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/lime-qrcode/components/l-qrcode/l-qrcode.vue b/src/uni_modules/lime-qrcode/components/l-qrcode/l-qrcode.vue
new file mode 100644
index 0000000..f228583
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/components/l-qrcode/l-qrcode.vue
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/lime-qrcode/components/l-qrcode/props.ts b/src/uni_modules/lime-qrcode/components/l-qrcode/props.ts
new file mode 100644
index 0000000..fb4d101
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/components/l-qrcode/props.ts
@@ -0,0 +1,36 @@
+// @ts-nocheck
+// import type { PropType } from './vue'
+export default {
+ value: String,
+ icon: String,
+ size: {
+ type: [Number, String],
+ default: 160
+ },
+ iconSize: {
+ type: [Number, String],
+ default: 40
+ },
+ marginSize: Number,
+ color: {
+ type: String,
+ default: '#000'
+ },
+ bgColor: {
+ type: String,
+ default: 'transparent'
+ },
+ bordered: {
+ type: Boolean,
+ default: true
+ },
+ errorLevel: {
+ type: String as PropType<'L'|'M'|'Q'|'H'>,
+ default: 'M' // 'L' | 'M' | 'Q' | 'H'
+ },
+ useCanvasToTempFilePath: Boolean
+ // status: {
+ // type: String as PropType<'active'|'expired'|'loading'>,
+ // default: 'active' // active | expired | loading
+ // }
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-qrcode/components/l-qrcode/qrcode.js b/src/uni_modules/lime-qrcode/components/l-qrcode/qrcode.js
new file mode 100644
index 0000000..b04047b
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/components/l-qrcode/qrcode.js
@@ -0,0 +1,6 @@
+function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var n=0;t.length>n;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function n(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function r(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;o.length>r;r++)0>t.indexOf(n=o[r])&&(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;o.length>r;r++)0>t.indexOf(n=o[r])&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);t>n;n++)r[n]=e[n];return r}function o(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return i(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?i(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,o=function(){};return{s:o,n:function(){return e.length>r?{done:!1,value:e[r++]}:{done:!0}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,s=!0,u=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){u=!0,a=e},f:function(){try{s||null==n.return||n.return()}finally{if(u)throw a}}}}
+/**
+ * @license QR Code generator library (TypeScript)
+ * Copyright (c) Project Nayuki.
+ * SPDX-License-Identifier: MIT
+ */var a;!function(t){var r=function(){function r(t,n,i,o){if(e(this,r),this.version=void 0,this.errorCorrectionLevel=void 0,this.size=void 0,this.mask=void 0,this.modules=[],this.isFunction=[],this.version=t,this.errorCorrectionLevel=n,r.MIN_VERSION>t||t>r.MAX_VERSION)throw new RangeError("Version value out of range");if(-1>o||o>7)throw new RangeError("Mask value out of range");this.size=4*t+17;for(var a=[],u=0;this.size>u;u++)a.push(!1);for(var l=0;this.size>l;l++)this.modules.push(a.slice()),this.isFunction.push(a.slice());this.drawFunctionPatterns();var h=this.addEccAndInterleave(i);if(this.drawCodewords(h),-1==o)for(var c=1e9,f=0;8>f;f++){this.applyMask(f),this.drawFormatBits(f);var v=this.getPenaltyScore();c>v&&(o=f,c=v),this.applyMask(f)}s(o>=0&&7>=o),this.mask=o,this.applyMask(o),this.drawFormatBits(o),this.isFunction=[]}return n(r,[{key:"getModule",value:function(e,t){return e>=0&&this.size>e&&t>=0&&this.size>t&&this.modules[t][e]}},{key:"getModules",value:function(){return this.modules}},{key:"drawFunctionPatterns",value:function(){for(var e=0;this.size>e;e++)this.setFunctionModule(6,e,e%2==0),this.setFunctionModule(e,6,e%2==0);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);for(var t=this.getAlignmentPatternPositions(),n=t.length,r=0;n>r;r++)for(var i=0;n>i;i++)0==r&&0==i||0==r&&i==n-1||r==n-1&&0==i||this.drawAlignmentPattern(t[r],t[i]);this.drawFormatBits(0),this.drawVersion()}},{key:"drawFormatBits",value:function(e){for(var t=this.errorCorrectionLevel.formatBits<<3|e,n=t,r=0;10>r;r++)n=n<<1^1335*(n>>>9);var i=21522^(t<<10|n);s(i>>>15==0);for(var o=0;5>=o;o++)this.setFunctionModule(8,o,a(i,o));this.setFunctionModule(8,7,a(i,6)),this.setFunctionModule(8,8,a(i,7)),this.setFunctionModule(7,8,a(i,8));for(var u=9;15>u;u++)this.setFunctionModule(14-u,8,a(i,u));for(var l=0;8>l;l++)this.setFunctionModule(this.size-1-l,8,a(i,l));for(var h=8;15>h;h++)this.setFunctionModule(8,this.size-15+h,a(i,h));this.setFunctionModule(8,this.size-8,!0)}},{key:"drawVersion",value:function(){if(this.version>=7){for(var e=this.version,t=0;12>t;t++)e=e<<1^7973*(e>>>11);var n=this.version<<12|e;s(n>>>18==0);for(var r=0;18>r;r++){var i=a(n,r),o=this.size-11+r%3,u=Math.floor(r/3);this.setFunctionModule(o,u,i),this.setFunctionModule(u,o,i)}}}},{key:"drawFinderPattern",value:function(e,t){for(var n=-4;4>=n;n++)for(var r=-4;4>=r;r++){var i=Math.max(Math.abs(r),Math.abs(n)),o=e+r,a=t+n;o>=0&&this.size>o&&a>=0&&this.size>a&&this.setFunctionModule(o,a,2!=i&&4!=i)}}},{key:"drawAlignmentPattern",value:function(e,t){for(var n=-2;2>=n;n++)for(var r=-2;2>=r;r++)this.setFunctionModule(e+r,t+n,1!=Math.max(Math.abs(r),Math.abs(n)))}},{key:"setFunctionModule",value:function(e,t,n){this.modules[t][e]=n,this.isFunction[t][e]=!0}},{key:"addEccAndInterleave",value:function(e){var t=this.version,n=this.errorCorrectionLevel;if(e.length!=r.getNumDataCodewords(t,n))throw new RangeError("Invalid argument");for(var i=r.NUM_ERROR_CORRECTION_BLOCKS[n.ordinal][t],o=r.ECC_CODEWORDS_PER_BLOCK[n.ordinal][t],a=Math.floor(r.getNumRawDataModules(t)/8),u=i-a%i,l=Math.floor(a/i),h=[],c=r.reedSolomonComputeDivisor(o),f=0,v=0;i>f;f++){var d=e.slice(v,v+l-o+(u>f?0:1));v+=d.length;var m=r.reedSolomonComputeRemainder(d,c);u>f&&d.push(0),h.push(d.concat(m))}for(var g=[],y=function(e){h.forEach((function(t,n){e==l-o&&u>n||g.push(t[e])}))},E=0;h[0].length>E;E++)y(E);return s(g.length==a),g}},{key:"drawCodewords",value:function(e){if(e.length!=Math.floor(r.getNumRawDataModules(this.version)/8))throw new RangeError("Invalid argument");for(var t=0,n=this.size-1;n>=1;n-=2){6==n&&(n=5);for(var i=0;this.size>i;i++)for(var o=0;2>o;o++){var u=n-o,l=0==(n+1&2)?this.size-1-i:i;!this.isFunction[l][u]&&8*e.length>t&&(this.modules[l][u]=a(e[t>>>3],7-(7&t)),t++)}}s(t==8*e.length)}},{key:"applyMask",value:function(e){if(0>e||e>7)throw new RangeError("Mask value out of range");for(var t=0;this.size>t;t++)for(var n=0;this.size>n;n++){var r=void 0;switch(e){case 0:r=(n+t)%2==0;break;case 1:r=t%2==0;break;case 2:r=n%3==0;break;case 3:r=(n+t)%3==0;break;case 4:r=(Math.floor(n/3)+Math.floor(t/2))%2==0;break;case 5:r=n*t%2+n*t%3==0;break;case 6:r=(n*t%2+n*t%3)%2==0;break;case 7:r=((n+t)%2+n*t%3)%2==0;break;default:throw Error("Unreachable")}!this.isFunction[t][n]&&r&&(this.modules[t][n]=!this.modules[t][n])}}},{key:"getPenaltyScore",value:function(){for(var e=0,t=0;this.size>t;t++){for(var n=!1,i=0,a=[0,0,0,0,0,0,0],u=0;this.size>u;u++)this.modules[t][u]==n?5==++i?e+=r.PENALTY_N1:i>5&&e++:(this.finderPenaltyAddHistory(i,a),n||(e+=this.finderPenaltyCountPatterns(a)*r.PENALTY_N3),n=this.modules[t][u],i=1);e+=this.finderPenaltyTerminateAndCount(n,i,a)*r.PENALTY_N3}for(var l=0;this.size>l;l++){for(var h=!1,c=0,f=[0,0,0,0,0,0,0],v=0;this.size>v;v++)this.modules[v][l]==h?5==++c?e+=r.PENALTY_N1:c>5&&e++:(this.finderPenaltyAddHistory(c,f),h||(e+=this.finderPenaltyCountPatterns(f)*r.PENALTY_N3),h=this.modules[v][l],c=1);e+=this.finderPenaltyTerminateAndCount(h,c,f)*r.PENALTY_N3}for(var d=0;this.size-1>d;d++)for(var m=0;this.size-1>m;m++){var g=this.modules[d][m];g==this.modules[d][m+1]&&g==this.modules[d+1][m]&&g==this.modules[d+1][m+1]&&(e+=r.PENALTY_N2)}var y,E=0,w=o(this.modules);try{for(w.s();!(y=w.n()).done;){E=y.value.reduce((function(e,t){return e+(t?1:0)}),E)}}catch(e){w.e(e)}finally{w.f()}var M=this.size*this.size,C=Math.ceil(Math.abs(20*E-10*M)/M)-1;return s(C>=0&&9>=C),s((e+=C*r.PENALTY_N4)>=0&&2568888>=e),e}},{key:"getAlignmentPatternPositions",value:function(){if(1==this.version)return[];for(var e=Math.floor(this.version/7)+2,t=32==this.version?26:2*Math.ceil((4*this.version+4)/(2*e-2)),n=[6],r=this.size-7;e>n.length;r-=t)n.splice(1,0,r);return n}},{key:"finderPenaltyCountPatterns",value:function(e){var t=e[1];s(3*this.size>=t);var n=t>0&&e[2]==t&&e[3]==3*t&&e[4]==t&&e[5]==t;return(!n||4*t>e[0]||t>e[6]?0:1)+(!n||4*t>e[6]||t>e[0]?0:1)}},{key:"finderPenaltyTerminateAndCount",value:function(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),this.finderPenaltyAddHistory(t+=this.size,n),this.finderPenaltyCountPatterns(n)}},{key:"finderPenaltyAddHistory",value:function(e,t){0==t[0]&&(e+=this.size),t.pop(),t.unshift(e)}}],[{key:"encodeText",value:function(e,n){var i=t.QrSegment.makeSegments(e);return r.encodeSegments(i,n)}},{key:"encodeBinary",value:function(e,n){var i=t.QrSegment.makeBytes(e);return r.encodeSegments([i],n)}},{key:"encodeSegments",value:function(e,t){var n,a,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,h=arguments.length>3&&void 0!==arguments[3]?arguments[3]:40,c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1,f=5>=arguments.length||void 0===arguments[5]||arguments[5];if(r.MIN_VERSION>l||l>h||h>r.MAX_VERSION||-1>c||c>7)throw new RangeError("Invalid value");for(n=l;;n++){var v=8*r.getNumDataCodewords(n,t),d=u.getTotalBits(e,n);if(v>=d){a=d;break}if(n>=h)throw new RangeError("Data too long")}for(var m=0,g=[r.Ecc.MEDIUM,r.Ecc.QUARTILE,r.Ecc.HIGH];g.length>m;m++){var y=g[m];f&&a<=8*r.getNumDataCodewords(n,y)&&(t=y)}var E,w=[],M=o(e);try{for(M.s();!(E=M.n()).done;){var C=E.value;i(C.mode.modeBits,4,w),i(C.numChars,C.mode.numCharCountBits(n),w);var R,A=o(C.getData());try{for(A.s();!(R=A.n()).done;){var p=R.value;w.push(p)}}catch(e){A.e(e)}finally{A.f()}}}catch(e){M.e(e)}finally{M.f()}s(w.length==a);var P=8*r.getNumDataCodewords(n,t);s(P>=w.length),i(0,Math.min(4,P-w.length),w),i(0,(8-w.length%8)%8,w),s(w.length%8==0);for(var N=236;P>w.length;N^=253)i(N,8,w);for(var k=[];w.length>8*k.length;)k.push(0);return w.forEach((function(e,t){return k[t>>>3]|=e<<7-(7&t)})),new r(n,t,k,c)}},{key:"getNumRawDataModules",value:function(e){if(r.MIN_VERSION>e||e>r.MAX_VERSION)throw new RangeError("Version number out of range");var t=(16*e+128)*e+64;if(e>=2){var n=Math.floor(e/7)+2;t-=(25*n-10)*n-55,7>e||(t-=36)}return s(t>=208&&29648>=t),t}},{key:"getNumDataCodewords",value:function(e,t){return Math.floor(r.getNumRawDataModules(e)/8)-r.ECC_CODEWORDS_PER_BLOCK[t.ordinal][e]*r.NUM_ERROR_CORRECTION_BLOCKS[t.ordinal][e]}},{key:"reedSolomonComputeDivisor",value:function(e){if(1>e||e>255)throw new RangeError("Degree out of range");for(var t=[],n=0;e-1>n;n++)t.push(0);t.push(1);for(var i=1,o=0;e>o;o++){for(var a=0;t.length>a;a++)t[a]=r.reedSolomonMultiply(t[a],i),t.length>a+1&&(t[a]^=t[a+1]);i=r.reedSolomonMultiply(i,2)}return t}},{key:"reedSolomonComputeRemainder",value:function(e,t){var n,i=t.map((function(e){return 0})),a=o(e);try{var s=function(){var e=n.value^i.shift();i.push(0),t.forEach((function(t,n){return i[n]^=r.reedSolomonMultiply(t,e)}))};for(a.s();!(n=a.n()).done;)s()}catch(e){a.e(e)}finally{a.f()}return i}},{key:"reedSolomonMultiply",value:function(e,t){if(e>>>8!=0||t>>>8!=0)throw new RangeError("Byte out of range");for(var n=0,r=7;r>=0;r--)n=n<<1^285*(n>>>7),n^=(t>>>r&1)*e;return s(n>>>8==0),n}}]),r}();function i(e,t,n){if(0>t||t>31||e>>>t!=0)throw new RangeError("Value out of range");for(var r=t-1;r>=0;r--)n.push(e>>>r&1)}function a(e,t){return 0!=(e>>>t&1)}function s(e){if(!e)throw Error("Assertion error")}r.MIN_VERSION=1,r.MAX_VERSION=40,r.PENALTY_N1=3,r.PENALTY_N2=3,r.PENALTY_N3=40,r.PENALTY_N4=10,r.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],r.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],t.QrCode=r;var u=function(){function t(n,r,i){if(e(this,t),this.mode=void 0,this.numChars=void 0,this.bitData=void 0,this.mode=n,this.numChars=r,this.bitData=i,0>r)throw new RangeError("Invalid argument");this.bitData=i.slice()}return n(t,[{key:"getData",value:function(){return this.bitData.slice()}}],[{key:"makeBytes",value:function(e){var n,r=[],a=o(e);try{for(a.s();!(n=a.n()).done;){i(n.value,8,r)}}catch(e){a.e(e)}finally{a.f()}return new t(t.Mode.BYTE,e.length,r)}},{key:"makeNumeric",value:function(e){if(!t.isNumeric(e))throw new RangeError("String contains non-numeric characters");for(var n=[],r=0;e.length>r;){var o=Math.min(e.length-r,3);i(parseInt(e.substring(r,r+o),10),3*o+1,n),r+=o}return new t(t.Mode.NUMERIC,e.length,n)}},{key:"makeAlphanumeric",value:function(e){if(!t.isAlphanumeric(e))throw new RangeError("String contains unencodable characters in alphanumeric mode");var n,r=[];for(n=0;e.length>=n+2;n+=2){var o=45*t.ALPHANUMERIC_CHARSET.indexOf(e.charAt(n));i(o+=t.ALPHANUMERIC_CHARSET.indexOf(e.charAt(n+1)),11,r)}return e.length>n&&i(t.ALPHANUMERIC_CHARSET.indexOf(e.charAt(n)),6,r),new t(t.Mode.ALPHANUMERIC,e.length,r)}},{key:"makeSegments",value:function(e){return""==e?[]:t.isNumeric(e)?[t.makeNumeric(e)]:t.isAlphanumeric(e)?[t.makeAlphanumeric(e)]:[t.makeBytes(t.toUtf8ByteArray(e))]}},{key:"makeEci",value:function(e){var n=[];if(0>e)throw new RangeError("ECI assignment value out of range");if(128>e)i(e,8,n);else if(16384>e)i(2,2,n),i(e,14,n);else{if(e>=1e6)throw new RangeError("ECI assignment value out of range");i(6,3,n),i(e,21,n)}return new t(t.Mode.ECI,0,n)}},{key:"isNumeric",value:function(e){return t.NUMERIC_REGEX.test(e)}},{key:"isAlphanumeric",value:function(e){return t.ALPHANUMERIC_REGEX.test(e)}},{key:"getTotalBits",value:function(e,t){var n,r=0,i=o(e);try{for(i.s();!(n=i.n()).done;){var a=n.value,s=a.mode.numCharCountBits(t);if(a.numChars>=1<n;n++)"%"!=e.charAt(n)?t.push(e.charCodeAt(n)):(t.push(parseInt(e.substring(n+1,n+3),16)),n+=2);return t}}]),t}();u.NUMERIC_REGEX=/^[0-9]*$/,u.ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+.\/:-]*$/,u.ALPHANUMERIC_CHARSET="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:",t.QrSegment=u}(a||(a={})),function(t){!function(t){var r=n((function t(n,r){e(this,t),this.ordinal=void 0,this.formatBits=void 0,this.ordinal=n,this.formatBits=r}));r.LOW=new r(0,1),r.MEDIUM=new r(1,0),r.QUARTILE=new r(2,3),r.HIGH=new r(3,2),t.Ecc=r}(t.QrCode||(t.QrCode={}))}(a||(a={})),function(t){!function(t){var r=function(){function t(n,r){e(this,t),this.modeBits=void 0,this.numBitsCharCount=void 0,this.modeBits=n,this.numBitsCharCount=r}return n(t,[{key:"numCharCountBits",value:function(e){return this.numBitsCharCount[Math.floor((e+7)/17)]}}]),t}();r.NUMERIC=new r(1,[10,12,14]),r.ALPHANUMERIC=new r(2,[9,11,13]),r.BYTE=new r(4,[8,16,16]),r.KANJI=new r(8,[8,10,12]),r.ECI=new r(7,[0,0,0]),t.Mode=r}(t.QrSegment||(t.QrSegment={}))}(a||(a={}));var s=a,u=["value","size","level","bgColor","fgColor","includeMargin","marginSize","imageSettings"],l={L:s.QrCode.Ecc.LOW,M:s.QrCode.Ecc.MEDIUM,Q:s.QrCode.Ecc.QUARTILE,H:s.QrCode.Ecc.HIGH};function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[];return e.forEach((function(e,r){var i=null;e.forEach((function(o,a){if(!o&&null!==i)return n.push("M".concat(i+t," ").concat(r+t,"h").concat(a-i,"v1H").concat(i+t,"z")),void(i=null);if(a!==e.length-1)o&&null===i&&(i=a);else{if(!o)return;n.push(null===i?"M".concat(a+t,",").concat(r+t," h1v1H").concat(a+t,"z"):"M".concat(i+t,",").concat(r+t," h").concat(a+1-i,"v1H").concat(i+t,"z"))}}))})),n.join("")}function c(e,t){return e.slice().map((function(e,n){return t.y>n||n>=t.y+t.h?e:e.map((function(e,n){return(t.x>n||n>=t.x+t.w)&&e}))}))}var f=function(){function t(n,r){var i=this;for(var o in e(this,t),this.canvas=void 0,this.pixelRatio="undefined"!=typeof window?window.devicePixelRatio:1,this.path2D=!0,this.SUPPORTS_PATH2D=void 0,this.createImage=function(){return new Image},this.createPath2D=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0,t="createPath2D";return i.canvas&&t in i.canvas?i.canvas[t](e):new Path2D(e)},this.canvas=n,r)o in this&&(this[o]=r[o]);this.SUPPORTS_PATH2D=function(){try{i.createPath2D()}catch(e){return!1}return!0}()}return n(t,[{key:"render",value:function(e,t){var n=this,i=e.value,o=e.size,a=void 0===o?128:o,f=e.level,v=void 0===f?"L":f,d=e.bgColor,m=void 0===d?"#FFFFFF":d,g=e.fgColor,y=void 0===g?"#000000":g,E=e.includeMargin,w=void 0!==E&&E,M=e.marginSize,C=e.imageSettings,R=(r(e,u),null==C?void 0:C.src),A=this.canvas,p=A.getContext("2d");if(p&&i){var P=s.QrCode.encodeText(i,l[v]).getModules(),N=function(e,t){return null!=t?Math.floor(t):e?4:0}(w,M),k=P.length+2*N,S=function(e,t,n,r){if(null==r)return null;var i=e.length+2*n,o=Math.floor(.1*t),a=i/t,s=(r.width||o)*a,u=(r.height||o)*a,l=null==r.x?e.length/2-s/2:r.x*a,h=null==r.y?e.length/2-u/2:r.y*a,c=null;if(r.excavate){var f=Math.floor(l),v=Math.floor(h);c={x:f,y:v,w:Math.ceil(s+l-f),h:Math.ceil(u+h-v)}}return{x:l,y:h,h:u,w:s,excavation:c}}(P,a,N,C),I=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,r=null!=S&&null!==e&&e.complete&&0!==e.naturalHeight&&0!==e.naturalWidth;r&&null!=S.excavation&&(P=c(P,S.excavation)),t&&t(P);var i=n.pixelRatio;p.clearRect(0,0,A.width,A.height),p.setTransform(1,0,0,1,0,0),A.height=A.width=a*i;var o=a/k*i;if(p.scale(o,o),p.fillStyle=m,p.fillRect(0,0,k,k),p.fillStyle=y,n.SUPPORTS_PATH2D&&n.path2D){var s=n.createPath2D(h(P,N));p.fill(s)}else P.forEach((function(e,t){e.forEach((function(e,n){e&&p.fillRect(n+N,t+N,1,1)}))}));var u=(null==e?void 0:e.path)||e;r&&p.drawImage(u,S.x+N,S.y+N,S.w,S.h),"draw"in p&&p.draw()};if(R){var b=this.createImage(A);b.onload=function(){I(b)},b.onerror=function(e){I(),console.warn(e)},b.src=R}else I()}}}]),t}();export{f as QRCodeCanvas};
diff --git a/src/uni_modules/lime-qrcode/components/l-qrcode/type.ts b/src/uni_modules/lime-qrcode/components/l-qrcode/type.ts
new file mode 100644
index 0000000..a11d379
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/components/l-qrcode/type.ts
@@ -0,0 +1,47 @@
+export type ImageSettings = {
+ width: number
+ height: number
+ x?: number
+ y?: number
+ excavate: boolean
+}
+export type QRCodePropsTypes = {
+ value?: string
+ size?: number
+ fgColor?: string
+ level?: string
+ marginSize: number
+ includeMargin: boolean
+ imageSettings?: ImageSettings
+}
+
+export type QRCodeCallback = (cells : boolean[][]) => void
+
+export type Excavation = {
+ x: number
+ y: number
+ h: number
+ w: number
+}
+
+
+
+
+
+/**
+ * 成功回调函数定义
+ */
+export type TakeSnapshotSuccessCallback = (res: TakeSnapshotSuccess) => void
+/**
+ * 失败回调函数定义
+ */
+export type TakeSnapshotFailCallback = (res: TakeSnapshotFail) => void
+/**
+ * 完成回调函数定义
+ */
+export type TakeSnapshotCompleteCallback = (res: any) => void
+
+
+export type LQrcodeFailCallback = TakeSnapshotFailCallback
+export type LQrcodeCompleteCallback = TakeSnapshotCompleteCallback
+export type LQrcodeSuccessCallback = TakeSnapshotSuccessCallback
\ No newline at end of file
diff --git a/src/uni_modules/lime-qrcode/components/l-qrcode/useCanvas.ts b/src/uni_modules/lime-qrcode/components/l-qrcode/useCanvas.ts
new file mode 100644
index 0000000..10587cd
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/components/l-qrcode/useCanvas.ts
@@ -0,0 +1,78 @@
+
+// @ts-nocheck
+import type { ComponentInternalInstance } from '@/uni_modules/lime-shared/vue'
+import { getRect } from '@/uni_modules/lime-shared/getRect'
+import { canIUseCanvas2d } from '@/uni_modules/lime-shared/canIUseCanvas2d'
+export const isCanvas2d = canIUseCanvas2d()
+
+export async function getCanvas(canvasId: string, options: {context: ComponentInternalInstance}) {
+ let { context } = options
+ // #ifdef MP || VUE2
+ if (context.proxy) context = context.proxy
+ // #endif
+ return getRect('#' + canvasId, {context, type: isCanvas2d ? 'fields': 'boundingClientRect'}).then(res => {
+ if(res.node){
+ return res.node
+ } else {
+ const ctx = uni.createCanvasContext(canvasId, context)
+ return {
+ getContext(type: string) {
+ if(type == '2d') {
+ return ctx
+ }
+ },
+ width: res.width,
+ height: res.height,
+ }
+ // #ifdef H5
+ // canvas.value = context.proxy.$el.querySelector('#'+ canvasId)
+ // #endif
+ }
+ })
+}
+
+// #ifndef H5 || APP-NVUE
+class Image {
+ currentSrc: string | null = null
+ naturalHeight: number = 0
+ naturalWidth: number = 0
+ width: number = 0
+ height: number = 0
+ tagName: string = 'IMG'
+ path: any = ''
+ crossOrigin: any = ''
+ referrerPolicy: any = ''
+ onload: () => void
+ onerror: () => void
+ constructor() {}
+ set src(src) {
+ this.currentSrc = src
+ uni.getImageInfo({
+ src,
+ success: (res) => {
+ this.path = res.path
+ this.naturalWidth = this.width = res.width
+ this.naturalHeight = this.height = res.height
+ this.onload()
+ },
+ fail: () => {
+ this.onerror()
+ }
+ })
+ }
+ get src() {
+ return this.currentSrc
+ }
+}
+// #endif
+
+export function createImage(canvas: WechatMiniprogram.Canvas) {
+ if(canvas && canvas.createImage) {
+ return canvas.createImage()
+ } else if(typeof window != 'undefined' && window.Image) {
+ return new window.Image()
+ }
+ // #ifndef H5 || APP-NVUE
+ return new Image()
+ // #endif
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-qrcode/components/l-qrcode/utils.uts b/src/uni_modules/lime-qrcode/components/l-qrcode/utils.uts
new file mode 100644
index 0000000..a88a930
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/components/l-qrcode/utils.uts
@@ -0,0 +1,35 @@
+export function addUnit(value: any|null):string{
+ if(value == null){
+ return ''
+ }
+ value = `${value}`
+ return /^(-)?\d+(\\.\d+)?$/.test(value) ? `${value}px` : value
+}
+
+export function unitConvert(value: any|null): number{
+ if(typeof value == 'number'){
+ return value as number
+ }
+ if(typeof value == 'string'){
+ value = `${value}`
+ if(/^(-)?\d+(\\.\d+)?$/.test(value)){
+ return parseFloat(value);
+ }
+
+ const reg = /^-?([0-9]+)?([.]{1}[0-9]+){0,1}(em|rpx|px|%)$/g;
+ const results = reg.exec(value);
+ if (results == null) {
+ return 0;
+ }
+ const unit = results[3];
+ const v = parseFloat(value);
+ if (unit == 'rpx') {
+ const { windowWidth } = uni.getWindowInfo()
+ return windowWidth / 750 * v;
+ }
+ if (unit == 'px') {
+ return v;
+ }
+ }
+ return 0;
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-qrcode/components/lime-qrcode/lime-qrcode.uvue b/src/uni_modules/lime-qrcode/components/lime-qrcode/lime-qrcode.uvue
new file mode 100644
index 0000000..93e10d2
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/components/lime-qrcode/lime-qrcode.uvue
@@ -0,0 +1,140 @@
+
+
+ QRCode
+ 能够将文本转换生成二维码的组件,支持自定义配色和 Logo 配置
+
+
+ 基础
+
+
+
+
+
+
+ icon
+
+
+
+
+
+
+
+
+
+
+
+ 颜色
+
+
+
+
+
+
+
+
+
+ 纠错比例
+
+
+
+
+
+
+
+ 动态
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/lime-qrcode/components/lime-qrcode/lime-qrcode.vue b/src/uni_modules/lime-qrcode/components/lime-qrcode/lime-qrcode.vue
new file mode 100644
index 0000000..113ef87
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/components/lime-qrcode/lime-qrcode.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/uni_modules/lime-qrcode/hybrid/html/index.html b/src/uni_modules/lime-qrcode/hybrid/html/index.html
new file mode 100644
index 0000000..bf4def9
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/hybrid/html/index.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+ lime-qrcode
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/lime-qrcode/hybrid/html/qrcode.min.js b/src/uni_modules/lime-qrcode/hybrid/html/qrcode.min.js
new file mode 100644
index 0000000..a0c79ce
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/hybrid/html/qrcode.min.js
@@ -0,0 +1,6 @@
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).lime={})}(this,(function(e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var n=0;t.length>n;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function r(e,t,r){return t&&n(e.prototype,t),r&&n(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e}function i(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;o.length>r;r++)0>t.indexOf(n=o[r])&&(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;o.length>r;r++)0>t.indexOf(n=o[r])&&Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);t>n;n++)r[n]=e[n];return r}function a(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=function(e,t){if(e){if("string"==typeof e)return o(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var r=0,i=function(){};return{s:i,n:function(){return e.length>r?{done:!1,value:e[r++]}:{done:!0}},e:function(e){throw e},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,s=!0,u=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return s=e.done,e},e:function(e){u=!0,a=e},f:function(){try{s||null==n.return||n.return()}finally{if(u)throw a}}}}
+/**
+ * @license QR Code generator library (TypeScript)
+ * Copyright (c) Project Nayuki.
+ * SPDX-License-Identifier: MIT
+ */var s;!function(e){var n=function(){function n(e,r,i,o){if(t(this,n),this.version=void 0,this.errorCorrectionLevel=void 0,this.size=void 0,this.mask=void 0,this.modules=[],this.isFunction=[],this.version=e,this.errorCorrectionLevel=r,n.MIN_VERSION>e||e>n.MAX_VERSION)throw new RangeError("Version value out of range");if(-1>o||o>7)throw new RangeError("Mask value out of range");this.size=4*e+17;for(var a=[],u=0;this.size>u;u++)a.push(!1);for(var l=0;this.size>l;l++)this.modules.push(a.slice()),this.isFunction.push(a.slice());this.drawFunctionPatterns();var h=this.addEccAndInterleave(i);if(this.drawCodewords(h),-1==o)for(var c=1e9,f=0;8>f;f++){this.applyMask(f),this.drawFormatBits(f);var d=this.getPenaltyScore();c>d&&(o=f,c=d),this.applyMask(f)}s(o>=0&&7>=o),this.mask=o,this.applyMask(o),this.drawFormatBits(o),this.isFunction=[]}return r(n,[{key:"getModule",value:function(e,t){return e>=0&&this.size>e&&t>=0&&this.size>t&&this.modules[t][e]}},{key:"getModules",value:function(){return this.modules}},{key:"drawFunctionPatterns",value:function(){for(var e=0;this.size>e;e++)this.setFunctionModule(6,e,e%2==0),this.setFunctionModule(e,6,e%2==0);this.drawFinderPattern(3,3),this.drawFinderPattern(this.size-4,3),this.drawFinderPattern(3,this.size-4);for(var t=this.getAlignmentPatternPositions(),n=t.length,r=0;n>r;r++)for(var i=0;n>i;i++)0==r&&0==i||0==r&&i==n-1||r==n-1&&0==i||this.drawAlignmentPattern(t[r],t[i]);this.drawFormatBits(0),this.drawVersion()}},{key:"drawFormatBits",value:function(e){for(var t=this.errorCorrectionLevel.formatBits<<3|e,n=t,r=0;10>r;r++)n=n<<1^1335*(n>>>9);var i=21522^(t<<10|n);s(i>>>15==0);for(var a=0;5>=a;a++)this.setFunctionModule(8,a,o(i,a));this.setFunctionModule(8,7,o(i,6)),this.setFunctionModule(8,8,o(i,7)),this.setFunctionModule(7,8,o(i,8));for(var u=9;15>u;u++)this.setFunctionModule(14-u,8,o(i,u));for(var l=0;8>l;l++)this.setFunctionModule(this.size-1-l,8,o(i,l));for(var h=8;15>h;h++)this.setFunctionModule(8,this.size-15+h,o(i,h));this.setFunctionModule(8,this.size-8,!0)}},{key:"drawVersion",value:function(){if(this.version>=7){for(var e=this.version,t=0;12>t;t++)e=e<<1^7973*(e>>>11);var n=this.version<<12|e;s(n>>>18==0);for(var r=0;18>r;r++){var i=o(n,r),a=this.size-11+r%3,u=Math.floor(r/3);this.setFunctionModule(a,u,i),this.setFunctionModule(u,a,i)}}}},{key:"drawFinderPattern",value:function(e,t){for(var n=-4;4>=n;n++)for(var r=-4;4>=r;r++){var i=Math.max(Math.abs(r),Math.abs(n)),o=e+r,a=t+n;o>=0&&this.size>o&&a>=0&&this.size>a&&this.setFunctionModule(o,a,2!=i&&4!=i)}}},{key:"drawAlignmentPattern",value:function(e,t){for(var n=-2;2>=n;n++)for(var r=-2;2>=r;r++)this.setFunctionModule(e+r,t+n,1!=Math.max(Math.abs(r),Math.abs(n)))}},{key:"setFunctionModule",value:function(e,t,n){this.modules[t][e]=n,this.isFunction[t][e]=!0}},{key:"addEccAndInterleave",value:function(e){var t=this.version,r=this.errorCorrectionLevel;if(e.length!=n.getNumDataCodewords(t,r))throw new RangeError("Invalid argument");for(var i=n.NUM_ERROR_CORRECTION_BLOCKS[r.ordinal][t],o=n.ECC_CODEWORDS_PER_BLOCK[r.ordinal][t],a=Math.floor(n.getNumRawDataModules(t)/8),u=i-a%i,l=Math.floor(a/i),h=[],c=n.reedSolomonComputeDivisor(o),f=0,d=0;i>f;f++){var v=e.slice(d,d+l-o+(u>f?0:1));d+=v.length;var m=n.reedSolomonComputeRemainder(v,c);u>f&&v.push(0),h.push(v.concat(m))}for(var g=[],y=function(e){h.forEach((function(t,n){e==l-o&&u>n||g.push(t[e])}))},E=0;h[0].length>E;E++)y(E);return s(g.length==a),g}},{key:"drawCodewords",value:function(e){if(e.length!=Math.floor(n.getNumRawDataModules(this.version)/8))throw new RangeError("Invalid argument");for(var t=0,r=this.size-1;r>=1;r-=2){6==r&&(r=5);for(var i=0;this.size>i;i++)for(var a=0;2>a;a++){var u=r-a,l=0==(r+1&2)?this.size-1-i:i;!this.isFunction[l][u]&&8*e.length>t&&(this.modules[l][u]=o(e[t>>>3],7-(7&t)),t++)}}s(t==8*e.length)}},{key:"applyMask",value:function(e){if(0>e||e>7)throw new RangeError("Mask value out of range");for(var t=0;this.size>t;t++)for(var n=0;this.size>n;n++){var r=void 0;switch(e){case 0:r=(n+t)%2==0;break;case 1:r=t%2==0;break;case 2:r=n%3==0;break;case 3:r=(n+t)%3==0;break;case 4:r=(Math.floor(n/3)+Math.floor(t/2))%2==0;break;case 5:r=n*t%2+n*t%3==0;break;case 6:r=(n*t%2+n*t%3)%2==0;break;case 7:r=((n+t)%2+n*t%3)%2==0;break;default:throw Error("Unreachable")}!this.isFunction[t][n]&&r&&(this.modules[t][n]=!this.modules[t][n])}}},{key:"getPenaltyScore",value:function(){for(var e=0,t=0;this.size>t;t++){for(var r=!1,i=0,o=[0,0,0,0,0,0,0],u=0;this.size>u;u++)this.modules[t][u]==r?5==++i?e+=n.PENALTY_N1:i>5&&e++:(this.finderPenaltyAddHistory(i,o),r||(e+=this.finderPenaltyCountPatterns(o)*n.PENALTY_N3),r=this.modules[t][u],i=1);e+=this.finderPenaltyTerminateAndCount(r,i,o)*n.PENALTY_N3}for(var l=0;this.size>l;l++){for(var h=!1,c=0,f=[0,0,0,0,0,0,0],d=0;this.size>d;d++)this.modules[d][l]==h?5==++c?e+=n.PENALTY_N1:c>5&&e++:(this.finderPenaltyAddHistory(c,f),h||(e+=this.finderPenaltyCountPatterns(f)*n.PENALTY_N3),h=this.modules[d][l],c=1);e+=this.finderPenaltyTerminateAndCount(h,c,f)*n.PENALTY_N3}for(var v=0;this.size-1>v;v++)for(var m=0;this.size-1>m;m++){var g=this.modules[v][m];g==this.modules[v][m+1]&&g==this.modules[v+1][m]&&g==this.modules[v+1][m+1]&&(e+=n.PENALTY_N2)}var y,E=0,w=a(this.modules);try{for(w.s();!(y=w.n()).done;){E=y.value.reduce((function(e,t){return e+(t?1:0)}),E)}}catch(e){w.e(e)}finally{w.f()}var M=this.size*this.size,C=Math.ceil(Math.abs(20*E-10*M)/M)-1;return s(C>=0&&9>=C),s((e+=C*n.PENALTY_N4)>=0&&2568888>=e),e}},{key:"getAlignmentPatternPositions",value:function(){if(1==this.version)return[];for(var e=Math.floor(this.version/7)+2,t=32==this.version?26:2*Math.ceil((4*this.version+4)/(2*e-2)),n=[6],r=this.size-7;e>n.length;r-=t)n.splice(1,0,r);return n}},{key:"finderPenaltyCountPatterns",value:function(e){var t=e[1];s(3*this.size>=t);var n=t>0&&e[2]==t&&e[3]==3*t&&e[4]==t&&e[5]==t;return(!n||4*t>e[0]||t>e[6]?0:1)+(!n||4*t>e[6]||t>e[0]?0:1)}},{key:"finderPenaltyTerminateAndCount",value:function(e,t,n){return e&&(this.finderPenaltyAddHistory(t,n),t=0),this.finderPenaltyAddHistory(t+=this.size,n),this.finderPenaltyCountPatterns(n)}},{key:"finderPenaltyAddHistory",value:function(e,t){0==t[0]&&(e+=this.size),t.pop(),t.unshift(e)}}],[{key:"encodeText",value:function(t,r){var i=e.QrSegment.makeSegments(t);return n.encodeSegments(i,r)}},{key:"encodeBinary",value:function(t,r){var i=e.QrSegment.makeBytes(t);return n.encodeSegments([i],r)}},{key:"encodeSegments",value:function(e,t){var r,o,l=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,h=arguments.length>3&&void 0!==arguments[3]?arguments[3]:40,c=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1,f=5>=arguments.length||void 0===arguments[5]||arguments[5];if(n.MIN_VERSION>l||l>h||h>n.MAX_VERSION||-1>c||c>7)throw new RangeError("Invalid value");for(r=l;;r++){var d=8*n.getNumDataCodewords(r,t),v=u.getTotalBits(e,r);if(d>=v){o=v;break}if(r>=h)throw new RangeError("Data too long")}for(var m=0,g=[n.Ecc.MEDIUM,n.Ecc.QUARTILE,n.Ecc.HIGH];g.length>m;m++){var y=g[m];f&&o<=8*n.getNumDataCodewords(r,y)&&(t=y)}var E,w=[],M=a(e);try{for(M.s();!(E=M.n()).done;){var C=E.value;i(C.mode.modeBits,4,w),i(C.numChars,C.mode.numCharCountBits(r),w);var R,p=a(C.getData());try{for(p.s();!(R=p.n()).done;){var A=R.value;w.push(A)}}catch(e){p.e(e)}finally{p.f()}}}catch(e){M.e(e)}finally{M.f()}s(w.length==o);var P=8*n.getNumDataCodewords(r,t);s(P>=w.length),i(0,Math.min(4,P-w.length),w),i(0,(8-w.length%8)%8,w),s(w.length%8==0);for(var N=236;P>w.length;N^=253)i(N,8,w);for(var k=[];w.length>8*k.length;)k.push(0);return w.forEach((function(e,t){return k[t>>>3]|=e<<7-(7&t)})),new n(r,t,k,c)}},{key:"getNumRawDataModules",value:function(e){if(n.MIN_VERSION>e||e>n.MAX_VERSION)throw new RangeError("Version number out of range");var t=(16*e+128)*e+64;if(e>=2){var r=Math.floor(e/7)+2;t-=(25*r-10)*r-55,7>e||(t-=36)}return s(t>=208&&29648>=t),t}},{key:"getNumDataCodewords",value:function(e,t){return Math.floor(n.getNumRawDataModules(e)/8)-n.ECC_CODEWORDS_PER_BLOCK[t.ordinal][e]*n.NUM_ERROR_CORRECTION_BLOCKS[t.ordinal][e]}},{key:"reedSolomonComputeDivisor",value:function(e){if(1>e||e>255)throw new RangeError("Degree out of range");for(var t=[],r=0;e-1>r;r++)t.push(0);t.push(1);for(var i=1,o=0;e>o;o++){for(var a=0;t.length>a;a++)t[a]=n.reedSolomonMultiply(t[a],i),t.length>a+1&&(t[a]^=t[a+1]);i=n.reedSolomonMultiply(i,2)}return t}},{key:"reedSolomonComputeRemainder",value:function(e,t){var r,i=t.map((function(e){return 0})),o=a(e);try{var s=function(){var e=r.value^i.shift();i.push(0),t.forEach((function(t,r){return i[r]^=n.reedSolomonMultiply(t,e)}))};for(o.s();!(r=o.n()).done;)s()}catch(e){o.e(e)}finally{o.f()}return i}},{key:"reedSolomonMultiply",value:function(e,t){if(e>>>8!=0||t>>>8!=0)throw new RangeError("Byte out of range");for(var n=0,r=7;r>=0;r--)n=n<<1^285*(n>>>7),n^=(t>>>r&1)*e;return s(n>>>8==0),n}}]),n}();function i(e,t,n){if(0>t||t>31||e>>>t!=0)throw new RangeError("Value out of range");for(var r=t-1;r>=0;r--)n.push(e>>>r&1)}function o(e,t){return 0!=(e>>>t&1)}function s(e){if(!e)throw Error("Assertion error")}n.MIN_VERSION=1,n.MAX_VERSION=40,n.PENALTY_N1=3,n.PENALTY_N2=3,n.PENALTY_N3=40,n.PENALTY_N4=10,n.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],n.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],e.QrCode=n;var u=function(){function e(n,r,i){if(t(this,e),this.mode=void 0,this.numChars=void 0,this.bitData=void 0,this.mode=n,this.numChars=r,this.bitData=i,0>r)throw new RangeError("Invalid argument");this.bitData=i.slice()}return r(e,[{key:"getData",value:function(){return this.bitData.slice()}}],[{key:"makeBytes",value:function(t){var n,r=[],o=a(t);try{for(o.s();!(n=o.n()).done;){i(n.value,8,r)}}catch(e){o.e(e)}finally{o.f()}return new e(e.Mode.BYTE,t.length,r)}},{key:"makeNumeric",value:function(t){if(!e.isNumeric(t))throw new RangeError("String contains non-numeric characters");for(var n=[],r=0;t.length>r;){var o=Math.min(t.length-r,3);i(parseInt(t.substring(r,r+o),10),3*o+1,n),r+=o}return new e(e.Mode.NUMERIC,t.length,n)}},{key:"makeAlphanumeric",value:function(t){if(!e.isAlphanumeric(t))throw new RangeError("String contains unencodable characters in alphanumeric mode");var n,r=[];for(n=0;t.length>=n+2;n+=2){var o=45*e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(n));i(o+=e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(n+1)),11,r)}return t.length>n&&i(e.ALPHANUMERIC_CHARSET.indexOf(t.charAt(n)),6,r),new e(e.Mode.ALPHANUMERIC,t.length,r)}},{key:"makeSegments",value:function(t){return""==t?[]:e.isNumeric(t)?[e.makeNumeric(t)]:e.isAlphanumeric(t)?[e.makeAlphanumeric(t)]:[e.makeBytes(e.toUtf8ByteArray(t))]}},{key:"makeEci",value:function(t){var n=[];if(0>t)throw new RangeError("ECI assignment value out of range");if(128>t)i(t,8,n);else if(16384>t)i(2,2,n),i(t,14,n);else{if(t>=1e6)throw new RangeError("ECI assignment value out of range");i(6,3,n),i(t,21,n)}return new e(e.Mode.ECI,0,n)}},{key:"isNumeric",value:function(t){return e.NUMERIC_REGEX.test(t)}},{key:"isAlphanumeric",value:function(t){return e.ALPHANUMERIC_REGEX.test(t)}},{key:"getTotalBits",value:function(e,t){var n,r=0,i=a(e);try{for(i.s();!(n=i.n()).done;){var o=n.value,s=o.mode.numCharCountBits(t);if(o.numChars>=1<n;n++)"%"!=e.charAt(n)?t.push(e.charCodeAt(n)):(t.push(parseInt(e.substring(n+1,n+3),16)),n+=2);return t}}]),e}();u.NUMERIC_REGEX=/^[0-9]*$/,u.ALPHANUMERIC_REGEX=/^[A-Z0-9 $%*+.\/:-]*$/,u.ALPHANUMERIC_CHARSET="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:",e.QrSegment=u}(s||(s={})),function(e){!function(e){var n=r((function e(n,r){t(this,e),this.ordinal=void 0,this.formatBits=void 0,this.ordinal=n,this.formatBits=r}));n.LOW=new n(0,1),n.MEDIUM=new n(1,0),n.QUARTILE=new n(2,3),n.HIGH=new n(3,2),e.Ecc=n}(e.QrCode||(e.QrCode={}))}(s||(s={})),function(e){!function(e){var n=function(){function e(n,r){t(this,e),this.modeBits=void 0,this.numBitsCharCount=void 0,this.modeBits=n,this.numBitsCharCount=r}return r(e,[{key:"numCharCountBits",value:function(e){return this.numBitsCharCount[Math.floor((e+7)/17)]}}]),e}();n.NUMERIC=new n(1,[10,12,14]),n.ALPHANUMERIC=new n(2,[9,11,13]),n.BYTE=new n(4,[8,16,16]),n.KANJI=new n(8,[8,10,12]),n.ECI=new n(7,[0,0,0]),e.Mode=n}(e.QrSegment||(e.QrSegment={}))}(s||(s={}));var u=s,l=["value","size","level","bgColor","fgColor","includeMargin","marginSize","imageSettings"],h={L:u.QrCode.Ecc.LOW,M:u.QrCode.Ecc.MEDIUM,Q:u.QrCode.Ecc.QUARTILE,H:u.QrCode.Ecc.HIGH};function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=[];return e.forEach((function(e,r){var i=null;e.forEach((function(o,a){if(!o&&null!==i)return n.push("M".concat(i+t," ").concat(r+t,"h").concat(a-i,"v1H").concat(i+t,"z")),void(i=null);if(a!==e.length-1)o&&null===i&&(i=a);else{if(!o)return;n.push(null===i?"M".concat(a+t,",").concat(r+t," h1v1H").concat(a+t,"z"):"M".concat(i+t,",").concat(r+t," h").concat(a+1-i,"v1H").concat(i+t,"z"))}}))})),n.join("")}function f(e,t){return e.slice().map((function(e,n){return t.y>n||n>=t.y+t.h?e:e.map((function(e,n){return(t.x>n||n>=t.x+t.w)&&e}))}))}var d=function(){function e(n,r){var i=this;for(var o in t(this,e),this.canvas=void 0,this.pixelRatio="undefined"!=typeof window?window.devicePixelRatio:1,this.path2D=!0,this.SUPPORTS_PATH2D=void 0,this.createImage=function(){return new Image},this.createPath2D=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0,t="createPath2D";return i.canvas&&t in i.canvas?i.canvas[t](e):new Path2D(e)},this.canvas=n,r)o in this&&(this[o]=r[o]);this.SUPPORTS_PATH2D=function(){try{i.createPath2D()}catch(e){return!1}return!0}()}return r(e,[{key:"render",value:function(e,t){var n=this,r=e.value,o=e.size,a=void 0===o?128:o,s=e.level,d=void 0===s?"L":s,v=e.bgColor,m=void 0===v?"#FFFFFF":v,g=e.fgColor,y=void 0===g?"#000000":g,E=e.includeMargin,w=void 0!==E&&E,M=e.marginSize,C=e.imageSettings,R=(i(e,l),null==C?void 0:C.src),p=this.canvas,A=p.getContext("2d");if(A&&r){var P=u.QrCode.encodeText(r,h[d]).getModules(),N=function(e,t){return null!=t?Math.floor(t):e?4:0}(w,M),k=P.length+2*N,S=function(e,t,n,r){if(null==r)return null;var i=e.length+2*n,o=Math.floor(.1*t),a=i/t,s=(r.width||o)*a,u=(r.height||o)*a,l=null==r.x?e.length/2-s/2:r.x*a,h=null==r.y?e.length/2-u/2:r.y*a,c=null;if(r.excavate){var f=Math.floor(l),d=Math.floor(h);c={x:f,y:d,w:Math.ceil(s+l-f),h:Math.ceil(u+h-d)}}return{x:l,y:h,h:u,w:s,excavation:c}}(P,a,N,C),I=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,r=null!=S&&null!==e&&e.complete&&0!==e.naturalHeight&&0!==e.naturalWidth;r&&null!=S.excavation&&(P=f(P,S.excavation)),t&&t(P);var i=n.pixelRatio;A.clearRect(0,0,p.width,p.height),A.setTransform(1,0,0,1,0,0),p.height=p.width=a*i;var o=a/k*i;if(A.scale(o,o),A.fillStyle=m,A.fillRect(0,0,k,k),A.fillStyle=y,n.SUPPORTS_PATH2D&&n.path2D){var s=n.createPath2D(c(P,N));A.fill(s)}else P.forEach((function(e,t){e.forEach((function(e,n){e&&A.fillRect(n+N,t+N,1,1)}))}));var u=(null==e?void 0:e.path)||e;r&&A.drawImage(u,S.x+N,S.y+N,S.w,S.h),"draw"in A&&A.draw()};if(R){var b=this.createImage(p);b.onload=function(){I(b)},b.onerror=function(e){I(),console.warn(e)},b.src=R}else I()}}}]),e}();e.QRCodeCanvas=d,Object.defineProperty(e,"__esModule",{value:!0})}));
diff --git a/src/uni_modules/lime-qrcode/hybrid/html/uni.webview.1.5.3.js b/src/uni_modules/lime-qrcode/hybrid/html/uni.webview.1.5.3.js
new file mode 100644
index 0000000..d6524fa
--- /dev/null
+++ b/src/uni_modules/lime-qrcode/hybrid/html/uni.webview.1.5.3.js
@@ -0,0 +1 @@
+!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e=e||self).uni=n()}(this,(function(){"use strict";try{var e={};Object.defineProperty(e,"passive",{get:function(){!0}}),window.addEventListener("test-passive",null,e)}catch(e){}var n=Object.prototype.hasOwnProperty;function i(e,i){return n.call(e,i)}var t=[];function o(){return window.__dcloud_weex_postMessage||window.__dcloud_weex_}var r=function(e,n){var i={options:{timestamp:+new Date},name:e,arg:n};if(o()){if("postMessage"===e){var r={data:[n]};return window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(r):window.__dcloud_weex_.postMessage(JSON.stringify(r))}var a={type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessageToService(a):window.__dcloud_weex_.postMessageToService(JSON.stringify(a))}if(!window.plus)return window.parent.postMessage({type:"WEB_INVOKE_APPSERVICE",data:i,pageId:""},"*");if(0===t.length){var d=plus.webview.currentWebview();if(!d)throw new Error("plus.webview.currentWebview() is undefined");var s=d.parent(),w="";w=s?s.id:d.id,t.push(w)}if(plus.webview.getWebviewById("__uniapp__service"))plus.webview.postMessageToUniNView({type:"WEB_INVOKE_APPSERVICE",args:{data:i,webviewIds:t}},"__uniapp__service");else{var u=JSON.stringify(i);plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat("WEB_INVOKE_APPSERVICE",'",').concat(u,",").concat(JSON.stringify(t),");"))}},a={navigateTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("navigateTo",{url:encodeURI(n)})},navigateBack:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.delta;r("navigateBack",{delta:parseInt(n)||1})},switchTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("switchTab",{url:encodeURI(n)})},reLaunch:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("reLaunch",{url:encodeURI(n)})},redirectTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;r("redirectTo",{url:encodeURI(n)})},getEnv:function(e){o()?e({nvue:!0}):window.plus?e({plus:!0}):e({h5:!0})},postMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};r("postMessage",e.data||{})}},d=/uni-app/i.test(navigator.userAgent),s=/Html5Plus/i.test(navigator.userAgent),w=/complete|loaded|interactive/;var u=window.my&&navigator.userAgent.indexOf("AlipayClient")>-1;var g=window.swan&&window.swan.webView&&/swan/i.test(navigator.userAgent);var c=window.qq&&window.qq.miniProgram&&/QQ/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var v=window.tt&&window.tt.miniProgram&&/toutiaomicroapp/i.test(navigator.userAgent);var m=window.wx&&window.wx.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var p=window.qa&&/quickapp/i.test(navigator.userAgent);var f=window.ks&&window.ks.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var l=window.tt&&window.tt.miniProgram&&/Lark|Feishu/i.test(navigator.userAgent);var _=window.jd&&window.jd.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);for(var E,b=function(){window.UniAppJSBridge=!0,document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady",{bubbles:!0,cancelable:!0}))},h=[function(e){if(d||s)return window.__dcloud_weex_postMessage||window.__dcloud_weex_?document.addEventListener("DOMContentLoaded",e):window.plus&&w.test(document.readyState)?setTimeout(e,0):document.addEventListener("plusready",e),a},function(e){if(m)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.wx.miniProgram},function(e){if(c)return window.QQJSBridge&&window.QQJSBridge.invoke?setTimeout(e,0):document.addEventListener("QQJSBridgeReady",e),window.qq.miniProgram},function(e){if(u){document.addEventListener("DOMContentLoaded",e);var n=window.my;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(g)return document.addEventListener("DOMContentLoaded",e),window.swan.webView},function(e){if(v)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(p){window.QaJSBridge&&window.QaJSBridge.invoke?setTimeout(e,0):document.addEventListener("QaJSBridgeReady",e);var n=window.qa;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(f)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.ks.miniProgram},function(e){if(l)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(_)return window.JDJSBridgeReady&&window.JDJSBridgeReady.invoke?setTimeout(e,0):document.addEventListener("JDJSBridgeReady",e),window.jd.miniProgram},function(e){return document.addEventListener("DOMContentLoaded",e),a}],y=0;y
+```
+
+
+#### ICON
+- 带 Icon 的二维码
+
+```html
+
+```
+
+#### 颜色
+- 通过设置 `color` 自定义二维码颜色,通过设置 `bgColor` 自定义背景颜色。
+
+```html
+
+
+```
+
+#### 纠错比例
+- 通过设置 `errorLevel` 调整不同的容错等级。
+
+```html
+
+```
+
+#### 生成图片
+- 1、通过调用插件的`canvasToTempFilePath`方法生成图片。
+
+```html
+
+
+
+```
+```js
+// vue3
+const qrcodeRef = ref(null)
+const onClick = () => {
+ if(!qrcodeRef.value) return
+ qrcodeRef.value.canvasToTempFilePath({
+ success(res) {
+ image.value = res.tempFilePath
+ console.log('success:::', res)
+ },
+ fail(err) {
+ console.log('err:::', err)
+ }
+ })
+}
+
+// vue2
+const el = this.$refs['qrcodeRef']
+el.canvasToTempFilePath({
+ success:(res)=>{
+ this.image = res.tempFilePath
+ },
+ fail(err) {
+ console.log('err:::', err)
+ }
+})
+
+// uvue
+const el:LQrcodeComponentPublicInstance = this.$refs['qrcodeRef'] as LQrcodeComponentPublicInstance
+el.canvasToTempFilePath({
+ success:(res: TakeSnapshotSuccess)=>{
+ this.image = res.tempFilePath
+ },
+ fail(err: TakeSnapshotFail) {
+ console.log('err:::', err)
+ }
+})
+```
+
+- 2、通过设置`useCanvasToTempFilePath`在`success`事件里接收图片地址
+
+```html
+
+
+```
+```js
+const image = ref(null)
+const success = (img) => {
+ image.value = img
+}
+```
+
+### 关于vue2的使用方式
+- 插件使用了`composition-api`, 如果你希望在vue2中使用请按官方的教程[vue-composition-api](https://uniapp.dcloud.net.cn/tutorial/vue-composition-api.html)配置
+- 关键代码是: 在main.js中 在vue2部分加上这一段即可
+
+```js
+// main.js vue2
+import Vue from 'vue'
+import VueCompositionAPI from '@vue/composition-api'
+Vue.use(VueCompositionAPI)
+```
+另外插件也用到了TS,vue2可能会遇过官方的TS版本过低的问题,找到HX目录下的`compile-typescript`目录
+```cmd
+// \HBuilderX\plugins\compile-typescript
+yarn add typescript -D
+- or -
+npm install typescript -D
+```
+
+### 查看示例
+- 导入后直接使用这个标签查看演示效果
+
+```html
+// 代码位于 uni_modules/lime-qrcode/compoents/lime-qrcode
+
+```
+
+### 插件标签
+- 默认 l-qrcode 为 component
+- 默认 lime-qrcode 为 demo
+
+
+
+## API
+
+### Props
+
+| 参数 | 说明 | 类型 | 默认值 |
+| --------------------------| ------------------------------------------------------------ | ---------------- | ------------ |
+| value | 扫描后的文本 | string | `-` |
+| icon | 二维码中图片的地址 | string | `-` |
+| size | 二维码大小 | number,string | `160` |
+| iconSize | 二维码中图片的大小 | number,string | `40` |
+| color | 二维码颜色 | string | `-` |
+| bgColor | 二维码背景颜色 | string | `-` |
+| errorLevel | 二维码纠错等级 | `'L' | 'M' | 'Q' | 'H' ` | `M` |
+| marginSize | 边距码大小,默认为0码点 | number | `0` |
+
+### 常见问题
+- icon 是网络地址时,H5和Nvue需要解决跨域问题,小程序需要配置download
+
+## 打赏
+
+如果你觉得本插件,解决了你的问题,赠人玫瑰,手留余香。
+
+
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/addUnit/index.ts b/src/uni_modules/lime-shared/addUnit/index.ts
new file mode 100644
index 0000000..2468a3a
--- /dev/null
+++ b/src/uni_modules/lime-shared/addUnit/index.ts
@@ -0,0 +1,25 @@
+// @ts-nocheck
+import {isNumeric} from '../isNumeric'
+import {isDef} from '../isDef'
+/**
+ * 给一个值添加单位(像素 px)
+ * @param value 要添加单位的值,可以是字符串或数字
+ * @returns 添加了单位的值,如果值为 undefined 则返回 undefined
+ */
+export function addUnit(value?: string | number): string | undefined {
+ if (!isDef(value)) {
+ return undefined;
+ }
+
+ value = String(value); // 将值转换为字符串
+
+ // 如果值是数字,则在后面添加单位 "px",否则保持原始值
+ return isNumeric(value) ? `${value}px` : value;
+}
+
+
+// console.log(addUnit(100)); // 输出: "100px"
+// console.log(addUnit("200")); // 输出: "200px"
+// console.log(addUnit("300px")); // 输出: "300px"(已经包含单位)
+// console.log(addUnit()); // 输出: undefined(值为 undefined)
+// console.log(addUnit(null)); // 输出: undefined(值为 null)
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/arrayBufferToFile/index.ts b/src/uni_modules/lime-shared/arrayBufferToFile/index.ts
new file mode 100644
index 0000000..9760b20
--- /dev/null
+++ b/src/uni_modules/lime-shared/arrayBufferToFile/index.ts
@@ -0,0 +1,63 @@
+// @ts-nocheck
+import {platform} from '../platform'
+/**
+ * buffer转路径
+ * @param {Object} buffer
+ */
+// @ts-nocheck
+export function arrayBufferToFile(buffer: ArrayBuffer | Blob, name?: string, format?:string):Promise<(File|string)> {
+ return new Promise((resolve, reject) => {
+ // #ifdef MP
+ const fs = uni.getFileSystemManager()
+ //自定义文件名
+ if (!name && !format) {
+ reject(new Error('ERROR_NAME_PARSE'))
+ }
+ const fileName = `${name || new Date().getTime()}.${format.replace(/(.+)?\//,'')}`;
+ let pre = platform()
+ const filePath = `${pre.env.USER_DATA_PATH}/${fileName}`
+ fs.writeFile({
+ filePath,
+ data: buffer,
+ success() {
+ resolve(filePath)
+ },
+ fail(err) {
+ console.error(err)
+ reject(err)
+ }
+ })
+ // #endif
+
+ // #ifdef H5
+ const file = new File([buffer], name, {
+ type: format,
+ });
+ resolve(file)
+ // #endif
+
+ // #ifdef APP-PLUS
+ const bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
+ const base64 = uni.arrayBufferToBase64(buffer)
+ bitmap.loadBase64Data(base64, () => {
+ if (!name && !format) {
+ reject(new Error('ERROR_NAME_PARSE'))
+ }
+ const fileNmae = `${name || new Date().getTime()}.${format.replace(/(.+)?\//,'')}`;
+ const filePath = `_doc/uniapp_temp/${fileNmae}`
+ bitmap.save(filePath, {},
+ () => {
+ bitmap.clear()
+ resolve(filePath)
+ },
+ (error) => {
+ bitmap.clear()
+ reject(error)
+ })
+ }, (error) => {
+ bitmap.clear()
+ reject(error)
+ })
+ // #endif
+ })
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/base64ToArrayBuffer/index.ts b/src/uni_modules/lime-shared/base64ToArrayBuffer/index.ts
new file mode 100644
index 0000000..f83b640
--- /dev/null
+++ b/src/uni_modules/lime-shared/base64ToArrayBuffer/index.ts
@@ -0,0 +1,13 @@
+// @ts-nocheck
+// 未完成
+export function base64ToArrayBuffer(base64 : string) {
+ const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64) || [];
+ if (!format) {
+ new Error('ERROR_BASE64SRC_PARSE')
+ }
+ if(uni.base64ToArrayBuffer) {
+ return uni.base64ToArrayBuffer(bodyData)
+ } else {
+
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/base64ToPath/index.ts b/src/uni_modules/lime-shared/base64ToPath/index.ts
new file mode 100644
index 0000000..1f14d0a
--- /dev/null
+++ b/src/uni_modules/lime-shared/base64ToPath/index.ts
@@ -0,0 +1,76 @@
+// @ts-nocheck
+import {platform} from '../platform'
+/**
+ * base64转路径
+ * @param {Object} base64
+ */
+export function base64ToPath(base64: string, filename?: string):Promise {
+ const [, format] = /^data:image\/(\w+);base64,/.exec(base64) || [];
+ console.log('format', format)
+ return new Promise((resolve, reject) => {
+ // #ifdef MP
+ const fs = uni.getFileSystemManager()
+ //自定义文件名
+ if (!filename && !format) {
+ reject(new Error('ERROR_BASE64SRC_PARSE'))
+ }
+ // const time = new Date().getTime();
+ const name = filename || `${new Date().getTime()}.${format}`;
+ let pre = platform()
+ const filePath = `${pre.env.USER_DATA_PATH}/${name}`
+ fs.writeFile({
+ filePath,
+ data: base64.split(',')[1],
+ encoding: 'base64',
+ success() {
+ resolve(filePath)
+ },
+ fail(err) {
+ console.error(err)
+ reject(err)
+ }
+ })
+ // #endif
+
+ // #ifdef H5
+ // mime类型
+ let mimeString = base64.split(',')[0].split(':')[1].split(';')[0];
+ //base64 解码
+ let byteString = atob(base64.split(',')[1]);
+ //创建缓冲数组
+ let arrayBuffer = new ArrayBuffer(byteString.length);
+ //创建视图
+ let intArray = new Uint8Array(arrayBuffer);
+ for (let i = 0; i < byteString.length; i++) {
+ intArray[i] = byteString.charCodeAt(i);
+ }
+ resolve(URL.createObjectURL(new Blob([intArray], {
+ type: mimeString
+ })))
+ // #endif
+
+ // #ifdef APP-PLUS
+ const bitmap = new plus.nativeObj.Bitmap('bitmap' + Date.now())
+ bitmap.loadBase64Data(base64, () => {
+ if (!filename && !format) {
+ reject(new Error('ERROR_BASE64SRC_PARSE'))
+ }
+ // const time = new Date().getTime();
+ const name = filename || `${new Date().getTime()}.${format}`;
+ const filePath = `_doc/uniapp_temp/${name}`
+ bitmap.save(filePath, {},
+ () => {
+ bitmap.clear()
+ resolve(filePath)
+ },
+ (error) => {
+ bitmap.clear()
+ reject(error)
+ })
+ }, (error) => {
+ bitmap.clear()
+ reject(error)
+ })
+ // #endif
+ })
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/camelCase/index.ts b/src/uni_modules/lime-shared/camelCase/index.ts
new file mode 100644
index 0000000..78a81c8
--- /dev/null
+++ b/src/uni_modules/lime-shared/camelCase/index.ts
@@ -0,0 +1,21 @@
+/**
+ * 将字符串转换为 camelCase 或 PascalCase 风格的命名约定
+ * @param str 要转换的字符串
+ * @param isPascalCase 指示是否转换为 PascalCase 的布尔值,默认为 false
+ * @returns 转换后的字符串
+ */
+export function camelCase(str: string, isPascalCase: boolean = false): string {
+ // 将字符串分割成单词数组
+ let words: string[] = str.split(/[\s_-]+/);
+
+ // 将数组中的每个单词首字母大写(除了第一个单词)
+ let camelCased: string[] = words.map((word, index) => {
+ if (index === 0 && !isPascalCase) {
+ return word.toLowerCase(); // 第一个单词全小写
+ }
+ return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();
+ });
+
+ // 将数组中的单词拼接成一个字符串
+ return camelCased.join('');
+};
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/canIUseCanvas2d/index.ts b/src/uni_modules/lime-shared/canIUseCanvas2d/index.ts
new file mode 100644
index 0000000..22e4416
--- /dev/null
+++ b/src/uni_modules/lime-shared/canIUseCanvas2d/index.ts
@@ -0,0 +1,58 @@
+// @ts-nocheck
+// #ifdef MP-ALIPAY
+interface My {
+ SDKVersion: string
+}
+declare var my: My
+// #endif
+
+function compareVersion(v1:string, v2:string) {
+ let a1 = v1.split('.');
+ let a2 = v2.split('.');
+ const len = Math.max(a1.length, a2.length);
+
+ while (a1.length < len) {
+ a1.push('0');
+ }
+ while (a2.length < len) {
+ a2.push('0');
+ }
+
+ for (let i = 0; i < len; i++) {
+ const num1 = parseInt(a1[i], 10);
+ const num2 = parseInt(a2[i], 10);
+
+ if (num1 > num2) {
+ return 1;
+ }
+ if (num1 < num2) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+function gte(version: string) {
+ let {SDKVersion} = uni.getSystemInfoSync();
+ // #ifdef MP-ALIPAY
+ SDKVersion = my.SDKVersion
+ // #endif
+ return compareVersion(SDKVersion, version) >= 0;
+}
+
+/** 环境是否支持canvas 2d */
+export function canIUseCanvas2d() {
+ // #ifdef MP-WEIXIN
+ return gte('2.9.0');
+ // #endif
+ // #ifdef MP-ALIPAY
+ return gte('2.7.0');
+ // #endif
+ // #ifdef MP-TOUTIAO
+ return gte('1.78.0');
+ // #endif
+ // #ifndef MP-WEIXIN || MP-ALIPAY || MP-TOUTIAO
+ return false
+ // #endif
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/changelog.md b/src/uni_modules/lime-shared/changelog.md
new file mode 100644
index 0000000..62c3f5b
--- /dev/null
+++ b/src/uni_modules/lime-shared/changelog.md
@@ -0,0 +1,30 @@
+## 0.1.4(2023-09-05)
+- feat: 增加 Hooks `useIntersectionObserver`
+- feat: 增加 `floatAdd`
+- feat: 因为本人插件兼容 vue2 需要使用 `composition-api`,故增加vue文件代码插件的条件编译
+## 0.1.3(2023-08-13)
+- feat: 增加 `camelCase`
+## 0.1.2(2023-07-17)
+- feat: 增加 `getClassStr`
+## 0.1.1(2023-07-06)
+- feat: 增加 `isNumeric`, 区别于 `isNumber`
+## 0.1.0(2023-06-30)
+- fix: `clamp`忘记导出了
+## 0.0.9(2023-06-27)
+- feat: 增加`arrayBufferToFile`
+## 0.0.8(2023-06-19)
+- feat: 增加`createAnimation`、`clamp`
+## 0.0.7(2023-06-08)
+- chore: 更新注释
+## 0.0.6(2023-06-08)
+- chore: 增加`createImage`为`lime-watermark`和`lime-qrcode`提供依赖
+## 0.0.5(2023-06-03)
+- chore: 更新注释
+## 0.0.4(2023-05-22)
+- feat: 增加`range`,`exif`,`selectComponent`
+## 0.0.3(2023-05-08)
+- feat: 增加`fillZero`,`debounce`,`throttle`,`random`
+## 0.0.2(2023-05-05)
+- chore: 更新文档
+## 0.0.1(2023-05-05)
+- 无
diff --git a/src/uni_modules/lime-shared/clamp/index.ts b/src/uni_modules/lime-shared/clamp/index.ts
new file mode 100644
index 0000000..b62565c
--- /dev/null
+++ b/src/uni_modules/lime-shared/clamp/index.ts
@@ -0,0 +1,16 @@
+// @ts-nocheck
+/**
+ * 将一个值限制在指定的范围内
+ * @param min 最小值
+ * @param max 最大值
+ * @param val 要限制的值
+ * @returns 限制后的值
+ */
+export function clamp(min: number, max: number, val: number): number {
+ return Math.max(min, Math.min(max, val));
+}
+
+
+// console.log(clamp(0, 10, 5)); // 输出: 5(在范围内,不做更改)
+// console.log(clamp(0, 10, -5)); // 输出: 0(小于最小值,被限制为最小值)
+// console.log(clamp(0, 10, 15)); // 输出: 10(大于最大值,被限制为最大值)
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/cloneDeep/index.ts b/src/uni_modules/lime-shared/cloneDeep/index.ts
new file mode 100644
index 0000000..ded334d
--- /dev/null
+++ b/src/uni_modules/lime-shared/cloneDeep/index.ts
@@ -0,0 +1,103 @@
+// @ts-nocheck
+/**
+ * 深度克隆一个对象或数组
+ * @param obj 要克隆的对象或数组
+ * @returns 克隆后的对象或数组
+ */
+export function cloneDeep(obj: any): T {
+ // 如果传入的对象为空,返回空
+ if (obj === null) {
+ return null as unknown as T;
+ }
+
+ // 如果传入的对象是 Set 类型,则将其转换为数组,并通过新的 Set 构造函数创建一个新的 Set 对象
+ if (obj instanceof Set) {
+ return new Set([...obj]) as unknown as T;
+ }
+
+ // 如果传入的对象是 Map 类型,则将其转换为数组,并通过新的 Map 构造函数创建一个新的 Map 对象
+ if (obj instanceof Map) {
+ return new Map([...obj]) as unknown as T;
+ }
+
+ // 如果传入的对象是 WeakMap 类型,则直接用传入的 WeakMap 对象进行赋值
+ if (obj instanceof WeakMap) {
+ let weakMap = new WeakMap();
+ weakMap = obj;
+ return weakMap as unknown as T;
+ }
+
+ // 如果传入的对象是 WeakSet 类型,则直接用传入的 WeakSet 对象进行赋值
+ if (obj instanceof WeakSet) {
+ let weakSet = new WeakSet();
+ weakSet = obj;
+ return weakSet as unknown as T;
+ }
+
+ // 如果传入的对象是 RegExp 类型,则通过新的 RegExp 构造函数创建一个新的 RegExp 对象
+ if (obj instanceof RegExp) {
+ return new RegExp(obj) as unknown as T;
+ }
+
+ // 如果传入的对象是 undefined 类型,则返回 undefined
+ if (typeof obj === 'undefined') {
+ return undefined as unknown as T;
+ }
+
+ // 如果传入的对象是数组,则递归调用 cloneDeep 函数对数组中的每个元素进行克隆
+ if (Array.isArray(obj)) {
+ return obj.map(cloneDeep) as unknown as T;
+ }
+
+ // 如果传入的对象是 Date 类型,则通过新的 Date 构造函数创建一个新的 Date 对象
+ if (obj instanceof Date) {
+ return new Date(obj.getTime()) as unknown as T;
+ }
+
+ // 如果传入的对象是普通对象,则使用递归调用 cloneDeep 函数对对象的每个属性进行克隆
+ if (typeof obj === 'object') {
+ const newObj: any = {};
+ for (const [key, value] of Object.entries(obj)) {
+ newObj[key] = cloneDeep(value);
+ }
+ const symbolKeys = Object.getOwnPropertySymbols(obj);
+ for (const key of symbolKeys) {
+ newObj[key] = cloneDeep(obj[key]);
+ }
+ return newObj;
+ }
+
+ // 如果传入的对象是基本数据类型(如字符串、数字等),则直接返回
+ return obj;
+}
+
+// 示例使用
+
+// // 克隆一个对象
+// const obj = { name: 'John', age: 30 };
+// const clonedObj = cloneDeep(obj);
+
+// console.log(clonedObj); // 输出: { name: 'John', age: 30 }
+// console.log(clonedObj === obj); // 输出: false (副本与原对象是独立的)
+
+// // 克隆一个数组
+// const arr = [1, 2, 3];
+// const clonedArr = cloneDeep(arr);
+
+// console.log(clonedArr); // 输出: [1, 2, 3]
+// console.log(clonedArr === arr); // 输出: false (副本与原数组是独立的)
+
+// // 克隆一个包含嵌套对象的对象
+// const person = {
+// name: 'Alice',
+// age: 25,
+// address: {
+// city: 'New York',
+// country: 'USA',
+// },
+// };
+// const clonedPerson = cloneDeep(person);
+
+// console.log(clonedPerson); // 输出: { name: 'Alice', age: 25, address: { city: 'New York', country: 'USA' } }
+// console.log(clonedPerson === person); // 输出: false (副本与原对象是独立的)
+// console.log(clonedPerson.address === person.address); // 输出: false (嵌套对象的副本也是独立的)
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/closest/index.ts b/src/uni_modules/lime-shared/closest/index.ts
new file mode 100644
index 0000000..95804cd
--- /dev/null
+++ b/src/uni_modules/lime-shared/closest/index.ts
@@ -0,0 +1,22 @@
+// @ts-nocheck
+
+/**
+ * 在给定数组中找到最接近目标数字的元素。
+ * @param arr 要搜索的数字数组。
+ * @param target 目标数字。
+ * @returns 最接近目标数字的数组元素。
+ */
+export function closest(arr: number[], target: number) {
+ return arr.reduce((pre, cur) =>
+ Math.abs(pre - target) < Math.abs(cur - target) ? pre : cur
+ );
+}
+
+// 示例
+// // 定义一个数字数组
+// const numbers = [1, 3, 5, 7, 9];
+
+// // 在数组中找到最接近目标数字 6 的元素
+// const closestNumber = closest(numbers, 6);
+
+// console.log(closestNumber); // 输出结果: 5
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/createAnimation/index.ts b/src/uni_modules/lime-shared/createAnimation/index.ts
new file mode 100644
index 0000000..5b6e2da
--- /dev/null
+++ b/src/uni_modules/lime-shared/createAnimation/index.ts
@@ -0,0 +1,149 @@
+// @ts-nocheck
+// nvue 需要在节点上设置ref或在export里传入
+// const animation = createAnimation({
+// ref: this.$refs['xxx'],
+// duration: 0,
+// timingFunction: 'linear'
+// })
+// animation.opacity(1).translate(x, y).step({duration})
+// animation.export(ref)
+
+// 抹平nvue 与 uni.createAnimation的使用差距
+// 但是nvue动画太慢~~~无语
+
+
+
+
+// #ifdef APP-NVUE
+const nvueAnimation = uni.requireNativePlugin('animation')
+
+type AnimationTypes = 'matrix' | 'matrix3d' | 'rotate' | 'rotate3d' | 'rotateX' | 'rotateY' | 'rotateZ' | 'scale' | 'scale3d' | 'scaleX' | 'scaleY' | 'scaleZ' | 'skew' | 'skewX' | 'skewY' | 'translate' | 'translate3d' | 'translateX' | 'translateY' | 'translateZ'
+ | 'opacity' | 'backgroundColor' | 'width' | 'height' | 'left' | 'right' | 'top' | 'bottom'
+
+interface Styles {
+ [key : string] : any
+}
+
+interface StepConfig {
+ duration?: number
+ timingFunction?: string
+ delay?: number
+ needLayout?: boolean
+ transformOrigin?: string
+}
+interface StepAnimate {
+ styles?: Styles
+ config?: StepConfig
+}
+interface StepAnimates {
+ [key: number]: StepAnimate
+}
+interface CreateAnimationOptions extends UniApp.CreateAnimationOptions {
+ ref?: string
+}
+
+type Callback = (time: number) => void
+const animateTypes1 : AnimationTypes[] = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d',
+ 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY',
+ 'translateZ'
+]
+const animateTypes2 : AnimationTypes[] = ['opacity', 'backgroundColor']
+const animateTypes3 : AnimationTypes[] = ['width', 'height', 'left', 'right', 'top', 'bottom']
+
+class LimeAnimation {
+ ref : any
+ context : any
+ options : UniApp.CreateAnimationOptions
+ // stack : any[] = []
+ next : number = 0
+ currentStepAnimates : StepAnimates = {}
+ duration : number = 0
+ constructor(options : CreateAnimationOptions) {
+ const {ref} = options
+ this.ref = ref
+ this.options = options
+ }
+ addAnimate(type : AnimationTypes, args: (string | number)[]) {
+ let aniObj = this.currentStepAnimates[this.next]
+ let stepAnimate:StepAnimate = {}
+ if (!aniObj) {
+ stepAnimate = {styles: {}, config: {}}
+ } else {
+ stepAnimate = aniObj
+ }
+
+ if (animateTypes1.includes(type)) {
+ if (!stepAnimate.styles.transform) {
+ stepAnimate.styles.transform = ''
+ }
+ let unit = ''
+ if (type === 'rotate') {
+ unit = 'deg'
+ }
+ stepAnimate.styles.transform += `${type}(${args.map((v: number) => v + unit).join(',')}) `
+ } else {
+ stepAnimate.styles[type] = `${args.join(',')}`
+ }
+ this.currentStepAnimates[this.next] = stepAnimate
+ }
+ animateRun(styles: Styles = {}, config:StepConfig = {}, ref: any) {
+ const el = ref || this.ref
+ if (!el) return
+ return new Promise((resolve) => {
+ const time = +new Date()
+ nvueAnimation.transition(el, {
+ styles,
+ ...config
+ }, () => {
+ resolve(+new Date() - time)
+ })
+ })
+ }
+ nextAnimate(animates: StepAnimates, step: number = 0, ref: any, cb: Callback) {
+ let obj = animates[step]
+ if (obj) {
+ let { styles, config } = obj
+ // this.duration += config.duration
+ this.animateRun(styles, config, ref).then((time: number) => {
+ step += 1
+ this.duration += time
+ this.nextAnimate(animates, step, ref, cb)
+ })
+ } else {
+ this.currentStepAnimates = {}
+ cb && cb(this.duration)
+ }
+ }
+ step(config:StepConfig = {}) {
+ this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config)
+ this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin
+ this.next++
+ return this
+ }
+ export(ref: any, cb?: Callback) {
+ ref = ref || this.ref
+ if(!ref) return
+ this.duration = 0
+ this.next = 0
+ this.nextAnimate(this.currentStepAnimates, 0, ref, cb)
+ return null
+ }
+}
+
+
+animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => {
+ LimeAnimation.prototype[type] = function(...args: (string | number)[]) {
+ this.addAnimate(type, args)
+ return this
+ }
+})
+// #endif
+export function createAnimation(options : CreateAnimationOptions) {
+ // #ifndef APP-NVUE
+ // 在iOS10+QQ小程序平台下,传给原生的对象一定是个普通对象而不是Proxy对象,否则会报parameter should be Object instead of ProxyObject的错误
+ return uni.createAnimation({ ...options })
+ // #endif
+ // #ifdef APP-NVUE
+ return new LimeAnimation(options)
+ // #endif
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/createImage/index.ts b/src/uni_modules/lime-shared/createImage/index.ts
new file mode 100644
index 0000000..674b6f5
--- /dev/null
+++ b/src/uni_modules/lime-shared/createImage/index.ts
@@ -0,0 +1,61 @@
+// @ts-nocheck
+import {isBrowser} from '../isBrowser'
+class Image {
+ currentSrc: string | null = null
+ naturalHeight: number = 0
+ naturalWidth: number = 0
+ width: number = 0
+ height: number = 0
+ tagName: string = 'IMG'
+ path: string = ''
+ crossOrigin: string = ''
+ referrerPolicy: string = ''
+ onload: () => void = () => {}
+ onerror: () => void = () => {}
+ complete: boolean = false
+ constructor() {}
+ set src(src: string) {
+ console.log('src', src)
+ if(!src) {
+ return this.onerror()
+ }
+ src = src.replace(/^@\//,'/')
+ this.currentSrc = src
+ uni.getImageInfo({
+ src,
+ success: (res) => {
+ const localReg = /^\.|^\/(?=[^\/])/;
+ // #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO
+ res.path = localReg.test(src) ? `/${res.path}` : res.path;
+ // #endif
+ this.complete = true
+ this.path = res.path
+ this.naturalWidth = this.width = res.width
+ this.naturalHeight = this.height = res.height
+ this.onload()
+ },
+ fail: () => {
+ this.onerror()
+ }
+ })
+ }
+ get src() {
+ return this.currentSrc
+ }
+}
+interface UniImage extends WechatMiniprogram.Image {
+ complete?: boolean
+ naturalHeight?: number
+ naturalWidth?: number
+}
+/** 创建用于 canvas 的 img */
+export function createImage(canvas?: any): HTMLImageElement | UniImage {
+ if(canvas && canvas.createImage) {
+ return (canvas as WechatMiniprogram.Canvas).createImage()
+ } else if(this.tagName == 'canvas' && !('toBlob' in this) || canvas && !('toBlob' in canvas)){
+ return new Image()
+ } else if(isBrowser) {
+ return new window.Image()
+ }
+ return new Image()
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/debounce/index.ts b/src/uni_modules/lime-shared/debounce/index.ts
new file mode 100644
index 0000000..5875145
--- /dev/null
+++ b/src/uni_modules/lime-shared/debounce/index.ts
@@ -0,0 +1,38 @@
+// @ts-nocheck
+type Timeout = ReturnType | null;
+/**
+ * 防抖函数,通过延迟一定时间来限制函数的执行频率。
+ * @param fn 要防抖的函数。
+ * @param wait 触发防抖的等待时间,单位为毫秒。
+ * @returns 防抖函数。
+ */
+export function debounce(fn: (...args: any[]) => void, wait = 300) {
+ let timer: Timeout = null; // 用于存储 setTimeout 的标识符的变量
+
+ return function (this: any, ...args: any[]) {
+ if (timer) clearTimeout(timer); // 如果上一个 setTimeout 存在,则清除它
+
+ // 设置一个新的 setTimeout,在指定的等待时间后调用防抖函数
+ timer = setTimeout(() => {
+ fn.apply(this, args); // 使用提供的参数调用原始函数
+ }, wait);
+ };
+};
+
+
+
+// 示例
+// 定义一个函数
+// function saveData(data: string) {
+// // 模拟保存数据的操作
+// console.log(`Saving data: ${data}`);
+// }
+
+// // 创建一个防抖函数,延迟 500 毫秒后调用 saveData 函数
+// const debouncedSaveData = debounce(saveData, 500);
+
+// // 连续调用防抖函数
+// debouncedSaveData('Data 1'); // 不会立即调用 saveData 函数
+// debouncedSaveData('Data 2'); // 不会立即调用 saveData 函数
+
+// 在 500 毫秒后,只会调用一次 saveData 函数,输出结果为 "Saving data: Data 2"
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/exif/index.ts b/src/uni_modules/lime-shared/exif/index.ts
new file mode 100644
index 0000000..b67e233
--- /dev/null
+++ b/src/uni_modules/lime-shared/exif/index.ts
@@ -0,0 +1,1056 @@
+// @ts-nocheck
+import { base64ToArrayBuffer } from '../base64ToArrayBuffer';
+import { pathToBase64 } from '../pathToBase64';
+import { isBase64 } from '../isBase64';
+import { isString } from '../isString';
+
+interface File {
+ exifdata : any
+ iptcdata : any
+ xmpdata : any
+ src : string
+}
+class EXIF {
+ isXmpEnabled = false
+ debug = false
+ Tags = {
+ // version tags
+ 0x9000: "ExifVersion", // EXIF version
+ 0xA000: "FlashpixVersion", // Flashpix format version
+
+ // colorspace tags
+ 0xA001: "ColorSpace", // Color space information tag
+
+ // image configuration
+ 0xA002: "PixelXDimension", // Valid width of meaningful image
+ 0xA003: "PixelYDimension", // Valid height of meaningful image
+ 0x9101: "ComponentsConfiguration", // Information about channels
+ 0x9102: "CompressedBitsPerPixel", // Compressed bits per pixel
+
+ // user information
+ 0x927C: "MakerNote", // Any desired information written by the manufacturer
+ 0x9286: "UserComment", // Comments by user
+
+ // related file
+ 0xA004: "RelatedSoundFile", // Name of related sound file
+
+ // date and time
+ 0x9003: "DateTimeOriginal", // Date and time when the original image was generated
+ 0x9004: "DateTimeDigitized", // Date and time when the image was stored digitally
+ 0x9290: "SubsecTime", // Fractions of seconds for DateTime
+ 0x9291: "SubsecTimeOriginal", // Fractions of seconds for DateTimeOriginal
+ 0x9292: "SubsecTimeDigitized", // Fractions of seconds for DateTimeDigitized
+
+ // picture-taking conditions
+ 0x829A: "ExposureTime", // Exposure time (in seconds)
+ 0x829D: "FNumber", // F number
+ 0x8822: "ExposureProgram", // Exposure program
+ 0x8824: "SpectralSensitivity", // Spectral sensitivity
+ 0x8827: "ISOSpeedRatings", // ISO speed rating
+ 0x8828: "OECF", // Optoelectric conversion factor
+ 0x9201: "ShutterSpeedValue", // Shutter speed
+ 0x9202: "ApertureValue", // Lens aperture
+ 0x9203: "BrightnessValue", // Value of brightness
+ 0x9204: "ExposureBias", // Exposure bias
+ 0x9205: "MaxApertureValue", // Smallest F number of lens
+ 0x9206: "SubjectDistance", // Distance to subject in meters
+ 0x9207: "MeteringMode", // Metering mode
+ 0x9208: "LightSource", // Kind of light source
+ 0x9209: "Flash", // Flash status
+ 0x9214: "SubjectArea", // Location and area of main subject
+ 0x920A: "FocalLength", // Focal length of the lens in mm
+ 0xA20B: "FlashEnergy", // Strobe energy in BCPS
+ 0xA20C: "SpatialFrequencyResponse", //
+ 0xA20E: "FocalPlaneXResolution", // Number of pixels in width direction per FocalPlaneResolutionUnit
+ 0xA20F: "FocalPlaneYResolution", // Number of pixels in height direction per FocalPlaneResolutionUnit
+ 0xA210: "FocalPlaneResolutionUnit", // Unit for measuring FocalPlaneXResolution and FocalPlaneYResolution
+ 0xA214: "SubjectLocation", // Location of subject in image
+ 0xA215: "ExposureIndex", // Exposure index selected on camera
+ 0xA217: "SensingMethod", // Image sensor type
+ 0xA300: "FileSource", // Image source (3 == DSC)
+ 0xA301: "SceneType", // Scene type (1 == directly photographed)
+ 0xA302: "CFAPattern", // Color filter array geometric pattern
+ 0xA401: "CustomRendered", // Special processing
+ 0xA402: "ExposureMode", // Exposure mode
+ 0xA403: "WhiteBalance", // 1 = auto white balance, 2 = manual
+ 0xA404: "DigitalZoomRation", // Digital zoom ratio
+ 0xA405: "FocalLengthIn35mmFilm", // Equivalent foacl length assuming 35mm film camera (in mm)
+ 0xA406: "SceneCaptureType", // Type of scene
+ 0xA407: "GainControl", // Degree of overall image gain adjustment
+ 0xA408: "Contrast", // Direction of contrast processing applied by camera
+ 0xA409: "Saturation", // Direction of saturation processing applied by camera
+ 0xA40A: "Sharpness", // Direction of sharpness processing applied by camera
+ 0xA40B: "DeviceSettingDescription", //
+ 0xA40C: "SubjectDistanceRange", // Distance to subject
+
+ // other tags
+ 0xA005: "InteroperabilityIFDPointer",
+ 0xA420: "ImageUniqueID" // Identifier assigned uniquely to each image
+ }
+ TiffTags = {
+ 0x0100: "ImageWidth",
+ 0x0101: "ImageHeight",
+ 0x8769: "ExifIFDPointer",
+ 0x8825: "GPSInfoIFDPointer",
+ 0xA005: "InteroperabilityIFDPointer",
+ 0x0102: "BitsPerSample",
+ 0x0103: "Compression",
+ 0x0106: "PhotometricInterpretation",
+ 0x0112: "Orientation",
+ 0x0115: "SamplesPerPixel",
+ 0x011C: "PlanarConfiguration",
+ 0x0212: "YCbCrSubSampling",
+ 0x0213: "YCbCrPositioning",
+ 0x011A: "XResolution",
+ 0x011B: "YResolution",
+ 0x0128: "ResolutionUnit",
+ 0x0111: "StripOffsets",
+ 0x0116: "RowsPerStrip",
+ 0x0117: "StripByteCounts",
+ 0x0201: "JPEGInterchangeFormat",
+ 0x0202: "JPEGInterchangeFormatLength",
+ 0x012D: "TransferFunction",
+ 0x013E: "WhitePoint",
+ 0x013F: "PrimaryChromaticities",
+ 0x0211: "YCbCrCoefficients",
+ 0x0214: "ReferenceBlackWhite",
+ 0x0132: "DateTime",
+ 0x010E: "ImageDescription",
+ 0x010F: "Make",
+ 0x0110: "Model",
+ 0x0131: "Software",
+ 0x013B: "Artist",
+ 0x8298: "Copyright"
+ }
+ GPSTags = {
+ 0x0000: "GPSVersionID",
+ 0x0001: "GPSLatitudeRef",
+ 0x0002: "GPSLatitude",
+ 0x0003: "GPSLongitudeRef",
+ 0x0004: "GPSLongitude",
+ 0x0005: "GPSAltitudeRef",
+ 0x0006: "GPSAltitude",
+ 0x0007: "GPSTimeStamp",
+ 0x0008: "GPSSatellites",
+ 0x0009: "GPSStatus",
+ 0x000A: "GPSMeasureMode",
+ 0x000B: "GPSDOP",
+ 0x000C: "GPSSpeedRef",
+ 0x000D: "GPSSpeed",
+ 0x000E: "GPSTrackRef",
+ 0x000F: "GPSTrack",
+ 0x0010: "GPSImgDirectionRef",
+ 0x0011: "GPSImgDirection",
+ 0x0012: "GPSMapDatum",
+ 0x0013: "GPSDestLatitudeRef",
+ 0x0014: "GPSDestLatitude",
+ 0x0015: "GPSDestLongitudeRef",
+ 0x0016: "GPSDestLongitude",
+ 0x0017: "GPSDestBearingRef",
+ 0x0018: "GPSDestBearing",
+ 0x0019: "GPSDestDistanceRef",
+ 0x001A: "GPSDestDistance",
+ 0x001B: "GPSProcessingMethod",
+ 0x001C: "GPSAreaInformation",
+ 0x001D: "GPSDateStamp",
+ 0x001E: "GPSDifferential"
+ }
+ // EXIF 2.3 Spec
+ IFD1Tags = {
+ 0x0100: "ImageWidth",
+ 0x0101: "ImageHeight",
+ 0x0102: "BitsPerSample",
+ 0x0103: "Compression",
+ 0x0106: "PhotometricInterpretation",
+ 0x0111: "StripOffsets",
+ 0x0112: "Orientation",
+ 0x0115: "SamplesPerPixel",
+ 0x0116: "RowsPerStrip",
+ 0x0117: "StripByteCounts",
+ 0x011A: "XResolution",
+ 0x011B: "YResolution",
+ 0x011C: "PlanarConfiguration",
+ 0x0128: "ResolutionUnit",
+ 0x0201: "JpegIFOffset", // When image format is JPEG, this value show offset to JPEG data stored.(aka "ThumbnailOffset" or "JPEGInterchangeFormat")
+ 0x0202: "JpegIFByteCount", // When image format is JPEG, this value shows data size of JPEG image (aka "ThumbnailLength" or "JPEGInterchangeFormatLength")
+ 0x0211: "YCbCrCoefficients",
+ 0x0212: "YCbCrSubSampling",
+ 0x0213: "YCbCrPositioning",
+ 0x0214: "ReferenceBlackWhite"
+ }
+ StringValues = {
+ ExposureProgram: {
+ 0: "Not defined",
+ 1: "Manual",
+ 2: "Normal program",
+ 3: "Aperture priority",
+ 4: "Shutter priority",
+ 5: "Creative program",
+ 6: "Action program",
+ 7: "Portrait mode",
+ 8: "Landscape mode"
+ },
+ MeteringMode: {
+ 0: "Unknown",
+ 1: "Average",
+ 2: "CenterWeightedAverage",
+ 3: "Spot",
+ 4: "MultiSpot",
+ 5: "Pattern",
+ 6: "Partial",
+ 255: "Other"
+ },
+ LightSource: {
+ 0: "Unknown",
+ 1: "Daylight",
+ 2: "Fluorescent",
+ 3: "Tungsten (incandescent light)",
+ 4: "Flash",
+ 9: "Fine weather",
+ 10: "Cloudy weather",
+ 11: "Shade",
+ 12: "Daylight fluorescent (D 5700 - 7100K)",
+ 13: "Day white fluorescent (N 4600 - 5400K)",
+ 14: "Cool white fluorescent (W 3900 - 4500K)",
+ 15: "White fluorescent (WW 3200 - 3700K)",
+ 17: "Standard light A",
+ 18: "Standard light B",
+ 19: "Standard light C",
+ 20: "D55",
+ 21: "D65",
+ 22: "D75",
+ 23: "D50",
+ 24: "ISO studio tungsten",
+ 255: "Other"
+ },
+ Flash: {
+ 0x0000: "Flash did not fire",
+ 0x0001: "Flash fired",
+ 0x0005: "Strobe return light not detected",
+ 0x0007: "Strobe return light detected",
+ 0x0009: "Flash fired, compulsory flash mode",
+ 0x000D: "Flash fired, compulsory flash mode, return light not detected",
+ 0x000F: "Flash fired, compulsory flash mode, return light detected",
+ 0x0010: "Flash did not fire, compulsory flash mode",
+ 0x0018: "Flash did not fire, auto mode",
+ 0x0019: "Flash fired, auto mode",
+ 0x001D: "Flash fired, auto mode, return light not detected",
+ 0x001F: "Flash fired, auto mode, return light detected",
+ 0x0020: "No flash function",
+ 0x0041: "Flash fired, red-eye reduction mode",
+ 0x0045: "Flash fired, red-eye reduction mode, return light not detected",
+ 0x0047: "Flash fired, red-eye reduction mode, return light detected",
+ 0x0049: "Flash fired, compulsory flash mode, red-eye reduction mode",
+ 0x004D: "Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",
+ 0x004F: "Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",
+ 0x0059: "Flash fired, auto mode, red-eye reduction mode",
+ 0x005D: "Flash fired, auto mode, return light not detected, red-eye reduction mode",
+ 0x005F: "Flash fired, auto mode, return light detected, red-eye reduction mode"
+ },
+ SensingMethod: {
+ 1: "Not defined",
+ 2: "One-chip color area sensor",
+ 3: "Two-chip color area sensor",
+ 4: "Three-chip color area sensor",
+ 5: "Color sequential area sensor",
+ 7: "Trilinear sensor",
+ 8: "Color sequential linear sensor"
+ },
+ SceneCaptureType: {
+ 0: "Standard",
+ 1: "Landscape",
+ 2: "Portrait",
+ 3: "Night scene"
+ },
+ SceneType: {
+ 1: "Directly photographed"
+ },
+ CustomRendered: {
+ 0: "Normal process",
+ 1: "Custom process"
+ },
+ WhiteBalance: {
+ 0: "Auto white balance",
+ 1: "Manual white balance"
+ },
+ GainControl: {
+ 0: "None",
+ 1: "Low gain up",
+ 2: "High gain up",
+ 3: "Low gain down",
+ 4: "High gain down"
+ },
+ Contrast: {
+ 0: "Normal",
+ 1: "Soft",
+ 2: "Hard"
+ },
+ Saturation: {
+ 0: "Normal",
+ 1: "Low saturation",
+ 2: "High saturation"
+ },
+ Sharpness: {
+ 0: "Normal",
+ 1: "Soft",
+ 2: "Hard"
+ },
+ SubjectDistanceRange: {
+ 0: "Unknown",
+ 1: "Macro",
+ 2: "Close view",
+ 3: "Distant view"
+ },
+ FileSource: {
+ 3: "DSC"
+ },
+
+ Components: {
+ 0: "",
+ 1: "Y",
+ 2: "Cb",
+ 3: "Cr",
+ 4: "R",
+ 5: "G",
+ 6: "B"
+ }
+ }
+ enableXmp() {
+ this.isXmpEnabled = true
+ }
+ disableXmp() {
+ this.isXmpEnabled = false;
+ }
+ /**
+ * 获取图片数据
+ * @param img 图片地址
+ * @param callback 回调 返回图片数据
+ * */
+ getData(img : any, callback : Function) {
+ // if (((self.Image && img instanceof self.Image) || (self.HTMLImageElement && img instanceof self.HTMLImageElement)) && !img.complete)
+ // return false;
+ let file : File = {
+ src: '',
+ exifdata: null,
+ iptcdata: null,
+ xmpdata: null,
+ }
+ if (isBase64(img)) {
+ file.src = img
+ } else if (img.path) {
+ file.src = img.path
+ } else if (isString(img)) {
+ file.src = img
+ } else {
+ return false;
+ }
+
+
+ if (!imageHasData(file)) {
+ getImageData(file, callback);
+ } else {
+ if (callback) {
+ callback.call(file);
+ }
+ }
+ return true;
+ }
+ /**
+ * 获取图片tag
+ * @param img 图片数据
+ * @param tag tag 类型
+ * */
+ getTag(img : File, tag : string) {
+ if (!imageHasData(img)) return;
+ return img.exifdata[tag];
+ }
+ getIptcTag(img : File, tag : string) {
+ if (!imageHasData(img)) return;
+ return img.iptcdata[tag];
+ }
+ getAllTags(img : File) {
+ if (!imageHasData(img)) return {};
+ let a,
+ data = img.exifdata,
+ tags = {};
+ for (a in data) {
+ if (data.hasOwnProperty(a)) {
+ tags[a] = data[a];
+ }
+ }
+ return tags;
+ }
+ getAllIptcTags(img : File) {
+ if (!imageHasData(img)) return {};
+ let a,
+ data = img.iptcdata,
+ tags = {};
+ for (a in data) {
+ if (data.hasOwnProperty(a)) {
+ tags[a] = data[a];
+ }
+ }
+ return tags;
+ }
+ pretty(img : File) {
+ if (!imageHasData(img)) return "";
+ let a,
+ data = img.exifdata,
+ strPretty = "";
+ for (a in data) {
+ if (data.hasOwnProperty(a)) {
+ if (typeof data[a] == "object") {
+ if (data[a] instanceof Number) {
+ strPretty += a + " : " + data[a] + " [" + data[a].numerator + "/" + data[a]
+ .denominator + "]\r\n";
+ } else {
+ strPretty += a + " : [" + data[a].length + " values]\r\n";
+ }
+ } else {
+ strPretty += a + " : " + data[a] + "\r\n";
+ }
+ }
+ }
+ return strPretty;
+ }
+ readFromBinaryFile(file: ArrayBuffer) {
+ return findEXIFinJPEG(file);
+ }
+}
+
+export const exif = new EXIF()
+// export function getData(img, callback) {
+// const exif = new EXIF()
+// exif.getData(img, callback)
+// }
+
+// export default {getData}
+const ExifTags = exif.Tags
+const TiffTags = exif.TiffTags
+const IFD1Tags = exif.IFD1Tags
+const GPSTags = exif.GPSTags
+const StringValues = exif.StringValues
+
+
+function imageHasData(img : File) : boolean {
+ return !!(img.exifdata);
+}
+
+function objectURLToBlob(url : string, callback : Function) {
+ try {
+ const http = new XMLHttpRequest();
+ http.open("GET", url, true);
+ http.responseType = "blob";
+ http.onload = function (e) {
+ if (this.status == 200 || this.status === 0) {
+ callback(this.response);
+ }
+ };
+ http.send();
+ } catch (e) {
+ console.warn(e)
+ }
+}
+
+
+function getImageData(img : File, callback : Function) {
+ function handleBinaryFile(binFile: ArrayBuffer) {
+ const data = findEXIFinJPEG(binFile);
+ img.exifdata = data ?? {};
+ const iptcdata = findIPTCinJPEG(binFile);
+ img.iptcdata = iptcdata ?? {};
+ if (exif.isXmpEnabled) {
+ const xmpdata = findXMPinJPEG(binFile);
+ img.xmpdata = xmpdata ?? {};
+ }
+ if (callback) {
+ callback.call(img);
+ }
+ }
+
+ if (img.src) {
+ if (/^data\:/i.test(img.src)) { // Data URI
+ // var arrayBuffer = base64ToArrayBuffer(img.src);
+ handleBinaryFile(base64ToArrayBuffer(img.src));
+
+ } else if (/^blob\:/i.test(img.src) && typeof FileReader !== 'undefined') { // Object URL
+ var fileReader = new FileReader();
+ fileReader.onload = function (e) {
+ handleBinaryFile(e.target.result);
+ };
+ objectURLToBlob(img.src, function (blob : Blob) {
+ fileReader.readAsArrayBuffer(blob);
+ });
+ } else if (typeof XMLHttpRequest !== 'undefined') {
+ var http = new XMLHttpRequest();
+ http.onload = function () {
+ if (this.status == 200 || this.status === 0) {
+ handleBinaryFile(http.response);
+ } else {
+ throw "Could not load image";
+ }
+ http = null;
+ };
+ http.open("GET", img.src, true);
+ http.responseType = "arraybuffer";
+ http.send(null);
+ } else {
+ pathToBase64(img.src).then(res => {
+ handleBinaryFile(base64ToArrayBuffer(res));
+ })
+ }
+ } else if (typeof FileReader !== 'undefined' && self.FileReader && (img instanceof self.Blob || img instanceof self.File)) {
+ var fileReader = new FileReader();
+ fileReader.onload = function (e : any) {
+ if (exif.debug) console.log("Got file of length " + e.target.result.byteLength);
+ handleBinaryFile(e.target.result);
+ };
+
+ fileReader.readAsArrayBuffer(img);
+ }
+}
+
+function findEXIFinJPEG(file: ArrayBuffer) {
+ const dataView = new DataView(file);
+
+ if (exif.debug) console.log("Got file of length " + file.byteLength);
+ if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
+ if (exif.debug) console.log("Not a valid JPEG");
+ return false; // not a valid jpeg
+ }
+
+ let offset = 2,
+ length = file.byteLength,
+ marker;
+
+ while (offset < length) {
+ if (dataView.getUint8(offset) != 0xFF) {
+ if (exif.debug) console.log("Not a valid marker at offset " + offset + ", found: " + dataView.getUint8(
+ offset));
+ return false; // not a valid marker, something is wrong
+ }
+
+ marker = dataView.getUint8(offset + 1);
+ if (exif.debug) console.log(marker);
+
+ // we could implement handling for other markers here,
+ // but we're only looking for 0xFFE1 for EXIF data
+
+ if (marker == 225) {
+ if (exif.debug) console.log("Found 0xFFE1 marker");
+
+ return readEXIFData(dataView, offset + 4, dataView.getUint16(offset + 2) - 2);
+
+ // offset += 2 + file.getShortAt(offset+2, true);
+
+ } else {
+ offset += 2 + dataView.getUint16(offset + 2);
+ }
+
+ }
+
+}
+
+function findIPTCinJPEG(file: ArrayBuffer) {
+ const dataView = new DataView(file);
+
+ if (exif.debug) console.log("Got file of length " + file.byteLength);
+ if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
+ if (exif.debug) console.log("Not a valid JPEG");
+ return false; // not a valid jpeg
+ }
+
+ let offset = 2,
+ length = file.byteLength;
+
+
+ const isFieldSegmentStart = function (dataView, offset: number) {
+ return (
+ dataView.getUint8(offset) === 0x38 &&
+ dataView.getUint8(offset + 1) === 0x42 &&
+ dataView.getUint8(offset + 2) === 0x49 &&
+ dataView.getUint8(offset + 3) === 0x4D &&
+ dataView.getUint8(offset + 4) === 0x04 &&
+ dataView.getUint8(offset + 5) === 0x04
+ );
+ };
+
+ while (offset < length) {
+
+ if (isFieldSegmentStart(dataView, offset)) {
+
+ // Get the length of the name header (which is padded to an even number of bytes)
+ var nameHeaderLength = dataView.getUint8(offset + 7);
+ if (nameHeaderLength % 2 !== 0) nameHeaderLength += 1;
+ // Check for pre photoshop 6 format
+ if (nameHeaderLength === 0) {
+ // Always 4
+ nameHeaderLength = 4;
+ }
+
+ var startOffset = offset + 8 + nameHeaderLength;
+ var sectionLength = dataView.getUint16(offset + 6 + nameHeaderLength);
+
+ return readIPTCData(file, startOffset, sectionLength);
+
+ break;
+
+ }
+
+
+ // Not the marker, continue searching
+ offset++;
+
+ }
+
+}
+
+const IptcFieldMap = {
+ 0x78: 'caption',
+ 0x6E: 'credit',
+ 0x19: 'keywords',
+ 0x37: 'dateCreated',
+ 0x50: 'byline',
+ 0x55: 'bylineTitle',
+ 0x7A: 'captionWriter',
+ 0x69: 'headline',
+ 0x74: 'copyright',
+ 0x0F: 'category'
+};
+
+function readIPTCData(file: ArrayBuffer, startOffset: number, sectionLength: number) {
+ const dataView = new DataView(file);
+ let data = {};
+ let fieldValue, fieldName, dataSize, segmentType, segmentSize;
+ let segmentStartPos = startOffset;
+ while (segmentStartPos < startOffset + sectionLength) {
+ if (dataView.getUint8(segmentStartPos) === 0x1C && dataView.getUint8(segmentStartPos + 1) === 0x02) {
+ segmentType = dataView.getUint8(segmentStartPos + 2);
+ if (segmentType in IptcFieldMap) {
+ dataSize = dataView.getInt16(segmentStartPos + 3);
+ segmentSize = dataSize + 5;
+ fieldName = IptcFieldMap[segmentType];
+ fieldValue = getStringFromDB(dataView, segmentStartPos + 5, dataSize);
+ // Check if we already stored a value with this name
+ if (data.hasOwnProperty(fieldName)) {
+ // Value already stored with this name, create multivalue field
+ if (data[fieldName] instanceof Array) {
+ data[fieldName].push(fieldValue);
+ } else {
+ data[fieldName] = [data[fieldName], fieldValue];
+ }
+ } else {
+ data[fieldName] = fieldValue;
+ }
+ }
+
+ }
+ segmentStartPos++;
+ }
+ return data;
+}
+
+function readTags(file: DataView, tiffStart: number, dirStart: number, strings: any[], bigEnd: number) {
+ let entries = file.getUint16(dirStart, !bigEnd),
+ tags = {},
+ entryOffset, tag;
+
+ for (let i = 0; i < entries; i++) {
+ entryOffset = dirStart + i * 12 + 2;
+ tag = strings[file.getUint16(entryOffset, !bigEnd)];
+ if (!tag && exif.debug) console.log("Unknown tag: " + file.getUint16(entryOffset, !bigEnd));
+ tags[tag] = readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd);
+ }
+ return tags;
+}
+
+function readTagValue(file: DataView, entryOffset: number, tiffStart: number, dirStart: number, bigEnd: number) {
+ let type = file.getUint16(entryOffset + 2, !bigEnd),
+ numValues = file.getUint32(entryOffset + 4, !bigEnd),
+ valueOffset = file.getUint32(entryOffset + 8, !bigEnd) + tiffStart,
+ offset,
+ vals, val, n,
+ numerator, denominator;
+
+ switch (type) {
+ case 1: // byte, 8-bit unsigned int
+ case 7: // undefined, 8-bit byte, value depending on field
+ if (numValues == 1) {
+ return file.getUint8(entryOffset + 8, !bigEnd);
+ } else {
+ offset = numValues > 4 ? valueOffset : (entryOffset + 8);
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getUint8(offset + n);
+ }
+ return vals;
+ }
+
+ case 2: // ascii, 8-bit byte
+ offset = numValues > 4 ? valueOffset : (entryOffset + 8);
+ return getStringFromDB(file, offset, numValues - 1);
+
+ case 3: // short, 16 bit int
+ if (numValues == 1) {
+ return file.getUint16(entryOffset + 8, !bigEnd);
+ } else {
+ offset = numValues > 2 ? valueOffset : (entryOffset + 8);
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getUint16(offset + 2 * n, !bigEnd);
+ }
+ return vals;
+ }
+
+ case 4: // long, 32 bit int
+ if (numValues == 1) {
+ return file.getUint32(entryOffset + 8, !bigEnd);
+ } else {
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getUint32(valueOffset + 4 * n, !bigEnd);
+ }
+ return vals;
+ }
+
+ case 5: // rational = two long values, first is numerator, second is denominator
+ if (numValues == 1) {
+ numerator = file.getUint32(valueOffset, !bigEnd);
+ denominator = file.getUint32(valueOffset + 4, !bigEnd);
+ val = new Number(numerator / denominator);
+ val.numerator = numerator;
+ val.denominator = denominator;
+ return val;
+ } else {
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ numerator = file.getUint32(valueOffset + 8 * n, !bigEnd);
+ denominator = file.getUint32(valueOffset + 4 + 8 * n, !bigEnd);
+ vals[n] = new Number(numerator / denominator);
+ vals[n].numerator = numerator;
+ vals[n].denominator = denominator;
+ }
+ return vals;
+ }
+
+ case 9: // slong, 32 bit signed int
+ if (numValues == 1) {
+ return file.getInt32(entryOffset + 8, !bigEnd);
+ } else {
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getInt32(valueOffset + 4 * n, !bigEnd);
+ }
+ return vals;
+ }
+
+ case 10: // signed rational, two slongs, first is numerator, second is denominator
+ if (numValues == 1) {
+ return file.getInt32(valueOffset, !bigEnd) / file.getInt32(valueOffset + 4, !bigEnd);
+ } else {
+ vals = [];
+ for (n = 0; n < numValues; n++) {
+ vals[n] = file.getInt32(valueOffset + 8 * n, !bigEnd) / file.getInt32(valueOffset + 4 + 8 *
+ n, !bigEnd);
+ }
+ return vals;
+ }
+ }
+}
+/**
+ * Given an IFD (Image File Directory) start offset
+ * returns an offset to next IFD or 0 if it's the last IFD.
+ */
+function getNextIFDOffset(dataView: DataView, dirStart: number, bigEnd: number) {
+ //the first 2bytes means the number of directory entries contains in this IFD
+ var entries = dataView.getUint16(dirStart, !bigEnd);
+
+ // After last directory entry, there is a 4bytes of data,
+ // it means an offset to next IFD.
+ // If its value is '0x00000000', it means this is the last IFD and there is no linked IFD.
+
+ return dataView.getUint32(dirStart + 2 + entries * 12, !bigEnd); // each entry is 12 bytes long
+}
+
+function readThumbnailImage(dataView: DataView, tiffStart: number, firstIFDOffset: number, bigEnd: number) {
+ // get the IFD1 offset
+ const IFD1OffsetPointer = getNextIFDOffset(dataView, tiffStart + firstIFDOffset, bigEnd);
+
+ if (!IFD1OffsetPointer) {
+ // console.log('******** IFD1Offset is empty, image thumb not found ********');
+ return {};
+ } else if (IFD1OffsetPointer > dataView.byteLength) { // this should not happen
+ // console.log('******** IFD1Offset is outside the bounds of the DataView ********');
+ return {};
+ }
+ // console.log('******* thumbnail IFD offset (IFD1) is: %s', IFD1OffsetPointer);
+
+ let thumbTags : any = readTags(dataView, tiffStart, tiffStart + IFD1OffsetPointer, IFD1Tags, bigEnd)
+
+ // EXIF 2.3 specification for JPEG format thumbnail
+
+ // If the value of Compression(0x0103) Tag in IFD1 is '6', thumbnail image format is JPEG.
+ // Most of Exif image uses JPEG format for thumbnail. In that case, you can get offset of thumbnail
+ // by JpegIFOffset(0x0201) Tag in IFD1, size of thumbnail by JpegIFByteCount(0x0202) Tag.
+ // Data format is ordinary JPEG format, starts from 0xFFD8 and ends by 0xFFD9. It seems that
+ // JPEG format and 160x120pixels of size are recommended thumbnail format for Exif2.1 or later.
+
+ if (thumbTags['Compression'] && typeof Blob !== 'undefined') {
+ // console.log('Thumbnail image found!');
+
+ switch (thumbTags['Compression']) {
+ case 6:
+ // console.log('Thumbnail image format is JPEG');
+ if (thumbTags.JpegIFOffset && thumbTags.JpegIFByteCount) {
+ // extract the thumbnail
+ var tOffset = tiffStart + thumbTags.JpegIFOffset;
+ var tLength = thumbTags.JpegIFByteCount;
+ thumbTags['blob'] = new Blob([new Uint8Array(dataView.buffer, tOffset, tLength)], {
+ type: 'image/jpeg'
+ });
+ }
+ break;
+
+ case 1:
+ console.log("Thumbnail image format is TIFF, which is not implemented.");
+ break;
+ default:
+ console.log("Unknown thumbnail image format '%s'", thumbTags['Compression']);
+ }
+ } else if (thumbTags['PhotometricInterpretation'] == 2) {
+ console.log("Thumbnail image format is RGB, which is not implemented.");
+ }
+ return thumbTags;
+}
+
+function getStringFromDB(buffer: DataView, start: number, length: number) {
+ let outstr = "";
+ for (let n = start; n < start + length; n++) {
+ outstr += String.fromCharCode(buffer.getUint8(n));
+ }
+ return outstr;
+}
+
+function readEXIFData(file: DataView, start: number) {
+ if (getStringFromDB(file, start, 4) != "Exif") {
+ if (exif.debug) console.log("Not valid EXIF data! " + getStringFromDB(file, start, 4));
+ return false;
+ }
+
+ let bigEnd,
+ tags, tag,
+ exifData, gpsData,
+ tiffOffset = start + 6;
+
+ // test for TIFF validity and endianness
+ if (file.getUint16(tiffOffset) == 0x4949) {
+ bigEnd = false;
+ } else if (file.getUint16(tiffOffset) == 0x4D4D) {
+ bigEnd = true;
+ } else {
+ if (exif.debug) console.log("Not valid TIFF data! (no 0x4949 or 0x4D4D)");
+ return false;
+ }
+
+ if (file.getUint16(tiffOffset + 2, !bigEnd) != 0x002A) {
+ if (exif.debug) console.log("Not valid TIFF data! (no 0x002A)");
+ return false;
+ }
+
+ const firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);
+
+ if (firstIFDOffset < 0x00000008) {
+ if (exif.debug) console.log("Not valid TIFF data! (First offset less than 8)", file.getUint32(tiffOffset + 4,
+ !bigEnd));
+ return false;
+ }
+
+ tags = readTags(file, tiffOffset, tiffOffset + firstIFDOffset, TiffTags, bigEnd);
+
+ if (tags.ExifIFDPointer) {
+ exifData = readTags(file, tiffOffset, tiffOffset + tags.ExifIFDPointer, ExifTags, bigEnd);
+ for (tag in exifData) {
+ switch (tag) {
+ case "LightSource":
+ case "Flash":
+ case "MeteringMode":
+ case "ExposureProgram":
+ case "SensingMethod":
+ case "SceneCaptureType":
+ case "SceneType":
+ case "CustomRendered":
+ case "WhiteBalance":
+ case "GainControl":
+ case "Contrast":
+ case "Saturation":
+ case "Sharpness":
+ case "SubjectDistanceRange":
+ case "FileSource":
+ exifData[tag] = StringValues[tag][exifData[tag]];
+ break;
+
+ case "ExifVersion":
+ case "FlashpixVersion":
+ exifData[tag] = String.fromCharCode(exifData[tag][0], exifData[tag][1], exifData[tag][2],
+ exifData[tag][3]);
+ break;
+
+ case "ComponentsConfiguration":
+ exifData[tag] =
+ StringValues.Components[exifData[tag][0]] +
+ StringValues.Components[exifData[tag][1]] +
+ StringValues.Components[exifData[tag][2]] +
+ StringValues.Components[exifData[tag][3]];
+ break;
+ }
+ tags[tag] = exifData[tag];
+ }
+ }
+
+ if (tags.GPSInfoIFDPointer) {
+ gpsData = readTags(file, tiffOffset, tiffOffset + tags.GPSInfoIFDPointer, GPSTags, bigEnd);
+ for (tag in gpsData) {
+ switch (tag) {
+ case "GPSVersionID":
+ gpsData[tag] = gpsData[tag][0] +
+ "." + gpsData[tag][1] +
+ "." + gpsData[tag][2] +
+ "." + gpsData[tag][3];
+ break;
+ }
+ tags[tag] = gpsData[tag];
+ }
+ }
+
+ // extract thumbnail
+ tags['thumbnail'] = readThumbnailImage(file, tiffOffset, firstIFDOffset, bigEnd);
+
+ return tags;
+}
+
+function findXMPinJPEG(file: ArrayBuffer) {
+
+ if (!('DOMParser' in self)) {
+ // console.warn('XML parsing not supported without DOMParser');
+ return;
+ }
+ const dataView = new DataView(file);
+
+ if (exif.debug) console.log("Got file of length " + file.byteLength);
+ if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
+ if (exif.debug) console.log("Not a valid JPEG");
+ return false; // not a valid jpeg
+ }
+
+ let offset = 2,
+ length = file.byteLength,
+ dom = new DOMParser();
+
+ while (offset < (length - 4)) {
+ if (getStringFromDB(dataView, offset, 4) == "http") {
+ const startOffset = offset - 1;
+ const sectionLength = dataView.getUint16(offset - 2) - 1;
+ let xmpString = getStringFromDB(dataView, startOffset, sectionLength)
+ const xmpEndIndex = xmpString.indexOf('xmpmeta>') + 8;
+ xmpString = xmpString.substring(xmpString.indexOf(' 0) {
+ json['@attributes'] = {};
+ for (var j = 0; j < xml.attributes.length; j++) {
+ var attribute = xml.attributes.item(j);
+ json['@attributes'][attribute.nodeName] = attribute.nodeValue;
+ }
+ }
+ } else if (xml.nodeType == 3) { // text node
+ return xml.nodeValue;
+ }
+
+ // deal with children
+ if (xml.hasChildNodes()) {
+ for (var i = 0; i < xml.childNodes.length; i++) {
+ var child = xml.childNodes.item(i);
+ var nodeName = child.nodeName;
+ if (json[nodeName] == null) {
+ json[nodeName] = xml2json(child);
+ } else {
+ if (json[nodeName].push == null) {
+ var old = json[nodeName];
+ json[nodeName] = [];
+ json[nodeName].push(old);
+ }
+ json[nodeName].push(xml2json(child));
+ }
+ }
+ }
+
+ return json;
+}
+
+function xml2Object(xml: any) {
+ try {
+ var obj = {};
+ if (xml.children.length > 0) {
+ for (var i = 0; i < xml.children.length; i++) {
+ var item = xml.children.item(i);
+ var attributes = item.attributes;
+ for (var idx in attributes) {
+ var itemAtt = attributes[idx];
+ var dataKey = itemAtt.nodeName;
+ var dataValue = itemAtt.nodeValue;
+
+ if (dataKey !== undefined) {
+ obj[dataKey] = dataValue;
+ }
+ }
+ var nodeName = item.nodeName;
+
+ if (typeof (obj[nodeName]) == "undefined") {
+ obj[nodeName] = xml2json(item);
+ } else {
+ if (typeof (obj[nodeName].push) == "undefined") {
+ var old = obj[nodeName];
+
+ obj[nodeName] = [];
+ obj[nodeName].push(old);
+ }
+ obj[nodeName].push(xml2json(item));
+ }
+ }
+ } else {
+ obj = xml.textContent;
+ }
+ return obj;
+ } catch (e) {
+ console.log(e.message);
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/fillZero/index.ts b/src/uni_modules/lime-shared/fillZero/index.ts
new file mode 100644
index 0000000..9952c45
--- /dev/null
+++ b/src/uni_modules/lime-shared/fillZero/index.ts
@@ -0,0 +1,11 @@
+// @ts-nocheck
+/**
+ * 在数字前填充零,返回字符串形式的结果
+ * @param number 要填充零的数字
+ * @param length 填充零后的字符串长度,默认为2
+ * @returns 填充零后的字符串
+ */
+export function fillZero(number: number, length: number = 2): string {
+ // 将数字转换为字符串,然后使用 padStart 方法填充零到指定长度
+ return `${number}`.padStart(length, '0');
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/floatAdd/index.ts b/src/uni_modules/lime-shared/floatAdd/index.ts
new file mode 100644
index 0000000..aba4774
--- /dev/null
+++ b/src/uni_modules/lime-shared/floatAdd/index.ts
@@ -0,0 +1,36 @@
+import {isNumber} from '../isNumber'
+/**
+ * 返回两个浮点数相加的结果
+ * @param num1 第一个浮点数
+ * @param num2 第二个浮点数
+ * @returns 两个浮点数的相加结果
+ */
+export function floatAdd(num1: number, num2: number): number {
+ // 检查 num1 和 num2 是否为数字类型
+ if (!(isNumber(num1) || isNumber(num2))) {
+ console.warn('Please pass in the number type');
+ return NaN;
+ }
+
+ let r1: number, r2: number, m: number;
+
+ try {
+ // 获取 num1 小数点后的位数
+ r1 = num1.toString().split('.')[1].length;
+ } catch (error) {
+ r1 = 0;
+ }
+
+ try {
+ // 获取 num2 小数点后的位数
+ r2 = num2.toString().split('.')[1].length;
+ } catch (error) {
+ r2 = 0;
+ }
+
+ // 计算需要扩大的倍数
+ m = Math.pow(10, Math.max(r1, r2));
+
+ // 返回相加结果
+ return (num1 * m + num2 * m) / m;
+}
diff --git a/src/uni_modules/lime-shared/getClassStr/index.ts b/src/uni_modules/lime-shared/getClassStr/index.ts
new file mode 100644
index 0000000..c3c62ac
--- /dev/null
+++ b/src/uni_modules/lime-shared/getClassStr/index.ts
@@ -0,0 +1,27 @@
+// @ts-nocheck
+/**
+ * 获取对象的类名字符串
+ * @param obj - 需要处理的对象
+ * @returns 由对象属性作为类名组成的字符串
+ */
+export function getClassStr(obj: T): string {
+ let classNames: string[] = [];
+
+ // 遍历对象的属性
+ for (let key in obj) {
+ // 检查属性确实属于对象自身且其值为true
+ if ((obj as any).hasOwnProperty(key) && obj[key]) {
+ // 将属性名添加到类名数组中
+ classNames.push(key);
+ }
+ }
+
+ // 将类名数组用空格连接成字符串并返回
+ return classNames.join(' ');
+}
+
+
+// 示例
+// const obj = { foo: true, bar: false, baz: true };
+// const classNameStr = getClassStr(obj);
+// console.log(classNameStr); // 输出: "foo baz"
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/getCurrentPage/index.ts b/src/uni_modules/lime-shared/getCurrentPage/index.ts
new file mode 100644
index 0000000..79ecac8
--- /dev/null
+++ b/src/uni_modules/lime-shared/getCurrentPage/index.ts
@@ -0,0 +1,6 @@
+// @ts-nocheck
+/** 获取当前页 */
+export const getCurrentPage = () => {
+ const pages = getCurrentPages();
+ return pages[pages.length - 1] //as T & WechatMiniprogram.Page.TrivialInstance;
+};
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/getLocalFilePath/index.ts b/src/uni_modules/lime-shared/getLocalFilePath/index.ts
new file mode 100644
index 0000000..8d6a68c
--- /dev/null
+++ b/src/uni_modules/lime-shared/getLocalFilePath/index.ts
@@ -0,0 +1,14 @@
+// @ts-nocheck
+export const getLocalFilePath = (path: string) => {
+ if(typeof plus == 'undefined') return path
+ if(/^(_www|_doc|_documents|_downloads|file:\/\/|\/storage\/emulated\/0\/)/.test(path)) return path
+ if (/^\//.test(path)) {
+ const localFilePath = plus.io.convertAbsoluteFileSystem(path)
+ if (localFilePath !== path) {
+ return localFilePath
+ } else {
+ path = path.slice(1)
+ }
+ }
+ return '_www/' + path
+}
diff --git a/src/uni_modules/lime-shared/getRect/index.ts b/src/uni_modules/lime-shared/getRect/index.ts
new file mode 100644
index 0000000..9763ee2
--- /dev/null
+++ b/src/uni_modules/lime-shared/getRect/index.ts
@@ -0,0 +1,86 @@
+// @ts-nocheck
+
+// #ifdef APP-NVUE
+// 当编译环境是 APP-NVUE 时,引入 uni.requireNativePlugin('dom'),具体插件用途未知
+const dom = uni.requireNativePlugin('dom')
+// #endif
+
+interface RectOptions {
+ /**
+ * 上下文
+ */
+ context ?: any // ComponentInternalInstance 类型,用于指定上下文
+
+ /**
+ * 是否需要获取所有节点,nvue 环境下不支持
+ */
+ needAll ?: boolean,
+
+ /**
+ * 节点引用对象,类型为 UniNamespace.NodesRef
+ */
+ nodes ?: UniNamespace.NodesRef
+
+ /**
+ * 节点引用对象的键,类型为 UniNamespace.NodesRef 中的某个键
+ */
+ type ?: keyof UniNamespace.NodesRef
+}
+
+/**
+ * 获取节点信息
+ * @param selector 选择器字符串
+ * @param options RectOptions 对象,用于配置选项
+ * @returns 包含节点信息的 Promise 对象
+ */
+export function getRect(selector : string, options : RectOptions = {}) {
+ // #ifndef APP-NVUE
+ const typeDefault = 'boundingClientRect'
+ let { context, needAll, type = typeDefault } = options
+ // #endif
+
+ // #ifdef MP || VUE2
+ if (context.proxy) context = context.proxy
+ // #endif
+
+ return new Promise((resolve, reject) => {
+ // #ifndef APP-NVUE
+ const dom = uni.createSelectorQuery().in(context)[needAll ? 'selectAll' : 'select'](selector);
+ const result = (rect: UniNamespace.NodeInfo) => {
+ if (rect) {
+ resolve(rect)
+ } else {
+ reject('no rect')
+ }
+ }
+ if (type == typeDefault) {
+ dom[type](result).exec()
+ } else {
+ dom[type]({
+ node: true,
+ size: true,
+ rect: true
+ }, result).exec()
+ }
+ // #endif
+ // #ifdef APP-NVUE
+ let { context } = options
+ if (/#|\./.test(selector) && context.refs) {
+ selector = selector.replace(/#|\./, '')
+ if (context.refs[selector]) {
+ selector = context.refs[selector]
+ if(Array.isArray(selector)) {
+ selector = selector[0]
+ }
+ }
+ }
+ dom.getComponentRect(selector, (res) => {
+ if (res.size) {
+ resolve(res.size)
+ } else {
+ reject('no rect')
+ }
+ })
+ // #endif
+ });
+};
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/getStyleStr/index.ts b/src/uni_modules/lime-shared/getStyleStr/index.ts
new file mode 100644
index 0000000..33decd5
--- /dev/null
+++ b/src/uni_modules/lime-shared/getStyleStr/index.ts
@@ -0,0 +1,30 @@
+// @ts-nocheck
+interface CSSProperties {
+ [key: string]: string | number
+}
+/**
+ * 将字符串转换为带有连字符分隔的小写形式
+ * @param key - 要转换的字符串
+ * @returns 转换后的字符串
+ */
+export function toLowercaseSeparator(key: string) {
+ return key.replace(/([A-Z])/g, '-$1').toLowerCase();
+}
+
+/**
+ * 获取样式对象对应的样式字符串
+ * @param style - CSS样式对象
+ * @returns 由非空有效样式属性键值对组成的字符串
+ */
+export function getStyleStr(style: CSSProperties): string {
+ return Object.keys(style)
+ .filter(key => style[key] !== undefined && style[key] !== null && style[key] !== '')
+ .map((key: string) => `${toLowercaseSeparator(key)}: ${style[key]};`)
+ .join(' ');
+}
+
+// 示例
+// const style = { color: 'red', fontSize: '16px', backgroundColor: '', border: null };
+// const styleStr = getStyleStr(style);
+// console.log(styleStr);
+// 输出: "color: red; font-size: 16px;"
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/hasOwn/index.ts b/src/uni_modules/lime-shared/hasOwn/index.ts
new file mode 100644
index 0000000..7317879
--- /dev/null
+++ b/src/uni_modules/lime-shared/hasOwn/index.ts
@@ -0,0 +1,30 @@
+// @ts-nocheck
+const hasOwnProperty = Object.prototype.hasOwnProperty
+/**
+ * 检查对象或数组是否具有指定的属性或键
+ * @param obj 要检查的对象或数组
+ * @param key 指定的属性或键
+ * @returns 如果对象或数组具有指定的属性或键,则返回true;否则返回false
+ */
+export function hasOwn(obj: Object | Array, key: string): boolean {
+ return hasOwnProperty.call(obj, key);
+}
+
+// 示例
+// const obj = { name: 'John', age: 30 };
+
+// if (hasOwn(obj, 'name')) {
+// console.log("对象具有 'name' 属性");
+// } else {
+// console.log("对象不具有 'name' 属性");
+// }
+// // 输出: 对象具有 'name' 属性
+
+// const arr = [1, 2, 3];
+
+// if (hasOwn(arr, 'length')) {
+// console.log("数组具有 'length' 属性");
+// } else {
+// console.log("数组不具有 'length' 属性");
+// }
+// 输出: 数组具有 'length' 属性
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/index.ts b/src/uni_modules/lime-shared/index.ts
new file mode 100644
index 0000000..8ffb34d
--- /dev/null
+++ b/src/uni_modules/lime-shared/index.ts
@@ -0,0 +1,43 @@
+// @ts-nocheck
+// validator
+export * from './isString'
+export * from './isNumber'
+export * from './isNumeric'
+export * from './isDef'
+export * from './isFunction'
+export * from './isObject'
+export * from './isPromise'
+export * from './isBase64'
+
+export * from './hasOwn'
+
+// 单位转换
+export * from './addUnit'
+export * from './unitConvert'
+export * from './toNumber'
+
+export * from './random'
+export * from './range'
+export * from './fillZero'
+
+// image
+export * from './base64ToPath'
+export * from './pathToBase64'
+export * from './exif'
+
+// canvas
+export * from './canIUseCanvas2d'
+
+// page
+export * from './getCurrentPage'
+
+// dom
+export * from './getRect'
+export * from './selectComponent'
+export * from './createAnimation'
+
+// delay
+export * from './sleep'
+export * from './debounce'
+export * from './throttle'
+
diff --git a/src/uni_modules/lime-shared/isBase64/index.ts b/src/uni_modules/lime-shared/isBase64/index.ts
new file mode 100644
index 0000000..44d0f6d
--- /dev/null
+++ b/src/uni_modules/lime-shared/isBase64/index.ts
@@ -0,0 +1,9 @@
+// @ts-nocheck
+/**
+ * 判断给定的路径是否为Base64编码的图像路径
+ * @param path 图像路径
+ * @returns 如果路径是Base64编码,则返回true;否则返回false
+ */
+export const isBase64 = (path: string): boolean => {
+ return /^data:image\/(\w+);base64/.test(path);
+};
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/isBrowser/index.ts b/src/uni_modules/lime-shared/isBrowser/index.ts
new file mode 100644
index 0000000..241c7f7
--- /dev/null
+++ b/src/uni_modules/lime-shared/isBrowser/index.ts
@@ -0,0 +1,2 @@
+// @ts-nocheck
+export const isBrowser = typeof window !== 'undefined';
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/isDef/index.ts b/src/uni_modules/lime-shared/isDef/index.ts
new file mode 100644
index 0000000..029407e
--- /dev/null
+++ b/src/uni_modules/lime-shared/isDef/index.ts
@@ -0,0 +1,9 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否已定义(不为 undefined)且不为 null
+ * @param value 要检查的值
+ * @returns 如果值已定义且不为 null,则返回 true;否则返回 false
+ */
+export function isDef(value: unknown): boolean {
+ return value !== undefined && value !== null;
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/isFunction/index.ts b/src/uni_modules/lime-shared/isFunction/index.ts
new file mode 100644
index 0000000..981442d
--- /dev/null
+++ b/src/uni_modules/lime-shared/isFunction/index.ts
@@ -0,0 +1,8 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为函数类型
+ * @param val 要检查的值
+ * @returns 如果值的类型是函数类型,则返回 true;否则返回 false
+ */
+export const isFunction = (val: unknown): val is Function =>
+ typeof val === 'function';
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/isNumber/index.ts b/src/uni_modules/lime-shared/isNumber/index.ts
new file mode 100644
index 0000000..2feff2f
--- /dev/null
+++ b/src/uni_modules/lime-shared/isNumber/index.ts
@@ -0,0 +1,9 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为数字类型
+ * @param value 要检查的值,可以是 number 类型或 string 类型的数字
+ * @returns 如果值是数字类型且不是 NaN,则返回 true;否则返回 false
+ */
+export function isNumber(value: number | string): boolean {
+ return typeof value === 'number' && !isNaN(value);
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/isNumeric/index.ts b/src/uni_modules/lime-shared/isNumeric/index.ts
new file mode 100644
index 0000000..5ee60ba
--- /dev/null
+++ b/src/uni_modules/lime-shared/isNumeric/index.ts
@@ -0,0 +1,9 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为数字类型或表示数字的字符串
+ * @param value 要检查的值,可以是 string 类型或 number 类型
+ * @returns 如果值是数字类型或表示数字的字符串,则返回 true;否则返回 false
+ */
+export function isNumeric(value: string | number): boolean {
+ return /^(-)?\d+(\.\d+)?$/.test(value);
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/isObject/index.ts b/src/uni_modules/lime-shared/isObject/index.ts
new file mode 100644
index 0000000..17234c9
--- /dev/null
+++ b/src/uni_modules/lime-shared/isObject/index.ts
@@ -0,0 +1,8 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为对象类型
+ * @param val 要检查的值
+ * @returns 如果值的类型是对象类型,则返回 true;否则返回 false
+ */
+export const isObject = (val : unknown) : val is Record =>
+ val !== null && typeof val === 'object';
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/isPromise/index.ts b/src/uni_modules/lime-shared/isPromise/index.ts
new file mode 100644
index 0000000..63847cd
--- /dev/null
+++ b/src/uni_modules/lime-shared/isPromise/index.ts
@@ -0,0 +1,13 @@
+// @ts-nocheck
+import {isFunction} from '../isFunction'
+import {isObject} from '../isObject'
+/**
+ * 检查一个值是否为 Promise 类型
+ * @param val 要检查的值
+ * @returns 如果值的类型是 Promise 类型,则返回 true;否则返回 false
+ */
+export const isPromise = (val: unknown): val is Promise => {
+ // 使用 isObject 函数判断值是否为对象类型
+ // 使用 isFunction 函数判断值是否具有 then 方法和 catch 方法
+ return isObject(val) && isFunction(val.then) && isFunction(val.catch);
+};
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/isString/index.ts b/src/uni_modules/lime-shared/isString/index.ts
new file mode 100644
index 0000000..a130eb2
--- /dev/null
+++ b/src/uni_modules/lime-shared/isString/index.ts
@@ -0,0 +1,7 @@
+// @ts-nocheck
+/**
+ * 检查一个值是否为字符串类型
+ * @param str 要检查的值
+ * @returns 如果值的类型是字符串类型,则返回 true;否则返回 false
+ */
+export const isString = (str: unknown): str is string => typeof str === 'string';
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/kebabCase/index.ts b/src/uni_modules/lime-shared/kebabCase/index.ts
new file mode 100644
index 0000000..fa0e4b2
--- /dev/null
+++ b/src/uni_modules/lime-shared/kebabCase/index.ts
@@ -0,0 +1,17 @@
+// export function toLowercaseSeparator(key: string) {
+// return key.replace(/([A-Z])/g, '-$1').toLowerCase();
+// }
+
+/**
+ * 将字符串转换为指定连接符的命名约定
+ * @param str 要转换的字符串
+ * @param separator 指定的连接符,默认为 "-"
+ * @returns 转换后的字符串
+ */
+export function kebabCase(str: string, separator: string = "-"): string {
+ return str
+ .replace(/[A-Z]/g, match => `${separator}${match.toLowerCase()}`) // 将大写字母替换为连接符加小写字母
+ .replace(/[\s_-]+/g, separator) // 将空格、下划线和短横线替换为指定连接符
+ .replace(new RegExp(`^${separator}|${separator}$`, "g"), "") // 删除开头和结尾的连接符
+ .toLowerCase(); // 将结果转换为全小写
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/package.json b/src/uni_modules/lime-shared/package.json
new file mode 100644
index 0000000..2e000c9
--- /dev/null
+++ b/src/uni_modules/lime-shared/package.json
@@ -0,0 +1,83 @@
+{
+ "id": "lime-shared",
+ "displayName": "lime-shared",
+ "version": "0.1.4",
+ "description": "本人插件的几个公共函数,获取当前页,图片的base64转临时路径,图片的exif信息等",
+ "keywords": [
+ "lime-shared",
+ "exif",
+ "selectComponent"
+],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.1.0"
+ },
+ "dcloudext": {
+ "type": "sdk-js",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "u",
+ "Edge": "u",
+ "Firefox": "u",
+ "Safari": "u"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "y",
+ "快手": "y",
+ "飞书": "y",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/pathToBase64/index.ts b/src/uni_modules/lime-shared/pathToBase64/index.ts
new file mode 100644
index 0000000..8167f88
--- /dev/null
+++ b/src/uni_modules/lime-shared/pathToBase64/index.ts
@@ -0,0 +1,121 @@
+// @ts-nocheck
+
+// #ifdef APP-PLUS
+import { getLocalFilePath } from '../getLocalFilePath'
+// #endif
+function isImage(extension : string) {
+ const imageExtensions = ["jpg", "jpeg", "png", "gif", "bmp", "svg"];
+ return imageExtensions.includes(extension.toLowerCase());
+}
+// #ifdef H5
+function getSVGFromURL(url: string) {
+ return new Promise((resolve, reject) => {
+ const xhr = new XMLHttpRequest();
+ xhr.open('GET', url, true);
+ xhr.responseType = 'text';
+
+ xhr.onload = function () {
+ if (xhr.status === 200) {
+ const svg = xhr.responseText;
+ resolve(svg);
+ } else {
+ reject(new Error(xhr.statusText));
+ }
+ };
+
+ xhr.onerror = function () {
+ reject(new Error('Network error'));
+ };
+
+ xhr.send();
+ });
+}
+// #endif
+/**
+ * 路径转base64
+ * @param {Object} string
+ */
+export function pathToBase64(path : string) : Promise {
+ if (/^data:/.test(path)) return path
+ let extension = path.substring(path.lastIndexOf('.') + 1);
+ const isImageFile = isImage(extension)
+ let prefix = ''
+ if (isImageFile) {
+ prefix = 'image/';
+ if(extension == 'svg') {
+ extension += '+xml'
+ }
+ } else if (extension === 'pdf') {
+ prefix = 'application/pdf';
+ } else if (extension === 'txt') {
+ prefix = 'text/plain';
+ } else {
+ // 添加更多文件类型的判断
+ // 如果不是图片、PDF、文本等类型,可以设定默认的前缀或采取其他处理
+ prefix = 'application/octet-stream';
+ }
+ return new Promise((resolve, reject) => {
+ // #ifdef H5
+ if (isImageFile) {
+ if(extension == 'svg') {
+ getSVGFromURL(path).then(svg => {
+ const base64 = btoa(svg);
+ resolve(`data:image/svg+xml;base64,${base64}`);
+ })
+ } else {
+ let image = new Image();
+ image.setAttribute("crossOrigin", 'Anonymous');
+ image.onload = function () {
+ let canvas = document.createElement('canvas');
+ canvas.width = this.naturalWidth;
+ canvas.height = this.naturalHeight;
+ canvas.getContext('2d').drawImage(image, 0, 0);
+ let result = canvas.toDataURL(`${prefix}${extension}`)
+ resolve(result);
+ canvas.height = canvas.width = 0
+ }
+ image.src = path + '?v=' + Math.random()
+ image.onerror = (error) => {
+ reject(error);
+ };
+ }
+
+ } else {
+ reject('not image');
+ }
+
+ // #endif
+
+ // #ifdef MP
+ if (uni.canIUse('getFileSystemManager')) {
+ uni.getFileSystemManager().readFile({
+ filePath: path,
+ encoding: 'base64',
+ success: (res) => {
+ resolve(`data:${prefix}${extension};base64,${res.data}`)
+ },
+ fail: (error) => {
+ console.error({ error, path })
+ reject(error)
+ }
+ })
+ }
+ // #endif
+
+ // #ifdef APP-PLUS
+ plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), (entry) => {
+ entry.file((file : any) => {
+ const fileReader = new plus.io.FileReader()
+ fileReader.onload = (data) => {
+ resolve(data.target.result)
+ }
+ fileReader.onerror = (error) => {
+ console.error({ error, path })
+ reject(error)
+ }
+ fileReader.readAsDataURL(file)
+ }, reject)
+ }, reject)
+ // #endif
+ })
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/piexif/index.ts b/src/uni_modules/lime-shared/piexif/index.ts
new file mode 100644
index 0000000..6a52b10
--- /dev/null
+++ b/src/uni_modules/lime-shared/piexif/index.ts
@@ -0,0 +1,2320 @@
+// @ts-nocheck
+// 源于piexifjs
+import { cloneDeep } from '../cloneDeep'
+import { isString } from '../isString'
+const TAGS = {
+ 'Image': {
+ 11: {
+ 'name': 'ProcessingSoftware',
+ 'type': 'Ascii'
+ },
+ 254: {
+ 'name': 'NewSubfileType',
+ 'type': 'Long'
+ },
+ 255: {
+ 'name': 'SubfileType',
+ 'type': 'Short'
+ },
+ 256: {
+ 'name': 'ImageWidth',
+ 'type': 'Long'
+ },
+ 257: {
+ 'name': 'ImageLength',
+ 'type': 'Long'
+ },
+ 258: {
+ 'name': 'BitsPerSample',
+ 'type': 'Short'
+ },
+ 259: {
+ 'name': 'Compression',
+ 'type': 'Short'
+ },
+ 262: {
+ 'name': 'PhotometricInterpretation',
+ 'type': 'Short'
+ },
+ 263: {
+ 'name': 'Threshholding',
+ 'type': 'Short'
+ },
+ 264: {
+ 'name': 'CellWidth',
+ 'type': 'Short'
+ },
+ 265: {
+ 'name': 'CellLength',
+ 'type': 'Short'
+ },
+ 266: {
+ 'name': 'FillOrder',
+ 'type': 'Short'
+ },
+ 269: {
+ 'name': 'DocumentName',
+ 'type': 'Ascii'
+ },
+ 270: {
+ 'name': 'ImageDescription',
+ 'type': 'Ascii'
+ },
+ 271: {
+ 'name': 'Make',
+ 'type': 'Ascii'
+ },
+ 272: {
+ 'name': 'Model',
+ 'type': 'Ascii'
+ },
+ 273: {
+ 'name': 'StripOffsets',
+ 'type': 'Long'
+ },
+ 274: {
+ 'name': 'Orientation',
+ 'type': 'Short'
+ },
+ 277: {
+ 'name': 'SamplesPerPixel',
+ 'type': 'Short'
+ },
+ 278: {
+ 'name': 'RowsPerStrip',
+ 'type': 'Long'
+ },
+ 279: {
+ 'name': 'StripByteCounts',
+ 'type': 'Long'
+ },
+ 282: {
+ 'name': 'XResolution',
+ 'type': 'Rational'
+ },
+ 283: {
+ 'name': 'YResolution',
+ 'type': 'Rational'
+ },
+ 284: {
+ 'name': 'PlanarConfiguration',
+ 'type': 'Short'
+ },
+ 290: {
+ 'name': 'GrayResponseUnit',
+ 'type': 'Short'
+ },
+ 291: {
+ 'name': 'GrayResponseCurve',
+ 'type': 'Short'
+ },
+ 292: {
+ 'name': 'T4Options',
+ 'type': 'Long'
+ },
+ 293: {
+ 'name': 'T6Options',
+ 'type': 'Long'
+ },
+ 296: {
+ 'name': 'ResolutionUnit',
+ 'type': 'Short'
+ },
+ 301: {
+ 'name': 'TransferFunction',
+ 'type': 'Short'
+ },
+ 305: {
+ 'name': 'Software',
+ 'type': 'Ascii'
+ },
+ 306: {
+ 'name': 'DateTime',
+ 'type': 'Ascii'
+ },
+ 315: {
+ 'name': 'Artist',
+ 'type': 'Ascii'
+ },
+ 316: {
+ 'name': 'HostComputer',
+ 'type': 'Ascii'
+ },
+ 317: {
+ 'name': 'Predictor',
+ 'type': 'Short'
+ },
+ 318: {
+ 'name': 'WhitePoint',
+ 'type': 'Rational'
+ },
+ 319: {
+ 'name': 'PrimaryChromaticities',
+ 'type': 'Rational'
+ },
+ 320: {
+ 'name': 'ColorMap',
+ 'type': 'Short'
+ },
+ 321: {
+ 'name': 'HalftoneHints',
+ 'type': 'Short'
+ },
+ 322: {
+ 'name': 'TileWidth',
+ 'type': 'Short'
+ },
+ 323: {
+ 'name': 'TileLength',
+ 'type': 'Short'
+ },
+ 324: {
+ 'name': 'TileOffsets',
+ 'type': 'Short'
+ },
+ 325: {
+ 'name': 'TileByteCounts',
+ 'type': 'Short'
+ },
+ 330: {
+ 'name': 'SubIFDs',
+ 'type': 'Long'
+ },
+ 332: {
+ 'name': 'InkSet',
+ 'type': 'Short'
+ },
+ 333: {
+ 'name': 'InkNames',
+ 'type': 'Ascii'
+ },
+ 334: {
+ 'name': 'NumberOfInks',
+ 'type': 'Short'
+ },
+ 336: {
+ 'name': 'DotRange',
+ 'type': 'Byte'
+ },
+ 337: {
+ 'name': 'TargetPrinter',
+ 'type': 'Ascii'
+ },
+ 338: {
+ 'name': 'ExtraSamples',
+ 'type': 'Short'
+ },
+ 339: {
+ 'name': 'SampleFormat',
+ 'type': 'Short'
+ },
+ 340: {
+ 'name': 'SMinSampleValue',
+ 'type': 'Short'
+ },
+ 341: {
+ 'name': 'SMaxSampleValue',
+ 'type': 'Short'
+ },
+ 342: {
+ 'name': 'TransferRange',
+ 'type': 'Short'
+ },
+ 343: {
+ 'name': 'ClipPath',
+ 'type': 'Byte'
+ },
+ 344: {
+ 'name': 'XClipPathUnits',
+ 'type': 'Long'
+ },
+ 345: {
+ 'name': 'YClipPathUnits',
+ 'type': 'Long'
+ },
+ 346: {
+ 'name': 'Indexed',
+ 'type': 'Short'
+ },
+ 347: {
+ 'name': 'JPEGTables',
+ 'type': 'Undefined'
+ },
+ 351: {
+ 'name': 'OPIProxy',
+ 'type': 'Short'
+ },
+ 512: {
+ 'name': 'JPEGProc',
+ 'type': 'Long'
+ },
+ 513: {
+ 'name': 'JPEGInterchangeFormat',
+ 'type': 'Long'
+ },
+ 514: {
+ 'name': 'JPEGInterchangeFormatLength',
+ 'type': 'Long'
+ },
+ 515: {
+ 'name': 'JPEGRestartInterval',
+ 'type': 'Short'
+ },
+ 517: {
+ 'name': 'JPEGLosslessPredictors',
+ 'type': 'Short'
+ },
+ 518: {
+ 'name': 'JPEGPointTransforms',
+ 'type': 'Short'
+ },
+ 519: {
+ 'name': 'JPEGQTables',
+ 'type': 'Long'
+ },
+ 520: {
+ 'name': 'JPEGDCTables',
+ 'type': 'Long'
+ },
+ 521: {
+ 'name': 'JPEGACTables',
+ 'type': 'Long'
+ },
+ 529: {
+ 'name': 'YCbCrCoefficients',
+ 'type': 'Rational'
+ },
+ 530: {
+ 'name': 'YCbCrSubSampling',
+ 'type': 'Short'
+ },
+ 531: {
+ 'name': 'YCbCrPositioning',
+ 'type': 'Short'
+ },
+ 532: {
+ 'name': 'ReferenceBlackWhite',
+ 'type': 'Rational'
+ },
+ 700: {
+ 'name': 'XMLPacket',
+ 'type': 'Byte'
+ },
+ 18246: {
+ 'name': 'Rating',
+ 'type': 'Short'
+ },
+ 18249: {
+ 'name': 'RatingPercent',
+ 'type': 'Short'
+ },
+ 32781: {
+ 'name': 'ImageID',
+ 'type': 'Ascii'
+ },
+ 33421: {
+ 'name': 'CFARepeatPatternDim',
+ 'type': 'Short'
+ },
+ 33422: {
+ 'name': 'CFAPattern',
+ 'type': 'Byte'
+ },
+ 33423: {
+ 'name': 'BatteryLevel',
+ 'type': 'Rational'
+ },
+ 33432: {
+ 'name': 'Copyright',
+ 'type': 'Ascii'
+ },
+ 33434: {
+ 'name': 'ExposureTime',
+ 'type': 'Rational'
+ },
+ 34377: {
+ 'name': 'ImageResources',
+ 'type': 'Byte'
+ },
+ 34665: {
+ 'name': 'ExifTag',
+ 'type': 'Long'
+ },
+ 34675: {
+ 'name': 'InterColorProfile',
+ 'type': 'Undefined'
+ },
+ 34853: {
+ 'name': 'GPSTag',
+ 'type': 'Long'
+ },
+ 34857: {
+ 'name': 'Interlace',
+ 'type': 'Short'
+ },
+ 34858: {
+ 'name': 'TimeZoneOffset',
+ 'type': 'Long'
+ },
+ 34859: {
+ 'name': 'SelfTimerMode',
+ 'type': 'Short'
+ },
+ 37387: {
+ 'name': 'FlashEnergy',
+ 'type': 'Rational'
+ },
+ 37388: {
+ 'name': 'SpatialFrequencyResponse',
+ 'type': 'Undefined'
+ },
+ 37389: {
+ 'name': 'Noise',
+ 'type': 'Undefined'
+ },
+ 37390: {
+ 'name': 'FocalPlaneXResolution',
+ 'type': 'Rational'
+ },
+ 37391: {
+ 'name': 'FocalPlaneYResolution',
+ 'type': 'Rational'
+ },
+ 37392: {
+ 'name': 'FocalPlaneResolutionUnit',
+ 'type': 'Short'
+ },
+ 37393: {
+ 'name': 'ImageNumber',
+ 'type': 'Long'
+ },
+ 37394: {
+ 'name': 'SecurityClassification',
+ 'type': 'Ascii'
+ },
+ 37395: {
+ 'name': 'ImageHistory',
+ 'type': 'Ascii'
+ },
+ 37397: {
+ 'name': 'ExposureIndex',
+ 'type': 'Rational'
+ },
+ 37398: {
+ 'name': 'TIFFEPStandardID',
+ 'type': 'Byte'
+ },
+ 37399: {
+ 'name': 'SensingMethod',
+ 'type': 'Short'
+ },
+ 40091: {
+ 'name': 'XPTitle',
+ 'type': 'Byte'
+ },
+ 40092: {
+ 'name': 'XPComment',
+ 'type': 'Byte'
+ },
+ 40093: {
+ 'name': 'XPAuthor',
+ 'type': 'Byte'
+ },
+ 40094: {
+ 'name': 'XPKeywords',
+ 'type': 'Byte'
+ },
+ 40095: {
+ 'name': 'XPSubject',
+ 'type': 'Byte'
+ },
+ 50341: {
+ 'name': 'PrintImageMatching',
+ 'type': 'Undefined'
+ },
+ 50706: {
+ 'name': 'DNGVersion',
+ 'type': 'Byte'
+ },
+ 50707: {
+ 'name': 'DNGBackwardVersion',
+ 'type': 'Byte'
+ },
+ 50708: {
+ 'name': 'UniqueCameraModel',
+ 'type': 'Ascii'
+ },
+ 50709: {
+ 'name': 'LocalizedCameraModel',
+ 'type': 'Byte'
+ },
+ 50710: {
+ 'name': 'CFAPlaneColor',
+ 'type': 'Byte'
+ },
+ 50711: {
+ 'name': 'CFALayout',
+ 'type': 'Short'
+ },
+ 50712: {
+ 'name': 'LinearizationTable',
+ 'type': 'Short'
+ },
+ 50713: {
+ 'name': 'BlackLevelRepeatDim',
+ 'type': 'Short'
+ },
+ 50714: {
+ 'name': 'BlackLevel',
+ 'type': 'Rational'
+ },
+ 50715: {
+ 'name': 'BlackLevelDeltaH',
+ 'type': 'SRational'
+ },
+ 50716: {
+ 'name': 'BlackLevelDeltaV',
+ 'type': 'SRational'
+ },
+ 50717: {
+ 'name': 'WhiteLevel',
+ 'type': 'Short'
+ },
+ 50718: {
+ 'name': 'DefaultScale',
+ 'type': 'Rational'
+ },
+ 50719: {
+ 'name': 'DefaultCropOrigin',
+ 'type': 'Short'
+ },
+ 50720: {
+ 'name': 'DefaultCropSize',
+ 'type': 'Short'
+ },
+ 50721: {
+ 'name': 'ColorMatrix1',
+ 'type': 'SRational'
+ },
+ 50722: {
+ 'name': 'ColorMatrix2',
+ 'type': 'SRational'
+ },
+ 50723: {
+ 'name': 'CameraCalibration1',
+ 'type': 'SRational'
+ },
+ 50724: {
+ 'name': 'CameraCalibration2',
+ 'type': 'SRational'
+ },
+ 50725: {
+ 'name': 'ReductionMatrix1',
+ 'type': 'SRational'
+ },
+ 50726: {
+ 'name': 'ReductionMatrix2',
+ 'type': 'SRational'
+ },
+ 50727: {
+ 'name': 'AnalogBalance',
+ 'type': 'Rational'
+ },
+ 50728: {
+ 'name': 'AsShotNeutral',
+ 'type': 'Short'
+ },
+ 50729: {
+ 'name': 'AsShotWhiteXY',
+ 'type': 'Rational'
+ },
+ 50730: {
+ 'name': 'BaselineExposure',
+ 'type': 'SRational'
+ },
+ 50731: {
+ 'name': 'BaselineNoise',
+ 'type': 'Rational'
+ },
+ 50732: {
+ 'name': 'BaselineSharpness',
+ 'type': 'Rational'
+ },
+ 50733: {
+ 'name': 'BayerGreenSplit',
+ 'type': 'Long'
+ },
+ 50734: {
+ 'name': 'LinearResponseLimit',
+ 'type': 'Rational'
+ },
+ 50735: {
+ 'name': 'CameraSerialNumber',
+ 'type': 'Ascii'
+ },
+ 50736: {
+ 'name': 'LensInfo',
+ 'type': 'Rational'
+ },
+ 50737: {
+ 'name': 'ChromaBlurRadius',
+ 'type': 'Rational'
+ },
+ 50738: {
+ 'name': 'AntiAliasStrength',
+ 'type': 'Rational'
+ },
+ 50739: {
+ 'name': 'ShadowScale',
+ 'type': 'SRational'
+ },
+ 50740: {
+ 'name': 'DNGPrivateData',
+ 'type': 'Byte'
+ },
+ 50741: {
+ 'name': 'MakerNoteSafety',
+ 'type': 'Short'
+ },
+ 50778: {
+ 'name': 'CalibrationIlluminant1',
+ 'type': 'Short'
+ },
+ 50779: {
+ 'name': 'CalibrationIlluminant2',
+ 'type': 'Short'
+ },
+ 50780: {
+ 'name': 'BestQualityScale',
+ 'type': 'Rational'
+ },
+ 50781: {
+ 'name': 'RawDataUniqueID',
+ 'type': 'Byte'
+ },
+ 50827: {
+ 'name': 'OriginalRawFileName',
+ 'type': 'Byte'
+ },
+ 50828: {
+ 'name': 'OriginalRawFileData',
+ 'type': 'Undefined'
+ },
+ 50829: {
+ 'name': 'ActiveArea',
+ 'type': 'Short'
+ },
+ 50830: {
+ 'name': 'MaskedAreas',
+ 'type': 'Short'
+ },
+ 50831: {
+ 'name': 'AsShotICCProfile',
+ 'type': 'Undefined'
+ },
+ 50832: {
+ 'name': 'AsShotPreProfileMatrix',
+ 'type': 'SRational'
+ },
+ 50833: {
+ 'name': 'CurrentICCProfile',
+ 'type': 'Undefined'
+ },
+ 50834: {
+ 'name': 'CurrentPreProfileMatrix',
+ 'type': 'SRational'
+ },
+ 50879: {
+ 'name': 'ColorimetricReference',
+ 'type': 'Short'
+ },
+ 50931: {
+ 'name': 'CameraCalibrationSignature',
+ 'type': 'Byte'
+ },
+ 50932: {
+ 'name': 'ProfileCalibrationSignature',
+ 'type': 'Byte'
+ },
+ 50934: {
+ 'name': 'AsShotProfileName',
+ 'type': 'Byte'
+ },
+ 50935: {
+ 'name': 'NoiseReductionApplied',
+ 'type': 'Rational'
+ },
+ 50936: {
+ 'name': 'ProfileName',
+ 'type': 'Byte'
+ },
+ 50937: {
+ 'name': 'ProfileHueSatMapDims',
+ 'type': 'Long'
+ },
+ 50938: {
+ 'name': 'ProfileHueSatMapData1',
+ 'type': 'Float'
+ },
+ 50939: {
+ 'name': 'ProfileHueSatMapData2',
+ 'type': 'Float'
+ },
+ 50940: {
+ 'name': 'ProfileToneCurve',
+ 'type': 'Float'
+ },
+ 50941: {
+ 'name': 'ProfileEmbedPolicy',
+ 'type': 'Long'
+ },
+ 50942: {
+ 'name': 'ProfileCopyright',
+ 'type': 'Byte'
+ },
+ 50964: {
+ 'name': 'ForwardMatrix1',
+ 'type': 'SRational'
+ },
+ 50965: {
+ 'name': 'ForwardMatrix2',
+ 'type': 'SRational'
+ },
+ 50966: {
+ 'name': 'PreviewApplicationName',
+ 'type': 'Byte'
+ },
+ 50967: {
+ 'name': 'PreviewApplicationVersion',
+ 'type': 'Byte'
+ },
+ 50968: {
+ 'name': 'PreviewSettingsName',
+ 'type': 'Byte'
+ },
+ 50969: {
+ 'name': 'PreviewSettingsDigest',
+ 'type': 'Byte'
+ },
+ 50970: {
+ 'name': 'PreviewColorSpace',
+ 'type': 'Long'
+ },
+ 50971: {
+ 'name': 'PreviewDateTime',
+ 'type': 'Ascii'
+ },
+ 50972: {
+ 'name': 'RawImageDigest',
+ 'type': 'Undefined'
+ },
+ 50973: {
+ 'name': 'OriginalRawFileDigest',
+ 'type': 'Undefined'
+ },
+ 50974: {
+ 'name': 'SubTileBlockSize',
+ 'type': 'Long'
+ },
+ 50975: {
+ 'name': 'RowInterleaveFactor',
+ 'type': 'Long'
+ },
+ 50981: {
+ 'name': 'ProfileLookTableDims',
+ 'type': 'Long'
+ },
+ 50982: {
+ 'name': 'ProfileLookTableData',
+ 'type': 'Float'
+ },
+ 51008: {
+ 'name': 'OpcodeList1',
+ 'type': 'Undefined'
+ },
+ 51009: {
+ 'name': 'OpcodeList2',
+ 'type': 'Undefined'
+ },
+ 51022: {
+ 'name': 'OpcodeList3',
+ 'type': 'Undefined'
+ }
+ },
+ 'Exif': {
+ 33434: {
+ 'name': 'ExposureTime',
+ 'type': 'Rational'
+ },
+ 33437: {
+ 'name': 'FNumber',
+ 'type': 'Rational'
+ },
+ 34850: {
+ 'name': 'ExposureProgram',
+ 'type': 'Short'
+ },
+ 34852: {
+ 'name': 'SpectralSensitivity',
+ 'type': 'Ascii'
+ },
+ 34855: {
+ 'name': 'ISOSpeedRatings',
+ 'type': 'Short'
+ },
+ 34856: {
+ 'name': 'OECF',
+ 'type': 'Undefined'
+ },
+ 34864: {
+ 'name': 'SensitivityType',
+ 'type': 'Short'
+ },
+ 34865: {
+ 'name': 'StandardOutputSensitivity',
+ 'type': 'Long'
+ },
+ 34866: {
+ 'name': 'RecommendedExposureIndex',
+ 'type': 'Long'
+ },
+ 34867: {
+ 'name': 'ISOSpeed',
+ 'type': 'Long'
+ },
+ 34868: {
+ 'name': 'ISOSpeedLatitudeyyy',
+ 'type': 'Long'
+ },
+ 34869: {
+ 'name': 'ISOSpeedLatitudezzz',
+ 'type': 'Long'
+ },
+ 36864: {
+ 'name': 'ExifVersion',
+ 'type': 'Undefined'
+ },
+ 36867: {
+ 'name': 'DateTimeOriginal',
+ 'type': 'Ascii'
+ },
+ 36868: {
+ 'name': 'DateTimeDigitized',
+ 'type': 'Ascii'
+ },
+ 37121: {
+ 'name': 'ComponentsConfiguration',
+ 'type': 'Undefined'
+ },
+ 37122: {
+ 'name': 'CompressedBitsPerPixel',
+ 'type': 'Rational'
+ },
+ 37377: {
+ 'name': 'ShutterSpeedValue',
+ 'type': 'SRational'
+ },
+ 37378: {
+ 'name': 'ApertureValue',
+ 'type': 'Rational'
+ },
+ 37379: {
+ 'name': 'BrightnessValue',
+ 'type': 'SRational'
+ },
+ 37380: {
+ 'name': 'ExposureBiasValue',
+ 'type': 'SRational'
+ },
+ 37381: {
+ 'name': 'MaxApertureValue',
+ 'type': 'Rational'
+ },
+ 37382: {
+ 'name': 'SubjectDistance',
+ 'type': 'Rational'
+ },
+ 37383: {
+ 'name': 'MeteringMode',
+ 'type': 'Short'
+ },
+ 37384: {
+ 'name': 'LightSource',
+ 'type': 'Short'
+ },
+ 37385: {
+ 'name': 'Flash',
+ 'type': 'Short'
+ },
+ 37386: {
+ 'name': 'FocalLength',
+ 'type': 'Rational'
+ },
+ 37396: {
+ 'name': 'SubjectArea',
+ 'type': 'Short'
+ },
+ 37500: {
+ 'name': 'MakerNote',
+ 'type': 'Undefined'
+ },
+ 37510: {
+ 'name': 'UserComment',
+ 'type': 'Ascii'
+ },
+ 37520: {
+ 'name': 'SubSecTime',
+ 'type': 'Ascii'
+ },
+ 37521: {
+ 'name': 'SubSecTimeOriginal',
+ 'type': 'Ascii'
+ },
+ 37522: {
+ 'name': 'SubSecTimeDigitized',
+ 'type': 'Ascii'
+ },
+ 40960: {
+ 'name': 'FlashpixVersion',
+ 'type': 'Undefined'
+ },
+ 40961: {
+ 'name': 'ColorSpace',
+ 'type': 'Short'
+ },
+ 40962: {
+ 'name': 'PixelXDimension',
+ 'type': 'Long'
+ },
+ 40963: {
+ 'name': 'PixelYDimension',
+ 'type': 'Long'
+ },
+ 40964: {
+ 'name': 'RelatedSoundFile',
+ 'type': 'Ascii'
+ },
+ 40965: {
+ 'name': 'InteroperabilityTag',
+ 'type': 'Long'
+ },
+ 41483: {
+ 'name': 'FlashEnergy',
+ 'type': 'Rational'
+ },
+ 41484: {
+ 'name': 'SpatialFrequencyResponse',
+ 'type': 'Undefined'
+ },
+ 41486: {
+ 'name': 'FocalPlaneXResolution',
+ 'type': 'Rational'
+ },
+ 41487: {
+ 'name': 'FocalPlaneYResolution',
+ 'type': 'Rational'
+ },
+ 41488: {
+ 'name': 'FocalPlaneResolutionUnit',
+ 'type': 'Short'
+ },
+ 41492: {
+ 'name': 'SubjectLocation',
+ 'type': 'Short'
+ },
+ 41493: {
+ 'name': 'ExposureIndex',
+ 'type': 'Rational'
+ },
+ 41495: {
+ 'name': 'SensingMethod',
+ 'type': 'Short'
+ },
+ 41728: {
+ 'name': 'FileSource',
+ 'type': 'Undefined'
+ },
+ 41729: {
+ 'name': 'SceneType',
+ 'type': 'Undefined'
+ },
+ 41730: {
+ 'name': 'CFAPattern',
+ 'type': 'Undefined'
+ },
+ 41985: {
+ 'name': 'CustomRendered',
+ 'type': 'Short'
+ },
+ 41986: {
+ 'name': 'ExposureMode',
+ 'type': 'Short'
+ },
+ 41987: {
+ 'name': 'WhiteBalance',
+ 'type': 'Short'
+ },
+ 41988: {
+ 'name': 'DigitalZoomRatio',
+ 'type': 'Rational'
+ },
+ 41989: {
+ 'name': 'FocalLengthIn35mmFilm',
+ 'type': 'Short'
+ },
+ 41990: {
+ 'name': 'SceneCaptureType',
+ 'type': 'Short'
+ },
+ 41991: {
+ 'name': 'GainControl',
+ 'type': 'Short'
+ },
+ 41992: {
+ 'name': 'Contrast',
+ 'type': 'Short'
+ },
+ 41993: {
+ 'name': 'Saturation',
+ 'type': 'Short'
+ },
+ 41994: {
+ 'name': 'Sharpness',
+ 'type': 'Short'
+ },
+ 41995: {
+ 'name': 'DeviceSettingDescription',
+ 'type': 'Undefined'
+ },
+ 41996: {
+ 'name': 'SubjectDistanceRange',
+ 'type': 'Short'
+ },
+ 42016: {
+ 'name': 'ImageUniqueID',
+ 'type': 'Ascii'
+ },
+ 42032: {
+ 'name': 'CameraOwnerName',
+ 'type': 'Ascii'
+ },
+ 42033: {
+ 'name': 'BodySerialNumber',
+ 'type': 'Ascii'
+ },
+ 42034: {
+ 'name': 'LensSpecification',
+ 'type': 'Rational'
+ },
+ 42035: {
+ 'name': 'LensMake',
+ 'type': 'Ascii'
+ },
+ 42036: {
+ 'name': 'LensModel',
+ 'type': 'Ascii'
+ },
+ 42037: {
+ 'name': 'LensSerialNumber',
+ 'type': 'Ascii'
+ },
+ 42240: {
+ 'name': 'Gamma',
+ 'type': 'Rational'
+ }
+ },
+ 'GPS': {
+ 0: {
+ 'name': 'GPSVersionID',
+ 'type': 'Byte'
+ },
+ 1: {
+ 'name': 'GPSLatitudeRef',
+ 'type': 'Ascii'
+ },
+ 2: {
+ 'name': 'GPSLatitude',
+ 'type': 'Rational'
+ },
+ 3: {
+ 'name': 'GPSLongitudeRef',
+ 'type': 'Ascii'
+ },
+ 4: {
+ 'name': 'GPSLongitude',
+ 'type': 'Rational'
+ },
+ 5: {
+ 'name': 'GPSAltitudeRef',
+ 'type': 'Byte'
+ },
+ 6: {
+ 'name': 'GPSAltitude',
+ 'type': 'Rational'
+ },
+ 7: {
+ 'name': 'GPSTimeStamp',
+ 'type': 'Rational'
+ },
+ 8: {
+ 'name': 'GPSSatellites',
+ 'type': 'Ascii'
+ },
+ 9: {
+ 'name': 'GPSStatus',
+ 'type': 'Ascii'
+ },
+ 10: {
+ 'name': 'GPSMeasureMode',
+ 'type': 'Ascii'
+ },
+ 11: {
+ 'name': 'GPSDOP',
+ 'type': 'Rational'
+ },
+ 12: {
+ 'name': 'GPSSpeedRef',
+ 'type': 'Ascii'
+ },
+ 13: {
+ 'name': 'GPSSpeed',
+ 'type': 'Rational'
+ },
+ 14: {
+ 'name': 'GPSTrackRef',
+ 'type': 'Ascii'
+ },
+ 15: {
+ 'name': 'GPSTrack',
+ 'type': 'Rational'
+ },
+ 16: {
+ 'name': 'GPSImgDirectionRef',
+ 'type': 'Ascii'
+ },
+ 17: {
+ 'name': 'GPSImgDirection',
+ 'type': 'Rational'
+ },
+ 18: {
+ 'name': 'GPSMapDatum',
+ 'type': 'Ascii'
+ },
+ 19: {
+ 'name': 'GPSDestLatitudeRef',
+ 'type': 'Ascii'
+ },
+ 20: {
+ 'name': 'GPSDestLatitude',
+ 'type': 'Rational'
+ },
+ 21: {
+ 'name': 'GPSDestLongitudeRef',
+ 'type': 'Ascii'
+ },
+ 22: {
+ 'name': 'GPSDestLongitude',
+ 'type': 'Rational'
+ },
+ 23: {
+ 'name': 'GPSDestBearingRef',
+ 'type': 'Ascii'
+ },
+ 24: {
+ 'name': 'GPSDestBearing',
+ 'type': 'Rational'
+ },
+ 25: {
+ 'name': 'GPSDestDistanceRef',
+ 'type': 'Ascii'
+ },
+ 26: {
+ 'name': 'GPSDestDistance',
+ 'type': 'Rational'
+ },
+ 27: {
+ 'name': 'GPSProcessingMethod',
+ 'type': 'Undefined'
+ },
+ 28: {
+ 'name': 'GPSAreaInformation',
+ 'type': 'Undefined'
+ },
+ 29: {
+ 'name': 'GPSDateStamp',
+ 'type': 'Ascii'
+ },
+ 30: {
+ 'name': 'GPSDifferential',
+ 'type': 'Short'
+ },
+ 31: {
+ 'name': 'GPSHPositioningError',
+ 'type': 'Rational'
+ }
+ },
+ 'Interop': {
+ 1: {
+ 'name': 'InteroperabilityIndex',
+ 'type': 'Ascii'
+ }
+ },
+};
+const TYPES = {
+ "Byte": 1,
+ "Ascii": 2,
+ "Short": 3,
+ "Long": 4,
+ "Rational": 5,
+ "Undefined": 7,
+ "SLong": 9,
+ "SRational": 10
+};
+TAGS["0th"] = TAGS["Image"];
+TAGS["1st"] = TAGS["Image"];
+class Piexif {
+ version = "1.0.4"
+ TAGS = TAGS
+ ImageIFD = {
+ ProcessingSoftware: 11,
+ NewSubfileType: 254,
+ SubfileType: 255,
+ ImageWidth: 256,
+ ImageLength: 257,
+ BitsPerSample: 258,
+ Compression: 259,
+ PhotometricInterpretation: 262,
+ Threshholding: 263,
+ CellWidth: 264,
+ CellLength: 265,
+ FillOrder: 266,
+ DocumentName: 269,
+ ImageDescription: 270,
+ Make: 271,
+ Model: 272,
+ StripOffsets: 273,
+ Orientation: 274,
+ SamplesPerPixel: 277,
+ RowsPerStrip: 278,
+ StripByteCounts: 279,
+ XResolution: 282,
+ YResolution: 283,
+ PlanarConfiguration: 284,
+ GrayResponseUnit: 290,
+ GrayResponseCurve: 291,
+ T4Options: 292,
+ T6Options: 293,
+ ResolutionUnit: 296,
+ TransferFunction: 301,
+ Software: 305,
+ DateTime: 306,
+ Artist: 315,
+ HostComputer: 316,
+ Predictor: 317,
+ WhitePoint: 318,
+ PrimaryChromaticities: 319,
+ ColorMap: 320,
+ HalftoneHints: 321,
+ TileWidth: 322,
+ TileLength: 323,
+ TileOffsets: 324,
+ TileByteCounts: 325,
+ SubIFDs: 330,
+ InkSet: 332,
+ InkNames: 333,
+ NumberOfInks: 334,
+ DotRange: 336,
+ TargetPrinter: 337,
+ ExtraSamples: 338,
+ SampleFormat: 339,
+ SMinSampleValue: 340,
+ SMaxSampleValue: 341,
+ TransferRange: 342,
+ ClipPath: 343,
+ XClipPathUnits: 344,
+ YClipPathUnits: 345,
+ Indexed: 346,
+ JPEGTables: 347,
+ OPIProxy: 351,
+ JPEGProc: 512,
+ JPEGInterchangeFormat: 513,
+ JPEGInterchangeFormatLength: 514,
+ JPEGRestartInterval: 515,
+ JPEGLosslessPredictors: 517,
+ JPEGPointTransforms: 518,
+ JPEGQTables: 519,
+ JPEGDCTables: 520,
+ JPEGACTables: 521,
+ YCbCrCoefficients: 529,
+ YCbCrSubSampling: 530,
+ YCbCrPositioning: 531,
+ ReferenceBlackWhite: 532,
+ XMLPacket: 700,
+ Rating: 18246,
+ RatingPercent: 18249,
+ ImageID: 32781,
+ CFARepeatPatternDim: 33421,
+ CFAPattern: 33422,
+ BatteryLevel: 33423,
+ Copyright: 33432,
+ ExposureTime: 33434,
+ ImageResources: 34377,
+ ExifTag: 34665,
+ InterColorProfile: 34675,
+ GPSTag: 34853,
+ Interlace: 34857,
+ TimeZoneOffset: 34858,
+ SelfTimerMode: 34859,
+ FlashEnergy: 37387,
+ SpatialFrequencyResponse: 37388,
+ Noise: 37389,
+ FocalPlaneXResolution: 37390,
+ FocalPlaneYResolution: 37391,
+ FocalPlaneResolutionUnit: 37392,
+ ImageNumber: 37393,
+ SecurityClassification: 37394,
+ ImageHistory: 37395,
+ ExposureIndex: 37397,
+ TIFFEPStandardID: 37398,
+ SensingMethod: 37399,
+ XPTitle: 40091,
+ XPComment: 40092,
+ XPAuthor: 40093,
+ XPKeywords: 40094,
+ XPSubject: 40095,
+ PrintImageMatching: 50341,
+ DNGVersion: 50706,
+ DNGBackwardVersion: 50707,
+ UniqueCameraModel: 50708,
+ LocalizedCameraModel: 50709,
+ CFAPlaneColor: 50710,
+ CFALayout: 50711,
+ LinearizationTable: 50712,
+ BlackLevelRepeatDim: 50713,
+ BlackLevel: 50714,
+ BlackLevelDeltaH: 50715,
+ BlackLevelDeltaV: 50716,
+ WhiteLevel: 50717,
+ DefaultScale: 50718,
+ DefaultCropOrigin: 50719,
+ DefaultCropSize: 50720,
+ ColorMatrix1: 50721,
+ ColorMatrix2: 50722,
+ CameraCalibration1: 50723,
+ CameraCalibration2: 50724,
+ ReductionMatrix1: 50725,
+ ReductionMatrix2: 50726,
+ AnalogBalance: 50727,
+ AsShotNeutral: 50728,
+ AsShotWhiteXY: 50729,
+ BaselineExposure: 50730,
+ BaselineNoise: 50731,
+ BaselineSharpness: 50732,
+ BayerGreenSplit: 50733,
+ LinearResponseLimit: 50734,
+ CameraSerialNumber: 50735,
+ LensInfo: 50736,
+ ChromaBlurRadius: 50737,
+ AntiAliasStrength: 50738,
+ ShadowScale: 50739,
+ DNGPrivateData: 50740,
+ MakerNoteSafety: 50741,
+ CalibrationIlluminant1: 50778,
+ CalibrationIlluminant2: 50779,
+ BestQualityScale: 50780,
+ RawDataUniqueID: 50781,
+ OriginalRawFileName: 50827,
+ OriginalRawFileData: 50828,
+ ActiveArea: 50829,
+ MaskedAreas: 50830,
+ AsShotICCProfile: 50831,
+ AsShotPreProfileMatrix: 50832,
+ CurrentICCProfile: 50833,
+ CurrentPreProfileMatrix: 50834,
+ ColorimetricReference: 50879,
+ CameraCalibrationSignature: 50931,
+ ProfileCalibrationSignature: 50932,
+ AsShotProfileName: 50934,
+ NoiseReductionApplied: 50935,
+ ProfileName: 50936,
+ ProfileHueSatMapDims: 50937,
+ ProfileHueSatMapData1: 50938,
+ ProfileHueSatMapData2: 50939,
+ ProfileToneCurve: 50940,
+ ProfileEmbedPolicy: 50941,
+ ProfileCopyright: 50942,
+ ForwardMatrix1: 50964,
+ ForwardMatrix2: 50965,
+ PreviewApplicationName: 50966,
+ PreviewApplicationVersion: 50967,
+ PreviewSettingsName: 50968,
+ PreviewSettingsDigest: 50969,
+ PreviewColorSpace: 50970,
+ PreviewDateTime: 50971,
+ RawImageDigest: 50972,
+ OriginalRawFileDigest: 50973,
+ SubTileBlockSize: 50974,
+ RowInterleaveFactor: 50975,
+ ProfileLookTableDims: 50981,
+ ProfileLookTableData: 50982,
+ OpcodeList1: 51008,
+ OpcodeList2: 51009,
+ OpcodeList3: 51022,
+ NoiseProfile: 51041,
+ }
+ ExifIFD = {
+ ExposureTime: 33434,
+ FNumber: 33437,
+ ExposureProgram: 34850,
+ SpectralSensitivity: 34852,
+ ISOSpeedRatings: 34855,
+ OECF: 34856,
+ SensitivityType: 34864,
+ StandardOutputSensitivity: 34865,
+ RecommendedExposureIndex: 34866,
+ ISOSpeed: 34867,
+ ISOSpeedLatitudeyyy: 34868,
+ ISOSpeedLatitudezzz: 34869,
+ ExifVersion: 36864,
+ DateTimeOriginal: 36867,
+ DateTimeDigitized: 36868,
+ ComponentsConfiguration: 37121,
+ CompressedBitsPerPixel: 37122,
+ ShutterSpeedValue: 37377,
+ ApertureValue: 37378,
+ BrightnessValue: 37379,
+ ExposureBiasValue: 37380,
+ MaxApertureValue: 37381,
+ SubjectDistance: 37382,
+ MeteringMode: 37383,
+ LightSource: 37384,
+ Flash: 37385,
+ FocalLength: 37386,
+ SubjectArea: 37396,
+ MakerNote: 37500,
+ UserComment: 37510,
+ SubSecTime: 37520,
+ SubSecTimeOriginal: 37521,
+ SubSecTimeDigitized: 37522,
+ FlashpixVersion: 40960,
+ ColorSpace: 40961,
+ PixelXDimension: 40962,
+ PixelYDimension: 40963,
+ RelatedSoundFile: 40964,
+ InteroperabilityTag: 40965,
+ FlashEnergy: 41483,
+ SpatialFrequencyResponse: 41484,
+ FocalPlaneXResolution: 41486,
+ FocalPlaneYResolution: 41487,
+ FocalPlaneResolutionUnit: 41488,
+ SubjectLocation: 41492,
+ ExposureIndex: 41493,
+ SensingMethod: 41495,
+ FileSource: 41728,
+ SceneType: 41729,
+ CFAPattern: 41730,
+ CustomRendered: 41985,
+ ExposureMode: 41986,
+ WhiteBalance: 41987,
+ DigitalZoomRatio: 41988,
+ FocalLengthIn35mmFilm: 41989,
+ SceneCaptureType: 41990,
+ GainControl: 41991,
+ Contrast: 41992,
+ Saturation: 41993,
+ Sharpness: 41994,
+ DeviceSettingDescription: 41995,
+ SubjectDistanceRange: 41996,
+ ImageUniqueID: 42016,
+ CameraOwnerName: 42032,
+ BodySerialNumber: 42033,
+ LensSpecification: 42034,
+ LensMake: 42035,
+ LensModel: 42036,
+ LensSerialNumber: 42037,
+ Gamma: 42240,
+ }
+ GPSIFD = {
+ GPSVersionID: 0,
+ GPSLatitudeRef: 1,
+ GPSLatitude: 2,
+ GPSLongitudeRef: 3,
+ GPSLongitude: 4,
+ GPSAltitudeRef: 5,
+ GPSAltitude: 6,
+ GPSTimeStamp: 7,
+ GPSSatellites: 8,
+ GPSStatus: 9,
+ GPSMeasureMode: 10,
+ GPSDOP: 11,
+ GPSSpeedRef: 12,
+ GPSSpeed: 13,
+ GPSTrackRef: 14,
+ GPSTrack: 15,
+ GPSImgDirectionRef: 16,
+ GPSImgDirection: 17,
+ GPSMapDatum: 18,
+ GPSDestLatitudeRef: 19,
+ GPSDestLatitude: 20,
+ GPSDestLongitudeRef: 21,
+ GPSDestLongitude: 22,
+ GPSDestBearingRef: 23,
+ GPSDestBearing: 24,
+ GPSDestDistanceRef: 25,
+ GPSDestDistance: 26,
+ GPSProcessingMethod: 27,
+ GPSAreaInformation: 28,
+ GPSDateStamp: 29,
+ GPSDifferential: 30,
+ GPSHPositioningError: 31,
+ }
+ InteropIFD = {
+ InteroperabilityIndex: 1,
+ }
+ GPSHelper = {
+ degToDmsRational(degFloat : number) {
+ const degAbs = Math.abs(degFloat);
+ const minFloat = degAbs % 1 * 60;
+ const secFloat = minFloat % 1 * 60;
+ const deg = Math.floor(degAbs);
+ const min = Math.floor(minFloat);
+ const sec = Math.round(secFloat * 100);
+
+ return [
+ [deg, 1],
+ [min, 1],
+ [sec, 100]
+ ];
+ },
+ dmsRationalToDeg(dmsArray : number[][], ref : string) {
+ const sign = (ref === 'S' || ref === 'W') ? -1.0 : 1.0;
+ const deg = dmsArray[0][0] / dmsArray[0][1] +
+ dmsArray[1][0] / dmsArray[1][1] / 60.0 +
+ dmsArray[2][0] / dmsArray[2][1] / 3600.0;
+
+ return deg * sign;
+ },
+ }
+ remove(jpeg) {
+ let b64 = false;
+ if (jpeg.slice(0, 2) == "\xff\xd8") { } else if (jpeg.slice(0, 23) == "data:image/jpeg;base64," || jpeg
+ .slice(0, 22) == "data:image/jpg;base64,") {
+ jpeg = atob(jpeg.split(",")[1]);
+ b64 = true;
+ } else {
+ throw new Error("Given data is not jpeg.");
+ }
+
+ const segments = splitIntoSegments(jpeg);
+ const newSegments = segments.filter(function (seg) {
+ return !(seg.slice(0, 2) == "\xff\xe1" &&
+ seg.slice(4, 10) == "Exif\x00\x00");
+ });
+
+ let new_data = newSegments.join("");
+ if (b64) {
+ new_data = "data:image/jpeg;base64," + btoa(new_data);
+ }
+
+ return new_data;
+ }
+ insert(exif, jpeg) {
+ let b64 = false;
+ if (exif.slice(0, 6) != "\x45\x78\x69\x66\x00\x00") {
+ throw new Error("Given data is not exif.");
+ }
+ if (jpeg.slice(0, 2) == "\xff\xd8") { } else if (jpeg.slice(0, 23) == "data:image/jpeg;base64," || jpeg
+ .slice(0, 22) == "data:image/jpg;base64,") {
+ jpeg = atob(jpeg.split(",")[1]);
+ b64 = true;
+ } else {
+ throw new Error("Given data is not jpeg.");
+ }
+
+ const exifStr = "\xff\xe1" + pack(">H", [exif.length + 2]) + exif;
+ const segments = splitIntoSegments(jpeg);
+ let new_data = mergeSegments(segments, exifStr);
+ if (b64) {
+ new_data = "data:image/jpeg;base64," + btoa(new_data);
+ }
+
+ return new_data;
+ }
+ load(data) {
+ let input_data;
+ if (isString(data)) {
+ if (data.slice(0, 2) == "\xff\xd8") {
+ input_data = data;
+ } else if (data.slice(0, 23) == "data:image/jpeg;base64," || data.slice(0, 22) == "data:image/jpg;base64,") {
+ input_data = atob(data.split(",")[1]);
+ } else if (data.slice(0, 4) == "Exif") {
+ input_data = data.slice(6);
+ } else {
+ throw new Error("'load' gots invalid file data.");
+ }
+ } else {
+ throw new Error("'load' gots invalid type argument.");
+ }
+
+ let exifDict = {};
+ let exif_dict = {
+ "0th": {},
+ "Exif": {},
+ "GPS": {},
+ "Interop": {},
+ "1st": {},
+ "thumbnail": null
+ };
+ const exifReader = new ExifReader(input_data);
+ if (exifReader.tiftag === null) {
+ return exif_dict;
+ }
+
+ if (exifReader.tiftag.slice(0, 2) == "\x49\x49") {
+ exifReader.endian_mark = "<";
+ } else {
+ exifReader.endian_mark = ">";
+ }
+
+ let pointer = unpack(exifReader.endian_mark + "L",
+ exifReader.tiftag.slice(4, 8))[0];
+ exif_dict["0th"] = exifReader.get_ifd(pointer, "0th");
+
+ const first_ifd_pointer = exif_dict["0th"]["first_ifd_pointer"];
+ delete exif_dict["0th"]["first_ifd_pointer"];
+
+ if (34665 in exif_dict["0th"]) {
+ pointer = exif_dict["0th"][34665];
+ exif_dict["Exif"] = exifReader.get_ifd(pointer, "Exif");
+ }
+ if (34853 in exif_dict["0th"]) {
+ pointer = exif_dict["0th"][34853];
+ exif_dict["GPS"] = exifReader.get_ifd(pointer, "GPS");
+ }
+ if (40965 in exif_dict["Exif"]) {
+ pointer = exif_dict["Exif"][40965];
+ exif_dict["Interop"] = exifReader.get_ifd(pointer, "Interop");
+ }
+ if (first_ifd_pointer != "\x00\x00\x00\x00") {
+ pointer = unpack(exifReader.endian_mark + "L",
+ first_ifd_pointer)[0];
+ exif_dict["1st"] = exifReader.get_ifd(pointer, "1st");
+ if ((513 in exif_dict["1st"]) && (514 in exif_dict["1st"])) {
+ var end = exif_dict["1st"][513] + exif_dict["1st"][514];
+ var thumb = exifReader.tiftag.slice(exif_dict["1st"][513], end);
+ exif_dict["thumbnail"] = thumb;
+ }
+ }
+
+ return exif_dict;
+ }
+ dump(exif_dict_original) {
+ const TIFF_HEADER_LENGTH = 8;
+
+ const exif_dict : any = cloneDeep(exif_dict_original);
+ const header = "Exif\x00\x00\x4d\x4d\x00\x2a\x00\x00\x00\x08";
+ let exif_is = 0//false;
+ let gps_is = 0 //false;
+ let interop_is = 0//false;
+ let first_is = false;
+
+ let zeroth_ifd,
+ exif_ifd,
+ interop_ifd,
+ gps_ifd,
+ first_ifd;
+
+ if ("0th" in exif_dict) {
+ zeroth_ifd = exif_dict["0th"];
+ } else {
+ zeroth_ifd = {};
+ }
+
+ if ((("Exif" in exif_dict) && (Object.keys(exif_dict["Exif"]).length)) ||
+ (("Interop" in exif_dict) && (Object.keys(exif_dict["Interop"]).length))) {
+ zeroth_ifd[34665] = 1;
+ exif_is = 1//true;
+ exif_ifd = exif_dict["Exif"];
+ if (("Interop" in exif_dict) && Object.keys(exif_dict["Interop"]).length) {
+ exif_ifd[40965] = 1;
+ interop_is = 1//true;
+ interop_ifd = exif_dict["Interop"];
+ } else if (Object.keys(exif_ifd).indexOf(this.ExifIFD.InteroperabilityTag.toString()) > -1) {
+ delete exif_ifd[40965];
+ }
+ } else if (Object.keys(zeroth_ifd).indexOf(this.ImageIFD.ExifTag.toString()) > -1) {
+ delete zeroth_ifd[34665];
+ }
+
+ if (("GPS" in exif_dict) && (Object.keys(exif_dict["GPS"]).length)) {
+ zeroth_ifd[this.ImageIFD.GPSTag] = 1;
+ gps_is = 1 //true;
+ gps_ifd = exif_dict["GPS"];
+ } else if (Object.keys(zeroth_ifd).indexOf(this.ImageIFD.GPSTag.toString()) > -1) {
+ delete zeroth_ifd[this.ImageIFD.GPSTag];
+ }
+
+ if (("1st" in exif_dict) &&
+ ("thumbnail" in exif_dict) &&
+ (exif_dict["thumbnail"] != null)) {
+ first_is = true;
+ exif_dict["1st"][513] = 1;
+ exif_dict["1st"][514] = 1;
+ first_ifd = exif_dict["1st"];
+ }
+
+ const zeroth_set = _dict_to_bytes(zeroth_ifd, "0th", 0);
+ const zeroth_length = (zeroth_set[0].length + exif_is * 12 + gps_is * 12 + 4 +
+ zeroth_set[1].length);
+
+ let exif_set,
+ exif_bytes = "",
+ exif_length = 0,
+ gps_set,
+ gps_bytes = "",
+ gps_length = 0,
+ interop_set,
+ interop_bytes = "",
+ interop_length = 0,
+ first_set,
+ first_bytes = "",
+ thumbnail;
+ if (exif_is) {
+ exif_set = _dict_to_bytes(exif_ifd, "Exif", zeroth_length);
+ exif_length = exif_set[0].length + interop_is * 12 + exif_set[1].length;
+ }
+ if (gps_is) {
+ gps_set = _dict_to_bytes(gps_ifd, "GPS", zeroth_length + exif_length);
+ gps_bytes = gps_set.join("");
+ gps_length = gps_bytes.length;
+ }
+ if (interop_is) {
+ const offset = zeroth_length + exif_length + gps_length;
+ interop_set = _dict_to_bytes(interop_ifd, "Interop", offset);
+ interop_bytes = interop_set.join("");
+ interop_length = interop_bytes.length;
+ }
+ if (first_is) {
+ const offset = zeroth_length + exif_length + gps_length + interop_length;
+ first_set = _dict_to_bytes(first_ifd, "1st", offset);
+ thumbnail = _get_thumbnail(exif_dict["thumbnail"]);
+ if (thumbnail.length > 64000) {
+ throw new Error("Given thumbnail is too large. max 64kB");
+ }
+ }
+
+ let exif_pointer = "",
+ gps_pointer = "",
+ interop_pointer = "",
+ first_ifd_pointer = "\x00\x00\x00\x00";
+ if (exif_is) {
+ const pointer_value = TIFF_HEADER_LENGTH + zeroth_length;
+ const pointer_str = pack(">L", [pointer_value]);
+ const key = 34665;
+ const key_str = pack(">H", [key]);
+ const type_str = pack(">H", [TYPES["Long"]]);
+ const length_str = pack(">L", [1]);
+ exif_pointer = key_str + type_str + length_str + pointer_str;
+ }
+ if (gps_is) {
+ const pointer_value = TIFF_HEADER_LENGTH + zeroth_length + exif_length;
+ const pointer_str = pack(">L", [pointer_value]);
+ const key = 34853;
+ const key_str = pack(">H", [key]);
+ const type_str = pack(">H", [TYPES["Long"]]);
+ const length_str = pack(">L", [1]);
+ gps_pointer = key_str + type_str + length_str + pointer_str;
+ }
+ if (interop_is) {
+ const pointer_value = (TIFF_HEADER_LENGTH +
+ zeroth_length + exif_length + gps_length);
+ const pointer_str = pack(">L", [pointer_value]);
+ const key = 40965;
+ const key_str = pack(">H", [key]);
+ const type_str = pack(">H", [TYPES["Long"]]);
+ const length_str = pack(">L", [1]);
+ interop_pointer = key_str + type_str + length_str + pointer_str;
+ }
+ if (first_is) {
+ const pointer_value = (TIFF_HEADER_LENGTH + zeroth_length +
+ exif_length + gps_length + interop_length);
+ first_ifd_pointer = pack(">L", [pointer_value]);
+ const thumbnail_pointer = (pointer_value + first_set[0].length + 24 +
+ 4 + first_set[1].length);
+ const thumbnail_p_bytes = ("\x02\x01\x00\x04\x00\x00\x00\x01" +
+ pack(">L", [thumbnail_pointer]));
+ const thumbnail_length_bytes = ("\x02\x02\x00\x04\x00\x00\x00\x01" +
+ pack(">L", [thumbnail.length]));
+ first_bytes = (first_set[0] + thumbnail_p_bytes +
+ thumbnail_length_bytes + "\x00\x00\x00\x00" +
+ first_set[1] + thumbnail);
+ }
+
+ const zeroth_bytes = (zeroth_set[0] + exif_pointer + gps_pointer +
+ first_ifd_pointer + zeroth_set[1]);
+ if (exif_is) {
+ exif_bytes = exif_set[0] + interop_pointer + exif_set[1];
+ }
+
+ return (header + zeroth_bytes + exif_bytes + gps_bytes +
+ interop_bytes + first_bytes);
+ }
+}
+
+
+
+function _get_thumbnail(jpeg) {
+ let segments = splitIntoSegments(jpeg);
+ while (("\xff\xe0" <= segments[1].slice(0, 2)) && (segments[1].slice(0, 2) <= "\xff\xef")) {
+ segments = [segments[0]].concat(segments.slice(2));
+ }
+ return segments.join("");
+}
+function _pack_byte(array) {
+ return pack(">" + nStr("B", array.length), array);
+}
+
+function _pack_short(array) {
+ return pack(">" + nStr("H", array.length), array);
+}
+
+function _pack_long(array) {
+ return pack(">" + nStr("L", array.length), array);
+}
+
+function _value_to_bytes(raw_value, value_type, offset) {
+ let four_bytes_over = "";
+ let value_str = "";
+ let length,
+ new_value,
+ num,
+ den;
+
+ if (value_type == "Byte") {
+ length = raw_value.length;
+ if (length <= 4) {
+ value_str = (_pack_byte(raw_value) +
+ nStr("\x00", 4 - length));
+ } else {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = _pack_byte(raw_value);
+ }
+ } else if (value_type == "Short") {
+ length = raw_value.length;
+ if (length <= 2) {
+ value_str = (_pack_short(raw_value) +
+ nStr("\x00\x00", 2 - length));
+ } else {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = _pack_short(raw_value);
+ }
+ } else if (value_type == "Long") {
+ length = raw_value.length;
+ if (length <= 1) {
+ value_str = _pack_long(raw_value);
+ } else {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = _pack_long(raw_value);
+ }
+ } else if (value_type == "Ascii") {
+ new_value = raw_value + "\x00";
+ length = new_value.length;
+ if (length > 4) {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = new_value;
+ } else {
+ value_str = new_value + nStr("\x00", 4 - length);
+ }
+ } else if (value_type == "Rational") {
+ if (typeof (raw_value[0]) == "number") {
+ length = 1;
+ num = raw_value[0];
+ den = raw_value[1];
+ new_value = pack(">L", [num]) + pack(">L", [den]);
+ } else {
+ length = raw_value.length;
+ new_value = "";
+ for (var n = 0; n < length; n++) {
+ num = raw_value[n][0];
+ den = raw_value[n][1];
+ new_value += (pack(">L", [num]) +
+ pack(">L", [den]));
+ }
+ }
+ value_str = pack(">L", [offset]);
+ four_bytes_over = new_value;
+ } else if (value_type == "SRational") {
+ if (typeof (raw_value[0]) == "number") {
+ length = 1;
+ num = raw_value[0];
+ den = raw_value[1];
+ new_value = pack(">l", [num]) + pack(">l", [den]);
+ } else {
+ length = raw_value.length;
+ new_value = "";
+ for (var n = 0; n < length; n++) {
+ num = raw_value[n][0];
+ den = raw_value[n][1];
+ new_value += (pack(">l", [num]) +
+ pack(">l", [den]));
+ }
+ }
+ value_str = pack(">L", [offset]);
+ four_bytes_over = new_value;
+ } else if (value_type == "Undefined") {
+ length = raw_value.length;
+ if (length > 4) {
+ value_str = pack(">L", [offset]);
+ four_bytes_over = raw_value;
+ } else {
+ value_str = raw_value + nStr("\x00", 4 - length);
+ }
+ }
+
+ var length_str = pack(">L", [length]);
+
+ return [length_str, value_str, four_bytes_over];
+}
+
+function _dict_to_bytes(ifd_dict, ifd, ifd_offset) {
+ const TIFF_HEADER_LENGTH = 8;
+ const tag_count = Object.keys(ifd_dict).length;
+ const entry_header = pack(">H", [tag_count]);
+ let entries_length;
+ if (["0th", "1st"].indexOf(ifd) > -1) {
+ entries_length = 2 + tag_count * 12 + 4;
+ } else {
+ entries_length = 2 + tag_count * 12;
+ }
+ let entries = "";
+ let values = "";
+ let key;
+
+ for (key in ifd_dict) {
+ if (typeof (key) == "string") {
+ key = parseInt(key);
+ }
+ if ((ifd == "0th") && ([34665, 34853].indexOf(key) > -1)) {
+ continue;
+ } else if ((ifd == "Exif") && (key == 40965)) {
+ continue;
+ } else if ((ifd == "1st") && ([513, 514].indexOf(key) > -1)) {
+ continue;
+ }
+
+ var raw_value = ifd_dict[key];
+ var key_str = pack(">H", [key]);
+ var value_type = TAGS[ifd][key]["type"];
+ var type_str = pack(">H", [TYPES[value_type]]);
+
+ if (typeof (raw_value) == "number") {
+ raw_value = [raw_value];
+ }
+ var offset = TIFF_HEADER_LENGTH + entries_length + ifd_offset + values.length;
+ var b = _value_to_bytes(raw_value, value_type, offset);
+ var length_str = b[0];
+ var value_str = b[1];
+ var four_bytes_over = b[2];
+
+ entries += key_str + type_str + length_str + value_str;
+ values += four_bytes_over;
+ }
+
+ return [entry_header + entries, values];
+}
+
+
+
+class ExifReader {
+ tiftag = null
+ endian_mark = ''
+ constructor(data) {
+ let segments,
+ app1;
+ if (data.slice(0, 2) == "\xff\xd8") { // JPEG
+ segments = splitIntoSegments(data);
+ app1 = getExifSeg(segments);
+ if (app1) {
+ this.tiftag = app1.slice(10);
+ }
+ } else if (["\x49\x49", "\x4d\x4d"].indexOf(data.slice(0, 2)) > -1) { // TIFF
+ this.tiftag = data;
+ } else if (data.slice(0, 4) == "Exif") { // Exif
+ this.tiftag = data.slice(6);
+ } else {
+ throw new Error("Given file is neither JPEG nor TIFF.");
+ }
+ }
+ get_ifd(pointer, ifd_name) {
+ let ifd_dict = {};
+ let tag_count = unpack(this.endian_mark + "H",
+ this.tiftag.slice(pointer, pointer + 2))[0];
+ const offset = pointer + 2;
+ let t;
+ if (["0th", "1st"].indexOf(ifd_name) > -1) {
+ t = "Image";
+ } else {
+ t = ifd_name;
+ }
+
+ for (let x = 0; x < tag_count; x++) {
+ pointer = offset + 12 * x;
+ const tag = unpack(this.endian_mark + "H",
+ this.tiftag.slice(pointer, pointer + 2))[0];
+ const value_type = unpack(this.endian_mark + "H",
+ this.tiftag.slice(pointer + 2, pointer + 4))[0];
+ const value_num = unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer + 4, pointer + 8))[0];
+ const value = this.tiftag.slice(pointer + 8, pointer + 12);
+
+ const v_set = [value_type, value_num, value];
+ if (tag in TAGS[t]) {
+ ifd_dict[tag] = this.convert_value(v_set);
+ }
+ }
+
+ if (ifd_name == "0th") {
+ pointer = offset + 12 * tag_count;
+ ifd_dict["first_ifd_pointer"] = this.tiftag.slice(pointer, pointer + 4);
+ }
+
+ return ifd_dict;
+ }
+
+ convert_value(val) {
+ let data = null;
+ const t = val[0];
+ const length = val[1];
+ const value = val[2];
+ let pointer;
+
+ if (t == 1) { // BYTE
+ if (length > 4) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = unpack(this.endian_mark + nStr("B", length),
+ this.tiftag.slice(pointer, pointer + length));
+ } else {
+ data = unpack(this.endian_mark + nStr("B", length), value.slice(0, length));
+ }
+ } else if (t == 2) { // ASCII
+ if (length > 4) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = this.tiftag.slice(pointer, pointer + length - 1);
+ } else {
+ data = value.slice(0, length - 1);
+ }
+ } else if (t == 3) { // SHORT
+ if (length > 2) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = unpack(this.endian_mark + nStr("H", length),
+ this.tiftag.slice(pointer, pointer + length * 2));
+ } else {
+ data = unpack(this.endian_mark + nStr("H", length),
+ value.slice(0, length * 2));
+ }
+ } else if (t == 4) { // LONG
+ if (length > 1) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = unpack(this.endian_mark + nStr("L", length),
+ this.tiftag.slice(pointer, pointer + length * 4));
+ } else {
+ data = unpack(this.endian_mark + nStr("L", length),
+ value);
+ }
+ } else if (t == 5) { // RATIONAL
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ if (length > 1) {
+ data = [];
+ for (let x = 0; x < length; x++) {
+ data.push([unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer + x * 8, pointer + 4 + x * 8))[0],
+ unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer + 4 + x * 8, pointer + 8 + x * 8))[0]
+ ]);
+ }
+ } else {
+ data = [unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer, pointer + 4))[0],
+ unpack(this.endian_mark + "L",
+ this.tiftag.slice(pointer + 4, pointer + 8))[0]
+ ];
+ }
+ } else if (t == 7) { // UNDEFINED BYTES
+ if (length > 4) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = this.tiftag.slice(pointer, pointer + length);
+ } else {
+ data = value.slice(0, length);
+ }
+ } else if (t == 9) { // SLONG
+ if (length > 1) {
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ data = unpack(this.endian_mark + nStr("l", length),
+ this.tiftag.slice(pointer, pointer + length * 4));
+ } else {
+ data = unpack(this.endian_mark + nStr("l", length),
+ value);
+ }
+ } else if (t == 10) { // SRATIONAL
+ pointer = unpack(this.endian_mark + "L", value)[0];
+ if (length > 1) {
+ data = [];
+ for (let x = 0; x < length; x++) {
+ data.push([unpack(this.endian_mark + "l",
+ this.tiftag.slice(pointer + x * 8, pointer + 4 + x * 8))[0],
+ unpack(this.endian_mark + "l",
+ this.tiftag.slice(pointer + 4 + x * 8, pointer + 8 + x * 8))[0]
+ ]);
+ }
+ } else {
+ data = [unpack(this.endian_mark + "l",
+ this.tiftag.slice(pointer, pointer + 4))[0],
+ unpack(this.endian_mark + "l",
+ this.tiftag.slice(pointer + 4, pointer + 8))[0]
+ ];
+ }
+ } else {
+ throw new Error("Exif might be wrong. Got incorrect value " +
+ "type to decode. type:" + t);
+ }
+
+ if ((data instanceof Array) && (data.length == 1)) {
+ return data[0];
+ } else {
+ return data;
+ }
+ }
+
+}
+
+
+function pack(mark, array) {
+ if (!(array instanceof Array)) {
+ throw new Error("'pack' error. Got invalid type argument.");
+ }
+ if ((mark.length - 1) != array.length) {
+ throw new Error("'pack' error. " + (mark.length - 1) + " marks, " + array.length + " elements.");
+ }
+
+ let littleEndian;
+ if (mark[0] == "<") {
+ littleEndian = true;
+ } else if (mark[0] == ">") {
+ littleEndian = false;
+ } else {
+ throw new Error("");
+ }
+ let packed = "";
+ let p = 1;
+ let val = null;
+ let c = null;
+ let valStr = null;
+
+ while (c = mark[p]) {
+ if (c.toLowerCase() == "b") {
+ val = array[p - 1];
+ if ((c == "b") && (val < 0)) {
+ val += 0x100;
+ }
+ if ((val > 0xff) || (val < 0)) {
+ throw new Error("'pack' error.");
+ } else {
+ valStr = String.fromCharCode(val);
+ }
+ } else if (c == "H") {
+ val = array[p - 1];
+ if ((val > 0xffff) || (val < 0)) {
+ throw new Error("'pack' error.");
+ } else {
+ valStr = String.fromCharCode(Math.floor((val % 0x10000) / 0x100)) +
+ String.fromCharCode(val % 0x100);
+ if (littleEndian) {
+ valStr = valStr.split("").reverse().join("");
+ }
+ }
+ } else if (c.toLowerCase() == "l") {
+ val = array[p - 1];
+ if ((c == "l") && (val < 0)) {
+ val += 0x100000000;
+ }
+ if ((val > 0xffffffff) || (val < 0)) {
+ throw new Error("'pack' error.");
+ } else {
+ valStr = String.fromCharCode(Math.floor(val / 0x1000000)) +
+ String.fromCharCode(Math.floor((val % 0x1000000) / 0x10000)) +
+ String.fromCharCode(Math.floor((val % 0x10000) / 0x100)) +
+ String.fromCharCode(val % 0x100);
+ if (littleEndian) {
+ valStr = valStr.split("").reverse().join("");
+ }
+ }
+ } else {
+ throw new Error("'pack' error.");
+ }
+
+ packed += valStr;
+ p += 1;
+ }
+
+ return packed;
+}
+
+
+function unpack(mark, str) {
+ if (typeof (str) != "string") {
+ throw new Error("'unpack' error. Got invalid type argument.");
+ }
+ let l = 0;
+ for (let markPointer = 1; markPointer < mark.length; markPointer++) {
+ if (mark[markPointer].toLowerCase() == "b") {
+ l += 1;
+ } else if (mark[markPointer].toLowerCase() == "h") {
+ l += 2;
+ } else if (mark[markPointer].toLowerCase() == "l") {
+ l += 4;
+ } else {
+ throw new Error("'unpack' error. Got invalid mark.");
+ }
+ }
+
+ if (l != str.length) {
+ throw new Error("'unpack' error. Mismatch between symbol and string length. " + l + ":" + str.length);
+ }
+
+ let littleEndian;
+ if (mark[0] == "<") {
+ littleEndian = true;
+ } else if (mark[0] == ">") {
+ littleEndian = false;
+ } else {
+ throw new Error("'unpack' error.");
+ }
+ let unpacked = [];
+ let strPointer = 0;
+ let p = 1;
+ let val = null;
+ let c = null;
+ let length = null;
+ let sliced = "";
+
+ while (c = mark[p]) {
+ if (c.toLowerCase() == "b") {
+ length = 1;
+ sliced = str.slice(strPointer, strPointer + length);
+ val = sliced.charCodeAt(0);
+ if ((c == "b") && (val >= 0x80)) {
+ val -= 0x100;
+ }
+ } else if (c == "H") {
+ length = 2;
+ sliced = str.slice(strPointer, strPointer + length);
+ if (littleEndian) {
+ sliced = sliced.split("").reverse().join("");
+ }
+ val = sliced.charCodeAt(0) * 0x100 +
+ sliced.charCodeAt(1);
+ } else if (c.toLowerCase() == "l") {
+ length = 4;
+ sliced = str.slice(strPointer, strPointer + length);
+ if (littleEndian) {
+ sliced = sliced.split("").reverse().join("");
+ }
+ val = sliced.charCodeAt(0) * 0x1000000 +
+ sliced.charCodeAt(1) * 0x10000 +
+ sliced.charCodeAt(2) * 0x100 +
+ sliced.charCodeAt(3);
+ if ((c == "l") && (val >= 0x80000000)) {
+ val -= 0x100000000;
+ }
+ } else {
+ throw new Error("'unpack' error. " + c);
+ }
+
+ unpacked.push(val);
+ strPointer += length;
+ p += 1;
+ }
+
+ return unpacked;
+}
+
+
+function nStr(ch, num) {
+ let str = "";
+ for (let i = 0; i < num; i++) {
+ str += ch;
+ }
+ return str;
+}
+
+
+function splitIntoSegments(data) {
+ if (data.slice(0, 2) != "\xff\xd8") {
+ throw new Error("Given data isn't JPEG.");
+ }
+
+ let head = 2;
+ const segments = ["\xff\xd8"];
+ while (true) {
+ if (data.slice(head, head + 2) == "\xff\xda") {
+ segments.push(data.slice(head));
+ break;
+ } else {
+ var length = unpack(">H", data.slice(head + 2, head + 4))[0];
+ var endPoint = head + length + 2;
+ segments.push(data.slice(head, endPoint));
+ head = endPoint;
+ }
+
+ if (head >= data.length) {
+ throw new Error("Wrong JPEG data.");
+ }
+ }
+ return segments;
+}
+
+
+function getExifSeg(segments) {
+ let seg;
+ for (let i = 0; i < segments.length; i++) {
+ seg = segments[i];
+ if (seg.slice(0, 2) == "\xff\xe1" &&
+ seg.slice(4, 10) == "Exif\x00\x00") {
+ return seg;
+ }
+ }
+ return null;
+}
+
+
+function mergeSegments(segments, exif) {
+ let hasExifSegment = false;
+ let additionalAPP1ExifSegments = [];
+
+ segments.forEach(function (segment, i) {
+ // Replace first occurence of APP1:Exif segment
+ if (segment.slice(0, 2) == "\xff\xe1" &&
+ segment.slice(4, 10) == "Exif\x00\x00"
+ ) {
+ if (!hasExifSegment) {
+ segments[i] = exif;
+ hasExifSegment = true;
+ } else {
+ additionalAPP1ExifSegments.unshift(i);
+ }
+ }
+ });
+
+ // Remove additional occurences of APP1:Exif segment
+ additionalAPP1ExifSegments.forEach(function (segmentIndex) {
+ segments.splice(segmentIndex, 1);
+ });
+
+ if (!hasExifSegment && exif) {
+ segments = [segments[0], exif].concat(segments.slice(1));
+ }
+
+ return segments.join("");
+}
+
+
diff --git a/src/uni_modules/lime-shared/platform/index.ts b/src/uni_modules/lime-shared/platform/index.ts
new file mode 100644
index 0000000..af07091
--- /dev/null
+++ b/src/uni_modules/lime-shared/platform/index.ts
@@ -0,0 +1,27 @@
+// @ts-nocheck
+declare var tt: Uni
+declare var swan: Uni
+declare var my: Uni
+declare var dd: Uni
+declare var ks: Uni
+declare var jd: Uni
+declare var qa: Uni
+declare var qq: Uni
+declare var qh: Uni
+declare var qq: Uni
+
+export function platform(): Uni | WechatMiniprogram.Wx {
+ const UNDEFINED = 'undefined'
+ if(typeof wx !== UNDEFINED) return wx // 微信
+ if(typeof tt !== UNDEFINED) return tt // 字节 飞书
+ if(typeof swan !== UNDEFINED) return swan // 百度
+ if(typeof my !== UNDEFINED) return my // 支付宝
+ if(typeof dd !== UNDEFINED) return dd // 钉钉
+ if(typeof ks !== UNDEFINED) return ks // 快手
+ if(typeof jd !== UNDEFINED) return jd // 京东
+ if(typeof qa !== UNDEFINED) return qa // 快应用
+ if(typeof qq !== UNDEFINED) return qq // qq
+ if(typeof qh !== UNDEFINED) return qh // 360
+ if(typeof uni !== UNDEFINED) return uni
+ return null
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/raf/index.ts b/src/uni_modules/lime-shared/raf/index.ts
new file mode 100644
index 0000000..ec7650d
--- /dev/null
+++ b/src/uni_modules/lime-shared/raf/index.ts
@@ -0,0 +1,30 @@
+// @ts-nocheck
+import {isBrowser} from '../isBrowser'
+
+// 是否支持被动事件监听
+export const supportsPassive = true;
+
+// 请求动画帧
+export function raf(fn: FrameRequestCallback): number {
+ // 如果是在浏览器环境下,使用 requestAnimationFrame 方法
+ if (isBrowser) {
+ return requestAnimationFrame(fn); // 请求动画帧
+ } else { // 在非浏览器环境下,使用 setTimeout 模拟
+ return setTimeout(fn, 1000 / 30); // 使用 setTimeout 模拟动画帧,每秒钟执行 30 次
+ }
+}
+
+// 取消动画帧
+export function cancelRaf(id: number) {
+ // 如果是在浏览器环境下,使用 cancelAnimationFrame 方法
+ if (isBrowser) {
+ cancelAnimationFrame(id); // 取消动画帧
+ } else { // 在非浏览器环境下,使用 clearTimeout 模拟
+ clearTimeout(id); // 使用 clearTimeout 模拟取消动画帧
+ }
+}
+
+// 双倍动画帧
+export function doubleRaf(fn: FrameRequestCallback): void {
+ raf(() => raf(fn)); // 在下一帧回调中再次请求动画帧,实现双倍动画帧效果
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/random/index.ts b/src/uni_modules/lime-shared/random/index.ts
new file mode 100644
index 0000000..dbf2681
--- /dev/null
+++ b/src/uni_modules/lime-shared/random/index.ts
@@ -0,0 +1,22 @@
+// @ts-nocheck
+/**
+ * 生成一个指定范围内的随机数
+ * @param min 随机数的最小值
+ * @param max 随机数的最大值
+ * @param fixed 随机数的小数位数,默认为 0
+ * @returns 生成的随机数
+ */
+export function random(min: number, max: number, fixed: number = 0) {
+ // 将 min 和 max 转换为数字类型
+ min = +min || 0;
+ max = +max || 0;
+ // 计算随机数范围内的一个随机数
+ const num = Math.random() * (max - min) + min;
+ // 如果 fixed 参数为 0,则返回四舍五入的整数随机数;否则保留固定小数位数
+ return fixed == 0 ? Math.round(num) : Number(num.toFixed(fixed));
+}
+
+// 示例
+// console.log(random(0, 10)); // 输出:在 0 和 10 之间的一个整数随机数
+// console.log(random(0, 1, 2)); // 输出:在 0 和 1 之间的一个保留两位小数的随机数
+// console.log(random(1, 100, 3)); // 输出:在 1 和 100 之间的一个保留三位小数的随机数
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/range/index.ts b/src/uni_modules/lime-shared/range/index.ts
new file mode 100644
index 0000000..80acfbf
--- /dev/null
+++ b/src/uni_modules/lime-shared/range/index.ts
@@ -0,0 +1,31 @@
+// @ts-nocheck
+/**
+ * 生成一个数字范围的数组
+ * @param start 范围的起始值
+ * @param end 范围的结束值
+ * @param step 步长,默认为 1
+ * @param fromRight 是否从右侧开始生成,默认为 false
+ * @returns 生成的数字范围数组
+ */
+export function range(start: number, end: number, step: number = 1, fromRight: boolean = false): number[] {
+ let index = -1;
+ // 计算范围的长度
+ let length = Math.max(Math.ceil((end - start) / (step || 1)), 0);
+ // 创建一个长度为 length 的数组
+ const result = new Array(length);
+
+ // 使用循环生成数字范围数组
+ while (length--) {
+ // 根据 fromRight 参数决定从左侧还是右侧开始填充数组
+ result[fromRight ? length : ++index] = start;
+ start += step;
+ }
+
+ return result;
+}
+
+
+// 示例
+// console.log(range(0, 5)); // 输出: [0, 1, 2, 3, 4]
+// console.log(range(1, 10, 2, true)); // 输出: [9, 7, 5, 3, 1]
+// console.log(range(5, 0, -1)); // 输出: [5, 4, 3, 2, 1]
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/readme.md b/src/uni_modules/lime-shared/readme.md
new file mode 100644
index 0000000..09ec7e9
--- /dev/null
+++ b/src/uni_modules/lime-shared/readme.md
@@ -0,0 +1,251 @@
+# lime-shared 工具库
+- 本人插件的几个公共函数
+
+## 引入
+```js
+// 按需引入
+// 这种只会引入相关的方法
+import {getRect} from '@/uni_modules/lime-shared/getRect'
+
+// 全量引入
+// 这种引入方式,会全量打包
+import {getRect} from '@/uni_modules/lime-shared'
+```
+
+## Utils
+
+#### getRect
+- 返回节点尺寸信息
+
+```js
+// 组件内需要传入上下文
+// 如果是nvue 则需要在节点上加与id或class同名的ref
+getRect('#id',{context: this}).then(res => {})
+```
+
+#### addUnit
+- 将未带单位的数值添加px,如果有单位则返回原值
+
+```js
+addUnit(10)
+// 10px
+```
+
+#### unitConvert
+- 将带有rpx|px的字符转成number,若本身是number则直接返回
+
+```js
+unitConvert('10rpx')
+// 5 设备不同 返回的值也不同
+unitConvert('10px')
+// 10
+unitConvert(10)
+// 10
+```
+
+#### canIUseCanvas2d
+- 环境是否支持使用 canvas 2d
+
+```js
+canIUseCanvas2d()
+// 若支持返回 true 否则 false
+```
+
+
+#### getCurrentPage
+- 获取当前页
+
+```js
+const page = getCurrentPage()
+```
+
+
+#### base64ToPath
+- 把base64的图片转成临时路径
+
+```js
+base64ToPath(`xxxxx`).then(res => {})
+```
+
+#### pathToBase64
+- 把图片的临时路径转成base64
+
+```js
+pathToBase64(`xxxxx/xxx.png`).then(res => {})
+```
+
+#### sleep
+- 睡眠,让 async 内部程序等待一定时间后再执行
+
+```js
+async next () => {
+ await sleep(300)
+ console.log('limeui');
+}
+```
+
+#### isBase64
+- 判断字符串是否为base64
+
+```js
+isBase64('xxxxx')
+```
+
+#### throttle
+- 节流
+
+```js
+throttle((nama) => {console.log(nama)}, 200)('limeui');
+```
+
+#### debounce
+- 防抖
+
+```js
+debounce((nama) => {console.log(nama)}, 200)('limeui');
+```
+
+#### random
+- 返回指定范围的随机数
+
+```js
+random(1, 5);
+```
+
+#### range
+- 生成区间数组
+
+```js
+range(0, 5)
+// [0,1,2,3,4,5]
+```
+
+#### clamp
+- 夹在min和max之间的数值,如小于min,返回min, 如大于max,返回max,否侧原值返回
+
+```js
+clamp(0, 10, -1)
+// 0
+clamp(0, 10, 11)
+// 10
+clamp(0, 10, 9)
+// 9
+```
+
+#### floatAdd
+- 返回两个浮点数相加的结果
+
+```js
+floatAdd(0.1, 0.2) // 0.3
+```
+
+
+#### fillZero
+- 补零,如果传入的是`个位数`则在前面补0
+
+```js
+fillZero(9);
+// 09
+```
+
+#### exif
+- 获取图片exif
+- 支持临时路径、base64
+
+```js
+uni.chooseImage({
+ count: 1, //最多可以选择的图片张数
+ sizeType: "original",
+ success: (res) => {
+ exif.getData(res.tempFiles[0], function() {
+ let tagj = exif.getTag(this, "GPSLongitude");
+ let Orientation = exif.getTag(this, 'Orientation');
+ console.log(tagj, Orientation)
+ })
+ }
+})
+```
+
+#### selectComponent
+- 获取页面或当前实例的指定组件,会在页面或实例向所有的节点查找(包括子组件或子子组件)
+- 仅vue3,vue2没有测试过
+
+```js
+// 当前页面
+const page = getCurrentPage()
+selectComponent('.custom', {context: page}).then(res => {
+})
+```
+
+
+#### createAnimation
+- 创建动画,与uni.createAnimation使用方法一致,只为了抹平nvue
+
+```html
+
+```
+```js
+const ball = ref(null)
+const animation = createAnimation({
+ transformOrigin: "50% 50%",
+ duration: 1000,
+ timingFunction: "ease",
+ delay: 0
+})
+
+animation.scale(2,2).rotate(45).step()
+// nvue 无导出数据,这样写只为了平台一致,
+// nvue 需要把 ref 传入,其它平台不需要
+const animationData = animation.export(ball.value)
+```
+
+
+## composition-api
+- 因本人插件需要兼容vue2/vue3,故增加一个vue文件,代替条件编译
+- vue2需要在main.js加上这一段
+```js
+// vue2
+import Vue from 'vue'
+import VueCompositionAPI from '@vue/composition-api'
+Vue.use(VueCompositionAPI)
+```
+
+```js
+//使用
+import {computed, onMounted, watch, reactive} from '@/uni_modules/lime-shared/vue'
+```
+
+
+## Hooks
+#### useIntersectionObserver
+- 使用 Intersection Observer 观察元素可见性的钩子函数
+
+```html
+
+
Hello world
+
+```
+
+```js
+// options 接口可传的参数,若在插件里context为必传
+interface UseIntersectionObserverOptions {
+ root ?: string; // 观察器的根元素选择器字符串
+ rootMargin ?: {
+ top ?: number; // 根元素顶部边距
+ bottom ?: number; // 根元素底部边距
+ left ?: number; // 根元素左侧边距
+ right ?: number; // 根元素右侧边距
+ }; // 根元素的边距
+ thresholds ?: any[]; // 交叉比例数组,用于指定何时触发回调函数
+ context ?: any; // 上下文对象,用于指定观察器的上下文
+ initialRatio ?: number; // 初始的交叉比例
+ observeAll ?: boolean; // 是否同时观察所有交叉对象
+}
+const options: UseIntersectionObserverOptions = {
+ rootMargin: {top: 44},
+ context: this
+}
+const {stop} = useIntersectionObserver('.target', (result) => {
+
+}, options)
+```
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/selectComponent/index.ts b/src/uni_modules/lime-shared/selectComponent/index.ts
new file mode 100644
index 0000000..39db2fe
--- /dev/null
+++ b/src/uni_modules/lime-shared/selectComponent/index.ts
@@ -0,0 +1,152 @@
+// @ts-nocheck
+interface SelectOptions {
+ context?: any
+ needAll?: boolean
+ node?: boolean
+}
+// #ifdef MP
+function selectMPComponent(key: string, name: string, context: any, needAll: boolean) {
+ const {proxy, $vm} = context
+ context = $vm || proxy
+ if(!['ref','component'].includes(key)) {
+ const queue = [context]
+ let result = null
+ const selector = (key == 'id' ? '#': '.') + name;
+ while(queue.length > 0) {
+ const child = queue.shift();
+ const flag = child?.selectComponent(selector)
+ if(flag) {
+ if(!needAll) {return result = flag.$vm}
+ return result = child.selectAllComponents(selector).map(item => item.$vm)
+ } else {
+ child.$children && (queue.push(...child.$children));
+ }
+ }
+ return result
+ } else {
+ const {$templateRefs} = context.$
+ const nameMap = {}
+ for (var i = 0; i < $templateRefs.length; i++) {
+ const item = $templateRefs[i]
+ nameMap[item.i] = item.r
+ }
+ let result = []
+ if(context.$children.length) {
+ const queue = [...context.$children]
+ while(queue.length > 0) {
+ const child = queue.shift();
+ if(key == 'component' && (child.type?.name === name || child.$?.type?.name === name)) {
+ result.push(child)
+ } else if(child.$refs && child.$refs[name]) {
+ result = child.$refs[name]
+ } else if(nameMap[child.id] === name){
+ result.push(child)
+ } else {
+ child.$children && (queue.push(...child.$children));
+ }
+ if(result.length && !needAll) {
+ return;
+ }
+ }
+ }
+ return needAll ? result : result[0]
+ }
+}
+// #endif
+// #ifdef H5
+function selectH5Component(key: string, name: string, context: any, needAll: boolean) {
+ const {_, component } = context
+ const child = {component: _ || component || context, children: null , subTree: null, props: null}
+ let result = []
+ let queue = [child]
+ while(queue.length > 0 ) {
+ const child = queue.shift()
+ const {component, children , props, subTree} = child
+ if(key === 'component' && component?.type?.name == name) {
+ result.push(component)
+ } else if(key === 'ref' && component && (props?.ref == name || component[key][name])) {
+ if(props?.ref == name) {
+ //exposed
+ result.push(component)
+ } else if(component[key][name]) {
+ result.push(component[key][name])
+ }
+ } else if(key !== 'ref' && component?.exposed && new RegExp(`\\b${name}\\b`).test(component.attrs[key])) {
+ // exposed
+ result.push(component)
+ } else if(children && Array.isArray(children)) {
+ queue.push(...children)
+ } else if(!component && subTree) {
+ queue.push(subTree)
+ } else if(component?.subTree) {
+ queue.push(component.subTree)
+ }
+ if(result.length && !needAll) {
+ break
+ }
+ }
+ return needAll ? result : result[0]
+}
+// #endif
+// #ifdef APP
+function selectAPPComponent(key: string, name: string, context: any, needAll: boolean, node: boolean) {
+ let result = []
+ // const {_, component} = context
+ // const child = {component: _ || component || context, children: null, props: null, subTree: null}
+ const queue = [context]
+ while(queue.length > 0) {
+ const child = queue.shift()
+ const {component, children, props, subTree} = child
+ const isComp = component && props && component.exposed && !node
+ if(key == 'component' && child.type && child.type.name === name) {
+ result.push(component)
+ } else if(props?.[key] === name && node) {
+ result.push(child)
+ } else if(key === 'ref' && isComp && (props.ref === name || props.ref_key === name)) {
+ // exposed
+ result.push(component)
+ } else if(key !== 'ref' && isComp && new RegExp(`\\b${name}\\b`).test(props[key])) {
+ // exposed
+ result.push(component)
+ }
+ // else if(component && component.subTree && Array.isArray(component.subTree.children)){
+ // queue.push(...component.subTree.children)
+ // }
+ else if(subTree) {
+ queue.push(subTree)
+ } else if(component && component.subTree){
+ queue.push(component.subTree)
+ }
+ else if(children && Array.isArray(children)) {
+ queue.push(...children)
+ }
+ if(result.length && !needAll) {
+ break;
+ }
+ }
+ return needAll ? result : result[0]
+}
+// #endif
+export function selectComponent(selector: string, options: SelectOptions = {}) {
+ // . class
+ // # id
+ // $ ref
+ // @ component name
+ const reg = /^(\.|#|@|\$)([a-zA-Z_0-9\-]+)$/;
+ if(!reg.test(selector)) return null
+ let { context, needAll, node} = options
+ const [,prefix, name] = selector.match(reg)
+ const symbolMappings = {'.': 'class', '#': 'id', '$':'ref', '@':'component'}
+
+ const key = symbolMappings [prefix] //prefix === '.' ? 'class' : prefix === '#' ? 'id' : 'ref';
+ console.log('key', key)
+ // #ifdef MP
+ return selectMPComponent(key, name, context, needAll)
+ // #endif
+ // #ifdef H5
+ return selectH5Component(key, name, context, needAll)
+ // #endif
+ // #ifdef APP
+ return selectAPPComponent(key, name, context, needAll, node)
+ // #endif
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/sleep/index.ts b/src/uni_modules/lime-shared/sleep/index.ts
new file mode 100644
index 0000000..3ae6926
--- /dev/null
+++ b/src/uni_modules/lime-shared/sleep/index.ts
@@ -0,0 +1,30 @@
+// @ts-nocheck
+/**
+ * 延迟指定时间后解析的 Promise
+ * @param delay 延迟的时间(以毫秒为单位),默认为 300 毫秒
+ * @returns 一个 Promise,在延迟结束后解析
+ */
+export const sleep = (delay: number = 300) =>
+ new Promise(resolve => setTimeout(resolve, delay));
+
+
+// 示例
+// async function example() {
+// console.log("Start");
+
+// // 延迟 1 秒后执行
+// await sleep(1000);
+// console.log("1 second later");
+
+// // 延迟 500 毫秒后执行
+// await sleep(500);
+// console.log("500 milliseconds later");
+
+// // 延迟 2 秒后执行
+// await sleep(2000);
+// console.log("2 seconds later");
+
+// console.log("End");
+// }
+
+// example();
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/throttle/index.ts b/src/uni_modules/lime-shared/throttle/index.ts
new file mode 100644
index 0000000..740f788
--- /dev/null
+++ b/src/uni_modules/lime-shared/throttle/index.ts
@@ -0,0 +1,41 @@
+// @ts-nocheck
+/**
+ * 节流函数,用于限制函数的调用频率
+ * @param fn 要进行节流的函数
+ * @param delay 两次调用之间的最小间隔时间
+ * @returns 节流后的函数
+ */
+export function throttle(fn: (...args: any[]) => void, delay: number) {
+ let flag = true; // 标记是否可以执行函数
+
+ return (...args: any[]) => {
+ if (flag) {
+ flag = false; // 设置为不可执行状态
+ fn(...args); // 执行传入的函数
+
+ setTimeout(() => {
+ flag = true; // 经过指定时间后,设置为可执行状态
+ }, delay);
+ }
+ };
+}
+
+
+// // 示例
+// // 定义一个被节流的函数
+// function handleScroll() {
+// console.log("Scroll event handled!");
+// }
+
+// // 使用节流函数对 handleScroll 进行节流,间隔时间为 500 毫秒
+// const throttledScroll = throttle(handleScroll, 500);
+
+// // 模拟多次调用 handleScroll
+// throttledScroll(); // 输出 "Scroll event handled!"
+// throttledScroll(); // 不会输出
+// throttledScroll(); // 不会输出
+
+// // 经过 500 毫秒后,再次调用 handleScroll
+// setTimeout(() => {
+// throttledScroll(); // 输出 "Scroll event handled!"
+// }, 500);
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/toArray/index.ts b/src/uni_modules/lime-shared/toArray/index.ts
new file mode 100644
index 0000000..b59b0af
--- /dev/null
+++ b/src/uni_modules/lime-shared/toArray/index.ts
@@ -0,0 +1,13 @@
+// @ts-nocheck
+/**
+ * 将一个或多个元素转换为数组
+ * @param item 要转换为数组的元素
+ * @returns 转换后的数组
+ */
+export const toArray = (item: T | T[]): T[] => Array.isArray(item) ? item : [item];
+
+// 示例
+// console.log(toArray(5)); // 输出: [5]
+// console.log(toArray("hello")); // 输出: ["hello"]
+// console.log(toArray([1, 2, 3])); // 输出: [1, 2, 3]
+// console.log(toArray(["apple", "banana"])); // 输出: ["apple", "banana"]
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/toNumber/index.ts b/src/uni_modules/lime-shared/toNumber/index.ts
new file mode 100644
index 0000000..a0745bb
--- /dev/null
+++ b/src/uni_modules/lime-shared/toNumber/index.ts
@@ -0,0 +1,15 @@
+// @ts-nocheck
+/**
+ * 将字符串转换为数字
+ * @param val 要转换的字符串
+ * @returns 转换后的数字或原始字符串
+ */
+export function toNumber(val: string): number | string {
+ const n = parseFloat(val); // 使用 parseFloat 函数将字符串转换为浮点数
+ return isNaN(n) ? val : n; // 使用 isNaN 函数判断是否为非数字,返回转换后的数字或原始字符串
+}
+
+// 示例
+// console.log(toNumber("123")); // 输出: 123
+// console.log(toNumber("3.14")); // 输出: 3.14
+// console.log(toNumber("hello")); // 输出: "hello"
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/unitConvert/index.ts b/src/uni_modules/lime-shared/unitConvert/index.ts
new file mode 100644
index 0000000..7cedccf
--- /dev/null
+++ b/src/uni_modules/lime-shared/unitConvert/index.ts
@@ -0,0 +1,39 @@
+// @ts-nocheck
+import {isString} from '../isString'
+import {isNumeric} from '../isNumeric'
+
+/**
+ * 单位转换函数,将字符串数字或带有单位的字符串转换为数字
+ * @param value 要转换的值,可以是字符串数字或带有单位的字符串
+ * @returns 转换后的数字,如果无法转换则返回0
+ */
+export function unitConvert(value: string | number): number {
+ // 如果是字符串数字
+ if (isNumeric(value)) {
+ return Number(value);
+ }
+ // 如果有单位
+ if (isString(value)) {
+ const reg = /^-?([0-9]+)?([.]{1}[0-9]+){0,1}(em|rpx|px|%)$/g;
+ const results = reg.exec(value);
+ if (!value || !results) {
+ return 0;
+ }
+ const unit = results[3];
+ value = parseFloat(value);
+ if (unit === 'rpx') {
+ return uni.upx2px(value);
+ }
+ if (unit === 'px') {
+ return value * 1;
+ }
+ // 如果是其他单位,可以继续添加对应的转换逻辑
+ }
+ return 0;
+}
+
+// 示例
+// console.log(unitConvert("123")); // 输出: 123 (字符串数字转换为数字)
+// console.log(unitConvert("3.14em")); // 输出: 0 (无法识别的单位)
+// console.log(unitConvert("20rpx")); // 输出: 根据具体情况而定 (根据单位进行转换)
+// console.log(unitConvert(10)); // 输出: 10 (数字不需要转换)
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/useIntersectionObserver/index.ts b/src/uni_modules/lime-shared/useIntersectionObserver/index.ts
new file mode 100644
index 0000000..b5862fe
--- /dev/null
+++ b/src/uni_modules/lime-shared/useIntersectionObserver/index.ts
@@ -0,0 +1,81 @@
+import { watch, unref, Ref } from "../vue"
+// #ifdef APP-NVUE
+// const dom = weex.requireModule('dom')
+// const dom = uni.requireNativePlugin('dom')
+// #endif
+
+interface UseIntersectionObserverOptions {
+ root ?: string; // 观察器的根元素选择器字符串
+ rootMargin ?: {
+ top ?: number; // 根元素顶部边距
+ bottom ?: number; // 根元素底部边距
+ left ?: number; // 根元素左侧边距
+ right ?: number; // 根元素右侧边距
+ }; // 根元素的边距
+ thresholds ?: any[]; // 交叉比例数组,用于指定何时触发回调函数
+ context ?: any; // 上下文对象,用于指定观察器的上下文
+ initialRatio ?: number; // 初始的交叉比例
+ observeAll ?: boolean; // 是否同时观察所有交叉对象
+}
+
+/**
+ * 使用 Intersection Observer 观察元素可见性的自定义钩子函数
+ * @param {Ref | string} target - 目标元素,可以是一个字符串或 ref 对象
+ * @param {(result: UniNamespace.ObserveResult) => void} callback - 回调函数,当目标元素的可见性发生变化时调用
+ * @param {UseIntersectionObserverOptions} options - 可选的配置参数
+ * @returns {Object} - 包含 stop 方法的对象,用于停止观察
+ */
+export function useIntersectionObserver(
+ target : Ref | string,
+ callback : (result : UniNamespace.ObserveResult) => void,
+ options : UseIntersectionObserverOptions = {}) {
+ const {
+ root, // 观察器的根元素选择器
+ rootMargin = { top: 0, bottom: 0 }, // 根元素的边距,默认为顶部和底部都为0
+ thresholds = [0], // 交叉比例数组,默认为[0]
+ initialRatio = 0, // 初始交叉比例,默认为0
+ observeAll = false, // 是否同时观察所有交叉对象,默认为false
+ context // 上下文对象,用于指定观察器的上下文
+ } = options
+ const noop = () => { }; // 空函数,用于初始化 cleanup
+ let cleanup = noop; // 清理函数,用于停止 Intersection Observer 的观察
+
+ const stopWatch = watch(() => ({ el: unref(target), root: unref(root) }), ({ el, root }) => {
+ if (!el) {
+ return
+ }
+ // #ifndef APP-NVUE
+ // 创建 Intersection Observer 实例
+ const observer = uni.createIntersectionObserver(context, { thresholds, initialRatio, observeAll })
+ if (root) {
+ // 相对于根元素设置边界
+ observer.relativeTo(root, rootMargin)
+ } else {
+ // 相对于视口设置边界
+ observer.relativeToViewport(rootMargin)
+ }
+ // 观察目标元素的可见性变化
+ observer.observe(el, callback)
+ cleanup = () => {
+ // 停止观察
+ observer.disconnect()
+ // 将 cleanup 函数重置为空函数
+ cleanup = noop
+ }
+ // #endif
+ // #ifdef APP-NVUE
+ // dom.getComponentRect(el, (res) => {
+ // console.log('res', res)
+ // })
+ // #endif
+ }, { immediate: true, flush: 'post' })
+
+ const stop = () => {
+ // 调用 cleanup 函数停止观察
+ cleanup && cleanup()
+ // 停止 watch
+ stopWatch && stopWatch()
+ }
+
+ return { stop }
+}
\ No newline at end of file
diff --git a/src/uni_modules/lime-shared/vue/index.ts b/src/uni_modules/lime-shared/vue/index.ts
new file mode 100644
index 0000000..91a4a7f
--- /dev/null
+++ b/src/uni_modules/lime-shared/vue/index.ts
@@ -0,0 +1,8 @@
+// @ts-nocheck
+
+// #ifdef VUE3
+export * from 'vue';
+// #endif
+// #ifndef VUE3
+export * from '@vue/composition-api';
+// #endif
diff --git a/src/uni_modules/wz-select-popup/changelog.md b/src/uni_modules/wz-select-popup/changelog.md
new file mode 100644
index 0000000..8a5f41c
--- /dev/null
+++ b/src/uni_modules/wz-select-popup/changelog.md
@@ -0,0 +1,8 @@
+## 1.0.11(2023-11-15)
+reqFun只允许传入Promise
+## 1.0.10(2023-11-13)
+去除默认值
+## 1.0.1(2023-11-13)
+更新插件依赖
+## 1.0.0(2023-11-13)
+第一次发布
diff --git a/src/uni_modules/wz-select-popup/components/wz-select-popup/util/defaultConfig.js b/src/uni_modules/wz-select-popup/components/wz-select-popup/util/defaultConfig.js
new file mode 100644
index 0000000..76b74ea
--- /dev/null
+++ b/src/uni_modules/wz-select-popup/components/wz-select-popup/util/defaultConfig.js
@@ -0,0 +1,22 @@
+export default {
+ mode: 'radio', //radio checkbox 单选、多选
+ showType: 'text', //暂时不用 text image 纯文字、图文
+ selected: '', //已选中的
+ dataList: null, //如果dataList传入了数组则直接使用传入的数组渲染,无需再配置proxyConfig
+ proxyConfig: { //组件内部代理请求数据配置
+ reqFun: Promise.resolve(), //请求方法
+ localPaging: false //前端本地分页,如果使用的是dataList默认是本地分页
+ },
+ page: { //如果是组件内部代理请求会把page的值加入到请求参数里
+ pageIndex: 1, //当前页
+ pageSize: 20 //页大小
+ },
+ search: {
+ type: 'local', //搜索的类型,local本地搜索, remote向服务器请求。只有使用proxyConfig.reqFun请求才能配置为remote
+ },
+ fields: { //显示的key,value
+ label: 'name',
+ value: 'code',
+ image: 'image', //暂时不用
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/wz-select-popup/components/wz-select-popup/util/index.js b/src/uni_modules/wz-select-popup/components/wz-select-popup/util/index.js
new file mode 100644
index 0000000..d10ab80
--- /dev/null
+++ b/src/uni_modules/wz-select-popup/components/wz-select-popup/util/index.js
@@ -0,0 +1,74 @@
+/**深度合并对象*/
+export const deepMerge = function(target = {}, source = {}) {
+ target = deepClone(target); //深度克隆
+ if (typeof target !== 'object' || typeof source !== 'object') return false; //判断类型
+ for (let prop in source) {
+ if (!source.hasOwnProperty(prop)) continue; //检测属性是否为对象的自有属性
+ if (prop in target) { //prop 中是否有 target 属性
+ if (typeof target[prop] !== 'object') {
+ target[prop] = source[prop];
+ } else {
+ if (typeof source[prop] !== 'object') {
+ target[prop] = source[prop];
+ } else {
+ if (target[prop].concat && source[prop].concat) {
+ target[prop] = target[prop].concat(source[prop]); //合并
+ } else {
+ target[prop] = deepMerge(target[prop], source[prop]); //递归
+ }
+ }
+ }
+ } else {
+ target[prop] = source[prop];
+ }
+ }
+ return target;
+}
+
+const isArray = function(arr) {
+ return Object.prototype.toString.call(arr) === '[object Array]';
+}
+
+/**深度合并对象*/
+export const deepClone = function(obj) {
+ // 对常见的“非”值,直接返回原来值
+ if ([null, undefined, NaN, false].includes(obj)) return obj;
+ if (typeof obj !== "object" && typeof obj !== 'function') {
+ //原始类型直接返回
+ return obj;
+ }
+ let o = isArray(obj) ? [] : {};
+ for (let i in obj) {
+ if (obj.hasOwnProperty(i)) {
+ o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
+ }
+ }
+ return o;
+};
+
+let timeout = null
+/**
+ * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数
+ *
+ * @param {Function} func 要执行的回调函数
+ * @param {Number} wait 延时的时间
+ * @param {Boolean} immediate 是否立即执行
+ * @return null
+ */
+export const debounce = function(func, wait = 500, immediate = false) {
+ // 清除定时器
+ if (timeout !== null) clearTimeout(timeout)
+ // 立即执行,此类情况一般用不到
+ if (immediate) {
+ const callNow = !timeout
+ timeout = setTimeout(() => {
+ timeout = null
+ }, wait)
+ if (callNow) typeof func === 'function' && func()
+ } else {
+ // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法
+ timeout = setTimeout(() => {
+ typeof func === 'function' && func()
+ }, wait)
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/wz-select-popup/components/wz-select-popup/wz-list.vue b/src/uni_modules/wz-select-popup/components/wz-select-popup/wz-list.vue
new file mode 100644
index 0000000..fe1ae07
--- /dev/null
+++ b/src/uni_modules/wz-select-popup/components/wz-select-popup/wz-list.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+
+
+
+ ({{index+1}})
+
+ ERP料号 : {{item.itemCode}}
+ 名称 : {{item.itemName}}
+ 描述 : {{item.itemDesc1}}
+
+
+
+
+
+
+
+ {{loadmore[page.loading]}}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/wz-select-popup/components/wz-select-popup/wz-search.vue b/src/uni_modules/wz-select-popup/components/wz-select-popup/wz-search.vue
new file mode 100644
index 0000000..6977a7f
--- /dev/null
+++ b/src/uni_modules/wz-select-popup/components/wz-select-popup/wz-search.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/wz-select-popup/components/wz-select-popup/wz-select-popup.vue b/src/uni_modules/wz-select-popup/components/wz-select-popup/wz-select-popup.vue
new file mode 100644
index 0000000..7e3b04f
--- /dev/null
+++ b/src/uni_modules/wz-select-popup/components/wz-select-popup/wz-select-popup.vue
@@ -0,0 +1,357 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/uni_modules/wz-select-popup/package.json b/src/uni_modules/wz-select-popup/package.json
new file mode 100644
index 0000000..3176f71
--- /dev/null
+++ b/src/uni_modules/wz-select-popup/package.json
@@ -0,0 +1,82 @@
+{
+ "id": "wz-select-popup",
+ "displayName": "popup弹窗选择器",
+ "version": "1.0.11",
+ "description": "popup弹窗选择器支持单选,多选,组件内部代理请求,自定义label,value显示,分页加载,",
+ "keywords": [
+ "wz-select-popup"
+ ],
+ "repository": "",
+ "engines": {
+ "HBuilderX": "^3.96"
+ },
+ "dcloudext": {
+ "type": "component-vue",
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "插件不采集任何数据",
+ "permissions": "无"
+ },
+ "npmurl": ""
+ },
+ "uni_modules": {
+ "dependencies": ["uni-icons", "uni-popup"],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "u"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "u",
+ "app-uvue": "n"
+ },
+ "H5-mobile": {
+ "Safari": "u",
+ "Android Browser": "u",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "u"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "u",
+ "Edge": "y",
+ "Firefox": "u",
+ "Safari": "u"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "u",
+ "百度": "u",
+ "字节跳动": "u",
+ "QQ": "u",
+ "钉钉": "u",
+ "快手": "u",
+ "飞书": "u",
+ "京东": "u"
+ },
+ "快应用": {
+ "华为": "u",
+ "联盟": "u"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/uni_modules/wz-select-popup/readme.md b/src/uni_modules/wz-select-popup/readme.md
new file mode 100644
index 0000000..0b6e839
--- /dev/null
+++ b/src/uni_modules/wz-select-popup/readme.md
@@ -0,0 +1,132 @@
+# wz-select-popup
+
+## 示例
+
+```vue
+
+
+
+ names:{{userForm.names}}
+ values:{{userForm.values}}
+ origin:{{userForm.origin}}
+
+
+
+
+
+
+
+
+
+```
+
+## 属性props
+
+| 属性 | 类型 | 默认值 | 说明 |
+| ------- | ------ | ------ | ------------------------------------------------------------ |
+| scrollH | String | 50vh | 滚动内容的高度,不包含搜索框和多选时的底部按钮栏。需要带单位 |
+
+
+## 方法methods
+
+| 方法名 | 说明 | 参数 |
+| ------ | -------- | ----------------------------- |
+| open | 打开弹窗 | [configs](#open方法的configs) |
+| close | 关闭弹窗 | |
+
+### open方法的configs
+
+| 参数名 | 说明 | 类型 | 默认值 |
+| ----------- | ------------------------------------------------------------ | ------------- | -------------------------- |
+| mode | 选择模式radio单选 ,checkbox多选 | String | radio |
+| selected | 已选中的value, 单选传字符串,多选传数组 | String\|Array | [] |
+| dataList | 传入了数组,则直接使用传入的数组渲染,无需再配置proxyConfig | Array | null |
+| proxyConfig | 组件内部代理请求数据配置 | Object | [proxyConfig](#proxyConfig的属性) |
+| search | 搜索配置 | Object | [search](#search的属性) |
+| page | 分页配置,如果是组件内部代理请求会把page的值加入到proxyConfig.reqFun请求参数里 | Object | [page](#page的属性) |
+| fields | 显示和取值的label,value | Object | [fields](#fields的属性) |
+
+#### proxyConfig的属性
+
+| 参数名 | 说明 | 类型 | 默认值 | 返回值 |
+| ----------- | --------------------------------------------------------- | ------- | ------------------- | --------------------------------------- |
+| reqFun | 向服务器请求数据的Promise方法,会返回页码以及搜索框的value | Promise | Promise.resolve([]) | ({pageIndex, pageSize,searchValue})=>{} |
+| localPaging | 是否本地分页 | Boolean | false | |
+
+#### search的属性
+
+| 参数名 | 说明 | 类型 | 默认值 |
+| ------ | ------------------------------------------------------------ | ------ | ------ |
+| type | 搜索的类型,local本地搜索, remote向服务器请求。只有使用proxyConfig.reqFun请求才能配置为remote | String | local |
+
+#### page的属性
+
+| 参数名 | 说明 | 类型 | 默认值 |
+| --------- | ------ | ------ | ------ |
+| pageIndex | 当前页 | Number | 1 |
+| pageSize | 页大小 | Number | 20 |
+
+#### fields的属性
+
+| 参数名 | 说明 | 类型 | 默认值 |
+| ------ | ------------ | ------ | ------ |
+| label | 显示的字段名 | String | name |
+| value | 取值的字段名 | String | code |
+
+## 事件enevt
+
+| 名称 | 触发时机 | 返回值 |
+| ------ | ------------------------------------------ | ------------------------------------------------------------ |
+| select | 单选点击列表时触发,多选点击确定按钮时触发 | mode等于radio时:(mode, {check,name,code})=>{}
mode等于checkbox时:(mode, {names,values,origin})=>{} |
+| close | popup关闭 | void |
diff --git a/test.keystore b/test.keystore
new file mode 100644
index 0000000..3d2e0c7
Binary files /dev/null and b/test.keystore differ