fabric-rails 1.0.12 → 1.0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.md +16 -0
- data/README.md +1 -1
- data/lib/fabric/rails/version.rb +2 -2
- data/vendor/assets/javascripts/event.js +1909 -0
- data/vendor/assets/javascripts/fabric.js +64 -16464
- data/vendor/assets/javascripts/fabric/HEADER.js +31 -0
- data/vendor/assets/javascripts/fabric/canvas.class.js +1007 -0
- data/vendor/assets/javascripts/fabric/canvas_animation.mixin.js +113 -0
- data/vendor/assets/javascripts/fabric/canvas_events.mixin.js +482 -0
- data/vendor/assets/javascripts/fabric/canvas_gestures.mixin.js +79 -0
- data/vendor/assets/javascripts/fabric/canvas_serialization.mixin.js +311 -0
- data/vendor/assets/javascripts/fabric/circle.class.js +182 -0
- data/vendor/assets/javascripts/fabric/color.class.js +284 -0
- data/vendor/assets/javascripts/fabric/ellipse.class.js +169 -0
- data/vendor/assets/javascripts/fabric/freedrawing.class.js +256 -0
- data/vendor/assets/javascripts/fabric/gradient.class.js +211 -0
- data/vendor/assets/javascripts/fabric/group.class.js +556 -0
- data/vendor/assets/javascripts/fabric/image.class.js +418 -0
- data/vendor/assets/javascripts/fabric/image_filters.js +809 -0
- data/vendor/assets/javascripts/fabric/intersection.class.js +178 -0
- data/vendor/assets/javascripts/fabric/line.class.js +188 -0
- data/vendor/assets/javascripts/fabric/log.js +26 -0
- data/vendor/assets/javascripts/fabric/node.js +149 -0
- data/vendor/assets/javascripts/fabric/object.class.js +1068 -0
- data/vendor/assets/javascripts/fabric/object_geometry.mixin.js +308 -0
- data/vendor/assets/javascripts/fabric/object_interactivity.mixin.js +496 -0
- data/vendor/assets/javascripts/fabric/object_origin.mixin.js +207 -0
- data/vendor/assets/javascripts/fabric/object_straightening.mixin.js +94 -0
- data/vendor/assets/javascripts/fabric/observable.mixin.js +91 -0
- data/vendor/assets/javascripts/fabric/parser.js +750 -0
- data/vendor/assets/javascripts/fabric/path.class.js +794 -0
- data/vendor/assets/javascripts/fabric/path_group.class.js +240 -0
- data/vendor/assets/javascripts/fabric/pattern.class.js +69 -0
- data/vendor/assets/javascripts/fabric/point.class.js +327 -0
- data/vendor/assets/javascripts/fabric/polygon.class.js +184 -0
- data/vendor/assets/javascripts/fabric/polyline.class.js +157 -0
- data/vendor/assets/javascripts/fabric/rect.class.js +298 -0
- data/vendor/assets/javascripts/fabric/scout.js +45 -0
- data/vendor/assets/javascripts/fabric/shadow.class.js +70 -0
- data/vendor/assets/javascripts/fabric/stateful.js +88 -0
- data/vendor/assets/javascripts/fabric/static_canvas.class.js +1298 -0
- data/vendor/assets/javascripts/fabric/text.class.js +934 -0
- data/vendor/assets/javascripts/fabric/triangle.class.js +108 -0
- data/vendor/assets/javascripts/fabric/util/anim_ease.js +360 -0
- data/vendor/assets/javascripts/fabric/util/dom_event.js +237 -0
- data/vendor/assets/javascripts/fabric/util/dom_misc.js +245 -0
- data/vendor/assets/javascripts/fabric/util/dom_request.js +72 -0
- data/vendor/assets/javascripts/fabric/util/dom_style.js +71 -0
- data/vendor/assets/javascripts/fabric/util/lang_array.js +250 -0
- data/vendor/assets/javascripts/fabric/util/lang_class.js +97 -0
- data/vendor/assets/javascripts/fabric/util/lang_function.js +35 -0
- data/vendor/assets/javascripts/fabric/util/lang_object.js +34 -0
- data/vendor/assets/javascripts/fabric/util/lang_string.js +60 -0
- data/vendor/assets/javascripts/fabric/util/misc.js +406 -0
- data/vendor/assets/javascripts/json2.js +491 -0
- metadata +53 -2
@@ -0,0 +1,284 @@
|
|
1
|
+
(function(global) {
|
2
|
+
|
3
|
+
"use strict";
|
4
|
+
|
5
|
+
var fabric = global.fabric || (global.fabric = { });
|
6
|
+
|
7
|
+
if (fabric.Color) {
|
8
|
+
fabric.warn('fabric.Color is already defined.');
|
9
|
+
return;
|
10
|
+
}
|
11
|
+
|
12
|
+
/**
|
13
|
+
* Color class
|
14
|
+
* The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations;
|
15
|
+
* {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects.
|
16
|
+
*
|
17
|
+
* @class Color
|
18
|
+
* @memberOf fabric
|
19
|
+
* @param {String} color optional in hex or rgb(a) format
|
20
|
+
* @return {fabric.Color} thisArg
|
21
|
+
*/
|
22
|
+
function Color(color) {
|
23
|
+
if (!color) {
|
24
|
+
this.setSource([0, 0, 0, 1]);
|
25
|
+
}
|
26
|
+
else {
|
27
|
+
this._tryParsingColor(color);
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
fabric.Color = Color;
|
32
|
+
|
33
|
+
fabric.Color.prototype = /** @scope fabric.Color.prototype */ {
|
34
|
+
|
35
|
+
/**
|
36
|
+
* @private
|
37
|
+
* @method _tryParsingColor
|
38
|
+
*/
|
39
|
+
_tryParsingColor: function(color) {
|
40
|
+
var source = Color.sourceFromHex(color);
|
41
|
+
if (!source) {
|
42
|
+
source = Color.sourceFromRgb(color);
|
43
|
+
}
|
44
|
+
if (source) {
|
45
|
+
this.setSource(source);
|
46
|
+
}
|
47
|
+
},
|
48
|
+
|
49
|
+
/**
|
50
|
+
* Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1])
|
51
|
+
* @method getSource
|
52
|
+
* @return {Array}
|
53
|
+
*/
|
54
|
+
getSource: function() {
|
55
|
+
return this._source;
|
56
|
+
},
|
57
|
+
|
58
|
+
/**
|
59
|
+
* Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1])
|
60
|
+
* @method setSource
|
61
|
+
* @param {Array} source
|
62
|
+
*/
|
63
|
+
setSource: function(source) {
|
64
|
+
this._source = source;
|
65
|
+
},
|
66
|
+
|
67
|
+
/**
|
68
|
+
* Returns color represenation in RGB format
|
69
|
+
* @method toRgb
|
70
|
+
* @return {String} ex: rgb(0-255,0-255,0-255)
|
71
|
+
*/
|
72
|
+
toRgb: function() {
|
73
|
+
var source = this.getSource();
|
74
|
+
return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')';
|
75
|
+
},
|
76
|
+
|
77
|
+
/**
|
78
|
+
* Returns color represenation in RGBA format
|
79
|
+
* @method toRgba
|
80
|
+
* @return {String} ex: rgba(0-255,0-255,0-255,0-1)
|
81
|
+
*/
|
82
|
+
toRgba: function() {
|
83
|
+
var source = this.getSource();
|
84
|
+
return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')';
|
85
|
+
},
|
86
|
+
|
87
|
+
/**
|
88
|
+
* Returns color represenation in HEX format
|
89
|
+
* @method toHex
|
90
|
+
* @return {String} ex: FF5555
|
91
|
+
*/
|
92
|
+
toHex: function() {
|
93
|
+
var source = this.getSource();
|
94
|
+
|
95
|
+
var r = source[0].toString(16);
|
96
|
+
r = (r.length === 1) ? ('0' + r) : r;
|
97
|
+
|
98
|
+
var g = source[1].toString(16);
|
99
|
+
g = (g.length === 1) ? ('0' + g) : g;
|
100
|
+
|
101
|
+
var b = source[2].toString(16);
|
102
|
+
b = (b.length === 1) ? ('0' + b) : b;
|
103
|
+
|
104
|
+
return r.toUpperCase() + g.toUpperCase() + b.toUpperCase();
|
105
|
+
},
|
106
|
+
|
107
|
+
/**
|
108
|
+
* Gets value of alpha channel for this color
|
109
|
+
* @method getAlpha
|
110
|
+
* @return {Number} 0-1
|
111
|
+
*/
|
112
|
+
getAlpha: function() {
|
113
|
+
return this.getSource()[3];
|
114
|
+
},
|
115
|
+
|
116
|
+
/**
|
117
|
+
* Sets value of alpha channel for this color
|
118
|
+
* @method setAlpha
|
119
|
+
* @param {Number} 0-1
|
120
|
+
* @return {fabric.Color} thisArg
|
121
|
+
*/
|
122
|
+
setAlpha: function(alpha) {
|
123
|
+
var source = this.getSource();
|
124
|
+
source[3] = alpha;
|
125
|
+
this.setSource(source);
|
126
|
+
return this;
|
127
|
+
},
|
128
|
+
|
129
|
+
/**
|
130
|
+
* Transforms color to its grayscale representation
|
131
|
+
* @method toGrayscale
|
132
|
+
* @return {fabric.Color} thisArg
|
133
|
+
*/
|
134
|
+
toGrayscale: function() {
|
135
|
+
var source = this.getSource(),
|
136
|
+
average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10),
|
137
|
+
currentAlpha = source[3];
|
138
|
+
this.setSource([average, average, average, currentAlpha]);
|
139
|
+
return this;
|
140
|
+
},
|
141
|
+
|
142
|
+
/**
|
143
|
+
* Transforms color to its black and white representation
|
144
|
+
* @method toGrayscale
|
145
|
+
* @return {fabric.Color} thisArg
|
146
|
+
*/
|
147
|
+
toBlackWhite: function(threshold) {
|
148
|
+
var source = this.getSource(),
|
149
|
+
average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0),
|
150
|
+
currentAlpha = source[3];
|
151
|
+
|
152
|
+
threshold = threshold || 127;
|
153
|
+
|
154
|
+
average = (Number(average) < Number(threshold)) ? 0 : 255;
|
155
|
+
this.setSource([average, average, average, currentAlpha]);
|
156
|
+
return this;
|
157
|
+
},
|
158
|
+
|
159
|
+
/**
|
160
|
+
* Overlays color with another color
|
161
|
+
* @method overlayWith
|
162
|
+
* @param {String|fabric.Color} otherColor
|
163
|
+
* @return {fabric.Color} thisArg
|
164
|
+
*/
|
165
|
+
overlayWith: function(otherColor) {
|
166
|
+
if (!(otherColor instanceof Color)) {
|
167
|
+
otherColor = new Color(otherColor);
|
168
|
+
}
|
169
|
+
|
170
|
+
var result = [],
|
171
|
+
alpha = this.getAlpha(),
|
172
|
+
otherAlpha = 0.5,
|
173
|
+
source = this.getSource(),
|
174
|
+
otherSource = otherColor.getSource();
|
175
|
+
|
176
|
+
for (var i = 0; i < 3; i++) {
|
177
|
+
result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha)));
|
178
|
+
}
|
179
|
+
|
180
|
+
result[3] = alpha;
|
181
|
+
this.setSource(result);
|
182
|
+
return this;
|
183
|
+
}
|
184
|
+
};
|
185
|
+
|
186
|
+
/**
|
187
|
+
* Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgb(255, 100, 10, 0.5), rgb(1,1,1))
|
188
|
+
* @static
|
189
|
+
* @field
|
190
|
+
*/
|
191
|
+
fabric.Color.reRGBa = /^rgba?\((\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})(?:\s*,\s*(\d+(?:\.\d+)?))?\)$/;
|
192
|
+
|
193
|
+
/**
|
194
|
+
* Regex matching color in HEX format (ex: #FF5555, 010155, aff)
|
195
|
+
* @static
|
196
|
+
* @field
|
197
|
+
*/
|
198
|
+
fabric.Color.reHex = /^#?([0-9a-f]{6}|[0-9a-f]{3})$/i;
|
199
|
+
|
200
|
+
/**
|
201
|
+
* Returns new color object, when given a color in RGB format
|
202
|
+
* @method fromRgb
|
203
|
+
* @param {String} color ex: rgb(0-255,0-255,0-255)
|
204
|
+
* @return {fabric.Color}
|
205
|
+
*/
|
206
|
+
fabric.Color.fromRgb = function(color) {
|
207
|
+
return Color.fromSource(Color.sourceFromRgb(color));
|
208
|
+
};
|
209
|
+
|
210
|
+
/**
|
211
|
+
* Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format
|
212
|
+
* @method sourceFromRgb
|
213
|
+
* @param {String} color ex: rgb(0-255,0-255,0-255)
|
214
|
+
* @return {Array} source
|
215
|
+
*/
|
216
|
+
fabric.Color.sourceFromRgb = function(color) {
|
217
|
+
var match = color.match(Color.reRGBa);
|
218
|
+
if (match) {
|
219
|
+
return [
|
220
|
+
parseInt(match[1], 10),
|
221
|
+
parseInt(match[2], 10),
|
222
|
+
parseInt(match[3], 10),
|
223
|
+
match[4] ? parseFloat(match[4]) : 1
|
224
|
+
];
|
225
|
+
}
|
226
|
+
};
|
227
|
+
|
228
|
+
/**
|
229
|
+
* Returns new color object, when given a color in RGBA format
|
230
|
+
* @static
|
231
|
+
* @function
|
232
|
+
* @method fromRgba
|
233
|
+
* @param {String} color
|
234
|
+
* @return {fabric.Color}
|
235
|
+
*/
|
236
|
+
fabric.Color.fromRgba = Color.fromRgb;
|
237
|
+
|
238
|
+
/**
|
239
|
+
* Returns new color object, when given a color in HEX format
|
240
|
+
* @static
|
241
|
+
* @method fromHex
|
242
|
+
* @return {fabric.Color}
|
243
|
+
*/
|
244
|
+
fabric.Color.fromHex = function(color) {
|
245
|
+
return Color.fromSource(Color.sourceFromHex(color));
|
246
|
+
};
|
247
|
+
|
248
|
+
/**
|
249
|
+
* Returns array represenatation (ex: [100, 100, 200, 1]) of a color that's in HEX format
|
250
|
+
* @static
|
251
|
+
* @method sourceFromHex
|
252
|
+
* @param {String} color ex: FF5555
|
253
|
+
* @return {Array} source
|
254
|
+
*/
|
255
|
+
fabric.Color.sourceFromHex = function(color) {
|
256
|
+
if (color.match(Color.reHex)) {
|
257
|
+
var value = color.slice(color.indexOf('#') + 1),
|
258
|
+
isShortNotation = (value.length === 3),
|
259
|
+
r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2),
|
260
|
+
g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4),
|
261
|
+
b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6);
|
262
|
+
|
263
|
+
return [
|
264
|
+
parseInt(r, 16),
|
265
|
+
parseInt(g, 16),
|
266
|
+
parseInt(b, 16),
|
267
|
+
1
|
268
|
+
];
|
269
|
+
}
|
270
|
+
};
|
271
|
+
|
272
|
+
/**
|
273
|
+
* Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5])
|
274
|
+
* @static
|
275
|
+
* @method fromSource
|
276
|
+
* @return {fabric.Color}
|
277
|
+
*/
|
278
|
+
fabric.Color.fromSource = function(source) {
|
279
|
+
var oColor = new Color();
|
280
|
+
oColor.setSource(source);
|
281
|
+
return oColor;
|
282
|
+
};
|
283
|
+
|
284
|
+
})(typeof exports !== 'undefined' ? exports : this);
|
@@ -0,0 +1,169 @@
|
|
1
|
+
(function(global){
|
2
|
+
|
3
|
+
"use strict";
|
4
|
+
|
5
|
+
var fabric = global.fabric || (global.fabric = { }),
|
6
|
+
piBy2 = Math.PI * 2,
|
7
|
+
extend = fabric.util.object.extend;
|
8
|
+
|
9
|
+
if (fabric.Ellipse) {
|
10
|
+
fabric.warn('fabric.Ellipse is already defined.');
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
|
14
|
+
/**
|
15
|
+
* Ellipse class
|
16
|
+
* @class Ellipse
|
17
|
+
* @extends fabric.Object
|
18
|
+
*/
|
19
|
+
fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @scope fabric.Ellipse.prototype */ {
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Type of an object
|
23
|
+
* @property
|
24
|
+
* @type String
|
25
|
+
*/
|
26
|
+
type: 'ellipse',
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Constructor
|
30
|
+
* @method initialize
|
31
|
+
* @param {Object} [options] Options object
|
32
|
+
* @return {fabric.Ellipse} thisArg
|
33
|
+
*/
|
34
|
+
initialize: function(options) {
|
35
|
+
options = options || { };
|
36
|
+
|
37
|
+
this.callSuper('initialize', options);
|
38
|
+
|
39
|
+
this.set('rx', options.rx || 0);
|
40
|
+
this.set('ry', options.ry || 0);
|
41
|
+
|
42
|
+
this.set('width', this.get('rx') * 2);
|
43
|
+
this.set('height', this.get('ry') * 2);
|
44
|
+
},
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Returns object representation of an instance
|
48
|
+
* @method toObject
|
49
|
+
* @param {Array} propertiesToInclude
|
50
|
+
* @return {Object} object representation of an instance
|
51
|
+
*/
|
52
|
+
toObject: function(propertiesToInclude) {
|
53
|
+
return extend(this.callSuper('toObject', propertiesToInclude), {
|
54
|
+
rx: this.get('rx'),
|
55
|
+
ry: this.get('ry')
|
56
|
+
});
|
57
|
+
},
|
58
|
+
|
59
|
+
/**
|
60
|
+
* Returns svg representation of an instance
|
61
|
+
* @method toSVG
|
62
|
+
* @return {String} svg representation of an instance
|
63
|
+
*/
|
64
|
+
toSVG: function() {
|
65
|
+
return [
|
66
|
+
'<ellipse ',
|
67
|
+
'rx="', this.get('rx'), '" ',
|
68
|
+
'ry="', this.get('ry'), '" ',
|
69
|
+
'style="', this.getSvgStyles(), '" ',
|
70
|
+
'transform="', this.getSvgTransform(), '" ',
|
71
|
+
'/>'
|
72
|
+
].join('');
|
73
|
+
},
|
74
|
+
|
75
|
+
/**
|
76
|
+
* Renders this instance on a given context
|
77
|
+
* @method render
|
78
|
+
* @param ctx {CanvasRenderingContext2D} context to render on
|
79
|
+
* @param noTransform {Boolean} context is not transformed when set to true
|
80
|
+
*/
|
81
|
+
render: function(ctx, noTransform) {
|
82
|
+
// do not use `get` for perf. reasons
|
83
|
+
if (this.rx === 0 || this.ry === 0) return;
|
84
|
+
return this.callSuper('render', ctx, noTransform);
|
85
|
+
},
|
86
|
+
|
87
|
+
/**
|
88
|
+
* @private
|
89
|
+
* @method _render
|
90
|
+
* @param ctx {CanvasRenderingContext2D} context to render on
|
91
|
+
*/
|
92
|
+
_render: function(ctx, noTransform) {
|
93
|
+
ctx.beginPath();
|
94
|
+
ctx.save();
|
95
|
+
ctx.globalAlpha = this.group ? (ctx.globalAlpha * this.opacity) : this.opacity;
|
96
|
+
if (this.transformMatrix && this.group) {
|
97
|
+
ctx.translate(this.cx, this.cy);
|
98
|
+
}
|
99
|
+
ctx.transform(1, 0, 0, this.ry/this.rx, 0, 0);
|
100
|
+
ctx.arc(noTransform ? this.left : 0, noTransform ? this.top : 0, this.rx, 0, piBy2, false);
|
101
|
+
if (this.stroke) {
|
102
|
+
ctx.stroke();
|
103
|
+
}
|
104
|
+
this._removeShadow(ctx);
|
105
|
+
if (this.fill) {
|
106
|
+
ctx.fill();
|
107
|
+
}
|
108
|
+
ctx.restore();
|
109
|
+
},
|
110
|
+
|
111
|
+
/**
|
112
|
+
* Returns complexity of an instance
|
113
|
+
* @method complexity
|
114
|
+
* @return {Number} complexity
|
115
|
+
*/
|
116
|
+
complexity: function() {
|
117
|
+
return 1;
|
118
|
+
}
|
119
|
+
});
|
120
|
+
|
121
|
+
/**
|
122
|
+
* List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement})
|
123
|
+
* @static
|
124
|
+
* @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement
|
125
|
+
*/
|
126
|
+
fabric.Ellipse.ATTRIBUTE_NAMES = 'cx cy rx ry fill fill-opacity opacity stroke stroke-width transform'.split(' ');
|
127
|
+
|
128
|
+
/**
|
129
|
+
* Returns {@link fabric.Ellipse} instance from an SVG element
|
130
|
+
* @static
|
131
|
+
* @method fabric.Ellipse.fromElement
|
132
|
+
* @param {SVGElement} element Element to parse
|
133
|
+
* @param {Object} [options] Options object
|
134
|
+
* @return {fabric.Ellipse}
|
135
|
+
*/
|
136
|
+
fabric.Ellipse.fromElement = function(element, options) {
|
137
|
+
options || (options = { });
|
138
|
+
|
139
|
+
var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES);
|
140
|
+
var cx = parsedAttributes.left;
|
141
|
+
var cy = parsedAttributes.top;
|
142
|
+
|
143
|
+
if ('left' in parsedAttributes) {
|
144
|
+
parsedAttributes.left -= (options.width / 2) || 0;
|
145
|
+
}
|
146
|
+
if ('top' in parsedAttributes) {
|
147
|
+
parsedAttributes.top -= (options.height / 2) || 0;
|
148
|
+
}
|
149
|
+
|
150
|
+
var ellipse = new fabric.Ellipse(extend(parsedAttributes, options));
|
151
|
+
|
152
|
+
ellipse.cx = cx || 0;
|
153
|
+
ellipse.cy = cy || 0;
|
154
|
+
|
155
|
+
return ellipse;
|
156
|
+
};
|
157
|
+
|
158
|
+
/**
|
159
|
+
* Returns {@link fabric.Ellipse} instance from an object representation
|
160
|
+
* @static
|
161
|
+
* @method fabric.Ellipse.fromObject
|
162
|
+
* @param {Object} object Object to create an instance from
|
163
|
+
* @return {fabric.Ellipse}
|
164
|
+
*/
|
165
|
+
fabric.Ellipse.fromObject = function(object) {
|
166
|
+
return new fabric.Ellipse(object);
|
167
|
+
};
|
168
|
+
|
169
|
+
})(typeof exports !== 'undefined' ? exports : this);
|