New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

angular-file

Package Overview
Dependencies
Maintainers
1
Versions
60
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

angular-file - npm Package Compare versions

Comparing version
4.0.1
to
4.0.2
+1
-1
package.json
{
"name": "angular-file",
"version": "4.0.1",
"version": "4.0.2",
"description": "Easy to use Angular directives for user file selections",

@@ -5,0 +5,0 @@ "main": "dist/index.js",

{"__symbolic":"module","version":4,"metadata":{"ngfModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":22,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@angular/common","name":"CommonModule","line":24,"character":4}],"declarations":[{"__symbolic":"reference","name":"ɵa"},{"__symbolic":"reference","name":"ɵc"},{"__symbolic":"reference","name":"ɵd"},{"__symbolic":"reference","name":"ɵe"},{"__symbolic":"reference","name":"ɵf"},{"__symbolic":"reference","name":"ɵg"},{"__symbolic":"reference","name":"ɵb"}],"exports":[{"__symbolic":"reference","name":"ɵa"},{"__symbolic":"reference","name":"ɵc"},{"__symbolic":"reference","name":"ɵd"},{"__symbolic":"reference","name":"ɵe"},{"__symbolic":"reference","name":"ɵf"},{"__symbolic":"reference","name":"ɵg"},{"__symbolic":"reference","name":"ɵb"}]}]}],"members":{}},"ɵa":{"__symbolic":"class","extends":{"__symbolic":"reference","name":"ɵb"},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":6,"character":1},"arguments":[{"selector":"[ngfDrop]","exportAs":"ngfDrop"}]}],"members":{"fileOver":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":11,"character":3}}]}],"validDrag":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":13,"character":3}}]}],"validDragChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":14,"character":3}}]}],"invalidDrag":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":16,"character":3}}]}],"invalidDragChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":17,"character":3}}]}],"dragFiles":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":19,"character":3}}]}],"dragFilesChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":20,"character":3}}]}],"onDrop":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":22,"character":3},"arguments":["drop",["$event"]]}]}],"handleFiles":[{"__symbolic":"method"}],"onDragOver":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":43,"character":3},"arguments":["dragover",["$event"]]}]}],"closeDrags":[{"__symbolic":"method"}],"onDragLeave":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":83,"character":3},"arguments":["dragleave",["$event"]]}]}]}},"ɵb":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":15,"character":1},"arguments":[{"selector":"[ngf]","exportAs":"ngf"}]}],"members":{"multiple":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":24,"character":3}}]}],"accept":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":25,"character":3}}]}],"maxSize":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":26,"character":3}}]}],"ngfFixOrientation":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":27,"character":3}}]}],"fileDropDisabled":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":29,"character":3}}]}],"selectable":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":30,"character":3}}]}],"directiveInit":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":31,"character":3},"arguments":["init"]}]}],"lastInvalids":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"lastInvalidsChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":34,"character":3}}]}],"lastBaseUrl":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":36,"character":3}}]}],"lastBaseUrlChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":37,"character":3}}]}],"file":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":39,"character":3}}]}],"fileChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":40,"character":3}}]}],"files":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":42,"character":3}}]}],"filesChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":43,"character":3}}]}],"fileSelectStart":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":45,"character":3}}]}],"capturePaste":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":47,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":51,"character":29}]}],"initFilters":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"ngOnInit":[{"__symbolic":"method"}],"ngOnChanges":[{"__symbolic":"method"}],"evalCapturePaste":[{"__symbolic":"method"}],"destroyPasteListener":[{"__symbolic":"method"}],"paramFileElm":[{"__symbolic":"method"}],"createFileElm":[{"__symbolic":"method"}],"enableSelecting":[{"__symbolic":"method"}],"getValidFiles":[{"__symbolic":"method"}],"getInvalidFiles":[{"__symbolic":"method"}],"handleFiles":[{"__symbolic":"method"}],"que":[{"__symbolic":"method"}],"changeFn":[{"__symbolic":"method"}],"clickHandler":[{"__symbolic":"method"}],"beforeSelect":[{"__symbolic":"method"}],"clearFileElmValue":[{"__symbolic":"method"}],"isEmptyAfterSelection":[{"__symbolic":"method"}],"stopEvent":[{"__symbolic":"method"}],"transferHasFiles":[{"__symbolic":"method"}],"eventToFiles":[{"__symbolic":"method"}],"applyExifRotations":[{"__symbolic":"method"}],"onChange":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"HostListener","line":354,"character":3},"arguments":["change",["$event"]]}]}],"getFileFilterFailName":[{"__symbolic":"method"}],"isFileValid":[{"__symbolic":"method"}],"isFilesValid":[{"__symbolic":"method"}],"_acceptFilter":[{"__symbolic":"method"}],"_fileSizeFilter":[{"__symbolic":"method"}]}},"ɵc":{"__symbolic":"class","extends":{"__symbolic":"reference","name":"ɵb"},"decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":3,"character":1},"arguments":[{"selector":"[ngfSelect]","exportAs":"ngfSelect"}]}],"members":{"selectable":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":8,"character":3}}]}]}},"ɵd":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":3,"character":1},"arguments":[{"selector":"[ngfBackground]"}]}],"members":{"file":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":5,"character":3},"arguments":["ngfBackground"]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":7,"character":32}]}],"ngOnChanges":[{"__symbolic":"method"}]}},"ɵe":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":3,"character":1},"arguments":[{"selector":"[ngfSrc]"}]}],"members":{"file":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":5,"character":3},"arguments":["ngfSrc"]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"ElementRef","line":7,"character":33}]}],"ngOnChanges":[{"__symbolic":"method"}]}},"ɵf":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":2,"character":1},"arguments":[{"selector":"ngfUploadStatus"}]}],"members":{"percent":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":4,"character":3}}]}],"percentChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":5,"character":3}}]}],"httpEvent":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":6,"character":3}}]}],"ngOnChanges":[{"__symbolic":"method"}]}},"ɵg":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Directive","line":7,"character":1},"arguments":[{"selector":"ngfFormData"}]}],"members":{"files":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":9,"character":3}}]}],"postName":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":10,"character":3}}]}],"fileName":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":11,"character":3}}]}],"FormData":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":13,"character":3}}]}],"FormDataChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":14,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"IterableDiffers","line":18,"character":31}]}],"ngDoCheck":[{"__symbolic":"method"}],"buildFormData":[{"__symbolic":"method"}]}}},"origins":{"ngfModule":"./file-upload/ngf.module","ɵa":"./file-upload/ngfDrop.directive","ɵb":"./file-upload/ngf.directive","ɵc":"./file-upload/ngfSelect.directive","ɵd":"./file-upload/ngfBackground.directive","ɵe":"./file-upload/ngfSrc.directive","ɵf":"./file-upload/ngfUploadStatus.directive","ɵg":"./file-upload/ngfFormData.directive"},"importAs":"angular-file"}
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('angular-file/src', ['exports', '@angular/core', '@angular/common'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global["angular-file"] = global["angular-file"] || {}, global["angular-file"].src = {}), global.ng.core, global.ng.common));
})(this, (function (exports, core, common) { 'use strict';
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b)
if (Object.prototype.hasOwnProperty.call(b, p))
d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
var __assign = function () {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __rest(s, e) {
var t = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
}
function __decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if (d = decorators[i])
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __param(paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); };
}
function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function")
throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn)
context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access)
context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done)
throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0)
continue;
if (result === null || typeof result !== "object")
throw new TypeError("Object expected");
if (_ = accept(result.get))
descriptor.get = _;
if (_ = accept(result.set))
descriptor.set = _;
if (_ = accept(result.init))
initializers.push(_);
}
else if (_ = accept(result)) {
if (kind === "field")
initializers.push(_);
else
descriptor[key] = _;
}
}
if (target)
Object.defineProperty(target, contextIn.name, descriptor);
done = true;
}
;
function __runInitializers(thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
}
;
function __propKey(x) {
return typeof x === "symbol" ? x : "".concat(x);
}
;
function __setFunctionName(f, name, prefix) {
if (typeof name === "symbol")
name = name.description ? "[".concat(name.description, "]") : "";
return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
}
;
function __metadata(metadataKey, metadataValue) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
return Reflect.metadata(metadataKey, metadataValue);
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try {
step(generator.next(value));
}
catch (e) {
reject(e);
} }
function rejected(value) { try {
step(generator["throw"](value));
}
catch (e) {
reject(e);
} }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1)
throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [op[0] & 2, t.value];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return { value: op[1], done: false };
case 5:
_.label++;
y = op[1];
op = [0];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
}
catch (e) {
op = [6, e];
y = 0;
}
finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return { value: op[0] ? op[1] : void 0, done: true };
}
}
var __createBinding = Object.create ? (function (o, m, k, k2) {
if (k2 === undefined)
k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function () { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function (o, m, k, k2) {
if (k2 === undefined)
k2 = k;
o[k2] = m[k];
});
function __exportStar(m, o) {
for (var p in m)
if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p))
__createBinding(o, m, p);
}
function __values(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m)
return m.call(o);
if (o && typeof o.length === "number")
return {
next: function () {
if (o && i >= o.length)
o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m)
return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
ar.push(r.value);
}
catch (error) {
e = { error: error };
}
finally {
try {
if (r && !r.done && (m = i["return"]))
m.call(i);
}
finally {
if (e)
throw e.error;
}
}
return ar;
}
/** @deprecated */
function __spread() {
for (var ar = [], i = 0; i < arguments.length; i++)
ar = ar.concat(__read(arguments[i]));
return ar;
}
/** @deprecated */
function __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++)
s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
}
function __spreadArray(to, from, pack) {
if (pack || arguments.length === 2)
for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar)
ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
}
function __await(v) {
return this instanceof __await ? (this.v = v, this) : new __await(v);
}
function __asyncGenerator(thisArg, _arguments, generator) {
if (!Symbol.asyncIterator)
throw new TypeError("Symbol.asyncIterator is not defined.");
var g = generator.apply(thisArg, _arguments || []), i, q = [];
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
function verb(n) { if (g[n])
i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
function resume(n, v) { try {
step(g[n](v));
}
catch (e) {
settle(q[0][3], e);
} }
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
function fulfill(value) { resume("next", value); }
function reject(value) { resume("throw", value); }
function settle(f, v) { if (f(v), q.shift(), q.length)
resume(q[0][0], q[0][1]); }
}
function __asyncDelegator(o) {
var i, p;
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
}
function __asyncValues(o) {
if (!Symbol.asyncIterator)
throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
}
function __makeTemplateObject(cooked, raw) {
if (Object.defineProperty) {
Object.defineProperty(cooked, "raw", { value: raw });
}
else {
cooked.raw = raw;
}
return cooked;
}
;
var __setModuleDefault = Object.create ? (function (o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function (o, v) {
o["default"] = v;
};
function __importStar(mod) {
if (mod && mod.__esModule)
return mod;
var result = {};
if (mod != null)
for (var k in mod)
if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
__createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
}
function __importDefault(mod) {
return (mod && mod.__esModule) ? mod : { default: mod };
}
function __classPrivateFieldGet(receiver, state, kind, f) {
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
}
function __classPrivateFieldSet(receiver, state, value, kind, f) {
if (kind === "m")
throw new TypeError("Private method is not writable");
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
}
function __classPrivateFieldIn(state, receiver) {
if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function"))
throw new TypeError("Cannot use 'in' operator on non-object");
return typeof state === "function" ? receiver === state : state.has(receiver);
}
var isFileInput = function (elm) {
var ty = elm.getAttribute('type');
return elm.tagName.toLowerCase() === 'input' && ty && ty.toLowerCase() === 'file';
};
var initialTouchStartY = 0;
var initialTouchStartX = 0;
var detectSwipe = function (evt) {
var touches = evt.changedTouches || (evt.originalEvent && evt.originalEvent.changedTouches);
if (touches) {
if (evt.type === 'touchstart') {
initialTouchStartX = touches[0].clientX;
initialTouchStartY = touches[0].clientY;
return true; // don't block event default
}
else {
// prevent scroll from triggering event
if (evt.type === 'touchend') {
var currentX = touches[0].clientX;
var currentY = touches[0].clientY;
if ((Math.abs(currentX - initialTouchStartX) > 20) ||
(Math.abs(currentY - initialTouchStartY) > 20)) {
evt.stopPropagation();
if (evt.cancelable) {
evt.preventDefault();
}
return false;
}
}
return true;
}
}
return false;
};
var createInvisibleFileInputWrap = function () {
var fileElem = createFileInput();
var label = document.createElement('label');
label.innerHTML = 'upload';
label.style.visibility = 'hidden';
label.style.position = 'absolute';
label.style.overflow = 'hidden';
label.style.width = '0px';
label.style.height = '0px';
label.style.border = 'none';
label.style.margin = '0px';
label.style.padding = '0px';
label.setAttribute('tabindex', '-1');
//bindAttrToFileInput(fileElem, label);
//generatedElems.push({el: elem, ref: label});
label.appendChild(fileElem);
//document.body.appendChild( label );
return label;
};
var createFileInput = function () {
var fileElem = document.createElement('input');
fileElem.type = "file";
return fileElem;
};
function getWindow() { return window; }
function acceptType(accept, type, name) {
if (!accept) {
return true;
}
var defs = accept.split(',');
var regx;
var acceptRegString;
for (var x = defs.length - 1; x >= 0; --x) {
//Escapes dots in mimetype
acceptRegString = defs[x];
//trim
acceptRegString = acceptRegString.replace(/(^\s+|\s+$)/g, '');
//Escapes stars in mimetype
acceptRegString = acceptRegString.replace(/\*/g, '.*');
//let acceptReg = '^((' + acceptRegString
//acceptReg = acceptReg.replace(/,/g,')|(') + '))$'
//try by mime
regx = new RegExp(acceptRegString, 'gi');
if (type.search(regx) >= 0) {
return true;
}
//try by ext
if (acceptRegString.substring(0, 1) == '.') {
acceptRegString = '\\' + acceptRegString; //.substring(1, acceptRegString.length-1)//remove dot at front
regx = new RegExp(acceptRegString + '$', 'i');
if ((name || type).search(regx) >= 0) {
return true;
}
}
}
return false;
}
function arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
function dataUrltoBlob(dataurl, name, origSize) {
var arr = dataurl.split(',');
var mimeMatch = arr[0].match(/:(.*?);/);
var mime = mimeMatch ? mimeMatch[1] : 'text/plain';
var bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var blob = new window.Blob([u8arr], { type: mime });
blob["name"] = name;
blob["$ngfOrigSize"] = origSize;
return blob;
}
function applyTransform(ctx, orientation, width, height) {
switch (orientation) {
case 2:
return ctx.transform(-1, 0, 0, 1, width, 0);
case 3:
return ctx.transform(-1, 0, 0, -1, width, height);
case 4:
return ctx.transform(1, 0, 0, -1, 0, height);
case 5:
return ctx.transform(0, 1, 1, 0, 0, 0);
case 6:
return ctx.transform(0, 1, -1, 0, height, 0);
case 7:
return ctx.transform(0, -1, -1, 0, height, width);
case 8:
return ctx.transform(0, -1, 1, 0, 0, width);
}
}
function fixFileOrientationByMeta(file, result) {
return dataUrl(file, true)
.then(function (url) {
var canvas = document.createElement('canvas');
var img = document.createElement('img');
return new Promise(function (res, rej) {
img.onload = function () {
try {
canvas.width = result.orientation > 4 ? img.height : img.width;
canvas.height = result.orientation > 4 ? img.width : img.height;
var ctx = canvas.getContext('2d');
applyTransform(ctx, result.orientation, img.width, img.height);
ctx.drawImage(img, 0, 0);
var dataUrl = canvas.toDataURL(file.type || 'image/WebP', 0.934);
var base = arrayBufferToBase64(result.fixedArrayBuffer);
dataUrl = restoreExif(base, dataUrl);
var blob = dataUrltoBlob(dataUrl, file.name);
var newFile = blobToFile(blob, file.name);
res(newFile);
}
catch (e) {
rej(e);
}
};
img.onerror = rej;
img.src = url;
});
});
}
function applyExifRotation(file) {
if (file.type.indexOf('image/jpeg') !== 0) {
return Promise.resolve(file);
}
return readOrientation(file)
.then(function (result) {
if (result.orientation < 2 || result.orientation > 8) {
return file;
}
return fixFileOrientationByMeta(file, result);
});
}
function readOrientation(file) {
return new Promise(function (res, rej) {
var reader = new FileReader();
var slicedFile = file.slice ? file.slice(0, 64 * 1024) : file;
reader.readAsArrayBuffer(slicedFile);
reader.onerror = rej;
reader.onload = function (e) {
var result = { orientation: 1 };
var view = new DataView(this.result);
if (view.getUint16(0, false) !== 0xFFD8)
return res(result);
var length = view.byteLength, offset = 2;
while (offset < length) {
var marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xFFE1) {
if (view.getUint32(offset += 2, false) !== 0x45786966)
return res(result);
var little = view.getUint16(offset += 6, false) === 0x4949;
offset += view.getUint32(offset + 4, little);
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++)
if (view.getUint16(offset + (i * 12), little) === 0x0112) {
var orientation = view.getUint16(offset + (i * 12) + 8, little);
if (orientation >= 2 && orientation <= 8) {
view.setUint16(offset + (i * 12) + 8, 1, little);
result.fixedArrayBuffer = e.target.result;
}
result.orientation = orientation;
return res(result);
}
}
else if ((marker & 0xFF00) !== 0xFF00)
break;
else
offset += view.getUint16(offset, false);
}
return res(result);
};
});
}
/** converts file-input file into base64 dataUri */
function dataUrl(file, disallowObjectUrl) {
if (!file)
return Promise.resolve(file);
if ((disallowObjectUrl && file.$ngfDataUrl != null) || (!disallowObjectUrl && file.$ngfBlobUrl != null)) {
return Promise.resolve(disallowObjectUrl ? file.$ngfDataUrl : file.$ngfBlobUrl);
}
var p = disallowObjectUrl ? file.$$ngfDataUrlPromise : file.$$ngfBlobUrlPromise;
if (p)
return p;
var win = getWindow();
var deferred;
if (win.FileReader && file &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = win.URL || win.webkitURL;
if (FileReader) {
deferred = new Promise(function (res, rej) {
var fileReader = new FileReader();
fileReader.onload = function (event) {
file.$ngfDataUrl = event.target.result;
delete file.$ngfDataUrl;
res(event.target.result);
};
fileReader.onerror = function (e) {
file.$ngfDataUrl = '';
rej(e);
};
fileReader.readAsDataURL(file);
});
}
else {
var url;
try {
url = URL.createObjectURL(file);
}
catch (e) {
return Promise.reject(e);
}
deferred = Promise.resolve(url);
file.$ngfBlobUrl = url;
}
}
else {
file[disallowObjectUrl ? '$ngfDataUrl' : '$ngfBlobUrl'] = '';
return Promise.reject(new Error('Browser does not support window.FileReader, window.FileReader, or window.FileAPI')); //deferred.reject();
}
if (disallowObjectUrl) {
p = file.$$ngfDataUrlPromise = deferred;
}
else {
p = file.$$ngfBlobUrlPromise = deferred;
}
p = p.then(function (x) {
delete file[disallowObjectUrl ? '$$ngfDataUrlPromise' : '$$ngfBlobUrlPromise'];
return x;
});
return p;
}
function restoreExif(orig, resized) {
var ExifRestorer = {
KEY_STR: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
};
ExifRestorer.encode64 = function (input) {
var output = '', chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0;
do {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
}
else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this.KEY_STR.charAt(enc1) +
this.KEY_STR.charAt(enc2) +
this.KEY_STR.charAt(enc3) +
this.KEY_STR.charAt(enc4);
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return output;
};
ExifRestorer.restore = function (origFileBase64, resizedFileBase64) {
if (origFileBase64.match('data:image/jpeg;base64,')) {
origFileBase64 = origFileBase64.replace('data:image/jpeg;base64,', '');
}
var rawImage = this.decode64(origFileBase64);
var segments = this.slice2Segments(rawImage);
var image = this.exifManipulation(resizedFileBase64, segments);
return 'data:image/jpeg;base64,' + this.encode64(image);
};
ExifRestorer.exifManipulation = function (resizedFileBase64, segments) {
var exifArray = this.getExifArray(segments), newImageArray = this.insertExif(resizedFileBase64, exifArray);
return new Uint8Array(newImageArray);
};
ExifRestorer.getExifArray = function (segments) {
var seg;
for (var x = 0; x < segments.length; x++) {
seg = segments[x];
if (seg[0] === 255 && seg[1] === 225) //(ff e1)
{
return seg;
}
}
return [];
};
ExifRestorer.insertExif = function (resizedFileBase64, exifArray) {
var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', ''), buf = this.decode64(imageData), separatePoint = buf.indexOf(255, 3), mae = buf.slice(0, separatePoint), ato = buf.slice(separatePoint), array = mae;
array = array.concat(exifArray);
array = array.concat(ato);
return array;
};
ExifRestorer.slice2Segments = function (rawImageArray) {
var head = 0, segments = [];
while (1) {
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 218) {
break;
}
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 216) {
head += 2;
}
else {
var length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];
var endPoint = head + length + 2;
var seg = rawImageArray.slice(head, endPoint);
segments.push(seg);
head = endPoint;
}
if (head > rawImageArray.length) {
break;
}
}
return segments;
};
ExifRestorer.decode64 = function (input) {
var chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0, buf = [];
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)) {
console.log('There were invalid base64 characters in the input text.');
}
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
do {
enc1 = this.KEY_STR.indexOf(input.charAt(i++));
enc2 = this.KEY_STR.indexOf(input.charAt(i++));
enc3 = this.KEY_STR.indexOf(input.charAt(i++));
enc4 = this.KEY_STR.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
buf.push(chr1);
if (enc3 !== 64) {
buf.push(chr2);
}
if (enc4 !== 64) {
buf.push(chr3);
}
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return buf;
};
return ExifRestorer.restore(orig, resized); //<= EXIF
}
;
function blobToFile(theBlob, fileName) {
var b = theBlob;
//A Blob() is almost a File() - it's just missing the two properties below which we will add
b.lastModifiedDate = new Date();
b.name = fileName;
//Cast to a File() type
return theBlob;
}
/** A master base set of logic intended to support file select/drag/drop operations
NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting
*/
var ngf = /** @class */ (function () {
function ngf(element) {
this.element = element;
this.filters = [];
this.lastFileCount = 0;
this.ngfFixOrientation = true;
this.fileDropDisabled = false;
this.selectable = false;
this.directiveInit = new core.EventEmitter();
this.lastInvalids = [];
this.lastInvalidsChange = new core.EventEmitter();
this.lastBaseUrlChange = new core.EventEmitter();
this.fileChange = new core.EventEmitter();
this.files = [];
this.filesChange = new core.EventEmitter();
this.fileSelectStart = new core.EventEmitter();
this.initFilters();
}
ngf.prototype.initFilters = function () {
// the order is important
this.filters.push({ name: 'accept', fn: this._acceptFilter });
this.filters.push({ name: 'fileSize', fn: this._fileSizeFilter });
//this.filters.push({name: 'fileType', fn: this._fileTypeFilter})
//this.filters.push({name: 'queueLimit', fn: this._queueLimitFilter})
//this.filters.push({name: 'mimeType', fn: this._mimeTypeFilter})
};
ngf.prototype.ngOnDestroy = function () {
delete this.fileElm; //faster memory release of dom element
this.destroyPasteListener();
};
ngf.prototype.ngOnInit = function () {
var _this = this;
var selectable = (this.selectable || this.selectable === '') && !['false', 'null', '0'].includes(this.selectable);
if (selectable) {
this.enableSelecting();
}
if (this.multiple) {
this.paramFileElm().setAttribute('multiple', this.multiple);
}
this.evalCapturePaste();
// create reference to this class with one cycle delay to avoid ExpressionChangedAfterItHasBeenCheckedError
setTimeout(function () {
_this.directiveInit.emit(_this);
}, 0);
};
ngf.prototype.ngOnChanges = function (changes) {
var _a, _b;
if (changes.accept) {
this.paramFileElm().setAttribute('accept', changes.accept.currentValue || '*');
}
if (changes.capturePaste) {
this.evalCapturePaste();
}
// Did we go from having a file to not having a file? Clear file element then
if (changes.file && changes.file.previousValue && !changes.file.currentValue) {
this.clearFileElmValue();
}
// Did we go from having files to not having files? Clear file element then
if (changes.files) {
var filesWentToZero = ((_a = changes.files.previousValue) === null || _a === void 0 ? void 0 : _a.length) && !((_b = changes.files.currentValue) === null || _b === void 0 ? void 0 : _b.length);
if (filesWentToZero) {
this.clearFileElmValue();
}
}
};
ngf.prototype.evalCapturePaste = function () {
var _this = this;
var isActive = this.capturePaste || this.capturePaste === '' || ['false', '0', 'null'].includes(this.capturePaste);
if (isActive) {
if (this.pasteCapturer) {
return; // already listening
}
this.pasteCapturer = function (e) {
var clip = e.clipboardData;
if (clip && clip.files && clip.files.length) {
_this.handleFiles(clip.files);
e.preventDefault();
}
};
window.addEventListener('paste', this.pasteCapturer);
return;
}
this.destroyPasteListener();
};
ngf.prototype.destroyPasteListener = function () {
if (this.pasteCapturer) {
window.removeEventListener('paste', this.pasteCapturer);
delete this.pasteCapturer;
}
};
ngf.prototype.paramFileElm = function () {
if (this.fileElm)
return this.fileElm; // already defined
// elm already is a file input
var isFile = isFileInput(this.element.nativeElement);
if (isFile) {
return this.fileElm = this.element.nativeElement;
}
// the host elm is NOT a file input
return this.fileElm = this.createFileElm({
change: this.changeFn.bind(this)
});
};
/** Only used when host element we are attached to is NOT a fileElement */
ngf.prototype.createFileElm = function (_c) {
var change = _c.change;
// use specific technique to hide file element within
var label = createInvisibleFileInputWrap();
var fileElm = label.getElementsByTagName('input')[0];
fileElm.addEventListener('change', change);
this.element.nativeElement.appendChild(label); // put on html stage
return fileElm;
};
ngf.prototype.enableSelecting = function () {
var _this = this;
var elm = this.element.nativeElement;
if (isFileInput(elm)) {
var bindedHandler_1 = function (event) { return _this.beforeSelect(event); };
elm.addEventListener('click', bindedHandler_1);
elm.addEventListener('touchstart', bindedHandler_1);
return;
}
var bindedHandler = function (ev) { return _this.clickHandler(ev); };
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
elm.addEventListener('touchend', bindedHandler);
};
ngf.prototype.getValidFiles = function (files) {
var rtn = [];
for (var x = files.length - 1; x >= 0; --x) {
if (this.isFileValid(files[x])) {
rtn.push(files[x]);
}
}
return rtn;
};
ngf.prototype.getInvalidFiles = function (files) {
var rtn = [];
for (var x = files.length - 1; x >= 0; --x) {
var failReason = this.getFileFilterFailName(files[x]);
if (failReason) {
rtn.push({
file: files[x],
type: failReason
});
}
}
return rtn;
};
// Primary handler of files coming in
ngf.prototype.handleFiles = function (files) {
var _this = this;
var valids = this.getValidFiles(files);
if (files.length != valids.length) {
this.lastInvalids = this.getInvalidFiles(files);
}
else {
delete this.lastInvalids;
}
this.lastInvalidsChange.emit(this.lastInvalids);
if (valids.length) {
if (this.ngfFixOrientation) {
this.applyExifRotations(valids)
.then(function (fixedFiles) { return _this.que(fixedFiles); });
}
else {
this.que(valids);
}
}
if (this.isEmptyAfterSelection()) {
this.element.nativeElement.value = '';
}
};
ngf.prototype.que = function (files) {
var _this = this;
this.files = this.files || [];
Array.prototype.push.apply(this.files, files);
//below break memory ref and doesnt act like a que
//this.files = files//causes memory change which triggers bindings like <ngfFormData [files]="files"></ngfFormData>
this.filesChange.emit(this.files);
if (files.length) {
this.fileChange.emit(this.file = files[0]);
if (this.lastBaseUrlChange.observers.length) {
dataUrl(files[0])
.then(function (url) { return _this.lastBaseUrlChange.emit(url); });
}
}
//will be checked for input value clearing
this.lastFileCount = this.files.length;
};
/** called when input has files */
ngf.prototype.changeFn = function (event) {
var fileList = event.__files_ || (event.target && event.target.files);
if (!fileList)
return;
this.stopEvent(event);
this.handleFiles(fileList);
};
ngf.prototype.clickHandler = function (evt) {
var elm = this.element.nativeElement;
if (elm.getAttribute('disabled') || this.fileDropDisabled) {
return false;
}
var r = detectSwipe(evt);
// prevent the click if it is a swipe
if (r !== false)
return r;
var fileElm = this.paramFileElm();
fileElm.click();
//fileElm.dispatchEvent( new Event('click') );
this.beforeSelect(evt);
return false;
};
ngf.prototype.beforeSelect = function (event) {
this.fileSelectStart.emit(event);
if (this.files && this.lastFileCount === this.files.length)
return;
// if no files in array, be sure browser does not prevent reselect of same file (see github issue 27)
this.clearFileElmValue();
};
ngf.prototype.clearFileElmValue = function () {
if (!this.fileElm)
return;
this.fileElm.value = null;
};
ngf.prototype.isEmptyAfterSelection = function () {
return !!this.element.nativeElement.attributes.multiple;
};
ngf.prototype.stopEvent = function (event) {
event.preventDefault();
event.stopPropagation();
};
ngf.prototype.transferHasFiles = function (transfer) {
if (!transfer.types) {
return false;
}
if (transfer.types.indexOf) {
return transfer.types.indexOf('Files') !== -1;
}
else if (transfer.types.contains) {
return transfer.types.contains('Files');
}
else {
return false;
}
};
ngf.prototype.eventToFiles = function (event) {
var transfer = eventToTransfer(event);
if (transfer) {
if (transfer.files && transfer.files.length) {
return transfer.files;
}
if (transfer.items && transfer.items.length) {
return transfer.items;
}
}
return [];
};
ngf.prototype.applyExifRotations = function (files) {
var mapper = function (file, index) {
return applyExifRotation(file)
.then(function (fixedFile) { return files.splice(index, 1, fixedFile); });
};
var proms = [];
for (var x = files.length - 1; x >= 0; --x) {
proms[x] = mapper(files[x], x);
}
return Promise.all(proms).then(function () { return files; });
};
ngf.prototype.onChange = function (event) {
var files = this.element.nativeElement.files || this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
};
ngf.prototype.getFileFilterFailName = function (file) {
for (var i = 0; i < this.filters.length; i++) {
if (!this.filters[i].fn.call(this, file)) {
return this.filters[i].name;
}
}
return undefined;
};
ngf.prototype.isFileValid = function (file) {
var noFilters = !this.accept && (!this.filters || !this.filters.length);
if (noFilters) {
return true; //we have no filters so all files are valid
}
return this.getFileFilterFailName(file) ? false : true;
};
ngf.prototype.isFilesValid = function (files) {
for (var x = files.length - 1; x >= 0; --x) {
if (!this.isFileValid(files[x])) {
return false;
}
}
return true;
};
ngf.prototype._acceptFilter = function (item) {
return acceptType(this.accept, item.type, item.name);
};
ngf.prototype._fileSizeFilter = function (item) {
return !(this.maxSize && item.size > this.maxSize);
};
return ngf;
}());
ngf.decorators = [
{ type: core.Directive, args: [{
selector: "[ngf]",
exportAs: "ngf"
},] }
];
ngf.ctorParameters = function () { return [
{ type: core.ElementRef }
]; };
ngf.propDecorators = {
multiple: [{ type: core.Input }],
accept: [{ type: core.Input }],
maxSize: [{ type: core.Input }],
ngfFixOrientation: [{ type: core.Input }],
fileDropDisabled: [{ type: core.Input }],
selectable: [{ type: core.Input }],
directiveInit: [{ type: core.Output, args: ['init',] }],
lastInvalids: [{ type: core.Input }],
lastInvalidsChange: [{ type: core.Output }],
lastBaseUrl: [{ type: core.Input }],
lastBaseUrlChange: [{ type: core.Output }],
file: [{ type: core.Input }],
fileChange: [{ type: core.Output }],
files: [{ type: core.Input }],
filesChange: [{ type: core.Output }],
fileSelectStart: [{ type: core.Output }],
capturePaste: [{ type: core.Input }],
onChange: [{ type: core.HostListener, args: ['change', ['$event'],] }]
};
/** browsers try hard to conceal data about file drags, this tends to undo that */
function filesToWriteableObject(files) {
var jsonFiles = [];
for (var x = 0; x < files.length; ++x) {
jsonFiles.push({
type: files[x].type,
kind: files[x]["kind"]
});
}
return jsonFiles;
}
function eventToTransfer(event) {
if (event.dataTransfer)
return event.dataTransfer;
return event.originalEvent ? event.originalEvent.dataTransfer : null;
}
var ngfSelect = /** @class */ (function (_super) {
__extends(ngfSelect, _super);
function ngfSelect() {
var _this = _super.apply(this, __spreadArray([], __read(arguments))) || this;
_this.selectable = true;
return _this;
}
return ngfSelect;
}(ngf));
ngfSelect.decorators = [
{ type: core.Directive, args: [{
selector: "[ngfSelect]",
exportAs: "ngfSelect"
},] }
];
ngfSelect.propDecorators = {
selectable: [{ type: core.Input }]
};
var ngfDrop = /** @class */ (function (_super) {
__extends(ngfDrop, _super);
function ngfDrop() {
var _this = _super.apply(this, __spreadArray([], __read(arguments))) || this;
_this.fileOver = new core.EventEmitter();
_this.validDrag = false;
_this.validDragChange = new core.EventEmitter();
_this.invalidDrag = false;
_this.invalidDragChange = new core.EventEmitter();
_this.dragFilesChange = new core.EventEmitter();
return _this;
}
ngfDrop.prototype.onDrop = function (event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
var files = this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
};
ngfDrop.prototype.handleFiles = function (files) {
this.fileOver.emit(false); //turn-off dragover
_super.prototype.handleFiles.call(this, files);
};
ngfDrop.prototype.onDragOver = function (event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
var transfer = eventToTransfer(event);
var files = this.eventToFiles(event);
var jsonFiles = filesToWriteableObject(files);
this.dragFilesChange.emit(this.dragFiles = jsonFiles);
if (files.length) {
this.validDrag = this.isFilesValid(files);
}
else {
//Safari, IE11 & some browsers do NOT tell you about dragged files until dropped. Always consider a valid drag
this.validDrag = true;
}
this.validDragChange.emit(this.validDrag);
this.invalidDrag = !this.validDrag;
this.invalidDragChange.emit(this.invalidDrag);
transfer.dropEffect = 'copy'; // change cursor and visual display
this.stopEvent(event);
this.fileOver.emit(true);
};
ngfDrop.prototype.closeDrags = function () {
delete this.validDrag;
this.validDragChange.emit(this.validDrag);
this.invalidDrag = false;
this.invalidDragChange.emit(this.invalidDrag);
delete this.dragFiles;
this.dragFilesChange.emit(this.dragFiles);
};
ngfDrop.prototype.onDragLeave = function (event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
if (this.element) {
if (event.currentTarget === this.element[0]) {
return;
}
}
this.stopEvent(event);
this.fileOver.emit(false);
};
return ngfDrop;
}(ngf));
ngfDrop.decorators = [
{ type: core.Directive, args: [{
selector: "[ngfDrop]",
exportAs: "ngfDrop"
},] }
];
ngfDrop.propDecorators = {
fileOver: [{ type: core.Output }],
validDrag: [{ type: core.Input }],
validDragChange: [{ type: core.Output }],
invalidDrag: [{ type: core.Input }],
invalidDragChange: [{ type: core.Output }],
dragFiles: [{ type: core.Input }],
dragFilesChange: [{ type: core.Output }],
onDrop: [{ type: core.HostListener, args: ['drop', ['$event'],] }],
onDragOver: [{ type: core.HostListener, args: ['dragover', ['$event'],] }],
onDragLeave: [{ type: core.HostListener, args: ['dragleave', ['$event'],] }]
};
var ngfBackground = /** @class */ (function () {
function ngfBackground(ElementRef) {
this.ElementRef = ElementRef;
}
ngfBackground.prototype.ngOnChanges = function (_changes) {
var _this = this;
dataUrl(this.file)
.then(function (src) {
var urlString = 'url(\'' + (src || '') + '\')';
_this.ElementRef.nativeElement.style.backgroundImage = urlString;
});
};
return ngfBackground;
}());
ngfBackground.decorators = [
{ type: core.Directive, args: [{ selector: '[ngfBackground]' },] }
];
ngfBackground.ctorParameters = function () { return [
{ type: core.ElementRef }
]; };
ngfBackground.propDecorators = {
file: [{ type: core.Input, args: ['ngfBackground',] }]
};
var ngfUploadStatus = /** @class */ (function () {
function ngfUploadStatus() {
this.percent = 0;
this.percentChange = new core.EventEmitter();
}
ngfUploadStatus.prototype.ngOnChanges = function (changes) {
var _this = this;
if (changes.httpEvent && changes.httpEvent.currentValue) {
var event_1 = changes.httpEvent.currentValue;
if (event_1.loaded && event_1.total) {
setTimeout(function () {
_this.percent = Math.round(100 * event_1.loaded / event_1.total);
_this.percentChange.emit(_this.percent);
}, 0);
}
}
};
return ngfUploadStatus;
}());
ngfUploadStatus.decorators = [
{ type: core.Directive, args: [{ selector: 'ngfUploadStatus' },] }
];
ngfUploadStatus.propDecorators = {
percent: [{ type: core.Input }],
percentChange: [{ type: core.Output }],
httpEvent: [{ type: core.Input }]
};
var ngfFormData = /** @class */ (function () {
function ngfFormData(IterableDiffers) {
this.postName = "file";
this.FormData = new FormData();
this.FormDataChange = new core.EventEmitter();
this.differ = IterableDiffers.find([]).create();
}
ngfFormData.prototype.ngDoCheck = function () {
var _this = this;
var changes = this.differ.diff(this.files);
if (changes) {
setTimeout(function () { return _this.buildFormData(); }, 0);
}
};
ngfFormData.prototype.buildFormData = function () {
var _this = this;
var isArray = typeof (this.files) === 'object' && this.files.constructor === Array;
if (isArray) {
this.FormData = new FormData();
var files = this.files || [];
files.forEach(function (file) { return _this.FormData.append(_this.postName, file, _this.fileName || file.name); });
this.FormDataChange.emit(this.FormData);
}
else {
delete this.FormData;
}
};
return ngfFormData;
}());
ngfFormData.decorators = [
{ type: core.Directive, args: [{ selector: 'ngfFormData' },] }
];
ngfFormData.ctorParameters = function () { return [
{ type: core.IterableDiffers }
]; };
ngfFormData.propDecorators = {
files: [{ type: core.Input }],
postName: [{ type: core.Input }],
fileName: [{ type: core.Input }],
FormData: [{ type: core.Input }],
FormDataChange: [{ type: core.Output }]
};
var ngfSrc = /** @class */ (function () {
function ngfSrc(ElementRef) {
this.ElementRef = ElementRef;
}
ngfSrc.prototype.ngOnChanges = function (_changes) {
var _this = this;
dataUrl(this.file)
.then(function (src) { return _this.ElementRef.nativeElement.src = src; });
};
return ngfSrc;
}());
ngfSrc.decorators = [
{ type: core.Directive, args: [{ selector: '[ngfSrc]' },] }
];
ngfSrc.ctorParameters = function () { return [
{ type: core.ElementRef }
]; };
ngfSrc.propDecorators = {
file: [{ type: core.Input, args: ['ngfSrc',] }]
};
//import{ HttpModule } from '@angular/http';
var declarations = [
ngfDrop,
ngfSelect,
ngfBackground,
ngfSrc,
ngfUploadStatus,
ngfFormData,
ngf
];
var ngfModule = /** @class */ (function () {
function ngfModule() {
}
return ngfModule;
}());
ngfModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
common.CommonModule
//,HttpModule
],
declarations: declarations,
exports: declarations //[HttpModule, ...declarations]
},] }
];
/*
* Public API Surface of angular-file
*/
/**
* Generated bundle index. Do not edit.
*/
exports.eventToTransfer = eventToTransfer;
exports.filesToWriteableObject = filesToWriteableObject;
exports.ngf = ngf;
exports.ngfBackground = ngfBackground;
exports.ngfDrop = ngfDrop;
exports.ngfFormData = ngfFormData;
exports.ngfModule = ngfModule;
exports.ngfSelect = ngfSelect;
exports.ngfSrc = ngfSrc;
exports.ngfUploadStatus = ngfUploadStatus;
Object.defineProperty(exports, '__esModule', { value: true });
}));
//# sourceMappingURL=angular-file-src.umd.js.map

Sorry, the diff of this file is too big to display

(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/common'), require('@angular/core')) :
typeof define === 'function' && define.amd ? define('angular-file', ['exports', '@angular/common', '@angular/core'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["angular-file"] = {}, global.ng.common, global.ng.core));
})(this, (function (exports, common, core) { 'use strict';
function getWindow() { return window; }
function acceptType(accept, type, name) {
if (!accept) {
return true;
}
var defs = accept.split(',');
var regx;
var acceptRegString;
for (var x = defs.length - 1; x >= 0; --x) {
//Escapes dots in mimetype
acceptRegString = defs[x];
//trim
acceptRegString = acceptRegString.replace(/(^\s+|\s+$)/g, '');
//Escapes stars in mimetype
acceptRegString = acceptRegString.replace(/\*/g, '.*');
//let acceptReg = '^((' + acceptRegString
//acceptReg = acceptReg.replace(/,/g,')|(') + '))$'
//try by mime
regx = new RegExp(acceptRegString, 'gi');
if (type.search(regx) >= 0) {
return true;
}
//try by ext
if (acceptRegString.substring(0, 1) == '.') {
acceptRegString = '\\' + acceptRegString; //.substring(1, acceptRegString.length-1)//remove dot at front
regx = new RegExp(acceptRegString + '$', 'i');
if ((name || type).search(regx) >= 0) {
return true;
}
}
}
return false;
}
function arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
function dataUrltoBlob(dataurl, name, origSize) {
var arr = dataurl.split(',');
var mimeMatch = arr[0].match(/:(.*?);/);
var mime = mimeMatch ? mimeMatch[1] : 'text/plain';
var bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var blob = new window.Blob([u8arr], { type: mime });
blob["name"] = name;
blob["$ngfOrigSize"] = origSize;
return blob;
}
function applyTransform(ctx, orientation, width, height) {
switch (orientation) {
case 2:
return ctx.transform(-1, 0, 0, 1, width, 0);
case 3:
return ctx.transform(-1, 0, 0, -1, width, height);
case 4:
return ctx.transform(1, 0, 0, -1, 0, height);
case 5:
return ctx.transform(0, 1, 1, 0, 0, 0);
case 6:
return ctx.transform(0, 1, -1, 0, height, 0);
case 7:
return ctx.transform(0, -1, -1, 0, height, width);
case 8:
return ctx.transform(0, -1, 1, 0, 0, width);
}
}
function fixFileOrientationByMeta(file, result) {
return dataUrl(file, true)
.then(function (url) {
var canvas = document.createElement('canvas');
var img = document.createElement('img');
return new Promise(function (res, rej) {
img.onload = function () {
try {
canvas.width = result.orientation > 4 ? img.height : img.width;
canvas.height = result.orientation > 4 ? img.width : img.height;
var ctx = canvas.getContext('2d');
applyTransform(ctx, result.orientation, img.width, img.height);
ctx.drawImage(img, 0, 0);
var dataUrl = canvas.toDataURL(file.type || 'image/WebP', 0.934);
var base = arrayBufferToBase64(result.fixedArrayBuffer);
dataUrl = restoreExif(base, dataUrl);
var blob = dataUrltoBlob(dataUrl, file.name);
var newFile = blobToFile(blob, file.name);
res(newFile);
}
catch (e) {
rej(e);
}
};
img.onerror = rej;
img.src = url;
});
});
}
function applyExifRotation(file) {
if (file.type.indexOf('image/jpeg') !== 0) {
return Promise.resolve(file);
}
return readOrientation(file)
.then(function (result) {
if (result.orientation < 2 || result.orientation > 8) {
return file;
}
return fixFileOrientationByMeta(file, result);
});
}
function readOrientation(file) {
return new Promise(function (res, rej) {
var reader = new FileReader();
var slicedFile = file.slice ? file.slice(0, 64 * 1024) : file;
reader.readAsArrayBuffer(slicedFile);
reader.onerror = rej;
reader.onload = function (e) {
var result = { orientation: 1 };
var view = new DataView(this.result);
if (view.getUint16(0, false) !== 0xFFD8)
return res(result);
var length = view.byteLength, offset = 2;
while (offset < length) {
var marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xFFE1) {
if (view.getUint32(offset += 2, false) !== 0x45786966)
return res(result);
var little = view.getUint16(offset += 6, false) === 0x4949;
offset += view.getUint32(offset + 4, little);
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++)
if (view.getUint16(offset + (i * 12), little) === 0x0112) {
var orientation = view.getUint16(offset + (i * 12) + 8, little);
if (orientation >= 2 && orientation <= 8) {
view.setUint16(offset + (i * 12) + 8, 1, little);
result.fixedArrayBuffer = e.target.result;
}
result.orientation = orientation;
return res(result);
}
}
else if ((marker & 0xFF00) !== 0xFF00)
break;
else
offset += view.getUint16(offset, false);
}
return res(result);
};
});
}
/** converts file-input file into base64 dataUri */
function dataUrl(file, disallowObjectUrl) {
if (!file)
return Promise.resolve(file);
if ((disallowObjectUrl && file.$ngfDataUrl != null) || (!disallowObjectUrl && file.$ngfBlobUrl != null)) {
return Promise.resolve(disallowObjectUrl ? file.$ngfDataUrl : file.$ngfBlobUrl);
}
var p = disallowObjectUrl ? file.$$ngfDataUrlPromise : file.$$ngfBlobUrlPromise;
if (p)
return p;
var win = getWindow();
var deferred;
if (win.FileReader && file &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = win.URL || win.webkitURL;
if (FileReader) {
deferred = new Promise(function (res, rej) {
var fileReader = new FileReader();
fileReader.onload = function (event) {
file.$ngfDataUrl = event.target.result;
delete file.$ngfDataUrl;
res(event.target.result);
};
fileReader.onerror = function (e) {
file.$ngfDataUrl = '';
rej(e);
};
fileReader.readAsDataURL(file);
});
}
else {
var url;
try {
url = URL.createObjectURL(file);
}
catch (e) {
return Promise.reject(e);
}
deferred = Promise.resolve(url);
file.$ngfBlobUrl = url;
}
}
else {
file[disallowObjectUrl ? '$ngfDataUrl' : '$ngfBlobUrl'] = '';
return Promise.reject(new Error('Browser does not support window.FileReader, window.FileReader, or window.FileAPI')); //deferred.reject();
}
if (disallowObjectUrl) {
p = file.$$ngfDataUrlPromise = deferred;
}
else {
p = file.$$ngfBlobUrlPromise = deferred;
}
p = p.then(function (x) {
delete file[disallowObjectUrl ? '$$ngfDataUrlPromise' : '$$ngfBlobUrlPromise'];
return x;
});
return p;
}
function restoreExif(orig, resized) {
var ExifRestorer = {
KEY_STR: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
};
ExifRestorer.encode64 = function (input) {
var output = '', chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0;
do {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
}
else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this.KEY_STR.charAt(enc1) +
this.KEY_STR.charAt(enc2) +
this.KEY_STR.charAt(enc3) +
this.KEY_STR.charAt(enc4);
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return output;
};
ExifRestorer.restore = function (origFileBase64, resizedFileBase64) {
if (origFileBase64.match('data:image/jpeg;base64,')) {
origFileBase64 = origFileBase64.replace('data:image/jpeg;base64,', '');
}
var rawImage = this.decode64(origFileBase64);
var segments = this.slice2Segments(rawImage);
var image = this.exifManipulation(resizedFileBase64, segments);
return 'data:image/jpeg;base64,' + this.encode64(image);
};
ExifRestorer.exifManipulation = function (resizedFileBase64, segments) {
var exifArray = this.getExifArray(segments), newImageArray = this.insertExif(resizedFileBase64, exifArray);
return new Uint8Array(newImageArray);
};
ExifRestorer.getExifArray = function (segments) {
var seg;
for (var x = 0; x < segments.length; x++) {
seg = segments[x];
if (seg[0] === 255 && seg[1] === 225) //(ff e1)
{
return seg;
}
}
return [];
};
ExifRestorer.insertExif = function (resizedFileBase64, exifArray) {
var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', ''), buf = this.decode64(imageData), separatePoint = buf.indexOf(255, 3), mae = buf.slice(0, separatePoint), ato = buf.slice(separatePoint), array = mae;
array = array.concat(exifArray);
array = array.concat(ato);
return array;
};
ExifRestorer.slice2Segments = function (rawImageArray) {
var head = 0, segments = [];
while (1) {
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 218) {
break;
}
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 216) {
head += 2;
}
else {
var length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];
var endPoint = head + length + 2;
var seg = rawImageArray.slice(head, endPoint);
segments.push(seg);
head = endPoint;
}
if (head > rawImageArray.length) {
break;
}
}
return segments;
};
ExifRestorer.decode64 = function (input) {
var chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0, buf = [];
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)) {
console.log('There were invalid base64 characters in the input text.');
}
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
do {
enc1 = this.KEY_STR.indexOf(input.charAt(i++));
enc2 = this.KEY_STR.indexOf(input.charAt(i++));
enc3 = this.KEY_STR.indexOf(input.charAt(i++));
enc4 = this.KEY_STR.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
buf.push(chr1);
if (enc3 !== 64) {
buf.push(chr2);
}
if (enc4 !== 64) {
buf.push(chr3);
}
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return buf;
};
return ExifRestorer.restore(orig, resized); //<= EXIF
}
;
function blobToFile(theBlob, fileName) {
var b = theBlob;
//A Blob() is almost a File() - it's just missing the two properties below which we will add
b.lastModifiedDate = new Date();
b.name = fileName;
//Cast to a File() type
return theBlob;
}
var ngfBackground = /** @class */ (function () {
function ngfBackground(ElementRef) {
this.ElementRef = ElementRef;
}
ngfBackground.prototype.ngOnChanges = function (_changes) {
var _this = this;
dataUrl(this.file)
.then(function (src) {
var urlString = 'url(\'' + (src || '') + '\')';
_this.ElementRef.nativeElement.style.backgroundImage = urlString;
});
};
return ngfBackground;
}());
ngfBackground.decorators = [
{ type: core.Directive, args: [{ selector: '[ngfBackground]' },] }
];
ngfBackground.ctorParameters = function () { return [
{ type: core.ElementRef }
]; };
ngfBackground.propDecorators = {
file: [{ type: core.Input, args: ['ngfBackground',] }]
};
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise */
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b)
if (Object.prototype.hasOwnProperty.call(b, p))
d[p] = b[p]; };
return extendStatics(d, b);
};
function __extends(d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
}
var __assign = function () {
__assign = Object.assign || function __assign(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
function __rest(s, e) {
var t = {};
for (var p in s)
if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
}
function __decorate(decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
r = Reflect.decorate(decorators, target, key, desc);
else
for (var i = decorators.length - 1; i >= 0; i--)
if (d = decorators[i])
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
}
function __param(paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); };
}
function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function")
throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn)
context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access)
context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done)
throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0)
continue;
if (result === null || typeof result !== "object")
throw new TypeError("Object expected");
if (_ = accept(result.get))
descriptor.get = _;
if (_ = accept(result.set))
descriptor.set = _;
if (_ = accept(result.init))
initializers.push(_);
}
else if (_ = accept(result)) {
if (kind === "field")
initializers.push(_);
else
descriptor[key] = _;
}
}
if (target)
Object.defineProperty(target, contextIn.name, descriptor);
done = true;
}
;
function __runInitializers(thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
}
;
function __propKey(x) {
return typeof x === "symbol" ? x : "".concat(x);
}
;
function __setFunctionName(f, name, prefix) {
if (typeof name === "symbol")
name = name.description ? "[".concat(name.description, "]") : "";
return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
}
;
function __metadata(metadataKey, metadataValue) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
return Reflect.metadata(metadataKey, metadataValue);
}
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try {
step(generator.next(value));
}
catch (e) {
reject(e);
} }
function rejected(value) { try {
step(generator["throw"](value));
}
catch (e) {
reject(e);
} }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
function __generator(thisArg, body) {
var _ = { label: 0, sent: function () { if (t[0] & 1)
throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f)
throw new TypeError("Generator is already executing.");
while (g && (g = 0, op[0] && (_ = 0)), _)
try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
return t;
if (y = 0, t)
op = [op[0] & 2, t.value];
switch (op[0]) {
case 0:
case 1:
t = op;
break;
case 4:
_.label++;
return { value: op[1], done: false };
case 5:
_.label++;
y = op[1];
op = [0];
continue;
case 7:
op = _.ops.pop();
_.trys.pop();
continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
_ = 0;
continue;
}
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
_.label = op[1];
break;
}
if (op[0] === 6 && _.label < t[1]) {
_.label = t[1];
t = op;
break;
}
if (t && _.label < t[2]) {
_.label = t[2];
_.ops.push(op);
break;
}
if (t[2])
_.ops.pop();
_.trys.pop();
continue;
}
op = body.call(thisArg, _);
}
catch (e) {
op = [6, e];
y = 0;
}
finally {
f = t = 0;
}
if (op[0] & 5)
throw op[1];
return { value: op[0] ? op[1] : void 0, done: true };
}
}
var __createBinding = Object.create ? (function (o, m, k, k2) {
if (k2 === undefined)
k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function () { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function (o, m, k, k2) {
if (k2 === undefined)
k2 = k;
o[k2] = m[k];
});
function __exportStar(m, o) {
for (var p in m)
if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p))
__createBinding(o, m, p);
}
function __values(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m)
return m.call(o);
if (o && typeof o.length === "number")
return {
next: function () {
if (o && i >= o.length)
o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
}
function __read(o, n) {
var m = typeof Symbol === "function" && o[Symbol.iterator];
if (!m)
return o;
var i = m.call(o), r, ar = [], e;
try {
while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
ar.push(r.value);
}
catch (error) {
e = { error: error };
}
finally {
try {
if (r && !r.done && (m = i["return"]))
m.call(i);
}
finally {
if (e)
throw e.error;
}
}
return ar;
}
/** @deprecated */
function __spread() {
for (var ar = [], i = 0; i < arguments.length; i++)
ar = ar.concat(__read(arguments[i]));
return ar;
}
/** @deprecated */
function __spreadArrays() {
for (var s = 0, i = 0, il = arguments.length; i < il; i++)
s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
}
function __spreadArray(to, from, pack) {
if (pack || arguments.length === 2)
for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar)
ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
}
function __await(v) {
return this instanceof __await ? (this.v = v, this) : new __await(v);
}
function __asyncGenerator(thisArg, _arguments, generator) {
if (!Symbol.asyncIterator)
throw new TypeError("Symbol.asyncIterator is not defined.");
var g = generator.apply(thisArg, _arguments || []), i, q = [];
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
function verb(n) { if (g[n])
i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
function resume(n, v) { try {
step(g[n](v));
}
catch (e) {
settle(q[0][3], e);
} }
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
function fulfill(value) { resume("next", value); }
function reject(value) { resume("throw", value); }
function settle(f, v) { if (f(v), q.shift(), q.length)
resume(q[0][0], q[0][1]); }
}
function __asyncDelegator(o) {
var i, p;
return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }
}
function __asyncValues(o) {
if (!Symbol.asyncIterator)
throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
}
function __makeTemplateObject(cooked, raw) {
if (Object.defineProperty) {
Object.defineProperty(cooked, "raw", { value: raw });
}
else {
cooked.raw = raw;
}
return cooked;
}
;
var __setModuleDefault = Object.create ? (function (o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function (o, v) {
o["default"] = v;
};
function __importStar(mod) {
if (mod && mod.__esModule)
return mod;
var result = {};
if (mod != null)
for (var k in mod)
if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
__createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
}
function __importDefault(mod) {
return (mod && mod.__esModule) ? mod : { default: mod };
}
function __classPrivateFieldGet(receiver, state, kind, f) {
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
}
function __classPrivateFieldSet(receiver, state, value, kind, f) {
if (kind === "m")
throw new TypeError("Private method is not writable");
if (kind === "a" && !f)
throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
}
function __classPrivateFieldIn(state, receiver) {
if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function"))
throw new TypeError("Cannot use 'in' operator on non-object");
return typeof state === "function" ? receiver === state : state.has(receiver);
}
var isFileInput = function (elm) {
var ty = elm.getAttribute('type');
return elm.tagName.toLowerCase() === 'input' && ty && ty.toLowerCase() === 'file';
};
var initialTouchStartY = 0;
var initialTouchStartX = 0;
var detectSwipe = function (evt) {
var touches = evt.changedTouches || (evt.originalEvent && evt.originalEvent.changedTouches);
if (touches) {
if (evt.type === 'touchstart') {
initialTouchStartX = touches[0].clientX;
initialTouchStartY = touches[0].clientY;
return true; // don't block event default
}
else {
// prevent scroll from triggering event
if (evt.type === 'touchend') {
var currentX = touches[0].clientX;
var currentY = touches[0].clientY;
if ((Math.abs(currentX - initialTouchStartX) > 20) ||
(Math.abs(currentY - initialTouchStartY) > 20)) {
evt.stopPropagation();
if (evt.cancelable) {
evt.preventDefault();
}
return false;
}
}
return true;
}
}
return false;
};
var createInvisibleFileInputWrap = function () {
var fileElem = createFileInput();
var label = document.createElement('label');
label.innerHTML = 'upload';
label.style.visibility = 'hidden';
label.style.position = 'absolute';
label.style.overflow = 'hidden';
label.style.width = '0px';
label.style.height = '0px';
label.style.border = 'none';
label.style.margin = '0px';
label.style.padding = '0px';
label.setAttribute('tabindex', '-1');
//bindAttrToFileInput(fileElem, label);
//generatedElems.push({el: elem, ref: label});
label.appendChild(fileElem);
//document.body.appendChild( label );
return label;
};
var createFileInput = function () {
var fileElem = document.createElement('input');
fileElem.type = "file";
return fileElem;
};
/** A master base set of logic intended to support file select/drag/drop operations
NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting
*/
var ngf = /** @class */ (function () {
function ngf(element) {
this.element = element;
this.filters = [];
this.lastFileCount = 0;
this.ngfFixOrientation = true;
this.fileDropDisabled = false;
this.selectable = false;
this.directiveInit = new core.EventEmitter();
this.lastInvalids = [];
this.lastInvalidsChange = new core.EventEmitter();
this.lastBaseUrlChange = new core.EventEmitter();
this.fileChange = new core.EventEmitter();
this.files = [];
this.filesChange = new core.EventEmitter();
this.fileSelectStart = new core.EventEmitter();
this.initFilters();
}
ngf.prototype.initFilters = function () {
// the order is important
this.filters.push({ name: 'accept', fn: this._acceptFilter });
this.filters.push({ name: 'fileSize', fn: this._fileSizeFilter });
//this.filters.push({name: 'fileType', fn: this._fileTypeFilter})
//this.filters.push({name: 'queueLimit', fn: this._queueLimitFilter})
//this.filters.push({name: 'mimeType', fn: this._mimeTypeFilter})
};
ngf.prototype.ngOnDestroy = function () {
delete this.fileElm; //faster memory release of dom element
this.destroyPasteListener();
};
ngf.prototype.ngOnInit = function () {
var _this = this;
var selectable = (this.selectable || this.selectable === '') && !['false', 'null', '0'].includes(this.selectable);
if (selectable) {
this.enableSelecting();
}
if (this.multiple) {
this.paramFileElm().setAttribute('multiple', this.multiple);
}
this.evalCapturePaste();
// create reference to this class with one cycle delay to avoid ExpressionChangedAfterItHasBeenCheckedError
setTimeout(function () {
_this.directiveInit.emit(_this);
}, 0);
};
ngf.prototype.ngOnChanges = function (changes) {
var _a, _b;
if (changes.accept) {
this.paramFileElm().setAttribute('accept', changes.accept.currentValue || '*');
}
if (changes.capturePaste) {
this.evalCapturePaste();
}
// Did we go from having a file to not having a file? Clear file element then
if (changes.file && changes.file.previousValue && !changes.file.currentValue) {
this.clearFileElmValue();
}
// Did we go from having files to not having files? Clear file element then
if (changes.files) {
var filesWentToZero = ((_a = changes.files.previousValue) === null || _a === void 0 ? void 0 : _a.length) && !((_b = changes.files.currentValue) === null || _b === void 0 ? void 0 : _b.length);
if (filesWentToZero) {
this.clearFileElmValue();
}
}
};
ngf.prototype.evalCapturePaste = function () {
var _this = this;
var isActive = this.capturePaste || this.capturePaste === '' || ['false', '0', 'null'].includes(this.capturePaste);
if (isActive) {
if (this.pasteCapturer) {
return; // already listening
}
this.pasteCapturer = function (e) {
var clip = e.clipboardData;
if (clip && clip.files && clip.files.length) {
_this.handleFiles(clip.files);
e.preventDefault();
}
};
window.addEventListener('paste', this.pasteCapturer);
return;
}
this.destroyPasteListener();
};
ngf.prototype.destroyPasteListener = function () {
if (this.pasteCapturer) {
window.removeEventListener('paste', this.pasteCapturer);
delete this.pasteCapturer;
}
};
ngf.prototype.paramFileElm = function () {
if (this.fileElm)
return this.fileElm; // already defined
// elm already is a file input
var isFile = isFileInput(this.element.nativeElement);
if (isFile) {
return this.fileElm = this.element.nativeElement;
}
// the host elm is NOT a file input
return this.fileElm = this.createFileElm({
change: this.changeFn.bind(this)
});
};
/** Only used when host element we are attached to is NOT a fileElement */
ngf.prototype.createFileElm = function (_c) {
var change = _c.change;
// use specific technique to hide file element within
var label = createInvisibleFileInputWrap();
var fileElm = label.getElementsByTagName('input')[0];
fileElm.addEventListener('change', change);
this.element.nativeElement.appendChild(label); // put on html stage
return fileElm;
};
ngf.prototype.enableSelecting = function () {
var _this = this;
var elm = this.element.nativeElement;
if (isFileInput(elm)) {
var bindedHandler_1 = function (event) { return _this.beforeSelect(event); };
elm.addEventListener('click', bindedHandler_1);
elm.addEventListener('touchstart', bindedHandler_1);
return;
}
var bindedHandler = function (ev) { return _this.clickHandler(ev); };
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
elm.addEventListener('touchend', bindedHandler);
};
ngf.prototype.getValidFiles = function (files) {
var rtn = [];
for (var x = files.length - 1; x >= 0; --x) {
if (this.isFileValid(files[x])) {
rtn.push(files[x]);
}
}
return rtn;
};
ngf.prototype.getInvalidFiles = function (files) {
var rtn = [];
for (var x = files.length - 1; x >= 0; --x) {
var failReason = this.getFileFilterFailName(files[x]);
if (failReason) {
rtn.push({
file: files[x],
type: failReason
});
}
}
return rtn;
};
// Primary handler of files coming in
ngf.prototype.handleFiles = function (files) {
var _this = this;
var valids = this.getValidFiles(files);
if (files.length != valids.length) {
this.lastInvalids = this.getInvalidFiles(files);
}
else {
delete this.lastInvalids;
}
this.lastInvalidsChange.emit(this.lastInvalids);
if (valids.length) {
if (this.ngfFixOrientation) {
this.applyExifRotations(valids)
.then(function (fixedFiles) { return _this.que(fixedFiles); });
}
else {
this.que(valids);
}
}
if (this.isEmptyAfterSelection()) {
this.element.nativeElement.value = '';
}
};
ngf.prototype.que = function (files) {
var _this = this;
this.files = this.files || [];
Array.prototype.push.apply(this.files, files);
//below break memory ref and doesnt act like a que
//this.files = files//causes memory change which triggers bindings like <ngfFormData [files]="files"></ngfFormData>
this.filesChange.emit(this.files);
if (files.length) {
this.fileChange.emit(this.file = files[0]);
if (this.lastBaseUrlChange.observers.length) {
dataUrl(files[0])
.then(function (url) { return _this.lastBaseUrlChange.emit(url); });
}
}
//will be checked for input value clearing
this.lastFileCount = this.files.length;
};
/** called when input has files */
ngf.prototype.changeFn = function (event) {
var fileList = event.__files_ || (event.target && event.target.files);
if (!fileList)
return;
this.stopEvent(event);
this.handleFiles(fileList);
};
ngf.prototype.clickHandler = function (evt) {
var elm = this.element.nativeElement;
if (elm.getAttribute('disabled') || this.fileDropDisabled) {
return false;
}
var r = detectSwipe(evt);
// prevent the click if it is a swipe
if (r !== false)
return r;
var fileElm = this.paramFileElm();
fileElm.click();
//fileElm.dispatchEvent( new Event('click') );
this.beforeSelect(evt);
return false;
};
ngf.prototype.beforeSelect = function (event) {
this.fileSelectStart.emit(event);
if (this.files && this.lastFileCount === this.files.length)
return;
// if no files in array, be sure browser does not prevent reselect of same file (see github issue 27)
this.clearFileElmValue();
};
ngf.prototype.clearFileElmValue = function () {
if (!this.fileElm)
return;
this.fileElm.value = null;
};
ngf.prototype.isEmptyAfterSelection = function () {
return !!this.element.nativeElement.attributes.multiple;
};
ngf.prototype.stopEvent = function (event) {
event.preventDefault();
event.stopPropagation();
};
ngf.prototype.transferHasFiles = function (transfer) {
if (!transfer.types) {
return false;
}
if (transfer.types.indexOf) {
return transfer.types.indexOf('Files') !== -1;
}
else if (transfer.types.contains) {
return transfer.types.contains('Files');
}
else {
return false;
}
};
ngf.prototype.eventToFiles = function (event) {
var transfer = eventToTransfer(event);
if (transfer) {
if (transfer.files && transfer.files.length) {
return transfer.files;
}
if (transfer.items && transfer.items.length) {
return transfer.items;
}
}
return [];
};
ngf.prototype.applyExifRotations = function (files) {
var mapper = function (file, index) {
return applyExifRotation(file)
.then(function (fixedFile) { return files.splice(index, 1, fixedFile); });
};
var proms = [];
for (var x = files.length - 1; x >= 0; --x) {
proms[x] = mapper(files[x], x);
}
return Promise.all(proms).then(function () { return files; });
};
ngf.prototype.onChange = function (event) {
var files = this.element.nativeElement.files || this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
};
ngf.prototype.getFileFilterFailName = function (file) {
for (var i = 0; i < this.filters.length; i++) {
if (!this.filters[i].fn.call(this, file)) {
return this.filters[i].name;
}
}
return undefined;
};
ngf.prototype.isFileValid = function (file) {
var noFilters = !this.accept && (!this.filters || !this.filters.length);
if (noFilters) {
return true; //we have no filters so all files are valid
}
return this.getFileFilterFailName(file) ? false : true;
};
ngf.prototype.isFilesValid = function (files) {
for (var x = files.length - 1; x >= 0; --x) {
if (!this.isFileValid(files[x])) {
return false;
}
}
return true;
};
ngf.prototype._acceptFilter = function (item) {
return acceptType(this.accept, item.type, item.name);
};
ngf.prototype._fileSizeFilter = function (item) {
return !(this.maxSize && item.size > this.maxSize);
};
return ngf;
}());
ngf.decorators = [
{ type: core.Directive, args: [{
selector: "[ngf]",
exportAs: "ngf"
},] }
];
ngf.ctorParameters = function () { return [
{ type: core.ElementRef }
]; };
ngf.propDecorators = {
multiple: [{ type: core.Input }],
accept: [{ type: core.Input }],
maxSize: [{ type: core.Input }],
ngfFixOrientation: [{ type: core.Input }],
fileDropDisabled: [{ type: core.Input }],
selectable: [{ type: core.Input }],
directiveInit: [{ type: core.Output, args: ['init',] }],
lastInvalids: [{ type: core.Input }],
lastInvalidsChange: [{ type: core.Output }],
lastBaseUrl: [{ type: core.Input }],
lastBaseUrlChange: [{ type: core.Output }],
file: [{ type: core.Input }],
fileChange: [{ type: core.Output }],
files: [{ type: core.Input }],
filesChange: [{ type: core.Output }],
fileSelectStart: [{ type: core.Output }],
capturePaste: [{ type: core.Input }],
onChange: [{ type: core.HostListener, args: ['change', ['$event'],] }]
};
/** browsers try hard to conceal data about file drags, this tends to undo that */
function filesToWriteableObject(files) {
var jsonFiles = [];
for (var x = 0; x < files.length; ++x) {
jsonFiles.push({
type: files[x].type,
kind: files[x]["kind"]
});
}
return jsonFiles;
}
function eventToTransfer(event) {
if (event.dataTransfer)
return event.dataTransfer;
return event.originalEvent ? event.originalEvent.dataTransfer : null;
}
var ngfDrop = /** @class */ (function (_super) {
__extends(ngfDrop, _super);
function ngfDrop() {
var _this = _super.apply(this, __spreadArray([], __read(arguments))) || this;
_this.fileOver = new core.EventEmitter();
_this.validDrag = false;
_this.validDragChange = new core.EventEmitter();
_this.invalidDrag = false;
_this.invalidDragChange = new core.EventEmitter();
_this.dragFilesChange = new core.EventEmitter();
return _this;
}
ngfDrop.prototype.onDrop = function (event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
var files = this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
};
ngfDrop.prototype.handleFiles = function (files) {
this.fileOver.emit(false); //turn-off dragover
_super.prototype.handleFiles.call(this, files);
};
ngfDrop.prototype.onDragOver = function (event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
var transfer = eventToTransfer(event);
var files = this.eventToFiles(event);
var jsonFiles = filesToWriteableObject(files);
this.dragFilesChange.emit(this.dragFiles = jsonFiles);
if (files.length) {
this.validDrag = this.isFilesValid(files);
}
else {
//Safari, IE11 & some browsers do NOT tell you about dragged files until dropped. Always consider a valid drag
this.validDrag = true;
}
this.validDragChange.emit(this.validDrag);
this.invalidDrag = !this.validDrag;
this.invalidDragChange.emit(this.invalidDrag);
transfer.dropEffect = 'copy'; // change cursor and visual display
this.stopEvent(event);
this.fileOver.emit(true);
};
ngfDrop.prototype.closeDrags = function () {
delete this.validDrag;
this.validDragChange.emit(this.validDrag);
this.invalidDrag = false;
this.invalidDragChange.emit(this.invalidDrag);
delete this.dragFiles;
this.dragFilesChange.emit(this.dragFiles);
};
ngfDrop.prototype.onDragLeave = function (event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
if (this.element) {
if (event.currentTarget === this.element[0]) {
return;
}
}
this.stopEvent(event);
this.fileOver.emit(false);
};
return ngfDrop;
}(ngf));
ngfDrop.decorators = [
{ type: core.Directive, args: [{
selector: "[ngfDrop]",
exportAs: "ngfDrop"
},] }
];
ngfDrop.propDecorators = {
fileOver: [{ type: core.Output }],
validDrag: [{ type: core.Input }],
validDragChange: [{ type: core.Output }],
invalidDrag: [{ type: core.Input }],
invalidDragChange: [{ type: core.Output }],
dragFiles: [{ type: core.Input }],
dragFilesChange: [{ type: core.Output }],
onDrop: [{ type: core.HostListener, args: ['drop', ['$event'],] }],
onDragOver: [{ type: core.HostListener, args: ['dragover', ['$event'],] }],
onDragLeave: [{ type: core.HostListener, args: ['dragleave', ['$event'],] }]
};
var ngfSelect = /** @class */ (function (_super) {
__extends(ngfSelect, _super);
function ngfSelect() {
var _this = _super.apply(this, __spreadArray([], __read(arguments))) || this;
_this.selectable = true;
return _this;
}
return ngfSelect;
}(ngf));
ngfSelect.decorators = [
{ type: core.Directive, args: [{
selector: "[ngfSelect]",
exportAs: "ngfSelect"
},] }
];
ngfSelect.propDecorators = {
selectable: [{ type: core.Input }]
};
var ngfUploadStatus = /** @class */ (function () {
function ngfUploadStatus() {
this.percent = 0;
this.percentChange = new core.EventEmitter();
}
ngfUploadStatus.prototype.ngOnChanges = function (changes) {
var _this = this;
if (changes.httpEvent && changes.httpEvent.currentValue) {
var event_1 = changes.httpEvent.currentValue;
if (event_1.loaded && event_1.total) {
setTimeout(function () {
_this.percent = Math.round(100 * event_1.loaded / event_1.total);
_this.percentChange.emit(_this.percent);
}, 0);
}
}
};
return ngfUploadStatus;
}());
ngfUploadStatus.decorators = [
{ type: core.Directive, args: [{ selector: 'ngfUploadStatus' },] }
];
ngfUploadStatus.propDecorators = {
percent: [{ type: core.Input }],
percentChange: [{ type: core.Output }],
httpEvent: [{ type: core.Input }]
};
var ngfFormData = /** @class */ (function () {
function ngfFormData(IterableDiffers) {
this.postName = "file";
this.FormData = new FormData();
this.FormDataChange = new core.EventEmitter();
this.differ = IterableDiffers.find([]).create();
}
ngfFormData.prototype.ngDoCheck = function () {
var _this = this;
var changes = this.differ.diff(this.files);
if (changes) {
setTimeout(function () { return _this.buildFormData(); }, 0);
}
};
ngfFormData.prototype.buildFormData = function () {
var _this = this;
var isArray = typeof (this.files) === 'object' && this.files.constructor === Array;
if (isArray) {
this.FormData = new FormData();
var files = this.files || [];
files.forEach(function (file) { return _this.FormData.append(_this.postName, file, _this.fileName || file.name); });
this.FormDataChange.emit(this.FormData);
}
else {
delete this.FormData;
}
};
return ngfFormData;
}());
ngfFormData.decorators = [
{ type: core.Directive, args: [{ selector: 'ngfFormData' },] }
];
ngfFormData.ctorParameters = function () { return [
{ type: core.IterableDiffers }
]; };
ngfFormData.propDecorators = {
files: [{ type: core.Input }],
postName: [{ type: core.Input }],
fileName: [{ type: core.Input }],
FormData: [{ type: core.Input }],
FormDataChange: [{ type: core.Output }]
};
var ngfSrc = /** @class */ (function () {
function ngfSrc(ElementRef) {
this.ElementRef = ElementRef;
}
ngfSrc.prototype.ngOnChanges = function (_changes) {
var _this = this;
dataUrl(this.file)
.then(function (src) { return _this.ElementRef.nativeElement.src = src; });
};
return ngfSrc;
}());
ngfSrc.decorators = [
{ type: core.Directive, args: [{ selector: '[ngfSrc]' },] }
];
ngfSrc.ctorParameters = function () { return [
{ type: core.ElementRef }
]; };
ngfSrc.propDecorators = {
file: [{ type: core.Input, args: ['ngfSrc',] }]
};
//import{ HttpModule } from '@angular/http';
var declarations = [
ngfDrop,
ngfSelect,
ngfBackground,
ngfSrc,
ngfUploadStatus,
ngfFormData,
ngf
];
var ngfModule = /** @class */ (function () {
function ngfModule() {
}
return ngfModule;
}());
ngfModule.decorators = [
{ type: core.NgModule, args: [{
imports: [
common.CommonModule
//,HttpModule
],
declarations: declarations,
exports: declarations //[HttpModule, ...declarations]
},] }
];
/**
* Generated bundle index. Do not edit.
*/
exports.ngfModule = ngfModule;
exports["ɵa"] = ngfDrop;
exports["ɵb"] = ngf;
exports["ɵc"] = ngfSelect;
exports["ɵd"] = ngfBackground;
exports["ɵe"] = ngfSrc;
exports["ɵf"] = ngfUploadStatus;
exports["ɵg"] = ngfFormData;
Object.defineProperty(exports, '__esModule', { value: true });
}));
//# sourceMappingURL=angular-file.umd.js.map

Sorry, the diff of this file is too big to display

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@angular/core"),require("@angular/common")):"function"==typeof define&&define.amd?define("angular-file",["exports","@angular/core","@angular/common"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["angular-file"]={},e.ng.core,e.ng.common)}(this,(function(e,t,n){"use strict";var i=function(e,t){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(e,t)};function r(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}Object.create;function a(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var i,r,a=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(i=a.next()).done;)s.push(i.value)}catch(e){r={error:e}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return s}function s(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(a(arguments[t]));return e}Object.create;var o=function(e){var t=e.getAttribute("type");return"input"===e.tagName.toLowerCase()&&t&&"file"===t.toLowerCase()},l=0,u=0,f=function(){var e=document.createElement("input");return e.type="file",e};function p(e,t){return h(e,!0).then((function(n){var i=document.createElement("canvas"),r=document.createElement("img");return new Promise((function(a,s){r.onload=function(){try{i.width=t.orientation>4?r.height:r.width,i.height=t.orientation>4?r.width:r.height;var n=i.getContext("2d");!function(e,t,n,i){switch(t){case 2:return e.transform(-1,0,0,1,n,0);case 3:return e.transform(-1,0,0,-1,n,i);case 4:return e.transform(1,0,0,-1,0,i);case 5:return e.transform(0,1,1,0,0,0);case 6:return e.transform(0,1,-1,0,i,0);case 7:return e.transform(0,-1,-1,0,i,n);case 8:e.transform(0,-1,1,0,0,n)}}(n,t.orientation,r.width,r.height),n.drawImage(r,0,0);var o=i.toDataURL(e.type||"image/WebP",.934),l=function(e){for(var t="",n=new Uint8Array(e),i=n.byteLength,r=0;r<i;r++)t+=String.fromCharCode(n[r]);return window.btoa(t)}(t.fixedArrayBuffer),u=function(e,t,n){for(var i=e.split(","),r=i[0].match(/:(.*?);/),a=r?r[1]:"text/plain",s=atob(i[1]),o=s.length,l=new Uint8Array(o);o--;)l[o]=s.charCodeAt(o);var u=new window.Blob([l],{type:a});return u.name=t,u.$ngfOrigSize=n,u}(o={KEY_STR:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode64:function(e){var t,n,i,r,a,s="",o="",l="",u=0;do{i=(t=e[u++])>>2,r=(3&t)<<4|(n=e[u++])>>4,a=(15&n)<<2|(o=e[u++])>>6,l=63&o,isNaN(n)?a=l=64:isNaN(o)&&(l=64),s=s+this.KEY_STR.charAt(i)+this.KEY_STR.charAt(r)+this.KEY_STR.charAt(a)+this.KEY_STR.charAt(l),t=n=o="",i=r=a=l=""}while(u<e.length);return s},restore:function(e,t){e.match("data:image/jpeg;base64,")&&(e=e.replace("data:image/jpeg;base64,",""));var n=this.decode64(e),i=this.slice2Segments(n),r=this.exifManipulation(t,i);return"data:image/jpeg;base64,"+this.encode64(r)},exifManipulation:function(e,t){var n=this.getExifArray(t),i=this.insertExif(e,n);return new Uint8Array(i)},getExifArray:function(e){for(var t,n=0;n<e.length;n++)if(255===(t=e[n])[0]&&225===t[1])return t;return[]},insertExif:function(e,t){var n=e.replace("data:image/jpeg;base64,",""),i=this.decode64(n),r=i.indexOf(255,3),a=i.slice(0,r),s=i.slice(r),o=a;return o=(o=o.concat(t)).concat(s)},slice2Segments:function(e){for(var t=0,n=[];255!==e[t]||218!==e[t+1];){if(255===e[t]&&216===e[t+1])t+=2;else{var i=t+(256*e[t+2]+e[t+3])+2,r=e.slice(t,i);n.push(r),t=i}if(t>e.length)break}return n},decode64:function(e){var t,n,i,r,a="",s="",o=0,l=[];/[^A-Za-z0-9\+\/\=]/g.exec(e)&&console.log("There were invalid base64 characters in the input text."),e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{t=this.KEY_STR.indexOf(e.charAt(o++))<<2|(i=this.KEY_STR.indexOf(e.charAt(o++)))>>4,n=(15&i)<<4|(r=this.KEY_STR.indexOf(e.charAt(o++)))>>2,a=(3&r)<<6|(s=this.KEY_STR.indexOf(e.charAt(o++))),l.push(t),64!==r&&l.push(n),64!==s&&l.push(a),t=n=a="",i=r=s=""}while(o<e.length);return l}}.restore(l,o),e.name),f=(p=u,c=e.name,(h=p).lastModifiedDate=new Date,h.name=c,p);a(f)}catch(e){s(e)}var p,c,h},r.onerror=s,r.src=n}))}))}function c(e){return 0!==e.type.indexOf("image/jpeg")?Promise.resolve(e):function(e){return new Promise((function(t,n){var i=new FileReader,r=e.slice?e.slice(0,65536):e;i.readAsArrayBuffer(r),i.onerror=n,i.onload=function(e){var n={orientation:1},i=new DataView(this.result);if(65496!==i.getUint16(0,!1))return t(n);for(var r=i.byteLength,a=2;a<r;){var s=i.getUint16(a,!1);if(a+=2,65505===s){if(1165519206!==i.getUint32(a+=2,!1))return t(n);var o=18761===i.getUint16(a+=6,!1);a+=i.getUint32(a+4,o);var l=i.getUint16(a,o);a+=2;for(var u=0;u<l;u++)if(274===i.getUint16(a+12*u,o)){var f=i.getUint16(a+12*u+8,o);return f>=2&&f<=8&&(i.setUint16(a+12*u+8,1,o),n.fixedArrayBuffer=e.target.result),n.orientation=f,t(n)}}else{if(65280!=(65280&s))break;a+=i.getUint16(a,!1)}}return t(n)}}))}(e).then((function(t){return t.orientation<2||t.orientation>8?e:p(e,t)}))}function h(e,t){if(!e)return Promise.resolve(e);if(t&&null!=e.$ngfDataUrl||!t&&null!=e.$ngfBlobUrl)return Promise.resolve(t?e.$ngfDataUrl:e.$ngfBlobUrl);var n=t?e.$$ngfDataUrlPromise:e.$$ngfBlobUrlPromise;if(n)return n;var i,r=window;if(!r.FileReader||!e||r.FileAPI&&-1!==navigator.userAgent.indexOf("MSIE 8")&&!(e.size<2e4)||r.FileAPI&&-1!==navigator.userAgent.indexOf("MSIE 9")&&!(e.size<4e6))return e[t?"$ngfDataUrl":"$ngfBlobUrl"]="",Promise.reject(new Error("Browser does not support window.FileReader, window.FileReader, or window.FileAPI"));var a=r.URL||r.webkitURL;if(FileReader)i=new Promise((function(t,n){var i=new FileReader;i.onload=function(n){e.$ngfDataUrl=n.target.result,delete e.$ngfDataUrl,t(n.target.result)},i.onerror=function(t){e.$ngfDataUrl="",n(t)},i.readAsDataURL(e)}));else{var s;try{s=a.createObjectURL(e)}catch(e){return Promise.reject(e)}i=Promise.resolve(s),e.$ngfBlobUrl=s}return n=(n=t?e.$$ngfDataUrlPromise=i:e.$$ngfBlobUrlPromise=i).then((function(n){return delete e[t?"$$ngfDataUrlPromise":"$$ngfBlobUrlPromise"],n}))}var g=function(){function e(e){this.element=e,this.filters=[],this.lastFileCount=0,this.ngfFixOrientation=!0,this.fileDropDisabled=!1,this.selectable=!1,this.directiveInit=new t.EventEmitter,this.lastInvalids=[],this.lastInvalidsChange=new t.EventEmitter,this.lastBaseUrlChange=new t.EventEmitter,this.fileChange=new t.EventEmitter,this.files=[],this.filesChange=new t.EventEmitter,this.fileSelectStart=new t.EventEmitter,this.initFilters()}return e.prototype.initFilters=function(){this.filters.push({name:"accept",fn:this._acceptFilter}),this.filters.push({name:"fileSize",fn:this._fileSizeFilter})},e.prototype.ngOnDestroy=function(){delete this.fileElm,this.destroyPasteListener()},e.prototype.ngOnInit=function(){var e=this;(this.selectable||""===this.selectable)&&!["false","null","0"].includes(this.selectable)&&this.enableSelecting(),this.multiple&&this.paramFileElm().setAttribute("multiple",this.multiple),this.evalCapturePaste(),setTimeout((function(){e.directiveInit.emit(e)}),0)},e.prototype.ngOnChanges=function(e){var t,n;(e.accept&&this.paramFileElm().setAttribute("accept",e.accept.currentValue||"*"),e.capturePaste&&this.evalCapturePaste(),e.file&&e.file.previousValue&&!e.file.currentValue&&this.clearFileElmValue(),e.files)&&((null===(t=e.files.previousValue)||void 0===t?void 0:t.length)&&!(null===(n=e.files.currentValue)||void 0===n?void 0:n.length)&&this.clearFileElmValue())},e.prototype.evalCapturePaste=function(){var e=this;if(this.capturePaste||""===this.capturePaste||["false","0","null"].includes(this.capturePaste)){if(this.pasteCapturer)return;return this.pasteCapturer=function(t){var n=t.clipboardData;n&&n.files&&n.files.length&&(e.handleFiles(n.files),t.preventDefault())},void window.addEventListener("paste",this.pasteCapturer)}this.destroyPasteListener()},e.prototype.destroyPasteListener=function(){this.pasteCapturer&&(window.removeEventListener("paste",this.pasteCapturer),delete this.pasteCapturer)},e.prototype.paramFileElm=function(){if(this.fileElm)return this.fileElm;var e=o(this.element.nativeElement);return this.fileElm=e?this.element.nativeElement:this.createFileElm({change:this.changeFn.bind(this)})},e.prototype.createFileElm=function(e){var t=e.change,n=function(){var e=f(),t=document.createElement("label");return t.innerHTML="upload",t.style.visibility="hidden",t.style.position="absolute",t.style.overflow="hidden",t.style.width="0px",t.style.height="0px",t.style.border="none",t.style.margin="0px",t.style.padding="0px",t.setAttribute("tabindex","-1"),t.appendChild(e),t}(),i=n.getElementsByTagName("input")[0];return i.addEventListener("change",t),this.element.nativeElement.appendChild(n),i},e.prototype.enableSelecting=function(){var e=this,t=this.element.nativeElement;if(o(t)){var n=function(t){return e.beforeSelect(t)};return t.addEventListener("click",n),void t.addEventListener("touchstart",n)}var i=function(t){return e.clickHandler(t)};t.addEventListener("click",i),t.addEventListener("touchstart",i),t.addEventListener("touchend",i)},e.prototype.getValidFiles=function(e){for(var t=[],n=e.length-1;n>=0;--n)this.isFileValid(e[n])&&t.push(e[n]);return t},e.prototype.getInvalidFiles=function(e){for(var t=[],n=e.length-1;n>=0;--n){var i=this.getFileFilterFailName(e[n]);i&&t.push({file:e[n],type:i})}return t},e.prototype.handleFiles=function(e){var t=this,n=this.getValidFiles(e);e.length!=n.length?this.lastInvalids=this.getInvalidFiles(e):delete this.lastInvalids,this.lastInvalidsChange.emit(this.lastInvalids),n.length&&(this.ngfFixOrientation?this.applyExifRotations(n).then((function(e){return t.que(e)})):this.que(n)),this.isEmptyAfterSelection()&&(this.element.nativeElement.value="")},e.prototype.que=function(e){var t=this;this.files=this.files||[],Array.prototype.push.apply(this.files,e),this.filesChange.emit(this.files),e.length&&(this.fileChange.emit(this.file=e[0]),this.lastBaseUrlChange.observers.length&&h(e[0]).then((function(e){return t.lastBaseUrlChange.emit(e)}))),this.lastFileCount=this.files.length},e.prototype.changeFn=function(e){var t=e.__files_||e.target&&e.target.files;t&&(this.stopEvent(e),this.handleFiles(t))},e.prototype.clickHandler=function(e){if(this.element.nativeElement.getAttribute("disabled")||this.fileDropDisabled)return!1;var t=function(e){var t=e.changedTouches||e.originalEvent&&e.originalEvent.changedTouches;if(t){if("touchstart"===e.type)return u=t[0].clientX,l=t[0].clientY,!0;if("touchend"===e.type){var n=t[0].clientX,i=t[0].clientY;if(Math.abs(n-u)>20||Math.abs(i-l)>20)return e.stopPropagation(),e.cancelable&&e.preventDefault(),!1}return!0}return!1}(e);return!1!==t?t:(this.paramFileElm().click(),this.beforeSelect(e),!1)},e.prototype.beforeSelect=function(e){this.fileSelectStart.emit(e),this.files&&this.lastFileCount===this.files.length||this.clearFileElmValue()},e.prototype.clearFileElmValue=function(){this.fileElm&&(this.fileElm.value=null)},e.prototype.isEmptyAfterSelection=function(){return!!this.element.nativeElement.attributes.multiple},e.prototype.stopEvent=function(e){e.preventDefault(),e.stopPropagation()},e.prototype.transferHasFiles=function(e){return!!e.types&&(e.types.indexOf?-1!==e.types.indexOf("Files"):!!e.types.contains&&e.types.contains("Files"))},e.prototype.eventToFiles=function(e){var t=v(e);if(t){if(t.files&&t.files.length)return t.files;if(t.items&&t.items.length)return t.items}return[]},e.prototype.applyExifRotations=function(e){for(var t=function(t,n){return c(t).then((function(t){return e.splice(n,1,t)}))},n=[],i=e.length-1;i>=0;--i)n[i]=t(e[i],i);return Promise.all(n).then((function(){return e}))},e.prototype.onChange=function(e){var t=this.element.nativeElement.files||this.eventToFiles(e);t.length&&(this.stopEvent(e),this.handleFiles(t))},e.prototype.getFileFilterFailName=function(e){for(var t=0;t<this.filters.length;t++)if(!this.filters[t].fn.call(this,e))return this.filters[t].name},e.prototype.isFileValid=function(e){return!(this.accept||this.filters&&this.filters.length)||!this.getFileFilterFailName(e)},e.prototype.isFilesValid=function(e){for(var t=e.length-1;t>=0;--t)if(!this.isFileValid(e[t]))return!1;return!0},e.prototype._acceptFilter=function(e){return function(e,t,n){if(!e)return!0;for(var i,r,a=e.split(","),s=a.length-1;s>=0;--s){if(r=(r=(r=a[s]).replace(/(^\s+|\s+$)/g,"")).replace(/\*/g,".*"),i=new RegExp(r,"gi"),t.search(i)>=0)return!0;if("."==r.substring(0,1)&&(r="\\"+r,i=new RegExp(r+"$","i"),(n||t).search(i)>=0))return!0}return!1}(this.accept,e.type,e.name)},e.prototype._fileSizeFilter=function(e){return!(this.maxSize&&e.size>this.maxSize)},e}();function d(e){for(var t=[],n=0;n<e.length;++n)t.push({type:e[n].type,kind:e[n].kind});return t}function v(e){return e.dataTransfer?e.dataTransfer:e.originalEvent?e.originalEvent.dataTransfer:null}g.decorators=[{type:t.Directive,args:[{selector:"[ngf]",exportAs:"ngf"}]}],g.ctorParameters=function(){return[{type:t.ElementRef}]},g.propDecorators={multiple:[{type:t.Input}],accept:[{type:t.Input}],maxSize:[{type:t.Input}],ngfFixOrientation:[{type:t.Input}],fileDropDisabled:[{type:t.Input}],selectable:[{type:t.Input}],directiveInit:[{type:t.Output,args:["init"]}],lastInvalids:[{type:t.Input}],lastInvalidsChange:[{type:t.Output}],lastBaseUrl:[{type:t.Input}],lastBaseUrlChange:[{type:t.Output}],file:[{type:t.Input}],fileChange:[{type:t.Output}],files:[{type:t.Input}],filesChange:[{type:t.Output}],fileSelectStart:[{type:t.Output}],capturePaste:[{type:t.Input}],onChange:[{type:t.HostListener,args:["change",["$event"]]}]};var m=function(e){function t(){var t=e.apply(this,s(arguments))||this;return t.selectable=!0,t}return r(t,e),t}(g);m.decorators=[{type:t.Directive,args:[{selector:"[ngfSelect]",exportAs:"ngfSelect"}]}],m.propDecorators={selectable:[{type:t.Input}]};var y=function(e){function n(){var n=e.apply(this,s(arguments))||this;return n.fileOver=new t.EventEmitter,n.validDrag=!1,n.validDragChange=new t.EventEmitter,n.invalidDrag=!1,n.invalidDragChange=new t.EventEmitter,n.dragFilesChange=new t.EventEmitter,n}return r(n,e),n.prototype.onDrop=function(e){if(this.fileDropDisabled)this.stopEvent(e);else{this.closeDrags();var t=this.eventToFiles(e);t.length&&(this.stopEvent(e),this.handleFiles(t))}},n.prototype.handleFiles=function(t){this.fileOver.emit(!1),e.prototype.handleFiles.call(this,t)},n.prototype.onDragOver=function(e){if(this.fileDropDisabled)this.stopEvent(e);else{var t=v(e),n=this.eventToFiles(e),i=d(n);this.dragFilesChange.emit(this.dragFiles=i),n.length?this.validDrag=this.isFilesValid(n):this.validDrag=!0,this.validDragChange.emit(this.validDrag),this.invalidDrag=!this.validDrag,this.invalidDragChange.emit(this.invalidDrag),t.dropEffect="copy",this.stopEvent(e),this.fileOver.emit(!0)}},n.prototype.closeDrags=function(){delete this.validDrag,this.validDragChange.emit(this.validDrag),this.invalidDrag=!1,this.invalidDragChange.emit(this.invalidDrag),delete this.dragFiles,this.dragFilesChange.emit(this.dragFiles)},n.prototype.onDragLeave=function(e){this.fileDropDisabled?this.stopEvent(e):(this.closeDrags(),this.element&&e.currentTarget===this.element[0]||(this.stopEvent(e),this.fileOver.emit(!1)))},n}(g);y.decorators=[{type:t.Directive,args:[{selector:"[ngfDrop]",exportAs:"ngfDrop"}]}],y.propDecorators={fileOver:[{type:t.Output}],validDrag:[{type:t.Input}],validDragChange:[{type:t.Output}],invalidDrag:[{type:t.Input}],invalidDragChange:[{type:t.Output}],dragFiles:[{type:t.Input}],dragFilesChange:[{type:t.Output}],onDrop:[{type:t.HostListener,args:["drop",["$event"]]}],onDragOver:[{type:t.HostListener,args:["dragover",["$event"]]}],onDragLeave:[{type:t.HostListener,args:["dragleave",["$event"]]}]};var E=function(){function e(e){this.ElementRef=e}return e.prototype.ngOnChanges=function(e){var t=this;h(this.file).then((function(e){var n="url('"+(e||"")+"')";t.ElementRef.nativeElement.style.backgroundImage=n}))},e}();E.decorators=[{type:t.Directive,args:[{selector:"[ngfBackground]"}]}],E.ctorParameters=function(){return[{type:t.ElementRef}]},E.propDecorators={file:[{type:t.Input,args:["ngfBackground"]}]};var D=function(){function e(){this.percent=0,this.percentChange=new t.EventEmitter}return e.prototype.ngOnChanges=function(e){var t=this;if(e.httpEvent&&e.httpEvent.currentValue){var n=e.httpEvent.currentValue;n.loaded&&n.total&&setTimeout((function(){t.percent=Math.round(100*n.loaded/n.total),t.percentChange.emit(t.percent)}),0)}},e}();D.decorators=[{type:t.Directive,args:[{selector:"ngfUploadStatus"}]}],D.propDecorators={percent:[{type:t.Input}],percentChange:[{type:t.Output}],httpEvent:[{type:t.Input}]};var F=function(){function e(e){this.postName="file",this.FormData=new FormData,this.FormDataChange=new t.EventEmitter,this.differ=e.find([]).create()}return e.prototype.ngDoCheck=function(){var e=this;this.differ.diff(this.files)&&setTimeout((function(){return e.buildFormData()}),0)},e.prototype.buildFormData=function(){var e=this;"object"==typeof this.files&&this.files.constructor===Array?(this.FormData=new FormData,(this.files||[]).forEach((function(t){return e.FormData.append(e.postName,t,e.fileName||t.name)})),this.FormDataChange.emit(this.FormData)):delete this.FormData},e}();F.decorators=[{type:t.Directive,args:[{selector:"ngfFormData"}]}],F.ctorParameters=function(){return[{type:t.IterableDiffers}]},F.propDecorators={files:[{type:t.Input}],postName:[{type:t.Input}],fileName:[{type:t.Input}],FormData:[{type:t.Input}],FormDataChange:[{type:t.Output}]};var b=function(){function e(e){this.ElementRef=e}return e.prototype.ngOnChanges=function(e){var t=this;h(this.file).then((function(e){return t.ElementRef.nativeElement.src=e}))},e}();b.decorators=[{type:t.Directive,args:[{selector:"[ngfSrc]"}]}],b.ctorParameters=function(){return[{type:t.ElementRef}]},b.propDecorators={file:[{type:t.Input,args:["ngfSrc"]}]};var w=[y,m,E,b,D,F,g],C=function(){};C.decorators=[{type:t.NgModule,args:[{imports:[n.CommonModule],declarations:w,exports:w}]}],e.eventToTransfer=v,e.filesToWriteableObject=d,e.ngf=g,e.ngfBackground=E,e.ngfDrop=y,e.ngfFormData=F,e.ngfModule=C,e.ngfSelect=m,e.ngfSrc=b,e.ngfUploadStatus=D,Object.defineProperty(e,"__esModule",{value:!0})}));
//# sourceMappingURL=angular-file.umd.min.js.map

Sorry, the diff of this file is too big to display

/**
* Generated bundle index. Do not edit.
*/
export * from './index';
export { ngf as ɵb } from './file-upload/ngf.directive';
export { ngfBackground as ɵd } from './file-upload/ngfBackground.directive';
export { ngfDrop as ɵa } from './file-upload/ngfDrop.directive';
export { ngfFormData as ɵg } from './file-upload/ngfFormData.directive';
export { ngfSelect as ɵc } from './file-upload/ngfSelect.directive';
export { ngfSrc as ɵe } from './file-upload/ngfSrc.directive';
export { ngfUploadStatus as ɵf } from './file-upload/ngfUploadStatus.directive';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1maWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FuZ3VsYXItZmlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDO0FBRXhCLE9BQU8sRUFBQyxHQUFHLElBQUksRUFBRSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGFBQWEsSUFBSSxFQUFFLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsT0FBTyxJQUFJLEVBQUUsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBQyxXQUFXLElBQUksRUFBRSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUMsTUFBTSxJQUFJLEVBQUUsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQzVELE9BQU8sRUFBQyxlQUFlLElBQUksRUFBRSxFQUFDLE1BQU0seUNBQXlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vaW5kZXgnO1xuXG5leHBvcnQge25nZiBhcyDJtWJ9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmLmRpcmVjdGl2ZSc7XG5leHBvcnQge25nZkJhY2tncm91bmQgYXMgybVkfSBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZkJhY2tncm91bmQuZGlyZWN0aXZlJztcbmV4cG9ydCB7bmdmRHJvcCBhcyDJtWF9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmRHJvcC5kaXJlY3RpdmUnO1xuZXhwb3J0IHtuZ2ZGb3JtRGF0YSBhcyDJtWd9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmRm9ybURhdGEuZGlyZWN0aXZlJztcbmV4cG9ydCB7bmdmU2VsZWN0IGFzIMm1Y30gZnJvbSAnLi9maWxlLXVwbG9hZC9uZ2ZTZWxlY3QuZGlyZWN0aXZlJztcbmV4cG9ydCB7bmdmU3JjIGFzIMm1ZX0gZnJvbSAnLi9maWxlLXVwbG9hZC9uZ2ZTcmMuZGlyZWN0aXZlJztcbmV4cG9ydCB7bmdmVXBsb2FkU3RhdHVzIGFzIMm1Zn0gZnJvbSAnLi9maWxlLXVwbG9hZC9uZ2ZVcGxvYWRTdGF0dXMuZGlyZWN0aXZlJzsiXX0=
export const isFileInput = function (elm) {
const ty = elm.getAttribute('type');
return elm.tagName.toLowerCase() === 'input' && ty && ty.toLowerCase() === 'file';
};
let initialTouchStartY = 0;
let initialTouchStartX = 0;
export const detectSwipe = function (evt) {
var touches = evt.changedTouches || (evt.originalEvent && evt.originalEvent.changedTouches);
if (touches) {
if (evt.type === 'touchstart') {
initialTouchStartX = touches[0].clientX;
initialTouchStartY = touches[0].clientY;
return true; // don't block event default
}
else {
// prevent scroll from triggering event
if (evt.type === 'touchend') {
var currentX = touches[0].clientX;
var currentY = touches[0].clientY;
if ((Math.abs(currentX - initialTouchStartX) > 20) ||
(Math.abs(currentY - initialTouchStartY) > 20)) {
evt.stopPropagation();
if (evt.cancelable) {
evt.preventDefault();
}
return false;
}
}
return true;
}
}
return false;
};
export const createInvisibleFileInputWrap = function () {
var fileElem = createFileInput();
var label = document.createElement('label');
label.innerHTML = 'upload';
label.style.visibility = 'hidden';
label.style.position = 'absolute';
label.style.overflow = 'hidden';
label.style.width = '0px';
label.style.height = '0px';
label.style.border = 'none';
label.style.margin = '0px';
label.style.padding = '0px';
label.setAttribute('tabindex', '-1');
//bindAttrToFileInput(fileElem, label);
//generatedElems.push({el: elem, ref: label});
label.appendChild(fileElem);
//document.body.appendChild( label );
return label;
};
export const createFileInput = function () {
var fileElem = document.createElement('input');
fileElem.type = "file";
return fileElem;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL2RvYy1ldmVudC1oZWxwLmZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBUyxHQUFPO0lBQ3pDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbkMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQztBQUNwRixDQUFDLENBQUE7QUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBUyxHQUFPO0lBQ3pDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxjQUFjLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUYsSUFBSSxPQUFPLEVBQUU7UUFDWCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO1lBQzdCLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDeEMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxDQUFDLDRCQUE0QjtTQUMxQzthQUFNO1lBQ0wsdUNBQXVDO1lBQ3ZDLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQzNCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDaEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO29CQUNoRCxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3RCLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTt3QkFDbEIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO3FCQUN0QjtvQkFDRCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRztJQUMxQyxJQUFJLFFBQVEsR0FBRyxlQUFlLEVBQUUsQ0FBQTtJQUNoQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO0lBQzFCLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQTtJQUNqQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUE7SUFDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBQy9CLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7SUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0lBQzNCLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtJQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFDM0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFFbkMsdUNBQXVDO0lBQ3ZDLDhDQUE4QztJQUU5QyxLQUFLLENBQUMsV0FBVyxDQUFFLFFBQVEsQ0FBRSxDQUFBO0lBQzdCLHFDQUFxQztJQUVyQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLFFBQVEsQ0FBQyxJQUFJLEdBQUMsTUFBTSxDQUFBO0lBQ3BCLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBpc0ZpbGVJbnB1dCA9IGZ1bmN0aW9uKGVsbTphbnkpe1xuICBjb25zdCB0eSA9IGVsbS5nZXRBdHRyaWJ1dGUoJ3R5cGUnKVxuICByZXR1cm4gZWxtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiB0eSAmJiB0eS50b0xvd2VyQ2FzZSgpID09PSAnZmlsZSc7XG59XG5cbmxldCBpbml0aWFsVG91Y2hTdGFydFkgPSAwO1xubGV0IGluaXRpYWxUb3VjaFN0YXJ0WCA9IDA7XG5leHBvcnQgY29uc3QgZGV0ZWN0U3dpcGUgPSBmdW5jdGlvbihldnQ6YW55KTpib29sZWFuIHtcbiAgdmFyIHRvdWNoZXMgPSBldnQuY2hhbmdlZFRvdWNoZXMgfHwgKGV2dC5vcmlnaW5hbEV2ZW50ICYmIGV2dC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzKTtcbiAgaWYgKHRvdWNoZXMpIHtcbiAgICBpZiAoZXZ0LnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgaW5pdGlhbFRvdWNoU3RhcnRYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgaW5pdGlhbFRvdWNoU3RhcnRZID0gdG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGRvbid0IGJsb2NrIGV2ZW50IGRlZmF1bHRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcHJldmVudCBzY3JvbGwgZnJvbSB0cmlnZ2VyaW5nIGV2ZW50XG4gICAgICBpZiAoZXZ0LnR5cGUgPT09ICd0b3VjaGVuZCcpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgICB2YXIgY3VycmVudFkgPSB0b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICAgIGlmICgoTWF0aC5hYnMoY3VycmVudFggLSBpbml0aWFsVG91Y2hTdGFydFgpID4gMjApIHx8XG4gICAgICAgICAgKE1hdGguYWJzKGN1cnJlbnRZIC0gaW5pdGlhbFRvdWNoU3RhcnRZKSA+IDIwKSkge1xuICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBpZiAoZXZ0LmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUludmlzaWJsZUZpbGVJbnB1dFdyYXAgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbGVFbGVtID0gY3JlYXRlRmlsZUlucHV0KClcbiAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgbGFiZWwuaW5uZXJIVE1MID0gJ3VwbG9hZCdcbiAgbGFiZWwuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nXG4gIGxhYmVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICBsYWJlbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gIGxhYmVsLnN0eWxlLndpZHRoID0gJzBweCdcbiAgbGFiZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCdcbiAgbGFiZWwuc3R5bGUuYm9yZGVyID0gJ25vbmUnXG4gIGxhYmVsLnN0eWxlLm1hcmdpbiA9ICcwcHgnXG4gIGxhYmVsLnN0eWxlLnBhZGRpbmcgPSAnMHB4J1xuICBsYWJlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywnLTEnKVxuICBcbiAgLy9iaW5kQXR0clRvRmlsZUlucHV0KGZpbGVFbGVtLCBsYWJlbCk7XG4gIC8vZ2VuZXJhdGVkRWxlbXMucHVzaCh7ZWw6IGVsZW0sIHJlZjogbGFiZWx9KTtcblxuICBsYWJlbC5hcHBlbmRDaGlsZCggZmlsZUVsZW0gKVxuICAvL2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGxhYmVsICk7XG5cbiAgcmV0dXJuIGxhYmVsO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlRmlsZUlucHV0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmaWxlRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGZpbGVFbGVtLnR5cGU9XCJmaWxlXCJcbiAgcmV0dXJuIGZpbGVFbGVtO1xufVxuIl19
export function getWindow() { return window; }
export function acceptType(accept, type, name) {
if (!accept) {
return true;
}
const defs = accept.split(',');
let regx;
let acceptRegString;
for (let x = defs.length - 1; x >= 0; --x) {
//Escapes dots in mimetype
acceptRegString = defs[x];
//trim
acceptRegString = acceptRegString.replace(/(^\s+|\s+$)/g, '');
//Escapes stars in mimetype
acceptRegString = acceptRegString.replace(/\*/g, '.*');
//let acceptReg = '^((' + acceptRegString
//acceptReg = acceptReg.replace(/,/g,')|(') + '))$'
//try by mime
regx = new RegExp(acceptRegString, 'gi');
if (type.search(regx) >= 0) {
return true;
}
//try by ext
if (acceptRegString.substring(0, 1) == '.') {
acceptRegString = '\\' + acceptRegString; //.substring(1, acceptRegString.length-1)//remove dot at front
regx = new RegExp(acceptRegString + '$', 'i');
if ((name || type).search(regx) >= 0) {
return true;
}
}
}
return false;
}
export function arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
export function dataUrltoBlob(dataurl, name, origSize) {
var arr = dataurl.split(',');
var mimeMatch = arr[0].match(/:(.*?);/);
var mime = mimeMatch ? mimeMatch[1] : 'text/plain';
var bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var blob = new window.Blob([u8arr], { type: mime });
blob["name"] = name;
blob["$ngfOrigSize"] = origSize;
return blob;
}
export function applyTransform(ctx, orientation, width, height) {
switch (orientation) {
case 2:
return ctx.transform(-1, 0, 0, 1, width, 0);
case 3:
return ctx.transform(-1, 0, 0, -1, width, height);
case 4:
return ctx.transform(1, 0, 0, -1, 0, height);
case 5:
return ctx.transform(0, 1, 1, 0, 0, 0);
case 6:
return ctx.transform(0, 1, -1, 0, height, 0);
case 7:
return ctx.transform(0, -1, -1, 0, height, width);
case 8:
return ctx.transform(0, -1, 1, 0, 0, width);
}
}
export function fixFileOrientationByMeta(file, result) {
return dataUrl(file, true)
.then(url => {
var canvas = document.createElement('canvas');
var img = document.createElement('img');
return new Promise(function (res, rej) {
img.onload = function () {
try {
canvas.width = result.orientation > 4 ? img.height : img.width;
canvas.height = result.orientation > 4 ? img.width : img.height;
var ctx = canvas.getContext('2d');
applyTransform(ctx, result.orientation, img.width, img.height);
ctx.drawImage(img, 0, 0);
var dataUrl = canvas.toDataURL(file.type || 'image/WebP', 0.934);
const base = arrayBufferToBase64(result.fixedArrayBuffer);
dataUrl = restoreExif(base, dataUrl);
var blob = dataUrltoBlob(dataUrl, file.name);
const newFile = blobToFile(blob, file.name);
res(newFile);
}
catch (e) {
rej(e);
}
};
img.onerror = rej;
img.src = url;
});
});
}
export function applyExifRotation(file) {
if (file.type.indexOf('image/jpeg') !== 0) {
return Promise.resolve(file);
}
return readOrientation(file)
.then((result) => {
if (result.orientation < 2 || result.orientation > 8) {
return file;
}
return fixFileOrientationByMeta(file, result);
});
}
export function readOrientation(file) {
return new Promise((res, rej) => {
var reader = new FileReader();
var slicedFile = file.slice ? file.slice(0, 64 * 1024) : file;
reader.readAsArrayBuffer(slicedFile);
reader.onerror = rej;
reader.onload = function (e) {
var result = { orientation: 1 };
var view = new DataView(this.result);
if (view.getUint16(0, false) !== 0xFFD8)
return res(result);
var length = view.byteLength, offset = 2;
while (offset < length) {
var marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xFFE1) {
if (view.getUint32(offset += 2, false) !== 0x45786966)
return res(result);
var little = view.getUint16(offset += 6, false) === 0x4949;
offset += view.getUint32(offset + 4, little);
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++)
if (view.getUint16(offset + (i * 12), little) === 0x0112) {
var orientation = view.getUint16(offset + (i * 12) + 8, little);
if (orientation >= 2 && orientation <= 8) {
view.setUint16(offset + (i * 12) + 8, 1, little);
result.fixedArrayBuffer = e.target.result;
}
result.orientation = orientation;
return res(result);
}
}
else if ((marker & 0xFF00) !== 0xFF00)
break;
else
offset += view.getUint16(offset, false);
}
return res(result);
};
});
}
/** converts file-input file into base64 dataUri */
export function dataUrl(file, disallowObjectUrl) {
if (!file)
return Promise.resolve(file);
if ((disallowObjectUrl && file.$ngfDataUrl != null) || (!disallowObjectUrl && file.$ngfBlobUrl != null)) {
return Promise.resolve(disallowObjectUrl ? file.$ngfDataUrl : file.$ngfBlobUrl);
}
var p = disallowObjectUrl ? file.$$ngfDataUrlPromise : file.$$ngfBlobUrlPromise;
if (p)
return p;
const win = getWindow();
let deferred;
if (win.FileReader && file &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = win.URL || win.webkitURL;
if (FileReader) {
deferred = new Promise((res, rej) => {
var fileReader = new FileReader();
fileReader.onload = function (event) {
file.$ngfDataUrl = event.target.result;
delete file.$ngfDataUrl;
res(event.target.result);
};
fileReader.onerror = function (e) {
file.$ngfDataUrl = '';
rej(e);
};
fileReader.readAsDataURL(file);
});
}
else {
var url;
try {
url = URL.createObjectURL(file);
}
catch (e) {
return Promise.reject(e);
}
deferred = Promise.resolve(url);
file.$ngfBlobUrl = url;
}
}
else {
file[disallowObjectUrl ? '$ngfDataUrl' : '$ngfBlobUrl'] = '';
return Promise.reject(new Error('Browser does not support window.FileReader, window.FileReader, or window.FileAPI')); //deferred.reject();
}
if (disallowObjectUrl) {
p = file.$$ngfDataUrlPromise = deferred;
}
else {
p = file.$$ngfBlobUrlPromise = deferred;
}
p = p.then((x) => {
delete file[disallowObjectUrl ? '$$ngfDataUrlPromise' : '$$ngfBlobUrlPromise'];
return x;
});
return p;
}
export function restoreExif(orig, resized) {
var ExifRestorer = {
KEY_STR: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
};
ExifRestorer.encode64 = function (input) {
var output = '', chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0;
do {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
}
else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this.KEY_STR.charAt(enc1) +
this.KEY_STR.charAt(enc2) +
this.KEY_STR.charAt(enc3) +
this.KEY_STR.charAt(enc4);
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return output;
};
ExifRestorer.restore = function (origFileBase64, resizedFileBase64) {
if (origFileBase64.match('data:image/jpeg;base64,')) {
origFileBase64 = origFileBase64.replace('data:image/jpeg;base64,', '');
}
var rawImage = this.decode64(origFileBase64);
var segments = this.slice2Segments(rawImage);
var image = this.exifManipulation(resizedFileBase64, segments);
return 'data:image/jpeg;base64,' + this.encode64(image);
};
ExifRestorer.exifManipulation = function (resizedFileBase64, segments) {
var exifArray = this.getExifArray(segments), newImageArray = this.insertExif(resizedFileBase64, exifArray);
return new Uint8Array(newImageArray);
};
ExifRestorer.getExifArray = function (segments) {
var seg;
for (var x = 0; x < segments.length; x++) {
seg = segments[x];
if (seg[0] === 255 && seg[1] === 225) //(ff e1)
{
return seg;
}
}
return [];
};
ExifRestorer.insertExif = function (resizedFileBase64, exifArray) {
var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', ''), buf = this.decode64(imageData), separatePoint = buf.indexOf(255, 3), mae = buf.slice(0, separatePoint), ato = buf.slice(separatePoint), array = mae;
array = array.concat(exifArray);
array = array.concat(ato);
return array;
};
ExifRestorer.slice2Segments = function (rawImageArray) {
var head = 0, segments = [];
while (1) {
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 218) {
break;
}
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 216) {
head += 2;
}
else {
var length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];
var endPoint = head + length + 2;
var seg = rawImageArray.slice(head, endPoint);
segments.push(seg);
head = endPoint;
}
if (head > rawImageArray.length) {
break;
}
}
return segments;
};
ExifRestorer.decode64 = function (input) {
var chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0, buf = [];
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)) {
console.log('There were invalid base64 characters in the input text.');
}
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
do {
enc1 = this.KEY_STR.indexOf(input.charAt(i++));
enc2 = this.KEY_STR.indexOf(input.charAt(i++));
enc3 = this.KEY_STR.indexOf(input.charAt(i++));
enc4 = this.KEY_STR.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
buf.push(chr1);
if (enc3 !== 64) {
buf.push(chr2);
}
if (enc4 !== 64) {
buf.push(chr3);
}
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return buf;
};
return ExifRestorer.restore(orig, resized); //<= EXIF
}
;
function blobToFile(theBlob, fileName) {
var b = theBlob;
//A Blob() is almost a File() - it's just missing the two properties below which we will add
b.lastModifiedDate = new Date();
b.name = fileName;
//Cast to a File() type
return theBlob;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL2ZpbGVUb29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsU0FBUyxLQUFPLE9BQU8sTUFBTSxDQUFBLENBQUEsQ0FBQztBQUU5QyxNQUFNLFVBQVUsVUFBVSxDQUFDLE1BQWEsRUFBRSxJQUFXLEVBQUUsSUFBWTtJQUNqRSxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUE7S0FDWjtJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDOUIsSUFBSSxJQUFXLENBQUE7SUFDZixJQUFJLGVBQXNCLENBQUE7SUFFMUIsS0FBSSxJQUFJLENBQUMsR0FBQyxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFDO1FBQ25DLDJCQUEyQjtRQUMzQixlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3pCLE1BQU07UUFDTixlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUMsRUFBRSxDQUFDLENBQUE7UUFDNUQsNEJBQTRCO1FBQzVCLGVBQWUsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBQyxJQUFJLENBQUMsQ0FBQTtRQUNyRCx5Q0FBeUM7UUFDekMsbURBQW1EO1FBRW5ELGFBQWE7UUFDYixJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3hDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBRSxDQUFDLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUE7U0FDWjtRQUVELFlBQVk7UUFDWixJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFFLEdBQUcsRUFBRTtZQUN4QyxlQUFlLEdBQUcsSUFBSSxHQUFFLGVBQWUsQ0FBQSxDQUFBLDhEQUE4RDtZQUNyRyxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsZUFBZSxHQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQTtZQUMzQyxJQUFJLENBQUMsSUFBSSxJQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBRSxDQUFDLEVBQUU7Z0JBQ2hDLE9BQU8sSUFBSSxDQUFBO2FBQ1o7U0FDRjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBT0QsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQVU7SUFDNUMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLElBQUksS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM1QixNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6QztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsT0FBYyxFQUNkLElBQVcsRUFDWCxRQUFhO0lBRWIsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3ZDLElBQUksSUFBSSxHQUFVLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUE7SUFDekQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxPQUFPLENBQUMsRUFBRSxFQUFFO1FBQ1YsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDL0I7SUFFRCxJQUFJLElBQUksR0FBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUNoQyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFPRCxNQUFNLFVBQVUsY0FBYyxDQUM1QixHQUE0QixFQUM1QixXQUFrQixFQUNsQixLQUFZLEVBQ1osTUFBYTtJQUViLFFBQVEsV0FBVyxFQUFFO1FBQ25CLEtBQUssQ0FBQztZQUNKLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDO1lBQ0osT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELEtBQUssQ0FBQztZQUNKLE9BQU8sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDL0MsS0FBSyxDQUFDO1lBQ0osT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsS0FBSyxDQUFDO1lBQ0osT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvQyxLQUFLLENBQUM7WUFDSixPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEQsS0FBSyxDQUFDO1lBQ0osT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMvQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLElBQVMsRUFBRSxNQUFzQjtJQUVqQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO1NBQ3pCLElBQUksQ0FBQyxHQUFHLENBQUEsRUFBRTtRQUNULElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV4QyxPQUFzQixJQUFJLE9BQU8sQ0FBQyxVQUFTLEdBQUcsRUFBQyxHQUFHO1lBQ2hELEdBQUcsQ0FBQyxNQUFNLEdBQUc7Z0JBQ1gsSUFBSTtvQkFDRixNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFBO29CQUM5RCxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFBO29CQUMvRCxJQUFJLEdBQUcsR0FBNkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDM0QsY0FBYyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO29CQUM5RCxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUE7b0JBQ2hFLE1BQU0sSUFBSSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO29CQUN6RCxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtvQkFDcEMsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQzVDLE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM1QyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ2Q7Z0JBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2lCQUNQO1lBQ0gsQ0FBQyxDQUFDO1lBQ0YsR0FBRyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDbEIsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLElBQVM7SUFFVCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN6QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDOUI7SUFFRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUM7U0FDM0IsSUFBSSxDQUFDLENBQUMsTUFBc0IsRUFBQyxFQUFFO1FBQzlCLElBQUksTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDcEQsT0FBTyxJQUFJLENBQUE7U0FDWjtRQUVELE9BQU8sd0JBQXdCLENBQUMsSUFBSSxFQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQzlDLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQzdCLElBQVM7SUFFVCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFDLEdBQUcsRUFBQyxFQUFFO1FBQzVCLElBQUksTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDOUIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFBO1FBQ3BCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFLO1lBQzdCLElBQUksTUFBTSxHQUFtQixFQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUMsQ0FBQztZQUM5QyxJQUFJLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBZSxJQUFJLENBQUMsTUFBTSxDQUFFLENBQUM7WUFDcEQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxNQUFNO2dCQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRTVELElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQzFCLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDYixPQUFPLE1BQU0sR0FBRyxNQUFNLEVBQUU7Z0JBQ3RCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLElBQUksQ0FBQyxDQUFDO2dCQUNaLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRTtvQkFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssVUFBVTt3QkFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFFMUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLE1BQU0sQ0FBQztvQkFDM0QsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQzFDLE1BQU0sSUFBSSxDQUFDLENBQUM7b0JBQ1osS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUU7d0JBQzNCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssTUFBTSxFQUFFOzRCQUN4RCxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7NEJBQ2hFLElBQUksV0FBVyxJQUFJLENBQUMsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUFFO2dDQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dDQUNqRCxNQUFNLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7NkJBQzNDOzRCQUNELE1BQU0sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDOzRCQUNqQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQzt5QkFDcEI7aUJBQ0o7cUJBQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxNQUFNO29CQUFFLE1BQU07O29CQUMxQyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDOUM7WUFDRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQixDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRCxtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLE9BQU8sQ0FDckIsSUFBUSxFQUNSLGlCQUFzQjtJQUV0QixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV2QyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsRUFBRTtRQUN2RyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUUsQ0FBQTtLQUNsRjtJQUVELElBQUksQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNoRixJQUFJLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUVoQixNQUFNLEdBQUcsR0FBRyxTQUFTLEVBQUUsQ0FBQTtJQUN2QixJQUFJLFFBQXdCLENBQUE7SUFDNUIsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLElBQUk7UUFDeEIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbkYsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsRUFBRTtRQUN2Rix5RUFBeUU7UUFDekUsaURBQWlEO1FBQ2pELElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUNuQyxJQUFJLFVBQVUsRUFBRTtZQUNkLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUMsRUFBRTtnQkFDaEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDbEMsVUFBVSxDQUFDLE1BQU0sR0FBRyxVQUFVLEtBQVM7b0JBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7b0JBQ3ZDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztvQkFDeEIsR0FBRyxDQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFFLENBQUE7Z0JBQzVCLENBQUMsQ0FBQztnQkFDRixVQUFVLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7b0JBQ3RCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDUixDQUFDLENBQUM7Z0JBQ0YsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQTtTQUNIO2FBQU07WUFDTCxJQUFJLEdBQU8sQ0FBQztZQUNaLElBQUk7Z0JBQ0YsR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakM7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDMUI7WUFFRCxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBRSxHQUFHLENBQUUsQ0FBQTtZQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztTQUN4QjtLQUNGO1NBQU07UUFDTCxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzdELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBRSxJQUFJLEtBQUssQ0FBQyxrRkFBa0YsQ0FBQyxDQUFFLENBQUEsQ0FBQSxvQkFBb0I7S0FDM0k7SUFFRCxJQUFJLGlCQUFpQixFQUFFO1FBQ3JCLENBQUMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO0tBQ3pDO1NBQU07UUFDTCxDQUFDLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQztLQUN6QztJQUVELENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBSyxFQUFDLEVBQUU7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQy9FLE9BQU8sQ0FBQyxDQUFBO0lBQ1YsQ0FBQyxDQUFDLENBQUE7SUFFRixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVEsRUFBRSxPQUFXO0lBQy9DLElBQUksWUFBWSxHQUFPO1FBQ3JCLE9BQU8sRUFBQyxtRUFBbUU7S0FDNUUsQ0FBQTtJQUVELFlBQVksQ0FBQyxRQUFRLEdBQUcsVUFBVSxLQUFTO1FBQ3pDLElBQUksTUFBTSxHQUFHLEVBQUUsRUFDYixJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBTyxFQUFFLEVBQ3pCLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBTyxFQUFFLEVBQy9CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFUixHQUFHO1lBQ0QsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFbEIsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUM7WUFDakIsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDeEMsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7WUFFakIsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2YsSUFBSSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7YUFDbEI7aUJBQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksR0FBRyxFQUFFLENBQUM7YUFDWDtZQUVELE1BQU0sR0FBRyxNQUFNO2dCQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO2dCQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1NBQ2hDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFFM0IsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0lBRUYsWUFBWSxDQUFDLE9BQU8sR0FBRyxVQUFVLGNBQWtCLEVBQUUsaUJBQXFCO1FBQ3hFLElBQUksY0FBYyxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFO1lBQ25ELGNBQWMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLHlCQUF5QixFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3hFO1FBRUQsSUFBSSxRQUFRLEdBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0RCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUvRCxPQUFPLHlCQUF5QixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQyxDQUFDO0lBR0YsWUFBWSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsaUJBQXFCLEVBQUUsUUFBWTtRQUMzRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxFQUN6QyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRSxPQUFPLElBQUksVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQztJQUVGLFlBQVksQ0FBQyxZQUFZLEdBQUcsVUFBVSxRQUFtQjtRQUN2RCxJQUFJLEdBQUcsQ0FBQztRQUNSLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsU0FBUzthQUMvQztnQkFDRSxPQUFPLEdBQUcsQ0FBQzthQUNaO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUMsQ0FBQztJQUdGLFlBQVksQ0FBQyxVQUFVLEdBQUcsVUFBVSxpQkFBcUIsRUFBRSxTQUFhO1FBQ3RFLElBQUksU0FBUyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLENBQUMsRUFDdEUsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQzlCLGFBQWEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFDbkMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxFQUNqQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsRUFDOUIsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUVkLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBR0YsWUFBWSxDQUFDLGNBQWMsR0FBRyxVQUM1QixhQUFzQjtRQUV0QixJQUFJLElBQUksR0FBVSxDQUFDLEVBQ2pCLFFBQVEsR0FBYyxFQUFFLENBQUM7UUFFM0IsT0FBTyxDQUFDLEVBQUU7WUFDUixJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Z0JBQ2xFLE1BQU07YUFDUDtZQUNELElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtnQkFDbEUsSUFBSSxJQUFJLENBQUMsQ0FBQzthQUNYO2lCQUNJO2dCQUNILElBQUksTUFBTSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUE7Z0JBQ3BFLElBQUksUUFBUSxHQUFHLElBQUksR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFBO2dCQUNoQyxJQUFJLEdBQUcsR0FBWSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQTtnQkFDdEQsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxHQUFHLFFBQVEsQ0FBQzthQUNqQjtZQUNELElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUU7Z0JBQy9CLE1BQU07YUFDUDtTQUNGO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0lBR0YsWUFBWSxDQUFDLFFBQVEsR0FBRyxVQUN0QixLQUFTO1FBRVQsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBTyxFQUFFLEVBQzNCLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksR0FBTyxFQUFFLEVBQy9CLENBQUMsR0FBRyxDQUFDLEVBQ0wsR0FBRyxHQUFZLEVBQUUsQ0FBQztRQUVwQiwrREFBK0Q7UUFDL0QsSUFBSSxVQUFVLEdBQUcscUJBQXFCLENBQUM7UUFDdkMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMseURBQXlELENBQUMsQ0FBQztTQUN4RTtRQUNELEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpELEdBQUc7WUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDL0MsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMvQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFL0MsSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUVoQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWYsSUFBSSxJQUFJLEtBQUssRUFBRSxFQUFFO2dCQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEI7WUFDRCxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNoQjtZQUVELElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1NBRWhDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFFM0IsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUM7SUFFRixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUUsU0FBUztBQUN4RCxDQUFDO0FBQUEsQ0FBQztBQUVGLFNBQVMsVUFBVSxDQUFDLE9BQWEsRUFBRSxRQUFlO0lBQ2hELElBQUksQ0FBQyxHQUFRLE9BQU8sQ0FBQztJQUNyQiw0RkFBNEY7SUFDNUYsQ0FBQyxDQUFDLGdCQUFnQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDaEMsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7SUFFbEIsdUJBQXVCO0lBQ3ZCLE9BQWEsT0FBTyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2V0V2luZG93KCk6YW55e3JldHVybiB3aW5kb3d9XG5cbmV4cG9ydCBmdW5jdGlvbiBhY2NlcHRUeXBlKGFjY2VwdDpzdHJpbmcsIHR5cGU6c3RyaW5nLCBuYW1lPzpzdHJpbmcpOmJvb2xlYW4geyAgIFxuICBpZiggIWFjY2VwdCApe1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdCBkZWZzID0gYWNjZXB0LnNwbGl0KCcsJylcbiAgbGV0IHJlZ3g6UmVnRXhwXG4gIGxldCBhY2NlcHRSZWdTdHJpbmc6c3RyaW5nXG5cbiAgZm9yKGxldCB4PWRlZnMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAvL0VzY2FwZXMgZG90cyBpbiBtaW1ldHlwZSBcbiAgICBhY2NlcHRSZWdTdHJpbmcgPSBkZWZzW3hdXG4gICAgLy90cmltXG4gICAgYWNjZXB0UmVnU3RyaW5nID0gYWNjZXB0UmVnU3RyaW5nLnJlcGxhY2UoLyheXFxzK3xcXHMrJCkvZywnJylcbiAgICAvL0VzY2FwZXMgc3RhcnMgaW4gbWltZXR5cGUgXG4gICAgYWNjZXB0UmVnU3RyaW5nID0gYWNjZXB0UmVnU3RyaW5nLnJlcGxhY2UoL1xcKi9nLCcuKicpXG4gICAgLy9sZXQgYWNjZXB0UmVnID0gJ14oKCcgKyBhY2NlcHRSZWdTdHJpbmdcbiAgICAvL2FjY2VwdFJlZyA9IGFjY2VwdFJlZy5yZXBsYWNlKC8sL2csJyl8KCcpICsgJykpJCdcbiAgICBcbiAgICAvL3RyeSBieSBtaW1lXG4gICAgcmVneCA9IG5ldyBSZWdFeHAoYWNjZXB0UmVnU3RyaW5nLCAnZ2knKVxuICAgIGlmKCB0eXBlLnNlYXJjaChyZWd4KT49MCApe1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvL3RyeSBieSBleHRcbiAgICBpZiggYWNjZXB0UmVnU3RyaW5nLnN1YnN0cmluZygwLCAxKT09Jy4nICl7ICAgICAgXG4gICAgICBhY2NlcHRSZWdTdHJpbmcgPSAnXFxcXCcrIGFjY2VwdFJlZ1N0cmluZy8vLnN1YnN0cmluZygxLCBhY2NlcHRSZWdTdHJpbmcubGVuZ3RoLTEpLy9yZW1vdmUgZG90IGF0IGZyb250XG4gICAgICByZWd4ID0gbmV3IFJlZ0V4cChhY2NlcHRSZWdTdHJpbmcrJyQnLCAnaScpXG4gICAgICBpZiggKG5hbWV8fHR5cGUpLnNlYXJjaChyZWd4KT49MCApe1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZhbGlkRmlsZUl0ZW17XG4gIGZpbGU6RmlsZVxuICB0eXBlOnN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXI6YW55KSB7XG4gIHZhciBiaW5hcnkgPSAnJztcbiAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgdmFyIGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gIH1cbiAgcmV0dXJuIHdpbmRvdy5idG9hKGJpbmFyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVXJsdG9CbG9iKFxuICBkYXRhdXJsOnN0cmluZyxcbiAgbmFtZTpzdHJpbmcsXG4gIG9yaWdTaXplPzphbnlcbik6QmxvYntcbiAgdmFyIGFyciA9IGRhdGF1cmwuc3BsaXQoJywnKTtcbiAgdmFyIG1pbWVNYXRjaCA9IGFyclswXS5tYXRjaCgvOiguKj8pOy8pXG4gIHZhciBtaW1lOnN0cmluZyA9IG1pbWVNYXRjaCA/IG1pbWVNYXRjaFsxXSA6ICd0ZXh0L3BsYWluJ1xuICB2YXIgYnN0ciA9IGF0b2IoYXJyWzFdKSwgbiA9IGJzdHIubGVuZ3RoLCB1OGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICB3aGlsZSAobi0tKSB7XG4gICAgdThhcnJbbl0gPSBic3RyLmNoYXJDb2RlQXQobik7XG4gIH1cbiAgXG4gIHZhciBibG9iOiBhbnkgPSBuZXcgd2luZG93LkJsb2IoW3U4YXJyXSwge3R5cGU6IG1pbWV9KTtcbiAgYmxvYltcIm5hbWVcIl0gPSBuYW1lO1xuICBibG9iW1wiJG5nZk9yaWdTaXplXCJdID0gb3JpZ1NpemU7XG4gIHJldHVybiBibG9iO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIG9yaWVudGF0aW9uTWV0YXtcbiAgb3JpZW50YXRpb246IG51bWJlclxuICBmaXhlZEFycmF5QnVmZmVyPzphbnlbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUcmFuc2Zvcm0oXG4gIGN0eDpDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIG9yaWVudGF0aW9uOm51bWJlcixcbiAgd2lkdGg6bnVtYmVyLFxuICBoZWlnaHQ6bnVtYmVyXG4pIHtcbiAgc3dpdGNoIChvcmllbnRhdGlvbikge1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBjdHgudHJhbnNmb3JtKC0xLCAwLCAwLCAxLCB3aWR0aCwgMCk7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGN0eC50cmFuc2Zvcm0oLTEsIDAsIDAsIC0xLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gY3R4LnRyYW5zZm9ybSgxLCAwLCAwLCAtMSwgMCwgaGVpZ2h0KTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gY3R4LnRyYW5zZm9ybSgwLCAxLCAxLCAwLCAwLCAwKTtcbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gY3R4LnRyYW5zZm9ybSgwLCAxLCAtMSwgMCwgaGVpZ2h0LCAwKTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gY3R4LnRyYW5zZm9ybSgwLCAtMSwgLTEsIDAsIGhlaWdodCwgd2lkdGgpO1xuICAgIGNhc2UgODpcbiAgICAgIHJldHVybiBjdHgudHJhbnNmb3JtKDAsIC0xLCAxLCAwLCAwLCB3aWR0aCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeEZpbGVPcmllbnRhdGlvbkJ5TWV0YShcbiAgZmlsZTpGaWxlLCByZXN1bHQ6b3JpZW50YXRpb25NZXRhXG4pOlByb21pc2U8RmlsZT57XG4gIHJldHVybiBkYXRhVXJsKGZpbGUsIHRydWUpXG4gIC50aGVuKHVybD0+e1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG5cbiAgICByZXR1cm4gPFByb21pc2U8RmlsZT4+bmV3IFByb21pc2UoZnVuY3Rpb24ocmVzLHJlail7XG4gICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHJlc3VsdC5vcmllbnRhdGlvbiA+IDQgPyBpbWcuaGVpZ2h0IDogaW1nLndpZHRoXG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IHJlc3VsdC5vcmllbnRhdGlvbiA+IDQgPyBpbWcud2lkdGggOiBpbWcuaGVpZ2h0XG4gICAgICAgICAgdmFyIGN0eCA9IDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+Y2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgICBhcHBseVRyYW5zZm9ybShjdHgsIHJlc3VsdC5vcmllbnRhdGlvbiwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KVxuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgICAgICB2YXIgZGF0YVVybCA9IGNhbnZhcy50b0RhdGFVUkwoZmlsZS50eXBlIHx8ICdpbWFnZS9XZWJQJywgMC45MzQpXG4gICAgICAgICAgY29uc3QgYmFzZSA9IGFycmF5QnVmZmVyVG9CYXNlNjQocmVzdWx0LmZpeGVkQXJyYXlCdWZmZXIpXG4gICAgICAgICAgZGF0YVVybCA9IHJlc3RvcmVFeGlmKGJhc2UsIGRhdGFVcmwpXG4gICAgICAgICAgdmFyIGJsb2IgPSBkYXRhVXJsdG9CbG9iKGRhdGFVcmwsIGZpbGUubmFtZSlcbiAgICAgICAgICBjb25zdCBuZXdGaWxlID0gYmxvYlRvRmlsZShibG9iLCBmaWxlLm5hbWUpO1xuICAgICAgICAgIHJlcyhuZXdGaWxlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlaihlKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaW1nLm9uZXJyb3IgPSByZWo7XG4gICAgICBpbWcuc3JjID0gdXJsOyAgICBcbiAgICB9KVxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlFeGlmUm90YXRpb24oXG4gIGZpbGU6RmlsZVxuKTpQcm9taXNlPEZpbGU+e1xuICBpZiAoZmlsZS50eXBlLmluZGV4T2YoJ2ltYWdlL2pwZWcnKSAhPT0gMCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmlsZSk7XG4gIH1cblxuICByZXR1cm4gcmVhZE9yaWVudGF0aW9uKGZpbGUpXG4gIC50aGVuKChyZXN1bHQ6b3JpZW50YXRpb25NZXRhKT0+e1xuICAgIGlmIChyZXN1bHQub3JpZW50YXRpb24gPCAyIHx8IHJlc3VsdC5vcmllbnRhdGlvbiA+IDgpIHtcbiAgICAgIHJldHVybiBmaWxlXG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmaXhGaWxlT3JpZW50YXRpb25CeU1ldGEoZmlsZSxyZXN1bHQpXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3JpZW50YXRpb24oXG4gIGZpbGU6RmlsZVxuKTpQcm9taXNlPG9yaWVudGF0aW9uTWV0YT57XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLHJlaik9PntcbiAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICB2YXIgc2xpY2VkRmlsZSA9IGZpbGUuc2xpY2UgPyBmaWxlLnNsaWNlKDAsIDY0ICogMTAyNCkgOiBmaWxlO1xuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihzbGljZWRGaWxlKTtcbiAgICByZWFkZXIub25lcnJvciA9IHJlalxuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZTphbnkpIHtcbiAgICAgIHZhciByZXN1bHQ6b3JpZW50YXRpb25NZXRhID0ge29yaWVudGF0aW9uOiAxfTtcbiAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KCA8QXJyYXlCdWZmZXI+dGhpcy5yZXN1bHQgKTtcbiAgICAgIGlmICh2aWV3LmdldFVpbnQxNigwLCBmYWxzZSkgIT09IDB4RkZEOCkgcmV0dXJuIHJlcyhyZXN1bHQpO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gdmlldy5ieXRlTGVuZ3RoLFxuICAgICAgICBvZmZzZXQgPSAyO1xuICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgbWFya2VyID0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICBpZiAobWFya2VyID09PSAweEZGRTEpIHtcbiAgICAgICAgICBpZiAodmlldy5nZXRVaW50MzIob2Zmc2V0ICs9IDIsIGZhbHNlKSAhPT0gMHg0NTc4Njk2NikgcmV0dXJuIHJlcyhyZXN1bHQpO1xuXG4gICAgICAgICAgdmFyIGxpdHRsZSA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCArPSA2LCBmYWxzZSkgPT09IDB4NDk0OTtcbiAgICAgICAgICBvZmZzZXQgKz0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgbGl0dGxlKTtcbiAgICAgICAgICB2YXIgdGFncyA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgbGl0dGxlKTtcbiAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhZ3M7IGkrKylcbiAgICAgICAgICAgIGlmICh2aWV3LmdldFVpbnQxNihvZmZzZXQgKyAoaSAqIDEyKSwgbGl0dGxlKSA9PT0gMHgwMTEyKSB7XG4gICAgICAgICAgICAgIHZhciBvcmllbnRhdGlvbiA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCArIChpICogMTIpICsgOCwgbGl0dGxlKTtcbiAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID49IDIgJiYgb3JpZW50YXRpb24gPD0gOCkge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDE2KG9mZnNldCArIChpICogMTIpICsgOCwgMSwgbGl0dGxlKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuZml4ZWRBcnJheUJ1ZmZlciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXN1bHQub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcyhyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKChtYXJrZXIgJiAweEZGMDApICE9PSAweEZGMDApIGJyZWFrO1xuICAgICAgICBlbHNlIG9mZnNldCArPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMocmVzdWx0KTtcbiAgICB9O1xuICB9KVxufVxuXG4vKiogY29udmVydHMgZmlsZS1pbnB1dCBmaWxlIGludG8gYmFzZTY0IGRhdGFVcmkgKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVXJsKFxuICBmaWxlOmFueSxcbiAgZGlzYWxsb3dPYmplY3RVcmw/OmFueVxuKTpQcm9taXNlPHN0cmluZz57XG4gIGlmICghZmlsZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmaWxlKVxuICBcbiAgaWYgKChkaXNhbGxvd09iamVjdFVybCAmJiBmaWxlLiRuZ2ZEYXRhVXJsICE9IG51bGwpIHx8ICghZGlzYWxsb3dPYmplY3RVcmwgJiYgZmlsZS4kbmdmQmxvYlVybCAhPSBudWxsKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoIGRpc2FsbG93T2JqZWN0VXJsID8gZmlsZS4kbmdmRGF0YVVybCA6IGZpbGUuJG5nZkJsb2JVcmwgKVxuICB9XG5cbiAgdmFyIHAgPSBkaXNhbGxvd09iamVjdFVybCA/IGZpbGUuJCRuZ2ZEYXRhVXJsUHJvbWlzZSA6IGZpbGUuJCRuZ2ZCbG9iVXJsUHJvbWlzZTtcbiAgaWYgKHApIHJldHVybiBwO1xuXG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdygpXG4gIGxldCBkZWZlcnJlZDpQcm9taXNlPHN0cmluZz5cbiAgaWYgKHdpbi5GaWxlUmVhZGVyICYmIGZpbGUgJiZcbiAgICAoIXdpbi5GaWxlQVBJIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRSA4JykgPT09IC0xIHx8IGZpbGUuc2l6ZSA8IDIwMDAwKSAmJlxuICAgICghd2luLkZpbGVBUEkgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFIDknKSA9PT0gLTEgfHwgZmlsZS5zaXplIDwgNDAwMDAwMCkpIHtcbiAgICAvL3ByZWZlciBVUkwuY3JlYXRlT2JqZWN0VVJMIGZvciBoYW5kbGluZyByZWZyZW5jZXMgdG8gZmlsZXMgb2YgYWxsIHNpemVzXG4gICAgLy9zaW5jZSBpdCBkb2VzbsK0dCBidWlsZCBhIGxhcmdlIHN0cmluZyBpbiBtZW1vcnlcbiAgICB2YXIgVVJMID0gd2luLlVSTCB8fCB3aW4ud2Via2l0VVJMO1xuICAgIGlmIChGaWxlUmVhZGVyKSB7XG4gICAgICBkZWZlcnJlZCA9IG5ldyBQcm9taXNlKChyZXMscmVqKT0+e1xuICAgICAgICB2YXIgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGV2ZW50OmFueSkge1xuICAgICAgICAgIGZpbGUuJG5nZkRhdGFVcmwgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgIGRlbGV0ZSBmaWxlLiRuZ2ZEYXRhVXJsO1xuICAgICAgICAgIHJlcyggZXZlbnQudGFyZ2V0LnJlc3VsdCApXG4gICAgICAgIH07XG4gICAgICAgIGZpbGVSZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgZmlsZS4kbmdmRGF0YVVybCA9ICcnO1xuICAgICAgICAgIHJlaihlKVxuICAgICAgICB9O1xuICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXJsOmFueTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZGVmZXJyZWQgPSBQcm9taXNlLnJlc29sdmUoIHVybCApXG4gICAgICBmaWxlLiRuZ2ZCbG9iVXJsID0gdXJsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWxlW2Rpc2FsbG93T2JqZWN0VXJsID8gJyRuZ2ZEYXRhVXJsJyA6ICckbmdmQmxvYlVybCddID0gJyc7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCBuZXcgRXJyb3IoJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB3aW5kb3cuRmlsZVJlYWRlciwgd2luZG93LkZpbGVSZWFkZXIsIG9yIHdpbmRvdy5GaWxlQVBJJykgKS8vZGVmZXJyZWQucmVqZWN0KCk7XG4gIH1cblxuICBpZiAoZGlzYWxsb3dPYmplY3RVcmwpIHtcbiAgICBwID0gZmlsZS4kJG5nZkRhdGFVcmxQcm9taXNlID0gZGVmZXJyZWQ7XG4gIH0gZWxzZSB7XG4gICAgcCA9IGZpbGUuJCRuZ2ZCbG9iVXJsUHJvbWlzZSA9IGRlZmVycmVkO1xuICB9XG5cbiAgcCA9IHAudGhlbigoeDphbnkpPT57XG4gICAgZGVsZXRlIGZpbGVbZGlzYWxsb3dPYmplY3RVcmwgPyAnJCRuZ2ZEYXRhVXJsUHJvbWlzZScgOiAnJCRuZ2ZCbG9iVXJsUHJvbWlzZSddO1xuICAgIHJldHVybiB4XG4gIH0pXG5cbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlRXhpZihvcmlnOmFueSwgcmVzaXplZDphbnkpIHtcbiAgdmFyIEV4aWZSZXN0b3JlcjphbnkgPSB7XG4gICAgS0VZX1NUUjonQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nXG4gIH1cblxuICBFeGlmUmVzdG9yZXIuZW5jb2RlNjQgPSBmdW5jdGlvbiAoaW5wdXQ6YW55KSB7XG4gICAgdmFyIG91dHB1dCA9ICcnLFxuICAgICAgY2hyMSwgY2hyMiwgY2hyMzphbnkgPSAnJyxcbiAgICAgIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ6YW55ID0gJycsXG4gICAgICBpID0gMDtcblxuICAgIGRvIHtcbiAgICAgIGNocjEgPSBpbnB1dFtpKytdO1xuICAgICAgY2hyMiA9IGlucHV0W2krK107XG4gICAgICBjaHIzID0gaW5wdXRbaSsrXTtcblxuICAgICAgZW5jMSA9IGNocjEgPj4gMjtcbiAgICAgIGVuYzIgPSAoKGNocjEgJiAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xuICAgICAgZW5jMyA9ICgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpO1xuICAgICAgZW5jNCA9IGNocjMgJiA2MztcblxuICAgICAgaWYgKGlzTmFOKGNocjIpKSB7XG4gICAgICAgIGVuYzMgPSBlbmM0ID0gNjQ7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKGNocjMpKSB7XG4gICAgICAgIGVuYzQgPSA2NDtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0ID0gb3V0cHV0ICtcbiAgICAgICAgdGhpcy5LRVlfU1RSLmNoYXJBdChlbmMxKSArXG4gICAgICAgIHRoaXMuS0VZX1NUUi5jaGFyQXQoZW5jMikgK1xuICAgICAgICB0aGlzLktFWV9TVFIuY2hhckF0KGVuYzMpICtcbiAgICAgICAgdGhpcy5LRVlfU1RSLmNoYXJBdChlbmM0KTtcbiAgICAgIGNocjEgPSBjaHIyID0gY2hyMyA9ICcnO1xuICAgICAgZW5jMSA9IGVuYzIgPSBlbmMzID0gZW5jNCA9ICcnO1xuICAgIH0gd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICBFeGlmUmVzdG9yZXIucmVzdG9yZSA9IGZ1bmN0aW9uIChvcmlnRmlsZUJhc2U2NDphbnksIHJlc2l6ZWRGaWxlQmFzZTY0OmFueSkge1xuICAgIGlmIChvcmlnRmlsZUJhc2U2NC5tYXRjaCgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnKSkge1xuICAgICAgb3JpZ0ZpbGVCYXNlNjQgPSBvcmlnRmlsZUJhc2U2NC5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKTtcbiAgICB9XG5cbiAgICB2YXIgcmF3SW1hZ2U6bnVtYmVyW10gPSB0aGlzLmRlY29kZTY0KG9yaWdGaWxlQmFzZTY0KTtcbiAgICB2YXIgc2VnbWVudHMgPSB0aGlzLnNsaWNlMlNlZ21lbnRzKHJhd0ltYWdlKTtcblxuICAgIHZhciBpbWFnZSA9IHRoaXMuZXhpZk1hbmlwdWxhdGlvbihyZXNpemVkRmlsZUJhc2U2NCwgc2VnbWVudHMpO1xuXG4gICAgcmV0dXJuICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyB0aGlzLmVuY29kZTY0KGltYWdlKTtcbiAgfTtcblxuXG4gIEV4aWZSZXN0b3Jlci5leGlmTWFuaXB1bGF0aW9uID0gZnVuY3Rpb24gKHJlc2l6ZWRGaWxlQmFzZTY0OmFueSwgc2VnbWVudHM6YW55KSB7XG4gICAgdmFyIGV4aWZBcnJheSA9IHRoaXMuZ2V0RXhpZkFycmF5KHNlZ21lbnRzKSxcbiAgICAgIG5ld0ltYWdlQXJyYXkgPSB0aGlzLmluc2VydEV4aWYocmVzaXplZEZpbGVCYXNlNjQsIGV4aWZBcnJheSk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ld0ltYWdlQXJyYXkpO1xuICB9O1xuXG4gIEV4aWZSZXN0b3Jlci5nZXRFeGlmQXJyYXkgPSBmdW5jdGlvbiAoc2VnbWVudHM6bnVtYmVyW11bXSkge1xuICAgIHZhciBzZWc7XG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCBzZWdtZW50cy5sZW5ndGg7IHgrKykge1xuICAgICAgc2VnID0gc2VnbWVudHNbeF07XG4gICAgICBpZiAoc2VnWzBdID09PSAyNTUgJiYgc2VnWzFdID09PSAyMjUpIC8vKGZmIGUxKVxuICAgICAge1xuICAgICAgICByZXR1cm4gc2VnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH07XG5cblxuICBFeGlmUmVzdG9yZXIuaW5zZXJ0RXhpZiA9IGZ1bmN0aW9uIChyZXNpemVkRmlsZUJhc2U2NDphbnksIGV4aWZBcnJheTphbnkpIHtcbiAgICB2YXIgaW1hZ2VEYXRhID0gcmVzaXplZEZpbGVCYXNlNjQucmVwbGFjZSgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnLCAnJyksXG4gICAgICBidWYgPSB0aGlzLmRlY29kZTY0KGltYWdlRGF0YSksXG4gICAgICBzZXBhcmF0ZVBvaW50ID0gYnVmLmluZGV4T2YoMjU1LCAzKSxcbiAgICAgIG1hZSA9IGJ1Zi5zbGljZSgwLCBzZXBhcmF0ZVBvaW50KSxcbiAgICAgIGF0byA9IGJ1Zi5zbGljZShzZXBhcmF0ZVBvaW50KSxcbiAgICAgIGFycmF5ID0gbWFlO1xuXG4gICAgYXJyYXkgPSBhcnJheS5jb25jYXQoZXhpZkFycmF5KTtcbiAgICBhcnJheSA9IGFycmF5LmNvbmNhdChhdG8pO1xuICAgIHJldHVybiBhcnJheTtcbiAgfTtcblxuXG4gIEV4aWZSZXN0b3Jlci5zbGljZTJTZWdtZW50cyA9IGZ1bmN0aW9uKFxuICAgIHJhd0ltYWdlQXJyYXk6bnVtYmVyW11cbiAgKSB7XG4gICAgdmFyIGhlYWQ6bnVtYmVyID0gMCxcbiAgICAgIHNlZ21lbnRzOm51bWJlcltdW10gPSBbXTtcblxuICAgIHdoaWxlICgxKSB7XG4gICAgICBpZiAocmF3SW1hZ2VBcnJheVtoZWFkXSA9PT0gMjU1ICYmIHJhd0ltYWdlQXJyYXlbaGVhZCArIDFdID09PSAyMTgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAocmF3SW1hZ2VBcnJheVtoZWFkXSA9PT0gMjU1ICYmIHJhd0ltYWdlQXJyYXlbaGVhZCArIDFdID09PSAyMTYpIHtcbiAgICAgICAgaGVhZCArPSAyO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBsZW5ndGggPSByYXdJbWFnZUFycmF5W2hlYWQgKyAyXSAqIDI1NiArIHJhd0ltYWdlQXJyYXlbaGVhZCArIDNdXG4gICAgICAgIHZhciBlbmRQb2ludCA9IGhlYWQgKyBsZW5ndGggKyAyXG4gICAgICAgIHZhciBzZWc6bnVtYmVyW10gPSByYXdJbWFnZUFycmF5LnNsaWNlKGhlYWQsIGVuZFBvaW50KVxuICAgICAgICBzZWdtZW50cy5wdXNoKHNlZyk7XG4gICAgICAgIGhlYWQgPSBlbmRQb2ludDtcbiAgICAgIH1cbiAgICAgIGlmIChoZWFkID4gcmF3SW1hZ2VBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9O1xuXG5cbiAgRXhpZlJlc3RvcmVyLmRlY29kZTY0ID0gZnVuY3Rpb24gKFxuICAgIGlucHV0OmFueVxuICApOm51bWJlcltde1xuICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzOmFueSA9ICcnLFxuICAgICAgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDphbnkgPSAnJyxcbiAgICAgIGkgPSAwLFxuICAgICAgYnVmOm51bWJlcltdID0gW107XG5cbiAgICAvLyByZW1vdmUgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IEEtWiwgYS16LCAwLTksICssIC8sIG9yID1cbiAgICB2YXIgYmFzZTY0dGVzdCA9IC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZztcbiAgICBpZiAoYmFzZTY0dGVzdC5leGVjKGlucHV0KSkge1xuICAgICAgY29uc29sZS5sb2coJ1RoZXJlIHdlcmUgaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgdGV4dC4nKTtcbiAgICB9XG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZywgJycpO1xuXG4gICAgZG8ge1xuICAgICAgZW5jMSA9IHRoaXMuS0VZX1NUUi5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgIGVuYzIgPSB0aGlzLktFWV9TVFIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICBlbmMzID0gdGhpcy5LRVlfU1RSLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgZW5jNCA9IHRoaXMuS0VZX1NUUi5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblxuICAgICAgY2hyMSA9IChlbmMxIDw8IDIpIHwgKGVuYzIgPj4gNCk7XG4gICAgICBjaHIyID0gKChlbmMyICYgMTUpIDw8IDQpIHwgKGVuYzMgPj4gMik7XG4gICAgICBjaHIzID0gKChlbmMzICYgMykgPDwgNikgfCBlbmM0O1xuXG4gICAgICBidWYucHVzaChjaHIxKTtcblxuICAgICAgaWYgKGVuYzMgIT09IDY0KSB7XG4gICAgICAgIGJ1Zi5wdXNoKGNocjIpO1xuICAgICAgfVxuICAgICAgaWYgKGVuYzQgIT09IDY0KSB7XG4gICAgICAgIGJ1Zi5wdXNoKGNocjMpO1xuICAgICAgfVxuXG4gICAgICBjaHIxID0gY2hyMiA9IGNocjMgPSAnJztcbiAgICAgIGVuYzEgPSBlbmMyID0gZW5jMyA9IGVuYzQgPSAnJztcblxuICAgIH0gd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfTtcblxuICByZXR1cm4gRXhpZlJlc3RvcmVyLnJlc3RvcmUob3JpZywgcmVzaXplZCk7ICAvLzw9IEVYSUZcbn07XG5cbmZ1bmN0aW9uIGJsb2JUb0ZpbGUodGhlQmxvYjogQmxvYiwgZmlsZU5hbWU6c3RyaW5nKTogRmlsZSB7XG4gIHZhciBiOiBhbnkgPSB0aGVCbG9iO1xuICAvL0EgQmxvYigpIGlzIGFsbW9zdCBhIEZpbGUoKSAtIGl0J3MganVzdCBtaXNzaW5nIHRoZSB0d28gcHJvcGVydGllcyBiZWxvdyB3aGljaCB3ZSB3aWxsIGFkZFxuICBiLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICBiLm5hbWUgPSBmaWxlTmFtZTtcblxuICAvL0Nhc3QgdG8gYSBGaWxlKCkgdHlwZVxuICByZXR1cm4gPEZpbGU+dGhlQmxvYjtcbn1cbiJdfQ==
import { Directive, EventEmitter, ElementRef, Input, Output, HostListener } from '@angular/core';
import { createInvisibleFileInputWrap, isFileInput, detectSwipe } from "./doc-event-help.functions";
import { acceptType, applyExifRotation, dataUrl } from "./fileTools";
/** A master base set of logic intended to support file select/drag/drop operations
NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting
*/
export class ngf {
constructor(element) {
this.element = element;
this.filters = [];
this.lastFileCount = 0;
this.ngfFixOrientation = true;
this.fileDropDisabled = false;
this.selectable = false;
this.directiveInit = new EventEmitter();
this.lastInvalids = [];
this.lastInvalidsChange = new EventEmitter();
this.lastBaseUrlChange = new EventEmitter();
this.fileChange = new EventEmitter();
this.files = [];
this.filesChange = new EventEmitter();
this.fileSelectStart = new EventEmitter();
this.initFilters();
}
initFilters() {
// the order is important
this.filters.push({ name: 'accept', fn: this._acceptFilter });
this.filters.push({ name: 'fileSize', fn: this._fileSizeFilter });
//this.filters.push({name: 'fileType', fn: this._fileTypeFilter})
//this.filters.push({name: 'queueLimit', fn: this._queueLimitFilter})
//this.filters.push({name: 'mimeType', fn: this._mimeTypeFilter})
}
ngOnDestroy() {
delete this.fileElm; //faster memory release of dom element
this.destroyPasteListener();
}
ngOnInit() {
const selectable = (this.selectable || this.selectable === '') && !['false', 'null', '0'].includes(this.selectable);
if (selectable) {
this.enableSelecting();
}
if (this.multiple) {
this.paramFileElm().setAttribute('multiple', this.multiple);
}
this.evalCapturePaste();
// create reference to this class with one cycle delay to avoid ExpressionChangedAfterItHasBeenCheckedError
setTimeout(() => {
this.directiveInit.emit(this);
}, 0);
}
ngOnChanges(changes) {
var _a, _b;
if (changes.accept) {
this.paramFileElm().setAttribute('accept', changes.accept.currentValue || '*');
}
if (changes.capturePaste) {
this.evalCapturePaste();
}
// Did we go from having a file to not having a file? Clear file element then
if (changes.file && changes.file.previousValue && !changes.file.currentValue) {
this.clearFileElmValue();
}
// Did we go from having files to not having files? Clear file element then
if (changes.files) {
const filesWentToZero = ((_a = changes.files.previousValue) === null || _a === void 0 ? void 0 : _a.length) && !((_b = changes.files.currentValue) === null || _b === void 0 ? void 0 : _b.length);
if (filesWentToZero) {
this.clearFileElmValue();
}
}
}
evalCapturePaste() {
const isActive = this.capturePaste || this.capturePaste === '' || ['false', '0', 'null'].includes(this.capturePaste);
if (isActive) {
if (this.pasteCapturer) {
return; // already listening
}
this.pasteCapturer = (e) => {
const clip = e.clipboardData;
if (clip && clip.files && clip.files.length) {
this.handleFiles(clip.files);
e.preventDefault();
}
};
window.addEventListener('paste', this.pasteCapturer);
return;
}
this.destroyPasteListener();
}
destroyPasteListener() {
if (this.pasteCapturer) {
window.removeEventListener('paste', this.pasteCapturer);
delete this.pasteCapturer;
}
}
paramFileElm() {
if (this.fileElm)
return this.fileElm; // already defined
// elm already is a file input
const isFile = isFileInput(this.element.nativeElement);
if (isFile) {
return this.fileElm = this.element.nativeElement;
}
// the host elm is NOT a file input
return this.fileElm = this.createFileElm({
change: this.changeFn.bind(this)
});
}
/** Only used when host element we are attached to is NOT a fileElement */
createFileElm({ change }) {
// use specific technique to hide file element within
const label = createInvisibleFileInputWrap();
const fileElm = label.getElementsByTagName('input')[0];
fileElm.addEventListener('change', change);
this.element.nativeElement.appendChild(label); // put on html stage
return fileElm;
}
enableSelecting() {
let elm = this.element.nativeElement;
if (isFileInput(elm)) {
const bindedHandler = event => this.beforeSelect(event);
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
return;
}
const bindedHandler = ev => this.clickHandler(ev);
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
elm.addEventListener('touchend', bindedHandler);
}
getValidFiles(files) {
const rtn = [];
for (let x = files.length - 1; x >= 0; --x) {
if (this.isFileValid(files[x])) {
rtn.push(files[x]);
}
}
return rtn;
}
getInvalidFiles(files) {
const rtn = [];
for (let x = files.length - 1; x >= 0; --x) {
let failReason = this.getFileFilterFailName(files[x]);
if (failReason) {
rtn.push({
file: files[x],
type: failReason
});
}
}
return rtn;
}
// Primary handler of files coming in
handleFiles(files) {
const valids = this.getValidFiles(files);
if (files.length != valids.length) {
this.lastInvalids = this.getInvalidFiles(files);
}
else {
delete this.lastInvalids;
}
this.lastInvalidsChange.emit(this.lastInvalids);
if (valids.length) {
if (this.ngfFixOrientation) {
this.applyExifRotations(valids)
.then(fixedFiles => this.que(fixedFiles));
}
else {
this.que(valids);
}
}
if (this.isEmptyAfterSelection()) {
this.element.nativeElement.value = '';
}
}
que(files) {
this.files = this.files || [];
Array.prototype.push.apply(this.files, files);
//below break memory ref and doesnt act like a que
//this.files = files//causes memory change which triggers bindings like <ngfFormData [files]="files"></ngfFormData>
this.filesChange.emit(this.files);
if (files.length) {
this.fileChange.emit(this.file = files[0]);
if (this.lastBaseUrlChange.observers.length) {
dataUrl(files[0])
.then(url => this.lastBaseUrlChange.emit(url));
}
}
//will be checked for input value clearing
this.lastFileCount = this.files.length;
}
/** called when input has files */
changeFn(event) {
var fileList = event.__files_ || (event.target && event.target.files);
if (!fileList)
return;
this.stopEvent(event);
this.handleFiles(fileList);
}
clickHandler(evt) {
const elm = this.element.nativeElement;
if (elm.getAttribute('disabled') || this.fileDropDisabled) {
return false;
}
var r = detectSwipe(evt);
// prevent the click if it is a swipe
if (r !== false)
return r;
const fileElm = this.paramFileElm();
fileElm.click();
//fileElm.dispatchEvent( new Event('click') );
this.beforeSelect(evt);
return false;
}
beforeSelect(event) {
this.fileSelectStart.emit(event);
if (this.files && this.lastFileCount === this.files.length)
return;
// if no files in array, be sure browser does not prevent reselect of same file (see github issue 27)
this.clearFileElmValue();
}
clearFileElmValue() {
if (!this.fileElm)
return;
this.fileElm.value = null;
}
isEmptyAfterSelection() {
return !!this.element.nativeElement.attributes.multiple;
}
stopEvent(event) {
event.preventDefault();
event.stopPropagation();
}
transferHasFiles(transfer) {
if (!transfer.types) {
return false;
}
if (transfer.types.indexOf) {
return transfer.types.indexOf('Files') !== -1;
}
else if (transfer.types.contains) {
return transfer.types.contains('Files');
}
else {
return false;
}
}
eventToFiles(event) {
const transfer = eventToTransfer(event);
if (transfer) {
if (transfer.files && transfer.files.length) {
return transfer.files;
}
if (transfer.items && transfer.items.length) {
return transfer.items;
}
}
return [];
}
applyExifRotations(files) {
const mapper = (file, index) => {
return applyExifRotation(file)
.then(fixedFile => files.splice(index, 1, fixedFile));
};
const proms = [];
for (let x = files.length - 1; x >= 0; --x) {
proms[x] = mapper(files[x], x);
}
return Promise.all(proms).then(() => files);
}
onChange(event) {
let files = this.element.nativeElement.files || this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
}
getFileFilterFailName(file) {
for (let i = 0; i < this.filters.length; i++) {
if (!this.filters[i].fn.call(this, file)) {
return this.filters[i].name;
}
}
return undefined;
}
isFileValid(file) {
const noFilters = !this.accept && (!this.filters || !this.filters.length);
if (noFilters) {
return true; //we have no filters so all files are valid
}
return this.getFileFilterFailName(file) ? false : true;
}
isFilesValid(files) {
for (let x = files.length - 1; x >= 0; --x) {
if (!this.isFileValid(files[x])) {
return false;
}
}
return true;
}
_acceptFilter(item) {
return acceptType(this.accept, item.type, item.name);
}
_fileSizeFilter(item) {
return !(this.maxSize && item.size > this.maxSize);
}
}
ngf.decorators = [
{ type: Directive, args: [{
selector: "[ngf]",
exportAs: "ngf"
},] }
];
ngf.ctorParameters = () => [
{ type: ElementRef }
];
ngf.propDecorators = {
multiple: [{ type: Input }],
accept: [{ type: Input }],
maxSize: [{ type: Input }],
ngfFixOrientation: [{ type: Input }],
fileDropDisabled: [{ type: Input }],
selectable: [{ type: Input }],
directiveInit: [{ type: Output, args: ['init',] }],
lastInvalids: [{ type: Input }],
lastInvalidsChange: [{ type: Output }],
lastBaseUrl: [{ type: Input }],
lastBaseUrlChange: [{ type: Output }],
file: [{ type: Input }],
fileChange: [{ type: Output }],
files: [{ type: Input }],
filesChange: [{ type: Output }],
fileSelectStart: [{ type: Output }],
capturePaste: [{ type: Input }],
onChange: [{ type: HostListener, args: ['change', ['$event'],] }]
};
/** browsers try hard to conceal data about file drags, this tends to undo that */
export function filesToWriteableObject(files) {
const jsonFiles = [];
for (let x = 0; x < files.length; ++x) {
jsonFiles.push({
type: files[x].type,
kind: files[x]["kind"]
});
}
return jsonFiles;
}
export function eventToTransfer(event) {
if (event.dataTransfer)
return event.dataTransfer;
return event.originalEvent ? event.originalEvent.dataTransfer : null;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLDRCQUE0QixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUNuRyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGlCQUFpQixFQUFFLE9BQU8sRUFDM0IsTUFBTSxhQUFhLENBQUE7QUFPcEI7O0VBRUU7QUFLRixNQUFNLE9BQU8sR0FBRztJQWdDZCxZQUFtQixPQUFrQjtRQUFsQixZQUFPLEdBQVAsT0FBTyxDQUFXO1FBOUJyQyxZQUFPLEdBQStDLEVBQUUsQ0FBQTtRQUN4RCxrQkFBYSxHQUFXLENBQUMsQ0FBQTtRQUtoQixzQkFBaUIsR0FBWSxJQUFJLENBQUE7UUFFakMscUJBQWdCLEdBQVksS0FBSyxDQUFBO1FBQ2pDLGVBQVUsR0FBcUIsS0FBSyxDQUFBO1FBQzdCLGtCQUFhLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUE7UUFFM0QsaUJBQVksR0FBcUIsRUFBRSxDQUFBO1FBQ2xDLHVCQUFrQixHQUEyQyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBRy9FLHNCQUFpQixHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRzNELGVBQVUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUVwRCxVQUFLLEdBQVUsRUFBRSxDQUFBO1FBQ2hCLGdCQUFXLEdBQXdCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFOUQsb0JBQWUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQU9oRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEIsQ0FBQztJQUVELFdB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QUssQ0FBQyxZQUFZO1FBQUMsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFBO0lBQy9DLE9BQVEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEhvc3RMaXN0ZW5lciwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlSW52aXNpYmxlRmlsZUlucHV0V3JhcCwgaXNGaWxlSW5wdXQsIGRldGVjdFN3aXBlIH0gZnJvbSBcIi4vZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zXCJcbmltcG9ydCB7XG4gIGFjY2VwdFR5cGUsIEludmFsaWRGaWxlSXRlbSxcbiAgYXBwbHlFeGlmUm90YXRpb24sIGRhdGFVcmxcbn0gZnJvbSBcIi4vZmlsZVRvb2xzXCJcblxuZXhwb3J0IGludGVyZmFjZSBkcmFnTWV0YXtcbiAgdHlwZTpzdHJpbmdcbiAga2luZDpzdHJpbmdcbn1cblxuLyoqIEEgbWFzdGVyIGJhc2Ugc2V0IG9mIGxvZ2ljIGludGVuZGVkIHRvIHN1cHBvcnQgZmlsZSBzZWxlY3QvZHJhZy9kcm9wIG9wZXJhdGlvbnNcbiBOT1RFOiBVc2UgbmdmRHJvcCBmb3IgZnVsbCBkcmFnL2Ryb3AuIFVzZSBuZ2ZTZWxlY3QgZm9yIHNlbGVjdGluZ1xuKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbbmdmXVwiLFxuICBleHBvcnRBczpcIm5nZlwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZiB7XG4gIGZpbGVFbG06IGFueVxuICBmaWx0ZXJzOiB7bmFtZTogc3RyaW5nLCBmbjogKGZpbGU6RmlsZSk9PmJvb2xlYW59W10gPSBbXVxuICBsYXN0RmlsZUNvdW50OiBudW1iZXIgPSAwXG5cbiAgQElucHV0KCkgbXVsdGlwbGUgITpzdHJpbmdcbiAgQElucHV0KCkgYWNjZXB0ICAgITpzdHJpbmdcbiAgQElucHV0KCkgbWF4U2l6ZSAgITpudW1iZXJcbiAgQElucHV0KCkgbmdmRml4T3JpZW50YXRpb246IGJvb2xlYW4gPSB0cnVlXG5cbiAgQElucHV0KCkgZmlsZURyb3BEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZVxuICBAT3V0cHV0KCdpbml0JykgZGlyZWN0aXZlSW5pdDpFdmVudEVtaXR0ZXI8bmdmPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGxhc3RJbnZhbGlkczpJbnZhbGlkRmlsZUl0ZW1bXSA9IFtdXG4gIEBPdXRwdXQoKSBsYXN0SW52YWxpZHNDaGFuZ2U6RXZlbnRFbWl0dGVyPHtmaWxlOkZpbGUsdHlwZTpzdHJpbmd9W10+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQElucHV0KCkgbGFzdEJhc2VVcmwhOiBzdHJpbmcvL2Jhc2U2NCBsYXN0IGZpbGUgdXBsb2FkZWQgdXJsXG4gIEBPdXRwdXQoKSBsYXN0QmFzZVVybENoYW5nZTpFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGZpbGU/OiBGaWxlLy9sYXN0IGZpbGUgdXBsb2FkZWRcbiAgQE91dHB1dCgpIGZpbGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGaWxlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGZpbGVzOkZpbGVbXSA9IFtdXG4gIEBPdXRwdXQoKSBmaWxlc0NoYW5nZTpFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gIEBPdXRwdXQoKSBmaWxlU2VsZWN0U3RhcnQ6RXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGNhcHR1cmVQYXN0ZTogYm9vbGVhbiAvLyB3aW5kb3cgcGFzdGUgZmlsZSB3YXRjaGluZyAoZW1wdHkgc3RyaW5nIHR1cm5zIG9uKVxuXG4gIHBhc3RlQ2FwdHVyZXIhOiAoZTogRXZlbnQpID0+IHZvaWQgLy8gZ29lcyB3aXRoIGNhcHR1cmVQYXN0ZVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OkVsZW1lbnRSZWYpe1xuICAgIHRoaXMuaW5pdEZpbHRlcnMoKVxuICB9XG5cbiAgaW5pdEZpbHRlcnMoKXtcbiAgICAvLyB0aGUgb3JkZXIgaXMgaW1wb3J0YW50XG4gICAgdGhpcy5maWx0ZXJzLnB1c2goe25hbWU6ICdhY2NlcHQnLCBmbjogdGhpcy5fYWNjZXB0RmlsdGVyfSlcbiAgICB0aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ2ZpbGVTaXplJywgZm46IHRoaXMuX2ZpbGVTaXplRmlsdGVyfSlcblxuICAgIC8vdGhpcy5maWx0ZXJzLnB1c2goe25hbWU6ICdmaWxlVHlwZScsIGZuOiB0aGlzLl9maWxlVHlwZUZpbHRlcn0pXG4gICAgLy90aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ3F1ZXVlTGltaXQnLCBmbjogdGhpcy5fcXVldWVMaW1pdEZpbHRlcn0pXG4gICAgLy90aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ21pbWVUeXBlJywgZm46IHRoaXMuX21pbWVUeXBlRmlsdGVyfSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCl7XG4gICAgZGVsZXRlIHRoaXMuZmlsZUVsbS8vZmFzdGVyIG1lbW9yeSByZWxlYXNlIG9mIGRvbSBlbGVtZW50XG4gICAgdGhpcy5kZXN0cm95UGFzdGVMaXN0ZW5lcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKXtcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gKHRoaXMuc2VsZWN0YWJsZSB8fCB0aGlzLnNlbGVjdGFibGU9PT0nJykgJiYgIVsnZmFsc2UnLCAnbnVsbCcsICcwJ10uaW5jbHVkZXModGhpcy5zZWxlY3RhYmxlIGFzIHN0cmluZyk7XG4gICAgaWYoIHNlbGVjdGFibGUgKXtcbiAgICAgIHRoaXMuZW5hYmxlU2VsZWN0aW5nKClcbiAgICB9XG5cbiAgICBpZiggdGhpcy5tdWx0aXBsZSApe1xuICAgICAgdGhpcy5wYXJhbUZpbGVFbG0oKS5zZXRBdHRyaWJ1dGUoJ211bHRpcGxlJywgdGhpcy5tdWx0aXBsZSlcbiAgICB9XG5cbiAgICB0aGlzLmV2YWxDYXB0dXJlUGFzdGUoKTtcblxuICAgIC8vIGNyZWF0ZSByZWZlcmVuY2UgdG8gdGhpcyBjbGFzcyB3aXRoIG9uZSBjeWNsZSBkZWxheSB0byBhdm9pZCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4gICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgdGhpcy5kaXJlY3RpdmVJbml0LmVtaXQodGhpcylcbiAgICB9LCAwKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKXtcbiAgICBpZiggY2hhbmdlcy5hY2NlcHQgKXtcbiAgICAgIHRoaXMucGFyYW1GaWxlRWxtKCkuc2V0QXR0cmlidXRlKCdhY2NlcHQnLCBjaGFuZ2VzLmFjY2VwdC5jdXJyZW50VmFsdWUgfHwgJyonKVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmNhcHR1cmVQYXN0ZSkge1xuICAgICAgdGhpcy5ldmFsQ2FwdHVyZVBhc3RlKCk7XG4gICAgfVxuXG4gICAgLy8gRGlkIHdlIGdvIGZyb20gaGF2aW5nIGEgZmlsZSB0byBub3QgaGF2aW5nIGEgZmlsZT8gQ2xlYXIgZmlsZSBlbGVtZW50IHRoZW5cbiAgICBpZiAoY2hhbmdlcy5maWxlICYmIGNoYW5nZXMuZmlsZS5wcmV2aW91c1ZhbHVlICYmICFjaGFuZ2VzLmZpbGUuY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmNsZWFyRmlsZUVsbVZhbHVlKClcbiAgICB9XG5cbiAgICAvLyBEaWQgd2UgZ28gZnJvbSBoYXZpbmcgZmlsZXMgdG8gbm90IGhhdmluZyBmaWxlcz8gQ2xlYXIgZmlsZSBlbGVtZW50IHRoZW5cbiAgICBpZiAoY2hhbmdlcy5maWxlcykge1xuICAgICAgY29uc3QgZmlsZXNXZW50VG9aZXJvID0gY2hhbmdlcy5maWxlcy5wcmV2aW91c1ZhbHVlPy5sZW5ndGggJiYgIWNoYW5nZXMuZmlsZXMuY3VycmVudFZhbHVlPy5sZW5ndGhcblxuICAgICAgaWYgKGZpbGVzV2VudFRvWmVybykge1xuICAgICAgICB0aGlzLmNsZWFyRmlsZUVsbVZhbHVlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBldmFsQ2FwdHVyZVBhc3RlKCkge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5jYXB0dXJlUGFzdGUgfHwgKHRoaXMuY2FwdHVyZVBhc3RlIGFzIGFueSk9PT0nJyB8fCBbJ2ZhbHNlJywgJzAnLCAnbnVsbCddLmluY2x1ZGVzKHRoaXMuY2FwdHVyZVBhc3RlIGFzIGFueSk7XG5cbiAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgIGlmICh0aGlzLnBhc3RlQ2FwdHVyZXIpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGxpc3RlbmluZ1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBhc3RlQ2FwdHVyZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY2xpcCA9IChlIGFzIGFueSkuY2xpcGJvYXJkRGF0YTtcbiAgICAgICAgaWYgKGNsaXAgJiYgY2xpcC5maWxlcyAmJiBjbGlwLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRmlsZXMoY2xpcC5maWxlcyk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIHRoaXMucGFzdGVDYXB0dXJlcik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRlc3Ryb3lQYXN0ZUxpc3RlbmVyKCk7XG4gIH1cblxuICBkZXN0cm95UGFzdGVMaXN0ZW5lcigpIHtcbiAgICBpZiAodGhpcy5wYXN0ZUNhcHR1cmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCB0aGlzLnBhc3RlQ2FwdHVyZXIpO1xuICAgICAgZGVsZXRlIHRoaXMucGFzdGVDYXB0dXJlcjtcbiAgICB9XG4gIH1cblxuICBwYXJhbUZpbGVFbG0oKXtcbiAgICBpZiggdGhpcy5maWxlRWxtIClyZXR1cm4gdGhpcy5maWxlRWxtIC8vIGFscmVhZHkgZGVmaW5lZFxuXG4gICAgLy8gZWxtIGFscmVhZHkgaXMgYSBmaWxlIGlucHV0XG4gICAgY29uc3QgaXNGaWxlID0gaXNGaWxlSW5wdXQoIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50IClcbiAgICBpZihpc0ZpbGUpe1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZUVsbSA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgZWxtIGlzIE5PVCBhIGZpbGUgaW5wdXRcbiAgICByZXR1cm4gdGhpcy5maWxlRWxtID0gdGhpcy5jcmVhdGVGaWxlRWxtKHtcbiAgICAgIGNoYW5nZTogdGhpcy5jaGFuZ2VGbi5iaW5kKHRoaXMpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBPbmx5IHVzZWQgd2hlbiBob3N0IGVsZW1lbnQgd2UgYXJlIGF0dGFjaGVkIHRvIGlzIE5PVCBhIGZpbGVFbGVtZW50ICovXG4gIGNyZWF0ZUZpbGVFbG0oe2NoYW5nZX06IHtjaGFuZ2U6KCkgPT4gYW55fSkge1xuICAgIC8vIHVzZSBzcGVjaWZpYyB0ZWNobmlxdWUgdG8gaGlkZSBmaWxlIGVsZW1lbnQgd2l0aGluXG4gICAgY29uc3QgbGFiZWwgPSBjcmVhdGVJbnZpc2libGVGaWxlSW5wdXRXcmFwKClcbiAgICBjb25zdCBmaWxlRWxtID0gbGFiZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cblxuICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2hhbmdlKTtcbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCggbGFiZWwgKSAvLyBwdXQgb24gaHRtbCBzdGFnZVxuXG4gICAgcmV0dXJuIGZpbGVFbG1cbiAgfVxuXG4gIGVuYWJsZVNlbGVjdGluZygpe1xuICAgIGxldCBlbG0gPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudFxuXG4gICAgaWYoIGlzRmlsZUlucHV0KGVsbSkgKXtcbiAgICAgIGNvbnN0IGJpbmRlZEhhbmRsZXIgPSBldmVudCA9PiB0aGlzLmJlZm9yZVNlbGVjdChldmVudClcbiAgICAgIGVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJpbmRlZEhhbmRsZXIpXG4gICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJpbmRlZEhhbmRsZXIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBiaW5kZWRIYW5kbGVyID0gZXYgPT4gdGhpcy5jbGlja0hhbmRsZXIoZXYpXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYmluZGVkSGFuZGxlcilcbiAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJpbmRlZEhhbmRsZXIpXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgYmluZGVkSGFuZGxlcilcbiAgfVxuXG4gIGdldFZhbGlkRmlsZXMoIGZpbGVzOkZpbGVbXSApOkZpbGVbXXtcbiAgICBjb25zdCBydG46RmlsZVtdID0gW11cbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIGlmKCB0aGlzLmlzRmlsZVZhbGlkKGZpbGVzW3hdKSApe1xuICAgICAgICBydG4ucHVzaCggZmlsZXNbeF0gKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnRuXG4gIH1cblxuICBnZXRJbnZhbGlkRmlsZXMoZmlsZXM6RmlsZVtdKTpJbnZhbGlkRmlsZUl0ZW1bXXtcbiAgICBjb25zdCBydG46SW52YWxpZEZpbGVJdGVtW10gPSBbXVxuICAgIGZvcihsZXQgeD1maWxlcy5sZW5ndGgtMTsgeCA+PSAwOyAtLXgpe1xuICAgICAgbGV0IGZhaWxSZWFzb24gPSB0aGlzLmdldEZpbGVGaWx0ZXJGYWlsTmFtZShmaWxlc1t4XSlcbiAgICAgIGlmKCBmYWlsUmVhc29uICl7XG4gICAgICAgIHJ0bi5wdXNoKHtcbiAgICAgICAgICBmaWxlIDogZmlsZXNbeF0sXG4gICAgICAgICAgdHlwZSA6IGZhaWxSZWFzb25cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ0blxuICB9XG5cbiAgLy8gUHJpbWFyeSBoYW5kbGVyIG9mIGZpbGVzIGNvbWluZyBpblxuICBoYW5kbGVGaWxlcyhmaWxlczpGaWxlW10pe1xuICAgIGNvbnN0IHZhbGlkcyA9IHRoaXMuZ2V0VmFsaWRGaWxlcyhmaWxlcylcblxuICAgIGlmKGZpbGVzLmxlbmd0aCE9dmFsaWRzLmxlbmd0aCl7XG4gICAgICB0aGlzLmxhc3RJbnZhbGlkcyA9IHRoaXMuZ2V0SW52YWxpZEZpbGVzKGZpbGVzKVxuICAgIH1lbHNle1xuICAgICAgZGVsZXRlIHRoaXMubGFzdEludmFsaWRzXG4gICAgfVxuXG4gICAgdGhpcy5sYXN0SW52YWxpZHNDaGFuZ2UuZW1pdCh0aGlzLmxhc3RJbnZhbGlkcylcblxuICAgIGlmKCB2YWxpZHMubGVuZ3RoICl7XG4gICAgICBpZiggdGhpcy5uZ2ZGaXhPcmllbnRhdGlvbiApe1xuICAgICAgICB0aGlzLmFwcGx5RXhpZlJvdGF0aW9ucyh2YWxpZHMpXG4gICAgICAgIC50aGVuKCBmaXhlZEZpbGVzPT50aGlzLnF1ZShmaXhlZEZpbGVzKSApXG4gICAgICB9ZWxzZXtcbiAgICAgICAgdGhpcy5xdWUodmFsaWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRW1wdHlBZnRlclNlbGVjdGlvbigpKSB7XG4gICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXG4gICAgfVxuICB9XG5cbiAgcXVlKCBmaWxlczpGaWxlW10gKXtcbiAgICB0aGlzLmZpbGVzID0gdGhpcy5maWxlcyB8fCBbXVxuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuZmlsZXMsIGZpbGVzKVxuXG4gICAgLy9iZWxvdyBicmVhayBtZW1vcnkgcmVmIGFuZCBkb2VzbnQgYWN0IGxpa2UgYSBxdWVcbiAgICAvL3RoaXMuZmlsZXMgPSBmaWxlcy8vY2F1c2VzIG1lbW9yeSBjaGFuZ2Ugd2hpY2ggdHJpZ2dlcnMgYmluZGluZ3MgbGlrZSA8bmdmRm9ybURhdGEgW2ZpbGVzXT1cImZpbGVzXCI+PC9uZ2ZGb3JtRGF0YT5cblxuICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCggdGhpcy5maWxlcyApXG5cbiAgICBpZihmaWxlcy5sZW5ndGgpe1xuICAgICAgdGhpcy5maWxlQ2hhbmdlLmVtaXQoIHRoaXMuZmlsZT1maWxlc1swXSApXG5cbiAgICAgIGlmKHRoaXMubGFzdEJhc2VVcmxDaGFuZ2Uub2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICAgIGRhdGFVcmwoIGZpbGVzWzBdIClcbiAgICAgICAgLnRoZW4oIHVybD0+dGhpcy5sYXN0QmFzZVVybENoYW5nZS5lbWl0KHVybCkgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vd2lsbCBiZSBjaGVja2VkIGZvciBpbnB1dCB2YWx1ZSBjbGVhcmluZ1xuICAgIHRoaXMubGFzdEZpbGVDb3VudCA9IHRoaXMuZmlsZXMubGVuZ3RoXG4gIH1cblxuICAvKiogY2FsbGVkIHdoZW4gaW5wdXQgaGFzIGZpbGVzICovXG4gIGNoYW5nZUZuKGV2ZW50OmFueSkge1xuICAgIHZhciBmaWxlTGlzdCA9IGV2ZW50Ll9fZmlsZXNfIHx8IChldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmZpbGVzKVxuXG4gICAgaWYgKCFmaWxlTGlzdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgIHRoaXMuaGFuZGxlRmlsZXMoZmlsZUxpc3QpXG4gIH1cblxuICBjbGlja0hhbmRsZXIoZXZ0OiBFdmVudCl7XG4gICAgY29uc3QgZWxtID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnRcbiAgICBpZiAoZWxtLmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCB0aGlzLmZpbGVEcm9wRGlzYWJsZWQpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciByID0gZGV0ZWN0U3dpcGUoZXZ0KTtcbiAgICAvLyBwcmV2ZW50IHRoZSBjbGljayBpZiBpdCBpcyBhIHN3aXBlXG4gICAgaWYgKCByIT09ZmFsc2UgKSByZXR1cm4gcjtcblxuICAgIGNvbnN0IGZpbGVFbG0gPSB0aGlzLnBhcmFtRmlsZUVsbSgpXG4gICAgZmlsZUVsbS5jbGljaygpXG4gICAgLy9maWxlRWxtLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCgnY2xpY2snKSApO1xuICAgIHRoaXMuYmVmb3JlU2VsZWN0KGV2dClcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGJlZm9yZVNlbGVjdChldmVudDogRXZlbnQpe1xuICAgIHRoaXMuZmlsZVNlbGVjdFN0YXJ0LmVtaXQoZXZlbnQpXG5cbiAgICBpZiggdGhpcy5maWxlcyAmJiB0aGlzLmxhc3RGaWxlQ291bnQ9PT10aGlzLmZpbGVzLmxlbmd0aCApcmV0dXJuXG5cbiAgICAvLyBpZiBubyBmaWxlcyBpbiBhcnJheSwgYmUgc3VyZSBicm93c2VyIGRvZXMgbm90IHByZXZlbnQgcmVzZWxlY3Qgb2Ygc2FtZSBmaWxlIChzZWUgZ2l0aHViIGlzc3VlIDI3KVxuICAgIHRoaXMuY2xlYXJGaWxlRWxtVmFsdWUoKVxuICB9XG5cbiAgY2xlYXJGaWxlRWxtVmFsdWUoKSB7XG4gICAgaWYgKCF0aGlzLmZpbGVFbG0pIHJldHVyblxuXG4gICAgdGhpcy5maWxlRWxtLnZhbHVlID0gbnVsbFxuICB9XG5cbiAgaXNFbXB0eUFmdGVyU2VsZWN0aW9uKCk6Ym9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXR0cmlidXRlcy5tdWx0aXBsZTtcbiAgfVxuXG4gIHN0b3BFdmVudChldmVudDphbnkpOmFueSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHRyYW5zZmVySGFzRmlsZXModHJhbnNmZXI6YW55KTphbnkge1xuICAgIGlmICghdHJhbnNmZXIudHlwZXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHJhbnNmZXIudHlwZXMuaW5kZXhPZikge1xuICAgICAgcmV0dXJuIHRyYW5zZmVyLnR5cGVzLmluZGV4T2YoJ0ZpbGVzJykgIT09IC0xO1xuICAgIH0gZWxzZSBpZiAodHJhbnNmZXIudHlwZXMuY29udGFpbnMpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zlci50eXBlcy5jb250YWlucygnRmlsZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGV2ZW50VG9GaWxlcyhldmVudDpFdmVudCl7XG4gICAgY29uc3QgdHJhbnNmZXIgPSBldmVudFRvVHJhbnNmZXIoZXZlbnQpO1xuICAgIGlmKCB0cmFuc2ZlciApe1xuICAgICAgaWYodHJhbnNmZXIuZmlsZXMgJiYgdHJhbnNmZXIuZmlsZXMubGVuZ3RoKXtcbiAgICAgICAgcmV0dXJuIHRyYW5zZmVyLmZpbGVzXG4gICAgICB9XG4gICAgICBpZih0cmFuc2Zlci5pdGVtcyAmJiB0cmFuc2Zlci5pdGVtcy5sZW5ndGgpe1xuICAgICAgICByZXR1cm4gdHJhbnNmZXIuaXRlbXNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBhcHBseUV4aWZSb3RhdGlvbnMoXG4gICAgZmlsZXM6RmlsZVtdXG4gICk6UHJvbWlzZTxGaWxlW10+e1xuICAgIGNvbnN0IG1hcHBlciA9IChcbiAgICAgIGZpbGU6RmlsZSxpbmRleDpudW1iZXJcbiAgICApOlByb21pc2U8YW55Pj0+e1xuICAgICAgcmV0dXJuIGFwcGx5RXhpZlJvdGF0aW9uKGZpbGUpXG4gICAgICAudGhlbiggZml4ZWRGaWxlPT5maWxlcy5zcGxpY2UoaW5kZXgsIDEsIGZpeGVkRmlsZSkgKVxuICAgIH1cblxuICAgIGNvbnN0IHByb21zOlByb21pc2U8YW55PltdID0gW11cbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIHByb21zW3hdID0gbWFwcGVyKCBmaWxlc1t4XSwgeCApXG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbCggcHJvbXMgKS50aGVuKCAoKT0+ZmlsZXMgKVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2UoZXZlbnQ6RXZlbnQpOnZvaWQge1xuICAgIGxldCBmaWxlcyA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmZpbGVzIHx8IHRoaXMuZXZlbnRUb0ZpbGVzKGV2ZW50KVxuXG4gICAgaWYoIWZpbGVzLmxlbmd0aClyZXR1cm5cblxuICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVzKVxuICB9XG5cbiAgZ2V0RmlsZUZpbHRlckZhaWxOYW1lKFxuICAgIGZpbGU6RmlsZVxuICApOnN0cmluZyB8IHVuZGVmaW5lZHtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSsrKXtcbiAgICAgIGlmKCAhdGhpcy5maWx0ZXJzW2ldLmZuLmNhbGwodGhpcywgZmlsZSkgKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyc1tpXS5uYW1lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGlzRmlsZVZhbGlkKGZpbGU6RmlsZSk6Ym9vbGVhbntcbiAgICBjb25zdCBub0ZpbHRlcnMgPSAhdGhpcy5hY2NlcHQgJiYgKCF0aGlzLmZpbHRlcnMgfHwgIXRoaXMuZmlsdGVycy5sZW5ndGgpXG4gICAgaWYoIG5vRmlsdGVycyApe1xuICAgICAgcmV0dXJuIHRydWUvL3dlIGhhdmUgbm8gZmlsdGVycyBzbyBhbGwgZmlsZXMgYXJlIHZhbGlkXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUZpbHRlckZhaWxOYW1lKGZpbGUpID8gZmFsc2UgOiB0cnVlXG4gIH1cblxuICBpc0ZpbGVzVmFsaWQoZmlsZXM6RmlsZVtdKXtcbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIGlmKCAhdGhpcy5pc0ZpbGVWYWxpZChmaWxlc1t4XSkgKXtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwcm90ZWN0ZWQgX2FjY2VwdEZpbHRlcihpdGVtOkZpbGUpOmJvb2xlYW4ge1xuICAgIHJldHVybiBhY2NlcHRUeXBlKHRoaXMuYWNjZXB0LCBpdGVtLnR5cGUsIGl0ZW0ubmFtZSlcbiAgfVxuXG4gIHByb3RlY3RlZCBfZmlsZVNpemVGaWx0ZXIoaXRlbTpGaWxlKTpib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLm1heFNpemUgJiYgaXRlbS5zaXplID4gdGhpcy5tYXhTaXplKTtcbiAgfVxufVxuXG5cbi8qKiBicm93c2VycyB0cnkgaGFyZCB0byBjb25jZWFsIGRhdGEgYWJvdXQgZmlsZSBkcmFncywgdGhpcyB0ZW5kcyB0byB1bmRvIHRoYXQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxlc1RvV3JpdGVhYmxlT2JqZWN0KCBmaWxlczpGaWxlW10gKTpkcmFnTWV0YVtde1xuICBjb25zdCBqc29uRmlsZXM6ZHJhZ01ldGFbXSA9IFtdXG4gIGZvcihsZXQgeD0wOyB4IDwgZmlsZXMubGVuZ3RoOyArK3gpe1xuICAgIGpzb25GaWxlcy5wdXNoKHtcbiAgICAgIHR5cGU6ZmlsZXNbeF0udHlwZSxcbiAgICAgIGtpbmQ6ZmlsZXNbeF1bXCJraW5kXCJdXG4gICAgfSlcbiAgfVxuICByZXR1cm4ganNvbkZpbGVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRvVHJhbnNmZXIoZXZlbnQ6IGFueSk6IFRyYW5zZmVyT2JqZWN0IHtcbiAgaWYoZXZlbnQuZGF0YVRyYW5zZmVyKXJldHVybiBldmVudC5kYXRhVHJhbnNmZXJcbiAgcmV0dXJuICBldmVudC5vcmlnaW5hbEV2ZW50ID8gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIgOiBudWxsXG59XG5cblxuaW50ZXJmYWNlIFRyYW5zZmVyT2JqZWN0IHtcbiAgaXRlbXM/OiBhbnlbXVxuICBmaWxlcz86IGFueVtdXG4gIGRyb3BFZmZlY3Q/OiAnY29weScgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlci9kcm9wRWZmZWN0XG59XG4iXX0=
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { ngfBackground } from './ngfBackground.directive';
import { ngfDrop } from './ngfDrop.directive';
import { ngf } from './ngf.directive';
import { ngfSelect } from './ngfSelect.directive';
import { ngfUploadStatus } from './ngfUploadStatus.directive';
import { ngfFormData } from './ngfFormData.directive';
import { ngfSrc } from './ngfSrc.directive';
//import{ HttpModule } from '@angular/http';
const declarations = [
ngfDrop,
ngfSelect,
ngfBackground,
ngfSrc,
ngfUploadStatus,
ngfFormData,
ngf
];
export class ngfModule {
}
ngfModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule
//,HttpModule
],
declarations: declarations,
exports: declarations //[HttpModule, ...declarations]
},] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1Qyw0Q0FBNEM7QUFFNUMsTUFBTSxZQUFZLEdBQUc7SUFDbkIsT0FBTztJQUNQLFNBQVM7SUFDVCxhQUFhO0lBQ2IsTUFBTTtJQUNOLGVBQWU7SUFDZixXQUFXO0lBQ1gsR0FBRztDQUNKLENBQUE7QUFTRSxNQUFNLE9BQU8sU0FBUzs7O1lBUHhCLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUU7b0JBQ1AsWUFBWTtvQkFDWixhQUFhO2lCQUNkO2dCQUNELFlBQVksRUFBRSxZQUFZO2dCQUMxQixPQUFPLEVBQUUsWUFBWSxDQUFBLCtCQUErQjthQUNyRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBuZ2ZCYWNrZ3JvdW5kIH0gZnJvbSAnLi9uZ2ZCYWNrZ3JvdW5kLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBuZ2ZEcm9wIH0gZnJvbSAnLi9uZ2ZEcm9wLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBuZ2YgfSBmcm9tICcuL25nZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgbmdmU2VsZWN0IH0gZnJvbSAnLi9uZ2ZTZWxlY3QuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZlVwbG9hZFN0YXR1cyB9IGZyb20gJy4vbmdmVXBsb2FkU3RhdHVzLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBuZ2ZGb3JtRGF0YSB9IGZyb20gJy4vbmdmRm9ybURhdGEuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZlNyYyB9IGZyb20gJy4vbmdmU3JjLmRpcmVjdGl2ZSc7XG4vL2ltcG9ydHsgSHR0cE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuXG5jb25zdCBkZWNsYXJhdGlvbnMgPSBbXG4gIG5nZkRyb3AsXG4gIG5nZlNlbGVjdCxcbiAgbmdmQmFja2dyb3VuZCxcbiAgbmdmU3JjLFxuICBuZ2ZVcGxvYWRTdGF0dXMsXG4gIG5nZkZvcm1EYXRhLFxuICBuZ2Zcbl1cblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICAgIC8vLEh0dHBNb2R1bGVcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBkZWNsYXJhdGlvbnMsXG4gIGV4cG9ydHM6IGRlY2xhcmF0aW9ucy8vW0h0dHBNb2R1bGUsIC4uLmRlY2xhcmF0aW9uc11cbn0pIGV4cG9ydCBjbGFzcyBuZ2ZNb2R1bGUge30iXX0=
import { Directive, ElementRef, Input } from '@angular/core';
import { dataUrl } from './fileTools';
export class ngfBackground {
constructor(ElementRef) {
this.ElementRef = ElementRef;
}
ngOnChanges(_changes) {
dataUrl(this.file)
.then(src => {
const urlString = 'url(\'' + (src || '') + '\')';
this.ElementRef.nativeElement.style.backgroundImage = urlString;
});
}
}
ngfBackground.decorators = [
{ type: Directive, args: [{ selector: '[ngfBackground]' },] }
];
ngfBackground.ctorParameters = () => [
{ type: ElementRef }
];
ngfBackground.propDecorators = {
file: [{ type: Input, args: ['ngfBackground',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmQmFja2dyb3VuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmlsZS11cGxvYWQvbmdmQmFja2dyb3VuZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHdEMsTUFBTSxPQUFPLGFBQWE7SUFHeEIsWUFBbUIsVUFBcUI7UUFBckIsZUFBVSxHQUFWLFVBQVUsQ0FBVztJQUFFLENBQUM7SUFFM0MsV0FBVyxDQUFFLFFBQVk7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQSxFQUFFO1lBQ1QsTUFBTSxTQUFTLEdBQUcsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtRQUNqRSxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7OztZQVpGLFNBQVMsU0FBQyxFQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBQzs7O1lBSHBCLFVBQVU7OzttQkFLM0IsS0FBSyxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkYXRhVXJsIH0gZnJvbSAnLi9maWxlVG9vbHMnO1xuXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1tuZ2ZCYWNrZ3JvdW5kXSd9KVxuZXhwb3J0IGNsYXNzIG5nZkJhY2tncm91bmQge1xuICBASW5wdXQoJ25nZkJhY2tncm91bmQnKSBmaWxlOmFueVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBFbGVtZW50UmVmOkVsZW1lbnRSZWYpe31cblxuICBuZ09uQ2hhbmdlcyggX2NoYW5nZXM6YW55ICl7XG4gICAgZGF0YVVybCh0aGlzLmZpbGUpXG4gICAgLnRoZW4oc3JjPT57XG4gICAgICBjb25zdCB1cmxTdHJpbmcgPSAndXJsKFxcJycgKyAoc3JjIHx8ICcnKSArICdcXCcpJ1xuICAgICAgdGhpcy5FbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gdXJsU3RyaW5nXG4gICAgfSlcbiAgfVxufVxuIl19
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { ngf, eventToTransfer, filesToWriteableObject } from "./ngf.directive";
export class ngfDrop extends ngf {
constructor() {
super(...arguments);
this.fileOver = new EventEmitter();
this.validDrag = false;
this.validDragChange = new EventEmitter();
this.invalidDrag = false;
this.invalidDragChange = new EventEmitter();
this.dragFilesChange = new EventEmitter();
}
onDrop(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
let files = this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
}
handleFiles(files) {
this.fileOver.emit(false); //turn-off dragover
super.handleFiles(files);
}
onDragOver(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
const transfer = eventToTransfer(event);
let files = this.eventToFiles(event);
let jsonFiles = filesToWriteableObject(files);
this.dragFilesChange.emit(this.dragFiles = jsonFiles);
if (files.length) {
this.validDrag = this.isFilesValid(files);
}
else {
//Safari, IE11 & some browsers do NOT tell you about dragged files until dropped. Always consider a valid drag
this.validDrag = true;
}
this.validDragChange.emit(this.validDrag);
this.invalidDrag = !this.validDrag;
this.invalidDragChange.emit(this.invalidDrag);
transfer.dropEffect = 'copy'; // change cursor and visual display
this.stopEvent(event);
this.fileOver.emit(true);
}
closeDrags() {
delete this.validDrag;
this.validDragChange.emit(this.validDrag);
this.invalidDrag = false;
this.invalidDragChange.emit(this.invalidDrag);
delete this.dragFiles;
this.dragFilesChange.emit(this.dragFiles);
}
onDragLeave(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
if (this.element) {
if (event.currentTarget === this.element[0]) {
return;
}
}
this.stopEvent(event);
this.fileOver.emit(false);
}
}
ngfDrop.decorators = [
{ type: Directive, args: [{
selector: "[ngfDrop]",
exportAs: "ngfDrop"
},] }
];
ngfDrop.propDecorators = {
fileOver: [{ type: Output }],
validDrag: [{ type: Input }],
validDragChange: [{ type: Output }],
invalidDrag: [{ type: Input }],
invalidDragChange: [{ type: Output }],
dragFiles: [{ type: Input }],
dragFilesChange: [{ type: Output }],
onDrop: [{ type: HostListener, args: ['drop', ['$event'],] }],
onDragOver: [{ type: HostListener, args: ['dragover', ['$event'],] }],
onDragLeave: [{ type: HostListener, args: ['dragleave', ['$event'],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmRHJvcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZmlsZS11cGxvYWQvbmdmRHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUM1QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsR0FBRyxFQUFZLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBTXhGLE1BQU0sT0FBTyxPQUFRLFNBQVEsR0FBRztJQUpoQzs7UUFLWSxhQUFRLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakQsY0FBUyxHQUFXLEtBQUssQ0FBQTtRQUN4QixvQkFBZSxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRTNELGdCQUFXLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLHNCQUFpQixHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRzVELG9CQUFlLEdBQTRCLElBQUksWUFBWSxFQUFFLENBQUE7SUFpRnpFLENBQUM7SUE5RUMsTUFBTSxDQUFDLEtBQVc7UUFDaEIsSUFBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUM7WUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixPQUFNO1NBQ1A7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDakIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVwQyxJQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07WUFBQyxPQUFNO1FBRXZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVk7UUFDdEIs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Q0FBQyxRQUFRLENBQUM7MEJBd0NuQyxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG5nZiwgZHJhZ01ldGEsIGV2ZW50VG9UcmFuc2ZlciwgZmlsZXNUb1dyaXRlYWJsZU9iamVjdCB9IGZyb20gXCIuL25nZi5kaXJlY3RpdmVcIlxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW25nZkRyb3BdXCIsXG4gIGV4cG9ydEFzOiBcIm5nZkRyb3BcIlxufSlcbmV4cG9ydCBjbGFzcyBuZ2ZEcm9wIGV4dGVuZHMgbmdmIHtcbiAgQE91dHB1dCgpIGZpbGVPdmVyOkV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBJbnB1dCgpIHZhbGlkRHJhZzpib29sZWFuID0gZmFsc2VcbiAgQE91dHB1dCgpIHZhbGlkRHJhZ0NoYW5nZTpFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICBASW5wdXQoKSBpbnZhbGlkRHJhZyA9IGZhbHNlXG4gIEBPdXRwdXQoKSBpbnZhbGlkRHJhZ0NoYW5nZTpFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICBASW5wdXQoKSBkcmFnRmlsZXMgITogZHJhZ01ldGFbXVxuICBAT3V0cHV0KCkgZHJhZ0ZpbGVzQ2hhbmdlOkV2ZW50RW1pdHRlcjxkcmFnTWV0YVtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxuICBvbkRyb3AoZXZlbnQ6RXZlbnQpOnZvaWQge1xuICAgIGlmKHRoaXMuZmlsZURyb3BEaXNhYmxlZCl7XG4gICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlRHJhZ3MoKVxuICAgIGxldCBmaWxlcyA9IHRoaXMuZXZlbnRUb0ZpbGVzKGV2ZW50KVxuXG4gICAgaWYoIWZpbGVzLmxlbmd0aClyZXR1cm5cblxuICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVzKVxuICB9XG5cbiAgaGFuZGxlRmlsZXMoZmlsZXM6RmlsZVtdKXtcbiAgICB0aGlzLmZpbGVPdmVyLmVtaXQoZmFsc2UpLy90dXJuLW9mZiBkcmFnb3ZlclxuICAgIHN1cGVyLmhhbmRsZUZpbGVzKGZpbGVzKVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKVxuICBvbkRyYWdPdmVyKGV2ZW50OkV2ZW50KTp2b2lkIHtcbiAgICBpZih0aGlzLmZpbGVEcm9wRGlzYWJsZWQpe1xuICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNmZXIgPSBldmVudFRvVHJhbnNmZXIoZXZlbnQpXG5cbiAgICBsZXQgZmlsZXMgPSB0aGlzLmV2ZW50VG9GaWxlcyhldmVudClcblxuICAgIGxldCBqc29uRmlsZXMgPSBmaWxlc1RvV3JpdGVhYmxlT2JqZWN0KGZpbGVzKVxuICAgIHRoaXMuZHJhZ0ZpbGVzQ2hhbmdlLmVtaXQoIHRoaXMuZHJhZ0ZpbGVzPWpzb25GaWxlcyApXG5cbiAgICBpZiggZmlsZXMubGVuZ3RoICl7XG4gICAgICB0aGlzLnZhbGlkRHJhZyA9IHRoaXMuaXNGaWxlc1ZhbGlkKGZpbGVzKVxuICAgIH1lbHNle1xuICAgICAgLy9TYWZhcmksIElFMTEgJiBzb21lIGJyb3dzZXJzIGRvIE5PVCB0ZWxsIHlvdSBhYm91dCBkcmFnZ2VkIGZpbGVzIHVudGlsIGRyb3BwZWQuIEFsd2F5cyBjb25zaWRlciBhIHZhbGlkIGRyYWdcbiAgICAgIHRoaXMudmFsaWREcmFnID0gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMudmFsaWREcmFnQ2hhbmdlLmVtaXQodGhpcy52YWxpZERyYWcpXG5cbiAgICB0aGlzLmludmFsaWREcmFnID0gIXRoaXMudmFsaWREcmFnXG4gICAgdGhpcy5pbnZhbGlkRHJhZ0NoYW5nZS5lbWl0KHRoaXMuaW52YWxpZERyYWcpXG5cbiAgICB0cmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknIC8vIGNoYW5nZSBjdXJzb3IgYW5kIHZpc3VhbCBkaXNwbGF5XG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpXG4gICAgdGhpcy5maWxlT3Zlci5lbWl0KHRydWUpXG4gIH1cblxuICBjbG9zZURyYWdzKCl7XG4gICAgZGVsZXRlIHRoaXMudmFsaWREcmFnXG4gICAgdGhpcy52YWxpZERyYWdDaGFuZ2UuZW1pdCh0aGlzLnZhbGlkRHJhZylcbiAgICB0aGlzLmludmFsaWREcmFnID0gZmFsc2VcbiAgICB0aGlzLmludmFsaWREcmFnQ2hhbmdlLmVtaXQodGhpcy5pbnZhbGlkRHJhZylcbiAgICBkZWxldGUgdGhpcy5kcmFnRmlsZXNcbiAgICB0aGlzLmRyYWdGaWxlc0NoYW5nZS5lbWl0KCB0aGlzLmRyYWdGaWxlcyApXG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBbJyRldmVudCddKVxuICBvbkRyYWdMZWF2ZShldmVudDpFdmVudCk6YW55IHtcbiAgICBpZih0aGlzLmZpbGVEcm9wRGlzYWJsZWQpe1xuICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZURyYWdzKClcblxuICAgIGlmICgodGhpcyBhcyBhbnkpLmVsZW1lbnQpIHtcbiAgICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0ID09PSAodGhpcyBhcyBhbnkpLmVsZW1lbnRbMF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICB0aGlzLmZpbGVPdmVyLmVtaXQoZmFsc2UpO1xuICB9XG59Il19
import { IterableDiffers, Directive, EventEmitter, Output, Input } from '@angular/core';
export class ngfFormData {
constructor(IterableDiffers) {
this.postName = "file";
this.FormData = new FormData();
this.FormDataChange = new EventEmitter();
this.differ = IterableDiffers.find([]).create();
}
ngDoCheck() {
var changes = this.differ.diff(this.files);
if (changes) {
setTimeout(() => this.buildFormData(), 0);
}
}
buildFormData() {
const isArray = typeof (this.files) === 'object' && this.files.constructor === Array;
if (isArray) {
this.FormData = new FormData();
const files = this.files || [];
files.forEach(file => this.FormData.append(this.postName, file, this.fileName || file.name));
this.FormDataChange.emit(this.FormData);
}
else {
delete this.FormData;
}
}
}
ngfFormData.decorators = [
{ type: Directive, args: [{ selector: 'ngfFormData' },] }
];
ngfFormData.ctorParameters = () => [
{ type: IterableDiffers }
];
ngfFormData.propDecorators = {
files: [{ type: Input }],
postName: [{ type: Input }],
fileName: [{ type: Input }],
FormData: [{ type: Input }],
FormDataChange: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmRm9ybURhdGEuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL25nZkZvcm1EYXRhLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZUFBZSxFQUNmLFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLE1BQU0sRUFBRSxLQUFLLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFHdkIsTUFBTSxPQUFPLFdBQVc7SUFVdEIsWUFBWSxlQUFnQztRQVJuQyxhQUFRLEdBQVUsTUFBTSxDQUFBO1FBR3hCLGFBQVEsR0FBWSxJQUFJLFFBQVEsRUFBRSxDQUFBO1FBQ2pDLG1CQUFjLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUE7UUFLbEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ2pELENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBRSxDQUFDO1FBRTdDLElBQUksT0FBTyxFQUFFO1lBQ1gsVUFBVSxDQUFDLEdBQUUsRUFBRSxDQUFBLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUN4QztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxPQUFPLEdBQUcsT0FBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUcsS0FBSyxDQUFBO1FBRS9FLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFBO1lBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO1lBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBLEVBQUUsQ0FDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3BFLENBQUE7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFFLENBQUE7U0FDMUM7YUFBSTtZQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtTQUNyQjtJQUNILENBQUM7OztZQXBDRixTQUFTLFNBQUMsRUFBQyxRQUFRLEVBQUUsYUFBYSxFQUFDOzs7WUFMbEMsZUFBZTs7O29CQU9kLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLO3VCQUVMLEtBQUs7NkJBQ0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEl0ZXJhYmxlRGlmZmVyLFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLFxuICBPdXRwdXQsIElucHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ25nZkZvcm1EYXRhJ30pXG5leHBvcnQgY2xhc3MgbmdmRm9ybURhdGEge1xuICBASW5wdXQoKSBmaWxlcyAhOiBGaWxlW11cbiAgQElucHV0KCkgcG9zdE5hbWU6c3RyaW5nID0gXCJmaWxlXCJcbiAgQElucHV0KCkgZmlsZU5hbWUgITogc3RyaW5nLy9mb3JjZSBmaWxlIG5hbWVcblxuICBASW5wdXQoKSBGb3JtRGF0YTpGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gIEBPdXRwdXQoKSBGb3JtRGF0YUNoYW5nZTpFdmVudEVtaXR0ZXI8Rm9ybURhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgZGlmZmVyOkl0ZXJhYmxlRGlmZmVyPHt9PlxuXG4gIGNvbnN0cnVjdG9yKEl0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzKXtcbiAgICB0aGlzLmRpZmZlciA9IEl0ZXJhYmxlRGlmZmVycy5maW5kKFtdKS5jcmVhdGUoKVxuICB9XG5cbiAgbmdEb0NoZWNrKCl7XG4gICAgdmFyIGNoYW5nZXMgPSB0aGlzLmRpZmZlci5kaWZmKCB0aGlzLmZpbGVzICk7XG5cbiAgICBpZiAoY2hhbmdlcykge1xuICAgICAgc2V0VGltZW91dCgoKT0+dGhpcy5idWlsZEZvcm1EYXRhKCksIDApXG4gICAgfVxuICB9XG5cbiAgYnVpbGRGb3JtRGF0YSgpe1xuICAgIGNvbnN0IGlzQXJyYXkgPSB0eXBlb2YodGhpcy5maWxlcyk9PT0nb2JqZWN0JyAmJiB0aGlzLmZpbGVzLmNvbnN0cnVjdG9yPT09QXJyYXlcblxuICAgIGlmKCBpc0FycmF5ICl7XG4gICAgICB0aGlzLkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAgIGNvbnN0IGZpbGVzID0gdGhpcy5maWxlcyB8fCBbXVxuICAgICAgZmlsZXMuZm9yRWFjaChmaWxlPT5cbiAgICAgICAgdGhpcy5Gb3JtRGF0YS5hcHBlbmQodGhpcy5wb3N0TmFtZSwgZmlsZSwgdGhpcy5maWxlTmFtZXx8ZmlsZS5uYW1lKVxuICAgICAgKVxuICAgICAgdGhpcy5Gb3JtRGF0YUNoYW5nZS5lbWl0KCB0aGlzLkZvcm1EYXRhIClcbiAgICB9ZWxzZXtcbiAgICAgIGRlbGV0ZSB0aGlzLkZvcm1EYXRhXG4gICAgfVxuICB9XG59Il19
import { Directive, Input } from "@angular/core";
import { ngf } from "./ngf.directive";
export class ngfSelect extends ngf {
constructor() {
super(...arguments);
this.selectable = true;
}
}
ngfSelect.decorators = [
{ type: Directive, args: [{
selector: "[ngfSelect]",
exportAs: "ngfSelect"
},] }
];
ngfSelect.propDecorators = {
selectable: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmU2VsZWN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZTZWxlY3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQU1yQyxNQUFNLE9BQU8sU0FBVSxTQUFRLEdBQUc7SUFKbEM7O1FBS1csZUFBVSxHQUFPLElBQUksQ0FBQTtJQUNoQyxDQUFDOzs7WUFOQSxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLFFBQVEsRUFBRSxXQUFXO2FBQ3RCOzs7eUJBRUUsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5pbXBvcnQgeyBuZ2YgfSBmcm9tIFwiLi9uZ2YuZGlyZWN0aXZlXCJcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIltuZ2ZTZWxlY3RdXCIsXG4gIGV4cG9ydEFzOiBcIm5nZlNlbGVjdFwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZlNlbGVjdCBleHRlbmRzIG5nZiB7XG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6YW55ID0gdHJ1ZVxufSJdfQ==
import { Directive, ElementRef, Input } from '@angular/core';
import { dataUrl } from './fileTools';
export class ngfSrc {
constructor(ElementRef) {
this.ElementRef = ElementRef;
}
ngOnChanges(_changes) {
dataUrl(this.file)
.then(src => this.ElementRef.nativeElement.src = src);
}
}
ngfSrc.decorators = [
{ type: Directive, args: [{ selector: '[ngfSrc]' },] }
];
ngfSrc.ctorParameters = () => [
{ type: ElementRef }
];
ngfSrc.propDecorators = {
file: [{ type: Input, args: ['ngfSrc',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmU3JjLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZTcmMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3RDLE1BQU0sT0FBTyxNQUFNO0lBR2pCLFlBQW1CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFBSSxDQUFDO0lBRTlDLFdBQVcsQ0FBQyxRQUFhO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUEsRUFBRSxDQUNULElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQ3hDLENBQUE7SUFDSCxDQUFDOzs7WUFYRixTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFOzs7WUFIZixVQUFVOzs7bUJBSzNCLEtBQUssU0FBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGF0YVVybCB9IGZyb20gJy4vZmlsZVRvb2xzJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25nZlNyY10nIH0pXG5leHBvcnQgY2xhc3MgbmdmU3JjIHtcbiAgQElucHV0KCduZ2ZTcmMnKSBmaWxlOiBhbnlcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgRWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IGFueSkge1xuICAgIGRhdGFVcmwodGhpcy5maWxlKVxuICAgIC50aGVuKHNyYz0+XG4gICAgICB0aGlzLkVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zcmMgPSBzcmNcbiAgICApXG4gIH1cbn1cbiJdfQ==
import { Directive, EventEmitter, Output, Input } from '@angular/core';
export class ngfUploadStatus {
constructor() {
this.percent = 0;
this.percentChange = new EventEmitter();
}
ngOnChanges(changes) {
if (changes.httpEvent && changes.httpEvent.currentValue) {
const event = changes.httpEvent.currentValue;
if (event.loaded && event.total) {
setTimeout(() => {
this.percent = Math.round(100 * event.loaded / event.total);
this.percentChange.emit(this.percent);
}, 0);
}
}
}
}
ngfUploadStatus.decorators = [
{ type: Directive, args: [{ selector: 'ngfUploadStatus' },] }
];
ngfUploadStatus.propDecorators = {
percent: [{ type: Input }],
percentChange: [{ type: Output }],
httpEvent: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmVXBsb2FkU3RhdHVzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZVcGxvYWRTdGF0dXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdkUsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFFVyxZQUFPLEdBQVUsQ0FBQyxDQUFBO1FBQ2pCLGtCQUFhLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUE7SUFjbkUsQ0FBQztJQVhDLFdBQVcsQ0FBRSxPQUFPO1FBQ2xCLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTtZQUN2RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQTtZQUM1QyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtnQkFDL0IsVUFBVSxDQUFDLEdBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFFLENBQUE7Z0JBQ3pDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTthQUNOO1NBQ0Y7SUFDSCxDQUFDOzs7WUFoQkYsU0FBUyxTQUFDLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDOzs7c0JBRXJDLEtBQUs7NEJBQ0wsTUFBTTt3QkFDTixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICduZ2ZVcGxvYWRTdGF0dXMnfSlcbmV4cG9ydCBjbGFzcyBuZ2ZVcGxvYWRTdGF0dXMge1xuICBASW5wdXQoKSBwZXJjZW50Om51bWJlciA9IDBcbiAgQE91dHB1dCgpIHBlcmNlbnRDaGFuZ2U6RXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQElucHV0KCkgaHR0cEV2ZW50ICE6IEV2ZW50XG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXMgKXtcbiAgICBpZiggY2hhbmdlcy5odHRwRXZlbnQgJiYgY2hhbmdlcy5odHRwRXZlbnQuY3VycmVudFZhbHVlICl7XG4gICAgICBjb25zdCBldmVudCA9IGNoYW5nZXMuaHR0cEV2ZW50LmN1cnJlbnRWYWx1ZVxuICAgICAgaWYgKGV2ZW50LmxvYWRlZCAmJiBldmVudC50b3RhbCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgdGhpcy5wZXJjZW50ID0gTWF0aC5yb3VuZCgxMDAgKiBldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCk7XG4gICAgICAgICAgdGhpcy5wZXJjZW50Q2hhbmdlLmVtaXQoIHRoaXMucGVyY2VudCApXG4gICAgICAgIH0sIDApXG4gICAgICB9XG4gICAgfVxuICB9XG59Il19
export * from './file-upload/ngf.module';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywwQkFBMEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZmlsZS11cGxvYWQvbmdmLm1vZHVsZSciXX0=
/*
* Public API Surface of angular-file
*/
export * from './file-upload/ngfSelect.directive';
export * from './file-upload/ngfDrop.directive';
export * from './file-upload/ngf.directive';
export * from './file-upload/ngf.module';
export { ngfBackground } from './file-upload/ngfBackground.directive';
export { ngfSrc } from './file-upload/ngfSrc.directive';
export { ngfUploadStatus } from './file-upload/ngfUploadStatus.directive';
export { ngfFormData } from './file-upload/ngfFormData.directive';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFuZ3VsYXItZmlsZVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vZmlsZS11cGxvYWQvbmdmU2VsZWN0LmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZkRyb3AuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS11cGxvYWQvbmdmLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZi5tb2R1bGUnO1xuZXhwb3J0IHsgbmdmQmFja2dyb3VuZCB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmQmFja2dyb3VuZC5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgbmdmU3JjIH0gZnJvbSAnLi9maWxlLXVwbG9hZC9uZ2ZTcmMuZGlyZWN0aXZlJztcbmV4cG9ydCB7IG5nZlVwbG9hZFN0YXR1cyB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmVXBsb2FkU3RhdHVzLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBuZ2ZGb3JtRGF0YSB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmRm9ybURhdGEuZGlyZWN0aXZlJzsiXX0=
/**
* Generated bundle index. Do not edit.
*/
export * from './public-api';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1maWxlLXNyYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hbmd1bGFyLWZpbGUtc3JjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
export const isFileInput = function (elm) {
const ty = elm.getAttribute('type');
return elm.tagName.toLowerCase() === 'input' && ty && ty.toLowerCase() === 'file';
};
let initialTouchStartY = 0;
let initialTouchStartX = 0;
export const detectSwipe = function (evt) {
var touches = evt.changedTouches || (evt.originalEvent && evt.originalEvent.changedTouches);
if (touches) {
if (evt.type === 'touchstart') {
initialTouchStartX = touches[0].clientX;
initialTouchStartY = touches[0].clientY;
return true; // don't block event default
}
else {
// prevent scroll from triggering event
if (evt.type === 'touchend') {
var currentX = touches[0].clientX;
var currentY = touches[0].clientY;
if ((Math.abs(currentX - initialTouchStartX) > 20) ||
(Math.abs(currentY - initialTouchStartY) > 20)) {
evt.stopPropagation();
if (evt.cancelable) {
evt.preventDefault();
}
return false;
}
}
return true;
}
}
return false;
};
export const createInvisibleFileInputWrap = function () {
var fileElem = createFileInput();
var label = document.createElement('label');
label.innerHTML = 'upload';
label.style.visibility = 'hidden';
label.style.position = 'absolute';
label.style.overflow = 'hidden';
label.style.width = '0px';
label.style.height = '0px';
label.style.border = 'none';
label.style.margin = '0px';
label.style.padding = '0px';
label.setAttribute('tabindex', '-1');
//bindAttrToFileInput(fileElem, label);
//generatedElems.push({el: elem, ref: label});
label.appendChild(fileElem);
//document.body.appendChild( label );
return label;
};
export const createFileInput = function () {
var fileElem = document.createElement('input');
fileElem.type = "file";
return fileElem;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL2RvYy1ldmVudC1oZWxwLmZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBUyxHQUFPO0lBQ3pDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbkMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLE9BQU8sSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sQ0FBQztBQUNwRixDQUFDLENBQUE7QUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUMzQixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsVUFBUyxHQUFPO0lBQ3pDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxjQUFjLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDNUYsSUFBSSxPQUFPLEVBQUU7UUFDWCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO1lBQzdCLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDeEMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUN4QyxPQUFPLElBQUksQ0FBQyxDQUFDLDRCQUE0QjtTQUMxQzthQUFNO1lBQ0wsdUNBQXVDO1lBQ3ZDLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUU7Z0JBQzNCLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDaEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFO29CQUNoRCxHQUFHLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3RCLElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTt3QkFDbEIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO3FCQUN0QjtvQkFDRCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBRztJQUMxQyxJQUFJLFFBQVEsR0FBRyxlQUFlLEVBQUUsQ0FBQTtJQUNoQyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLEtBQUssQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFBO0lBQzFCLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQTtJQUNqQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUE7SUFDakMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO0lBQy9CLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7SUFDMUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0lBQzNCLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtJQUMxQixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7SUFDM0IsS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFFbkMsdUNBQXVDO0lBQ3ZDLDhDQUE4QztJQUU5QyxLQUFLLENBQUMsV0FBVyxDQUFFLFFBQVEsQ0FBRSxDQUFBO0lBQzdCLHFDQUFxQztJQUVyQyxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLFFBQVEsQ0FBQyxJQUFJLEdBQUMsTUFBTSxDQUFBO0lBQ3BCLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBpc0ZpbGVJbnB1dCA9IGZ1bmN0aW9uKGVsbTphbnkpe1xuICBjb25zdCB0eSA9IGVsbS5nZXRBdHRyaWJ1dGUoJ3R5cGUnKVxuICByZXR1cm4gZWxtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiB0eSAmJiB0eS50b0xvd2VyQ2FzZSgpID09PSAnZmlsZSc7XG59XG5cbmxldCBpbml0aWFsVG91Y2hTdGFydFkgPSAwO1xubGV0IGluaXRpYWxUb3VjaFN0YXJ0WCA9IDA7XG5leHBvcnQgY29uc3QgZGV0ZWN0U3dpcGUgPSBmdW5jdGlvbihldnQ6YW55KTpib29sZWFuIHtcbiAgdmFyIHRvdWNoZXMgPSBldnQuY2hhbmdlZFRvdWNoZXMgfHwgKGV2dC5vcmlnaW5hbEV2ZW50ICYmIGV2dC5vcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzKTtcbiAgaWYgKHRvdWNoZXMpIHtcbiAgICBpZiAoZXZ0LnR5cGUgPT09ICd0b3VjaHN0YXJ0Jykge1xuICAgICAgaW5pdGlhbFRvdWNoU3RhcnRYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgaW5pdGlhbFRvdWNoU3RhcnRZID0gdG91Y2hlc1swXS5jbGllbnRZO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIGRvbid0IGJsb2NrIGV2ZW50IGRlZmF1bHRcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gcHJldmVudCBzY3JvbGwgZnJvbSB0cmlnZ2VyaW5nIGV2ZW50XG4gICAgICBpZiAoZXZ0LnR5cGUgPT09ICd0b3VjaGVuZCcpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRYID0gdG91Y2hlc1swXS5jbGllbnRYO1xuICAgICAgICB2YXIgY3VycmVudFkgPSB0b3VjaGVzWzBdLmNsaWVudFk7XG4gICAgICAgIGlmICgoTWF0aC5hYnMoY3VycmVudFggLSBpbml0aWFsVG91Y2hTdGFydFgpID4gMjApIHx8XG4gICAgICAgICAgKE1hdGguYWJzKGN1cnJlbnRZIC0gaW5pdGlhbFRvdWNoU3RhcnRZKSA+IDIwKSkge1xuICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBpZiAoZXZ0LmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUludmlzaWJsZUZpbGVJbnB1dFdyYXAgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGZpbGVFbGVtID0gY3JlYXRlRmlsZUlucHV0KClcbiAgdmFyIGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgbGFiZWwuaW5uZXJIVE1MID0gJ3VwbG9hZCdcbiAgbGFiZWwuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nXG4gIGxhYmVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICBsYWJlbC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nXG4gIGxhYmVsLnN0eWxlLndpZHRoID0gJzBweCdcbiAgbGFiZWwuc3R5bGUuaGVpZ2h0ID0gJzBweCdcbiAgbGFiZWwuc3R5bGUuYm9yZGVyID0gJ25vbmUnXG4gIGxhYmVsLnN0eWxlLm1hcmdpbiA9ICcwcHgnXG4gIGxhYmVsLnN0eWxlLnBhZGRpbmcgPSAnMHB4J1xuICBsYWJlbC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywnLTEnKVxuICBcbiAgLy9iaW5kQXR0clRvRmlsZUlucHV0KGZpbGVFbGVtLCBsYWJlbCk7XG4gIC8vZ2VuZXJhdGVkRWxlbXMucHVzaCh7ZWw6IGVsZW0sIHJlZjogbGFiZWx9KTtcblxuICBsYWJlbC5hcHBlbmRDaGlsZCggZmlsZUVsZW0gKVxuICAvL2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGxhYmVsICk7XG5cbiAgcmV0dXJuIGxhYmVsO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlRmlsZUlucHV0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmaWxlRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gIGZpbGVFbGVtLnR5cGU9XCJmaWxlXCJcbiAgcmV0dXJuIGZpbGVFbGVtO1xufVxuIl19
export function getWindow() { return window; }
export function acceptType(accept, type, name) {
if (!accept) {
return true;
}
const defs = accept.split(',');
let regx;
let acceptRegString;
for (let x = defs.length - 1; x >= 0; --x) {
//Escapes dots in mimetype
acceptRegString = defs[x];
//trim
acceptRegString = acceptRegString.replace(/(^\s+|\s+$)/g, '');
//Escapes stars in mimetype
acceptRegString = acceptRegString.replace(/\*/g, '.*');
//let acceptReg = '^((' + acceptRegString
//acceptReg = acceptReg.replace(/,/g,')|(') + '))$'
//try by mime
regx = new RegExp(acceptRegString, 'gi');
if (type.search(regx) >= 0) {
return true;
}
//try by ext
if (acceptRegString.substring(0, 1) == '.') {
acceptRegString = '\\' + acceptRegString; //.substring(1, acceptRegString.length-1)//remove dot at front
regx = new RegExp(acceptRegString + '$', 'i');
if ((name || type).search(regx) >= 0) {
return true;
}
}
}
return false;
}
export function arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
export function dataUrltoBlob(dataurl, name, origSize) {
var arr = dataurl.split(',');
var mimeMatch = arr[0].match(/:(.*?);/);
var mime = mimeMatch ? mimeMatch[1] : 'text/plain';
var bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var blob = new window.Blob([u8arr], { type: mime });
blob["name"] = name;
blob["$ngfOrigSize"] = origSize;
return blob;
}
export function applyTransform(ctx, orientation, width, height) {
switch (orientation) {
case 2:
return ctx.transform(-1, 0, 0, 1, width, 0);
case 3:
return ctx.transform(-1, 0, 0, -1, width, height);
case 4:
return ctx.transform(1, 0, 0, -1, 0, height);
case 5:
return ctx.transform(0, 1, 1, 0, 0, 0);
case 6:
return ctx.transform(0, 1, -1, 0, height, 0);
case 7:
return ctx.transform(0, -1, -1, 0, height, width);
case 8:
return ctx.transform(0, -1, 1, 0, 0, width);
}
}
export function fixFileOrientationByMeta(file, result) {
return dataUrl(file, true)
.then(url => {
var canvas = document.createElement('canvas');
var img = document.createElement('img');
return new Promise(function (res, rej) {
img.onload = function () {
try {
canvas.width = result.orientation > 4 ? img.height : img.width;
canvas.height = result.orientation > 4 ? img.width : img.height;
var ctx = canvas.getContext('2d');
applyTransform(ctx, result.orientation, img.width, img.height);
ctx.drawImage(img, 0, 0);
var dataUrl = canvas.toDataURL(file.type || 'image/WebP', 0.934);
const base = arrayBufferToBase64(result.fixedArrayBuffer);
dataUrl = restoreExif(base, dataUrl);
var blob = dataUrltoBlob(dataUrl, file.name);
const newFile = blobToFile(blob, file.name);
res(newFile);
}
catch (e) {
rej(e);
}
};
img.onerror = rej;
img.src = url;
});
});
}
export function applyExifRotation(file) {
if (file.type.indexOf('image/jpeg') !== 0) {
return Promise.resolve(file);
}
return readOrientation(file)
.then((result) => {
if (result.orientation < 2 || result.orientation > 8) {
return file;
}
return fixFileOrientationByMeta(file, result);
});
}
export function readOrientation(file) {
return new Promise((res, rej) => {
var reader = new FileReader();
var slicedFile = file.slice ? file.slice(0, 64 * 1024) : file;
reader.readAsArrayBuffer(slicedFile);
reader.onerror = rej;
reader.onload = function (e) {
var result = { orientation: 1 };
var view = new DataView(this.result);
if (view.getUint16(0, false) !== 0xFFD8)
return res(result);
var length = view.byteLength, offset = 2;
while (offset < length) {
var marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xFFE1) {
if (view.getUint32(offset += 2, false) !== 0x45786966)
return res(result);
var little = view.getUint16(offset += 6, false) === 0x4949;
offset += view.getUint32(offset + 4, little);
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++)
if (view.getUint16(offset + (i * 12), little) === 0x0112) {
var orientation = view.getUint16(offset + (i * 12) + 8, little);
if (orientation >= 2 && orientation <= 8) {
view.setUint16(offset + (i * 12) + 8, 1, little);
result.fixedArrayBuffer = e.target.result;
}
result.orientation = orientation;
return res(result);
}
}
else if ((marker & 0xFF00) !== 0xFF00)
break;
else
offset += view.getUint16(offset, false);
}
return res(result);
};
});
}
/** converts file-input file into base64 dataUri */
export function dataUrl(file, disallowObjectUrl) {
if (!file)
return Promise.resolve(file);
if ((disallowObjectUrl && file.$ngfDataUrl != null) || (!disallowObjectUrl && file.$ngfBlobUrl != null)) {
return Promise.resolve(disallowObjectUrl ? file.$ngfDataUrl : file.$ngfBlobUrl);
}
var p = disallowObjectUrl ? file.$$ngfDataUrlPromise : file.$$ngfBlobUrlPromise;
if (p)
return p;
const win = getWindow();
let deferred;
if (win.FileReader && file &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = win.URL || win.webkitURL;
if (FileReader) {
deferred = new Promise((res, rej) => {
var fileReader = new FileReader();
fileReader.onload = function (event) {
file.$ngfDataUrl = event.target.result;
delete file.$ngfDataUrl;
res(event.target.result);
};
fileReader.onerror = function (e) {
file.$ngfDataUrl = '';
rej(e);
};
fileReader.readAsDataURL(file);
});
}
else {
var url;
try {
url = URL.createObjectURL(file);
}
catch (e) {
return Promise.reject(e);
}
deferred = Promise.resolve(url);
file.$ngfBlobUrl = url;
}
}
else {
file[disallowObjectUrl ? '$ngfDataUrl' : '$ngfBlobUrl'] = '';
return Promise.reject(new Error('Browser does not support window.FileReader, window.FileReader, or window.FileAPI')); //deferred.reject();
}
if (disallowObjectUrl) {
p = file.$$ngfDataUrlPromise = deferred;
}
else {
p = file.$$ngfBlobUrlPromise = deferred;
}
p = p.then((x) => {
delete file[disallowObjectUrl ? '$$ngfDataUrlPromise' : '$$ngfBlobUrlPromise'];
return x;
});
return p;
}
export function restoreExif(orig, resized) {
var ExifRestorer = {
KEY_STR: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
};
ExifRestorer.encode64 = function (input) {
var output = '', chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0;
do {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
}
else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this.KEY_STR.charAt(enc1) +
this.KEY_STR.charAt(enc2) +
this.KEY_STR.charAt(enc3) +
this.KEY_STR.charAt(enc4);
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return output;
};
ExifRestorer.restore = function (origFileBase64, resizedFileBase64) {
if (origFileBase64.match('data:image/jpeg;base64,')) {
origFileBase64 = origFileBase64.replace('data:image/jpeg;base64,', '');
}
var rawImage = this.decode64(origFileBase64);
var segments = this.slice2Segments(rawImage);
var image = this.exifManipulation(resizedFileBase64, segments);
return 'data:image/jpeg;base64,' + this.encode64(image);
};
ExifRestorer.exifManipulation = function (resizedFileBase64, segments) {
var exifArray = this.getExifArray(segments), newImageArray = this.insertExif(resizedFileBase64, exifArray);
return new Uint8Array(newImageArray);
};
ExifRestorer.getExifArray = function (segments) {
var seg;
for (var x = 0; x < segments.length; x++) {
seg = segments[x];
if (seg[0] === 255 && seg[1] === 225) //(ff e1)
{
return seg;
}
}
return [];
};
ExifRestorer.insertExif = function (resizedFileBase64, exifArray) {
var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', ''), buf = this.decode64(imageData), separatePoint = buf.indexOf(255, 3), mae = buf.slice(0, separatePoint), ato = buf.slice(separatePoint), array = mae;
array = array.concat(exifArray);
array = array.concat(ato);
return array;
};
ExifRestorer.slice2Segments = function (rawImageArray) {
var head = 0, segments = [];
while (1) {
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 218) {
break;
}
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 216) {
head += 2;
}
else {
var length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];
var endPoint = head + length + 2;
var seg = rawImageArray.slice(head, endPoint);
segments.push(seg);
head = endPoint;
}
if (head > rawImageArray.length) {
break;
}
}
return segments;
};
ExifRestorer.decode64 = function (input) {
var chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0, buf = [];
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)) {
console.log('There were invalid base64 characters in the input text.');
}
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
do {
enc1 = this.KEY_STR.indexOf(input.charAt(i++));
enc2 = this.KEY_STR.indexOf(input.charAt(i++));
enc3 = this.KEY_STR.indexOf(input.charAt(i++));
enc4 = this.KEY_STR.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
buf.push(chr1);
if (enc3 !== 64) {
buf.push(chr2);
}
if (enc4 !== 64) {
buf.push(chr3);
}
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return buf;
};
return ExifRestorer.restore(orig, resized); //<= EXIF
}
;
function blobToFile(theBlob, fileName) {
var b = theBlob;
//A Blob() is almost a File() - it's just missing the two properties below which we will add
b.lastModifiedDate = new Date();
b.name = fileName;
//Cast to a File() type
return theBlob;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVRvb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL2ZpbGVUb29scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsU0FBUyxLQUFPLE9BQU8sTUFBTSxDQUFBLENBQUEsQ0FBQztBQUU5QyxNQUFNLFVBQVUsVUFBVSxDQUFDLE1BQWEsRUFBRSxJQUFXLEVBQUUsSUFBWTtJQUNqRSxJQUFJLENBQUMsTUFBTSxFQUFFO1FBQ1gsT0FBTyxJQUFJLENBQUE7S0FDWjtJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDOUIsSUFBSSxJQUFXLENBQUE7SUFDZixJQUFJLGVBQXNCLENBQUE7SUFFMUIsS0FBSSxJQUFJLENBQUMsR0FBQyxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFDO1FBQ25DLDJCQUEyQjtRQUMzQixlQUFlLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3pCLE1BQU07UUFDTixlQUFlLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUMsRUFBRSxDQUFDLENBQUE7UUFDNUQsNEJBQTRCO1FBQzVCLGVBQWUsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBQyxJQUFJLENBQUMsQ0FBQTtRQUNyRCx5Q0FBeUM7UUFDekMsbURBQW1EO1FBRW5ELGFBQWE7UUFDYixJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFBO1FBQ3hDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBRSxDQUFDLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUE7U0FDWjtRQUVELFlBQVk7UUFDWixJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FB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O2dCQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEI7WUFDRCxJQUFJLElBQUksS0FBSyxFQUFFLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNoQjtZQUVELElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1NBRWhDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFFM0IsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLENBQUM7SUFFRixPQUFPLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUUsU0FBUztBQUN4RCxDQUFDO0FBQUEsQ0FBQztBQUVGLFNBQVMsVUFBVSxDQUFDLE9BQWEsRUFBRSxRQUFlO0lBQ2hELElBQUksQ0FBQyxHQUFRLE9BQU8sQ0FBQztJQUNyQiw0RkFBNEY7SUFDNUYsQ0FBQyxDQUFDLGdCQUFnQixHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUFDaEMsQ0FBQyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7SUFFbEIsdUJBQXVCO0lBQ3ZCLE9BQWEsT0FBTyxDQUFDO0FBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZ2V0V2luZG93KCk6YW55e3JldHVybiB3aW5kb3d9XG5cbmV4cG9ydCBmdW5jdGlvbiBhY2NlcHRUeXBlKGFjY2VwdDpzdHJpbmcsIHR5cGU6c3RyaW5nLCBuYW1lPzpzdHJpbmcpOmJvb2xlYW4geyAgIFxuICBpZiggIWFjY2VwdCApe1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBjb25zdCBkZWZzID0gYWNjZXB0LnNwbGl0KCcsJylcbiAgbGV0IHJlZ3g6UmVnRXhwXG4gIGxldCBhY2NlcHRSZWdTdHJpbmc6c3RyaW5nXG5cbiAgZm9yKGxldCB4PWRlZnMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAvL0VzY2FwZXMgZG90cyBpbiBtaW1ldHlwZSBcbiAgICBhY2NlcHRSZWdTdHJpbmcgPSBkZWZzW3hdXG4gICAgLy90cmltXG4gICAgYWNjZXB0UmVnU3RyaW5nID0gYWNjZXB0UmVnU3RyaW5nLnJlcGxhY2UoLyheXFxzK3xcXHMrJCkvZywnJylcbiAgICAvL0VzY2FwZXMgc3RhcnMgaW4gbWltZXR5cGUgXG4gICAgYWNjZXB0UmVnU3RyaW5nID0gYWNjZXB0UmVnU3RyaW5nLnJlcGxhY2UoL1xcKi9nLCcuKicpXG4gICAgLy9sZXQgYWNjZXB0UmVnID0gJ14oKCcgKyBhY2NlcHRSZWdTdHJpbmdcbiAgICAvL2FjY2VwdFJlZyA9IGFjY2VwdFJlZy5yZXBsYWNlKC8sL2csJyl8KCcpICsgJykpJCdcbiAgICBcbiAgICAvL3RyeSBieSBtaW1lXG4gICAgcmVneCA9IG5ldyBSZWdFeHAoYWNjZXB0UmVnU3RyaW5nLCAnZ2knKVxuICAgIGlmKCB0eXBlLnNlYXJjaChyZWd4KT49MCApe1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICAvL3RyeSBieSBleHRcbiAgICBpZiggYWNjZXB0UmVnU3RyaW5nLnN1YnN0cmluZygwLCAxKT09Jy4nICl7ICAgICAgXG4gICAgICBhY2NlcHRSZWdTdHJpbmcgPSAnXFxcXCcrIGFjY2VwdFJlZ1N0cmluZy8vLnN1YnN0cmluZygxLCBhY2NlcHRSZWdTdHJpbmcubGVuZ3RoLTEpLy9yZW1vdmUgZG90IGF0IGZyb250XG4gICAgICByZWd4ID0gbmV3IFJlZ0V4cChhY2NlcHRSZWdTdHJpbmcrJyQnLCAnaScpXG4gICAgICBpZiggKG5hbWV8fHR5cGUpLnNlYXJjaChyZWd4KT49MCApe1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbnZhbGlkRmlsZUl0ZW17XG4gIGZpbGU6RmlsZVxuICB0eXBlOnN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChidWZmZXI6YW55KSB7XG4gIHZhciBiaW5hcnkgPSAnJztcbiAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgdmFyIGxlbiA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XG4gIH1cbiAgcmV0dXJuIHdpbmRvdy5idG9hKGJpbmFyeSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVXJsdG9CbG9iKFxuICBkYXRhdXJsOnN0cmluZyxcbiAgbmFtZTpzdHJpbmcsXG4gIG9yaWdTaXplPzphbnlcbik6QmxvYntcbiAgdmFyIGFyciA9IGRhdGF1cmwuc3BsaXQoJywnKTtcbiAgdmFyIG1pbWVNYXRjaCA9IGFyclswXS5tYXRjaCgvOiguKj8pOy8pXG4gIHZhciBtaW1lOnN0cmluZyA9IG1pbWVNYXRjaCA/IG1pbWVNYXRjaFsxXSA6ICd0ZXh0L3BsYWluJ1xuICB2YXIgYnN0ciA9IGF0b2IoYXJyWzFdKSwgbiA9IGJzdHIubGVuZ3RoLCB1OGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xuICB3aGlsZSAobi0tKSB7XG4gICAgdThhcnJbbl0gPSBic3RyLmNoYXJDb2RlQXQobik7XG4gIH1cbiAgXG4gIHZhciBibG9iOiBhbnkgPSBuZXcgd2luZG93LkJsb2IoW3U4YXJyXSwge3R5cGU6IG1pbWV9KTtcbiAgYmxvYltcIm5hbWVcIl0gPSBuYW1lO1xuICBibG9iW1wiJG5nZk9yaWdTaXplXCJdID0gb3JpZ1NpemU7XG4gIHJldHVybiBibG9iO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIG9yaWVudGF0aW9uTWV0YXtcbiAgb3JpZW50YXRpb246IG51bWJlclxuICBmaXhlZEFycmF5QnVmZmVyPzphbnlbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlUcmFuc2Zvcm0oXG4gIGN0eDpDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gIG9yaWVudGF0aW9uOm51bWJlcixcbiAgd2lkdGg6bnVtYmVyLFxuICBoZWlnaHQ6bnVtYmVyXG4pIHtcbiAgc3dpdGNoIChvcmllbnRhdGlvbikge1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBjdHgudHJhbnNmb3JtKC0xLCAwLCAwLCAxLCB3aWR0aCwgMCk7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGN0eC50cmFuc2Zvcm0oLTEsIDAsIDAsIC0xLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gY3R4LnRyYW5zZm9ybSgxLCAwLCAwLCAtMSwgMCwgaGVpZ2h0KTtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gY3R4LnRyYW5zZm9ybSgwLCAxLCAxLCAwLCAwLCAwKTtcbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gY3R4LnRyYW5zZm9ybSgwLCAxLCAtMSwgMCwgaGVpZ2h0LCAwKTtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gY3R4LnRyYW5zZm9ybSgwLCAtMSwgLTEsIDAsIGhlaWdodCwgd2lkdGgpO1xuICAgIGNhc2UgODpcbiAgICAgIHJldHVybiBjdHgudHJhbnNmb3JtKDAsIC0xLCAxLCAwLCAwLCB3aWR0aCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpeEZpbGVPcmllbnRhdGlvbkJ5TWV0YShcbiAgZmlsZTpGaWxlLCByZXN1bHQ6b3JpZW50YXRpb25NZXRhXG4pOlByb21pc2U8RmlsZT57XG4gIHJldHVybiBkYXRhVXJsKGZpbGUsIHRydWUpXG4gIC50aGVuKHVybD0+e1xuICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG5cbiAgICByZXR1cm4gPFByb21pc2U8RmlsZT4+bmV3IFByb21pc2UoZnVuY3Rpb24ocmVzLHJlail7XG4gICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHJlc3VsdC5vcmllbnRhdGlvbiA+IDQgPyBpbWcuaGVpZ2h0IDogaW1nLndpZHRoXG4gICAgICAgICAgY2FudmFzLmhlaWdodCA9IHJlc3VsdC5vcmllbnRhdGlvbiA+IDQgPyBpbWcud2lkdGggOiBpbWcuaGVpZ2h0XG4gICAgICAgICAgdmFyIGN0eCA9IDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+Y2FudmFzLmdldENvbnRleHQoJzJkJylcbiAgICAgICAgICBhcHBseVRyYW5zZm9ybShjdHgsIHJlc3VsdC5vcmllbnRhdGlvbiwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KVxuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgICAgICB2YXIgZGF0YVVybCA9IGNhbnZhcy50b0RhdGFVUkwoZmlsZS50eXBlIHx8ICdpbWFnZS9XZWJQJywgMC45MzQpXG4gICAgICAgICAgY29uc3QgYmFzZSA9IGFycmF5QnVmZmVyVG9CYXNlNjQocmVzdWx0LmZpeGVkQXJyYXlCdWZmZXIpXG4gICAgICAgICAgZGF0YVVybCA9IHJlc3RvcmVFeGlmKGJhc2UsIGRhdGFVcmwpXG4gICAgICAgICAgdmFyIGJsb2IgPSBkYXRhVXJsdG9CbG9iKGRhdGFVcmwsIGZpbGUubmFtZSlcbiAgICAgICAgICBjb25zdCBuZXdGaWxlID0gYmxvYlRvRmlsZShibG9iLCBmaWxlLm5hbWUpO1xuICAgICAgICAgIHJlcyhuZXdGaWxlKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHJlaihlKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaW1nLm9uZXJyb3IgPSByZWo7XG4gICAgICBpbWcuc3JjID0gdXJsOyAgICBcbiAgICB9KVxuICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlFeGlmUm90YXRpb24oXG4gIGZpbGU6RmlsZVxuKTpQcm9taXNlPEZpbGU+e1xuICBpZiAoZmlsZS50eXBlLmluZGV4T2YoJ2ltYWdlL2pwZWcnKSAhPT0gMCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmlsZSk7XG4gIH1cblxuICByZXR1cm4gcmVhZE9yaWVudGF0aW9uKGZpbGUpXG4gIC50aGVuKChyZXN1bHQ6b3JpZW50YXRpb25NZXRhKT0+e1xuICAgIGlmIChyZXN1bHQub3JpZW50YXRpb24gPCAyIHx8IHJlc3VsdC5vcmllbnRhdGlvbiA+IDgpIHtcbiAgICAgIHJldHVybiBmaWxlXG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmaXhGaWxlT3JpZW50YXRpb25CeU1ldGEoZmlsZSxyZXN1bHQpXG4gIH0pXG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkT3JpZW50YXRpb24oXG4gIGZpbGU6RmlsZVxuKTpQcm9taXNlPG9yaWVudGF0aW9uTWV0YT57XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLHJlaik9PntcbiAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICB2YXIgc2xpY2VkRmlsZSA9IGZpbGUuc2xpY2UgPyBmaWxlLnNsaWNlKDAsIDY0ICogMTAyNCkgOiBmaWxlO1xuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihzbGljZWRGaWxlKTtcbiAgICByZWFkZXIub25lcnJvciA9IHJlalxuICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZTphbnkpIHtcbiAgICAgIHZhciByZXN1bHQ6b3JpZW50YXRpb25NZXRhID0ge29yaWVudGF0aW9uOiAxfTtcbiAgICAgIHZhciB2aWV3ID0gbmV3IERhdGFWaWV3KCA8QXJyYXlCdWZmZXI+dGhpcy5yZXN1bHQgKTtcbiAgICAgIGlmICh2aWV3LmdldFVpbnQxNigwLCBmYWxzZSkgIT09IDB4RkZEOCkgcmV0dXJuIHJlcyhyZXN1bHQpO1xuXG4gICAgICB2YXIgbGVuZ3RoID0gdmlldy5ieXRlTGVuZ3RoLFxuICAgICAgICBvZmZzZXQgPSAyO1xuICAgICAgd2hpbGUgKG9mZnNldCA8IGxlbmd0aCkge1xuICAgICAgICB2YXIgbWFya2VyID0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIG9mZnNldCArPSAyO1xuICAgICAgICBpZiAobWFya2VyID09PSAweEZGRTEpIHtcbiAgICAgICAgICBpZiAodmlldy5nZXRVaW50MzIob2Zmc2V0ICs9IDIsIGZhbHNlKSAhPT0gMHg0NTc4Njk2NikgcmV0dXJuIHJlcyhyZXN1bHQpO1xuXG4gICAgICAgICAgdmFyIGxpdHRsZSA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCArPSA2LCBmYWxzZSkgPT09IDB4NDk0OTtcbiAgICAgICAgICBvZmZzZXQgKz0gdmlldy5nZXRVaW50MzIob2Zmc2V0ICsgNCwgbGl0dGxlKTtcbiAgICAgICAgICB2YXIgdGFncyA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgbGl0dGxlKTtcbiAgICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhZ3M7IGkrKylcbiAgICAgICAgICAgIGlmICh2aWV3LmdldFVpbnQxNihvZmZzZXQgKyAoaSAqIDEyKSwgbGl0dGxlKSA9PT0gMHgwMTEyKSB7XG4gICAgICAgICAgICAgIHZhciBvcmllbnRhdGlvbiA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCArIChpICogMTIpICsgOCwgbGl0dGxlKTtcbiAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID49IDIgJiYgb3JpZW50YXRpb24gPD0gOCkge1xuICAgICAgICAgICAgICAgIHZpZXcuc2V0VWludDE2KG9mZnNldCArIChpICogMTIpICsgOCwgMSwgbGl0dGxlKTtcbiAgICAgICAgICAgICAgICByZXN1bHQuZml4ZWRBcnJheUJ1ZmZlciA9IGUudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXN1bHQub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcyhyZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKChtYXJrZXIgJiAweEZGMDApICE9PSAweEZGMDApIGJyZWFrO1xuICAgICAgICBlbHNlIG9mZnNldCArPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMocmVzdWx0KTtcbiAgICB9O1xuICB9KVxufVxuXG4vKiogY29udmVydHMgZmlsZS1pbnB1dCBmaWxlIGludG8gYmFzZTY0IGRhdGFVcmkgKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVXJsKFxuICBmaWxlOmFueSxcbiAgZGlzYWxsb3dPYmplY3RVcmw/OmFueVxuKTpQcm9taXNlPHN0cmluZz57XG4gIGlmICghZmlsZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmaWxlKVxuICBcbiAgaWYgKChkaXNhbGxvd09iamVjdFVybCAmJiBmaWxlLiRuZ2ZEYXRhVXJsICE9IG51bGwpIHx8ICghZGlzYWxsb3dPYmplY3RVcmwgJiYgZmlsZS4kbmdmQmxvYlVybCAhPSBudWxsKSkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoIGRpc2FsbG93T2JqZWN0VXJsID8gZmlsZS4kbmdmRGF0YVVybCA6IGZpbGUuJG5nZkJsb2JVcmwgKVxuICB9XG5cbiAgdmFyIHAgPSBkaXNhbGxvd09iamVjdFVybCA/IGZpbGUuJCRuZ2ZEYXRhVXJsUHJvbWlzZSA6IGZpbGUuJCRuZ2ZCbG9iVXJsUHJvbWlzZTtcbiAgaWYgKHApIHJldHVybiBwO1xuXG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdygpXG4gIGxldCBkZWZlcnJlZDpQcm9taXNlPHN0cmluZz5cbiAgaWYgKHdpbi5GaWxlUmVhZGVyICYmIGZpbGUgJiZcbiAgICAoIXdpbi5GaWxlQVBJIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignTVNJRSA4JykgPT09IC0xIHx8IGZpbGUuc2l6ZSA8IDIwMDAwKSAmJlxuICAgICghd2luLkZpbGVBUEkgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFIDknKSA9PT0gLTEgfHwgZmlsZS5zaXplIDwgNDAwMDAwMCkpIHtcbiAgICAvL3ByZWZlciBVUkwuY3JlYXRlT2JqZWN0VVJMIGZvciBoYW5kbGluZyByZWZyZW5jZXMgdG8gZmlsZXMgb2YgYWxsIHNpemVzXG4gICAgLy9zaW5jZSBpdCBkb2VzbsK0dCBidWlsZCBhIGxhcmdlIHN0cmluZyBpbiBtZW1vcnlcbiAgICB2YXIgVVJMID0gd2luLlVSTCB8fCB3aW4ud2Via2l0VVJMO1xuICAgIGlmIChGaWxlUmVhZGVyKSB7XG4gICAgICBkZWZlcnJlZCA9IG5ldyBQcm9taXNlKChyZXMscmVqKT0+e1xuICAgICAgICB2YXIgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGV2ZW50OmFueSkge1xuICAgICAgICAgIGZpbGUuJG5nZkRhdGFVcmwgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgIGRlbGV0ZSBmaWxlLiRuZ2ZEYXRhVXJsO1xuICAgICAgICAgIHJlcyggZXZlbnQudGFyZ2V0LnJlc3VsdCApXG4gICAgICAgIH07XG4gICAgICAgIGZpbGVSZWFkZXIub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgZmlsZS4kbmdmRGF0YVVybCA9ICcnO1xuICAgICAgICAgIHJlaihlKVxuICAgICAgICB9O1xuICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgdXJsOmFueTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgZGVmZXJyZWQgPSBQcm9taXNlLnJlc29sdmUoIHVybCApXG4gICAgICBmaWxlLiRuZ2ZCbG9iVXJsID0gdXJsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmaWxlW2Rpc2FsbG93T2JqZWN0VXJsID8gJyRuZ2ZEYXRhVXJsJyA6ICckbmdmQmxvYlVybCddID0gJyc7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCBuZXcgRXJyb3IoJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCB3aW5kb3cuRmlsZVJlYWRlciwgd2luZG93LkZpbGVSZWFkZXIsIG9yIHdpbmRvdy5GaWxlQVBJJykgKS8vZGVmZXJyZWQucmVqZWN0KCk7XG4gIH1cblxuICBpZiAoZGlzYWxsb3dPYmplY3RVcmwpIHtcbiAgICBwID0gZmlsZS4kJG5nZkRhdGFVcmxQcm9taXNlID0gZGVmZXJyZWQ7XG4gIH0gZWxzZSB7XG4gICAgcCA9IGZpbGUuJCRuZ2ZCbG9iVXJsUHJvbWlzZSA9IGRlZmVycmVkO1xuICB9XG5cbiAgcCA9IHAudGhlbigoeDphbnkpPT57XG4gICAgZGVsZXRlIGZpbGVbZGlzYWxsb3dPYmplY3RVcmwgPyAnJCRuZ2ZEYXRhVXJsUHJvbWlzZScgOiAnJCRuZ2ZCbG9iVXJsUHJvbWlzZSddO1xuICAgIHJldHVybiB4XG4gIH0pXG5cbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlRXhpZihvcmlnOmFueSwgcmVzaXplZDphbnkpIHtcbiAgdmFyIEV4aWZSZXN0b3JlcjphbnkgPSB7XG4gICAgS0VZX1NUUjonQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nXG4gIH1cblxuICBFeGlmUmVzdG9yZXIuZW5jb2RlNjQgPSBmdW5jdGlvbiAoaW5wdXQ6YW55KSB7XG4gICAgdmFyIG91dHB1dCA9ICcnLFxuICAgICAgY2hyMSwgY2hyMiwgY2hyMzphbnkgPSAnJyxcbiAgICAgIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ6YW55ID0gJycsXG4gICAgICBpID0gMDtcblxuICAgIGRvIHtcbiAgICAgIGNocjEgPSBpbnB1dFtpKytdO1xuICAgICAgY2hyMiA9IGlucHV0W2krK107XG4gICAgICBjaHIzID0gaW5wdXRbaSsrXTtcblxuICAgICAgZW5jMSA9IGNocjEgPj4gMjtcbiAgICAgIGVuYzIgPSAoKGNocjEgJiAzKSA8PCA0KSB8IChjaHIyID4+IDQpO1xuICAgICAgZW5jMyA9ICgoY2hyMiAmIDE1KSA8PCAyKSB8IChjaHIzID4+IDYpO1xuICAgICAgZW5jNCA9IGNocjMgJiA2MztcblxuICAgICAgaWYgKGlzTmFOKGNocjIpKSB7XG4gICAgICAgIGVuYzMgPSBlbmM0ID0gNjQ7XG4gICAgICB9IGVsc2UgaWYgKGlzTmFOKGNocjMpKSB7XG4gICAgICAgIGVuYzQgPSA2NDtcbiAgICAgIH1cblxuICAgICAgb3V0cHV0ID0gb3V0cHV0ICtcbiAgICAgICAgdGhpcy5LRVlfU1RSLmNoYXJBdChlbmMxKSArXG4gICAgICAgIHRoaXMuS0VZX1NUUi5jaGFyQXQoZW5jMikgK1xuICAgICAgICB0aGlzLktFWV9TVFIuY2hhckF0KGVuYzMpICtcbiAgICAgICAgdGhpcy5LRVlfU1RSLmNoYXJBdChlbmM0KTtcbiAgICAgIGNocjEgPSBjaHIyID0gY2hyMyA9ICcnO1xuICAgICAgZW5jMSA9IGVuYzIgPSBlbmMzID0gZW5jNCA9ICcnO1xuICAgIH0gd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcblxuICBFeGlmUmVzdG9yZXIucmVzdG9yZSA9IGZ1bmN0aW9uIChvcmlnRmlsZUJhc2U2NDphbnksIHJlc2l6ZWRGaWxlQmFzZTY0OmFueSkge1xuICAgIGlmIChvcmlnRmlsZUJhc2U2NC5tYXRjaCgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnKSkge1xuICAgICAgb3JpZ0ZpbGVCYXNlNjQgPSBvcmlnRmlsZUJhc2U2NC5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKTtcbiAgICB9XG5cbiAgICB2YXIgcmF3SW1hZ2U6bnVtYmVyW10gPSB0aGlzLmRlY29kZTY0KG9yaWdGaWxlQmFzZTY0KTtcbiAgICB2YXIgc2VnbWVudHMgPSB0aGlzLnNsaWNlMlNlZ21lbnRzKHJhd0ltYWdlKTtcblxuICAgIHZhciBpbWFnZSA9IHRoaXMuZXhpZk1hbmlwdWxhdGlvbihyZXNpemVkRmlsZUJhc2U2NCwgc2VnbWVudHMpO1xuXG4gICAgcmV0dXJuICdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcgKyB0aGlzLmVuY29kZTY0KGltYWdlKTtcbiAgfTtcblxuXG4gIEV4aWZSZXN0b3Jlci5leGlmTWFuaXB1bGF0aW9uID0gZnVuY3Rpb24gKHJlc2l6ZWRGaWxlQmFzZTY0OmFueSwgc2VnbWVudHM6YW55KSB7XG4gICAgdmFyIGV4aWZBcnJheSA9IHRoaXMuZ2V0RXhpZkFycmF5KHNlZ21lbnRzKSxcbiAgICAgIG5ld0ltYWdlQXJyYXkgPSB0aGlzLmluc2VydEV4aWYocmVzaXplZEZpbGVCYXNlNjQsIGV4aWZBcnJheSk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KG5ld0ltYWdlQXJyYXkpO1xuICB9O1xuXG4gIEV4aWZSZXN0b3Jlci5nZXRFeGlmQXJyYXkgPSBmdW5jdGlvbiAoc2VnbWVudHM6bnVtYmVyW11bXSkge1xuICAgIHZhciBzZWc7XG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCBzZWdtZW50cy5sZW5ndGg7IHgrKykge1xuICAgICAgc2VnID0gc2VnbWVudHNbeF07XG4gICAgICBpZiAoc2VnWzBdID09PSAyNTUgJiYgc2VnWzFdID09PSAyMjUpIC8vKGZmIGUxKVxuICAgICAge1xuICAgICAgICByZXR1cm4gc2VnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH07XG5cblxuICBFeGlmUmVzdG9yZXIuaW5zZXJ0RXhpZiA9IGZ1bmN0aW9uIChyZXNpemVkRmlsZUJhc2U2NDphbnksIGV4aWZBcnJheTphbnkpIHtcbiAgICB2YXIgaW1hZ2VEYXRhID0gcmVzaXplZEZpbGVCYXNlNjQucmVwbGFjZSgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnLCAnJyksXG4gICAgICBidWYgPSB0aGlzLmRlY29kZTY0KGltYWdlRGF0YSksXG4gICAgICBzZXBhcmF0ZVBvaW50ID0gYnVmLmluZGV4T2YoMjU1LCAzKSxcbiAgICAgIG1hZSA9IGJ1Zi5zbGljZSgwLCBzZXBhcmF0ZVBvaW50KSxcbiAgICAgIGF0byA9IGJ1Zi5zbGljZShzZXBhcmF0ZVBvaW50KSxcbiAgICAgIGFycmF5ID0gbWFlO1xuXG4gICAgYXJyYXkgPSBhcnJheS5jb25jYXQoZXhpZkFycmF5KTtcbiAgICBhcnJheSA9IGFycmF5LmNvbmNhdChhdG8pO1xuICAgIHJldHVybiBhcnJheTtcbiAgfTtcblxuXG4gIEV4aWZSZXN0b3Jlci5zbGljZTJTZWdtZW50cyA9IGZ1bmN0aW9uKFxuICAgIHJhd0ltYWdlQXJyYXk6bnVtYmVyW11cbiAgKSB7XG4gICAgdmFyIGhlYWQ6bnVtYmVyID0gMCxcbiAgICAgIHNlZ21lbnRzOm51bWJlcltdW10gPSBbXTtcblxuICAgIHdoaWxlICgxKSB7XG4gICAgICBpZiAocmF3SW1hZ2VBcnJheVtoZWFkXSA9PT0gMjU1ICYmIHJhd0ltYWdlQXJyYXlbaGVhZCArIDFdID09PSAyMTgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAocmF3SW1hZ2VBcnJheVtoZWFkXSA9PT0gMjU1ICYmIHJhd0ltYWdlQXJyYXlbaGVhZCArIDFdID09PSAyMTYpIHtcbiAgICAgICAgaGVhZCArPSAyO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBsZW5ndGggPSByYXdJbWFnZUFycmF5W2hlYWQgKyAyXSAqIDI1NiArIHJhd0ltYWdlQXJyYXlbaGVhZCArIDNdXG4gICAgICAgIHZhciBlbmRQb2ludCA9IGhlYWQgKyBsZW5ndGggKyAyXG4gICAgICAgIHZhciBzZWc6bnVtYmVyW10gPSByYXdJbWFnZUFycmF5LnNsaWNlKGhlYWQsIGVuZFBvaW50KVxuICAgICAgICBzZWdtZW50cy5wdXNoKHNlZyk7XG4gICAgICAgIGhlYWQgPSBlbmRQb2ludDtcbiAgICAgIH1cbiAgICAgIGlmIChoZWFkID4gcmF3SW1hZ2VBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9O1xuXG5cbiAgRXhpZlJlc3RvcmVyLmRlY29kZTY0ID0gZnVuY3Rpb24gKFxuICAgIGlucHV0OmFueVxuICApOm51bWJlcltde1xuICAgIHZhciBjaHIxLCBjaHIyLCBjaHIzOmFueSA9ICcnLFxuICAgICAgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDphbnkgPSAnJyxcbiAgICAgIGkgPSAwLFxuICAgICAgYnVmOm51bWJlcltdID0gW107XG5cbiAgICAvLyByZW1vdmUgYWxsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90IEEtWiwgYS16LCAwLTksICssIC8sIG9yID1cbiAgICB2YXIgYmFzZTY0dGVzdCA9IC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZztcbiAgICBpZiAoYmFzZTY0dGVzdC5leGVjKGlucHV0KSkge1xuICAgICAgY29uc29sZS5sb2coJ1RoZXJlIHdlcmUgaW52YWxpZCBiYXNlNjQgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgdGV4dC4nKTtcbiAgICB9XG4gICAgaW5wdXQgPSBpbnB1dC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL1xcPV0vZywgJycpO1xuXG4gICAgZG8ge1xuICAgICAgZW5jMSA9IHRoaXMuS0VZX1NUUi5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgIGVuYzIgPSB0aGlzLktFWV9TVFIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICBlbmMzID0gdGhpcy5LRVlfU1RSLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgZW5jNCA9IHRoaXMuS0VZX1NUUi5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcblxuICAgICAgY2hyMSA9IChlbmMxIDw8IDIpIHwgKGVuYzIgPj4gNCk7XG4gICAgICBjaHIyID0gKChlbmMyICYgMTUpIDw8IDQpIHwgKGVuYzMgPj4gMik7XG4gICAgICBjaHIzID0gKChlbmMzICYgMykgPDwgNikgfCBlbmM0O1xuXG4gICAgICBidWYucHVzaChjaHIxKTtcblxuICAgICAgaWYgKGVuYzMgIT09IDY0KSB7XG4gICAgICAgIGJ1Zi5wdXNoKGNocjIpO1xuICAgICAgfVxuICAgICAgaWYgKGVuYzQgIT09IDY0KSB7XG4gICAgICAgIGJ1Zi5wdXNoKGNocjMpO1xuICAgICAgfVxuXG4gICAgICBjaHIxID0gY2hyMiA9IGNocjMgPSAnJztcbiAgICAgIGVuYzEgPSBlbmMyID0gZW5jMyA9IGVuYzQgPSAnJztcblxuICAgIH0gd2hpbGUgKGkgPCBpbnB1dC5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfTtcblxuICByZXR1cm4gRXhpZlJlc3RvcmVyLnJlc3RvcmUob3JpZywgcmVzaXplZCk7ICAvLzw9IEVYSUZcbn07XG5cbmZ1bmN0aW9uIGJsb2JUb0ZpbGUodGhlQmxvYjogQmxvYiwgZmlsZU5hbWU6c3RyaW5nKTogRmlsZSB7XG4gIHZhciBiOiBhbnkgPSB0aGVCbG9iO1xuICAvL0EgQmxvYigpIGlzIGFsbW9zdCBhIEZpbGUoKSAtIGl0J3MganVzdCBtaXNzaW5nIHRoZSB0d28gcHJvcGVydGllcyBiZWxvdyB3aGljaCB3ZSB3aWxsIGFkZFxuICBiLmxhc3RNb2RpZmllZERhdGUgPSBuZXcgRGF0ZSgpO1xuICBiLm5hbWUgPSBmaWxlTmFtZTtcblxuICAvL0Nhc3QgdG8gYSBGaWxlKCkgdHlwZVxuICByZXR1cm4gPEZpbGU+dGhlQmxvYjtcbn1cbiJdfQ==
import { Directive, EventEmitter, ElementRef, Input, Output, HostListener } from '@angular/core';
import { createInvisibleFileInputWrap, isFileInput, detectSwipe } from "./doc-event-help.functions";
import { acceptType, applyExifRotation, dataUrl } from "./fileTools";
/** A master base set of logic intended to support file select/drag/drop operations
NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting
*/
export class ngf {
constructor(element) {
this.element = element;
this.filters = [];
this.lastFileCount = 0;
this.ngfFixOrientation = true;
this.fileDropDisabled = false;
this.selectable = false;
this.directiveInit = new EventEmitter();
this.lastInvalids = [];
this.lastInvalidsChange = new EventEmitter();
this.lastBaseUrlChange = new EventEmitter();
this.fileChange = new EventEmitter();
this.files = [];
this.filesChange = new EventEmitter();
this.fileSelectStart = new EventEmitter();
this.initFilters();
}
initFilters() {
// the order is important
this.filters.push({ name: 'accept', fn: this._acceptFilter });
this.filters.push({ name: 'fileSize', fn: this._fileSizeFilter });
//this.filters.push({name: 'fileType', fn: this._fileTypeFilter})
//this.filters.push({name: 'queueLimit', fn: this._queueLimitFilter})
//this.filters.push({name: 'mimeType', fn: this._mimeTypeFilter})
}
ngOnDestroy() {
delete this.fileElm; //faster memory release of dom element
this.destroyPasteListener();
}
ngOnInit() {
const selectable = (this.selectable || this.selectable === '') && !['false', 'null', '0'].includes(this.selectable);
if (selectable) {
this.enableSelecting();
}
if (this.multiple) {
this.paramFileElm().setAttribute('multiple', this.multiple);
}
this.evalCapturePaste();
// create reference to this class with one cycle delay to avoid ExpressionChangedAfterItHasBeenCheckedError
setTimeout(() => {
this.directiveInit.emit(this);
}, 0);
}
ngOnChanges(changes) {
var _a, _b;
if (changes.accept) {
this.paramFileElm().setAttribute('accept', changes.accept.currentValue || '*');
}
if (changes.capturePaste) {
this.evalCapturePaste();
}
// Did we go from having a file to not having a file? Clear file element then
if (changes.file && changes.file.previousValue && !changes.file.currentValue) {
this.clearFileElmValue();
}
// Did we go from having files to not having files? Clear file element then
if (changes.files) {
const filesWentToZero = ((_a = changes.files.previousValue) === null || _a === void 0 ? void 0 : _a.length) && !((_b = changes.files.currentValue) === null || _b === void 0 ? void 0 : _b.length);
if (filesWentToZero) {
this.clearFileElmValue();
}
}
}
evalCapturePaste() {
const isActive = this.capturePaste || this.capturePaste === '' || ['false', '0', 'null'].includes(this.capturePaste);
if (isActive) {
if (this.pasteCapturer) {
return; // already listening
}
this.pasteCapturer = (e) => {
const clip = e.clipboardData;
if (clip && clip.files && clip.files.length) {
this.handleFiles(clip.files);
e.preventDefault();
}
};
window.addEventListener('paste', this.pasteCapturer);
return;
}
this.destroyPasteListener();
}
destroyPasteListener() {
if (this.pasteCapturer) {
window.removeEventListener('paste', this.pasteCapturer);
delete this.pasteCapturer;
}
}
paramFileElm() {
if (this.fileElm)
return this.fileElm; // already defined
// elm already is a file input
const isFile = isFileInput(this.element.nativeElement);
if (isFile) {
return this.fileElm = this.element.nativeElement;
}
// the host elm is NOT a file input
return this.fileElm = this.createFileElm({
change: this.changeFn.bind(this)
});
}
/** Only used when host element we are attached to is NOT a fileElement */
createFileElm({ change }) {
// use specific technique to hide file element within
const label = createInvisibleFileInputWrap();
const fileElm = label.getElementsByTagName('input')[0];
fileElm.addEventListener('change', change);
this.element.nativeElement.appendChild(label); // put on html stage
return fileElm;
}
enableSelecting() {
let elm = this.element.nativeElement;
if (isFileInput(elm)) {
const bindedHandler = event => this.beforeSelect(event);
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
return;
}
const bindedHandler = ev => this.clickHandler(ev);
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
elm.addEventListener('touchend', bindedHandler);
}
getValidFiles(files) {
const rtn = [];
for (let x = files.length - 1; x >= 0; --x) {
if (this.isFileValid(files[x])) {
rtn.push(files[x]);
}
}
return rtn;
}
getInvalidFiles(files) {
const rtn = [];
for (let x = files.length - 1; x >= 0; --x) {
let failReason = this.getFileFilterFailName(files[x]);
if (failReason) {
rtn.push({
file: files[x],
type: failReason
});
}
}
return rtn;
}
// Primary handler of files coming in
handleFiles(files) {
const valids = this.getValidFiles(files);
if (files.length != valids.length) {
this.lastInvalids = this.getInvalidFiles(files);
}
else {
delete this.lastInvalids;
}
this.lastInvalidsChange.emit(this.lastInvalids);
if (valids.length) {
if (this.ngfFixOrientation) {
this.applyExifRotations(valids)
.then(fixedFiles => this.que(fixedFiles));
}
else {
this.que(valids);
}
}
if (this.isEmptyAfterSelection()) {
this.element.nativeElement.value = '';
}
}
que(files) {
this.files = this.files || [];
Array.prototype.push.apply(this.files, files);
//below break memory ref and doesnt act like a que
//this.files = files//causes memory change which triggers bindings like <ngfFormData [files]="files"></ngfFormData>
this.filesChange.emit(this.files);
if (files.length) {
this.fileChange.emit(this.file = files[0]);
if (this.lastBaseUrlChange.observers.length) {
dataUrl(files[0])
.then(url => this.lastBaseUrlChange.emit(url));
}
}
//will be checked for input value clearing
this.lastFileCount = this.files.length;
}
/** called when input has files */
changeFn(event) {
var fileList = event.__files_ || (event.target && event.target.files);
if (!fileList)
return;
this.stopEvent(event);
this.handleFiles(fileList);
}
clickHandler(evt) {
const elm = this.element.nativeElement;
if (elm.getAttribute('disabled') || this.fileDropDisabled) {
return false;
}
var r = detectSwipe(evt);
// prevent the click if it is a swipe
if (r !== false)
return r;
const fileElm = this.paramFileElm();
fileElm.click();
//fileElm.dispatchEvent( new Event('click') );
this.beforeSelect(evt);
return false;
}
beforeSelect(event) {
this.fileSelectStart.emit(event);
if (this.files && this.lastFileCount === this.files.length)
return;
// if no files in array, be sure browser does not prevent reselect of same file (see github issue 27)
this.clearFileElmValue();
}
clearFileElmValue() {
if (!this.fileElm)
return;
this.fileElm.value = null;
}
isEmptyAfterSelection() {
return !!this.element.nativeElement.attributes.multiple;
}
stopEvent(event) {
event.preventDefault();
event.stopPropagation();
}
transferHasFiles(transfer) {
if (!transfer.types) {
return false;
}
if (transfer.types.indexOf) {
return transfer.types.indexOf('Files') !== -1;
}
else if (transfer.types.contains) {
return transfer.types.contains('Files');
}
else {
return false;
}
}
eventToFiles(event) {
const transfer = eventToTransfer(event);
if (transfer) {
if (transfer.files && transfer.files.length) {
return transfer.files;
}
if (transfer.items && transfer.items.length) {
return transfer.items;
}
}
return [];
}
applyExifRotations(files) {
const mapper = (file, index) => {
return applyExifRotation(file)
.then(fixedFile => files.splice(index, 1, fixedFile));
};
const proms = [];
for (let x = files.length - 1; x >= 0; --x) {
proms[x] = mapper(files[x], x);
}
return Promise.all(proms).then(() => files);
}
onChange(event) {
let files = this.element.nativeElement.files || this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
}
getFileFilterFailName(file) {
for (let i = 0; i < this.filters.length; i++) {
if (!this.filters[i].fn.call(this, file)) {
return this.filters[i].name;
}
}
return undefined;
}
isFileValid(file) {
const noFilters = !this.accept && (!this.filters || !this.filters.length);
if (noFilters) {
return true; //we have no filters so all files are valid
}
return this.getFileFilterFailName(file) ? false : true;
}
isFilesValid(files) {
for (let x = files.length - 1; x >= 0; --x) {
if (!this.isFileValid(files[x])) {
return false;
}
}
return true;
}
_acceptFilter(item) {
return acceptType(this.accept, item.type, item.name);
}
_fileSizeFilter(item) {
return !(this.maxSize && item.size > this.maxSize);
}
}
ngf.decorators = [
{ type: Directive, args: [{
selector: "[ngf]",
exportAs: "ngf"
},] }
];
ngf.ctorParameters = () => [
{ type: ElementRef }
];
ngf.propDecorators = {
multiple: [{ type: Input }],
accept: [{ type: Input }],
maxSize: [{ type: Input }],
ngfFixOrientation: [{ type: Input }],
fileDropDisabled: [{ type: Input }],
selectable: [{ type: Input }],
directiveInit: [{ type: Output, args: ['init',] }],
lastInvalids: [{ type: Input }],
lastInvalidsChange: [{ type: Output }],
lastBaseUrl: [{ type: Input }],
lastBaseUrlChange: [{ type: Output }],
file: [{ type: Input }],
fileChange: [{ type: Output }],
files: [{ type: Input }],
filesChange: [{ type: Output }],
fileSelectStart: [{ type: Output }],
capturePaste: [{ type: Input }],
onChange: [{ type: HostListener, args: ['change', ['$event'],] }]
};
/** browsers try hard to conceal data about file drags, this tends to undo that */
export function filesToWriteableObject(files) {
const jsonFiles = [];
for (let x = 0; x < files.length; ++x) {
jsonFiles.push({
type: files[x].type,
kind: files[x]["kind"]
});
}
return jsonFiles;
}
export function eventToTransfer(event) {
if (event.dataTransfer)
return event.dataTransfer;
return event.originalEvent ? event.originalEvent.dataTransfer : null;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLDRCQUE0QixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUNuRyxPQUFPLEVBQ0wsVUFBVSxFQUNWLGlCQUFpQixFQUFFLE9BQU8sRUFDM0IsTUFBTSxhQUFhLENBQUE7QUFPcEI7O0VBRUU7QUFLRixNQUFNLE9BQU8sR0FBRztJQWdDZCxZQUFtQixPQUFrQjtRQUFsQixZQUFPLEdBQVAsT0FBTyxDQUFXO1FBOUJyQyxZQUFPLEdBQStDLEVBQUUsQ0FBQTtRQUN4RCxrQkFBYSxHQUFXLENBQUMsQ0FBQTtRQUtoQixzQkFBaUIsR0FBWSxJQUFJLENBQUE7UUFFakMscUJBQWdCLEdBQVksS0FBSyxDQUFBO1FBQ2pDLGVBQVUsR0FBcUIsS0FBSyxDQUFBO1FBQzdCLGtCQUFhLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUE7UUFFM0QsaUJBQVksR0FBcUIsRUFBRSxDQUFBO1FBQ2xDLHVCQUFrQixHQUEyQyxJQUFJLFlBQVksRUFBRSxDQUFBO1FBRy9FLHNCQUFpQixHQUF3QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRzNELGVBQVUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUVwRCxVQUFLLEdBQVUsRUFBRSxDQUFBO1FBQ2hCLGdCQUFXLEdBQXdCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFOUQsb0JBQWUsR0FBdUIsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQU9oRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFDcEIsQ0FBQztJQUVE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LEtBQUssQ0FBQyxZQUFZO1FBQUMsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFBO0lBQy9DLE9BQVEsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEVsZW1lbnRSZWYsIElucHV0LCBPdXRwdXQsIEhvc3RMaXN0ZW5lciwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY3JlYXRlSW52aXNpYmxlRmlsZUlucHV0V3JhcCwgaXNGaWxlSW5wdXQsIGRldGVjdFN3aXBlIH0gZnJvbSBcIi4vZG9jLWV2ZW50LWhlbHAuZnVuY3Rpb25zXCJcbmltcG9ydCB7XG4gIGFjY2VwdFR5cGUsIEludmFsaWRGaWxlSXRlbSxcbiAgYXBwbHlFeGlmUm90YXRpb24sIGRhdGFVcmxcbn0gZnJvbSBcIi4vZmlsZVRvb2xzXCJcblxuZXhwb3J0IGludGVyZmFjZSBkcmFnTWV0YXtcbiAgdHlwZTpzdHJpbmdcbiAga2luZDpzdHJpbmdcbn1cblxuLyoqIEEgbWFzdGVyIGJhc2Ugc2V0IG9mIGxvZ2ljIGludGVuZGVkIHRvIHN1cHBvcnQgZmlsZSBzZWxlY3QvZHJhZy9kcm9wIG9wZXJhdGlvbnNcbiBOT1RFOiBVc2UgbmdmRHJvcCBmb3IgZnVsbCBkcmFnL2Ryb3AuIFVzZSBuZ2ZTZWxlY3QgZm9yIHNlbGVjdGluZ1xuKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJbbmdmXVwiLFxuICBleHBvcnRBczpcIm5nZlwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZiB7XG4gIGZpbGVFbG06IGFueVxuICBmaWx0ZXJzOiB7bmFtZTogc3RyaW5nLCBmbjogKGZpbGU6RmlsZSk9PmJvb2xlYW59W10gPSBbXVxuICBsYXN0RmlsZUNvdW50OiBudW1iZXIgPSAwXG5cbiAgQElucHV0KCkgbXVsdGlwbGUgITpzdHJpbmdcbiAgQElucHV0KCkgYWNjZXB0ICAgITpzdHJpbmdcbiAgQElucHV0KCkgbWF4U2l6ZSAgITpudW1iZXJcbiAgQElucHV0KCkgbmdmRml4T3JpZW50YXRpb246IGJvb2xlYW4gPSB0cnVlXG5cbiAgQElucHV0KCkgZmlsZURyb3BEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6IGJvb2xlYW4gfCBzdHJpbmcgPSBmYWxzZVxuICBAT3V0cHV0KCdpbml0JykgZGlyZWN0aXZlSW5pdDpFdmVudEVtaXR0ZXI8bmdmPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGxhc3RJbnZhbGlkczpJbnZhbGlkRmlsZUl0ZW1bXSA9IFtdXG4gIEBPdXRwdXQoKSBsYXN0SW52YWxpZHNDaGFuZ2U6RXZlbnRFbWl0dGVyPHtmaWxlOkZpbGUsdHlwZTpzdHJpbmd9W10+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgQElucHV0KCkgbGFzdEJhc2VVcmwhOiBzdHJpbmcvL2Jhc2U2NCBsYXN0IGZpbGUgdXBsb2FkZWQgdXJsXG4gIEBPdXRwdXQoKSBsYXN0QmFzZVVybENoYW5nZTpFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGZpbGU/OiBGaWxlLy9sYXN0IGZpbGUgdXBsb2FkZWRcbiAgQE91dHB1dCgpIGZpbGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGaWxlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGZpbGVzOkZpbGVbXSA9IFtdXG4gIEBPdXRwdXQoKSBmaWxlc0NoYW5nZTpFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gIEBPdXRwdXQoKSBmaWxlU2VsZWN0U3RhcnQ6RXZlbnRFbWl0dGVyPEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBJbnB1dCgpIGNhcHR1cmVQYXN0ZTogYm9vbGVhbiAvLyB3aW5kb3cgcGFzdGUgZmlsZSB3YXRjaGluZyAoZW1wdHkgc3RyaW5nIHR1cm5zIG9uKVxuXG4gIHBhc3RlQ2FwdHVyZXIhOiAoZTogRXZlbnQpID0+IHZvaWQgLy8gZ29lcyB3aXRoIGNhcHR1cmVQYXN0ZVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OkVsZW1lbnRSZWYpe1xuICAgIHRoaXMuaW5pdEZpbHRlcnMoKVxuICB9XG5cbiAgaW5pdEZpbHRlcnMoKXtcbiAgICAvLyB0aGUgb3JkZXIgaXMgaW1wb3J0YW50XG4gICAgdGhpcy5maWx0ZXJzLnB1c2goe25hbWU6ICdhY2NlcHQnLCBmbjogdGhpcy5fYWNjZXB0RmlsdGVyfSlcbiAgICB0aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ2ZpbGVTaXplJywgZm46IHRoaXMuX2ZpbGVTaXplRmlsdGVyfSlcblxuICAgIC8vdGhpcy5maWx0ZXJzLnB1c2goe25hbWU6ICdmaWxlVHlwZScsIGZuOiB0aGlzLl9maWxlVHlwZUZpbHRlcn0pXG4gICAgLy90aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ3F1ZXVlTGltaXQnLCBmbjogdGhpcy5fcXVldWVMaW1pdEZpbHRlcn0pXG4gICAgLy90aGlzLmZpbHRlcnMucHVzaCh7bmFtZTogJ21pbWVUeXBlJywgZm46IHRoaXMuX21pbWVUeXBlRmlsdGVyfSlcbiAgfVxuXG4gIG5nT25EZXN0cm95KCl7XG4gICAgZGVsZXRlIHRoaXMuZmlsZUVsbS8vZmFzdGVyIG1lbW9yeSByZWxlYXNlIG9mIGRvbSBlbGVtZW50XG4gICAgdGhpcy5kZXN0cm95UGFzdGVMaXN0ZW5lcigpO1xuICB9XG5cbiAgbmdPbkluaXQoKXtcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gKHRoaXMuc2VsZWN0YWJsZSB8fCB0aGlzLnNlbGVjdGFibGU9PT0nJykgJiYgIVsnZmFsc2UnLCAnbnVsbCcsICcwJ10uaW5jbHVkZXModGhpcy5zZWxlY3RhYmxlIGFzIHN0cmluZyk7XG4gICAgaWYoIHNlbGVjdGFibGUgKXtcbiAgICAgIHRoaXMuZW5hYmxlU2VsZWN0aW5nKClcbiAgICB9XG5cbiAgICBpZiggdGhpcy5tdWx0aXBsZSApe1xuICAgICAgdGhpcy5wYXJhbUZpbGVFbG0oKS5zZXRBdHRyaWJ1dGUoJ211bHRpcGxlJywgdGhpcy5tdWx0aXBsZSlcbiAgICB9XG5cbiAgICB0aGlzLmV2YWxDYXB0dXJlUGFzdGUoKTtcblxuICAgIC8vIGNyZWF0ZSByZWZlcmVuY2UgdG8gdGhpcyBjbGFzcyB3aXRoIG9uZSBjeWNsZSBkZWxheSB0byBhdm9pZCBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEVycm9yXG4gICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgdGhpcy5kaXJlY3RpdmVJbml0LmVtaXQodGhpcylcbiAgICB9LCAwKVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMgKXtcbiAgICBpZiggY2hhbmdlcy5hY2NlcHQgKXtcbiAgICAgIHRoaXMucGFyYW1GaWxlRWxtKCkuc2V0QXR0cmlidXRlKCdhY2NlcHQnLCBjaGFuZ2VzLmFjY2VwdC5jdXJyZW50VmFsdWUgfHwgJyonKVxuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLmNhcHR1cmVQYXN0ZSkge1xuICAgICAgdGhpcy5ldmFsQ2FwdHVyZVBhc3RlKCk7XG4gICAgfVxuXG4gICAgLy8gRGlkIHdlIGdvIGZyb20gaGF2aW5nIGEgZmlsZSB0byBub3QgaGF2aW5nIGEgZmlsZT8gQ2xlYXIgZmlsZSBlbGVtZW50IHRoZW5cbiAgICBpZiAoY2hhbmdlcy5maWxlICYmIGNoYW5nZXMuZmlsZS5wcmV2aW91c1ZhbHVlICYmICFjaGFuZ2VzLmZpbGUuY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLmNsZWFyRmlsZUVsbVZhbHVlKClcbiAgICB9XG5cbiAgICAvLyBEaWQgd2UgZ28gZnJvbSBoYXZpbmcgZmlsZXMgdG8gbm90IGhhdmluZyBmaWxlcz8gQ2xlYXIgZmlsZSBlbGVtZW50IHRoZW5cbiAgICBpZiAoY2hhbmdlcy5maWxlcykge1xuICAgICAgY29uc3QgZmlsZXNXZW50VG9aZXJvID0gY2hhbmdlcy5maWxlcy5wcmV2aW91c1ZhbHVlPy5sZW5ndGggJiYgIWNoYW5nZXMuZmlsZXMuY3VycmVudFZhbHVlPy5sZW5ndGhcblxuICAgICAgaWYgKGZpbGVzV2VudFRvWmVybykge1xuICAgICAgICB0aGlzLmNsZWFyRmlsZUVsbVZhbHVlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBldmFsQ2FwdHVyZVBhc3RlKCkge1xuICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5jYXB0dXJlUGFzdGUgfHwgKHRoaXMuY2FwdHVyZVBhc3RlIGFzIGFueSk9PT0nJyB8fCBbJ2ZhbHNlJywgJzAnLCAnbnVsbCddLmluY2x1ZGVzKHRoaXMuY2FwdHVyZVBhc3RlIGFzIGFueSk7XG5cbiAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgIGlmICh0aGlzLnBhc3RlQ2FwdHVyZXIpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGxpc3RlbmluZ1xuICAgICAgfVxuXG4gICAgICB0aGlzLnBhc3RlQ2FwdHVyZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgY2xpcCA9IChlIGFzIGFueSkuY2xpcGJvYXJkRGF0YTtcbiAgICAgICAgaWYgKGNsaXAgJiYgY2xpcC5maWxlcyAmJiBjbGlwLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlRmlsZXMoY2xpcC5maWxlcyk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYXN0ZScsIHRoaXMucGFzdGVDYXB0dXJlcik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRlc3Ryb3lQYXN0ZUxpc3RlbmVyKCk7XG4gIH1cblxuICBkZXN0cm95UGFzdGVMaXN0ZW5lcigpIHtcbiAgICBpZiAodGhpcy5wYXN0ZUNhcHR1cmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFzdGUnLCB0aGlzLnBhc3RlQ2FwdHVyZXIpO1xuICAgICAgZGVsZXRlIHRoaXMucGFzdGVDYXB0dXJlcjtcbiAgICB9XG4gIH1cblxuICBwYXJhbUZpbGVFbG0oKXtcbiAgICBpZiggdGhpcy5maWxlRWxtIClyZXR1cm4gdGhpcy5maWxlRWxtIC8vIGFscmVhZHkgZGVmaW5lZFxuXG4gICAgLy8gZWxtIGFscmVhZHkgaXMgYSBmaWxlIGlucHV0XG4gICAgY29uc3QgaXNGaWxlID0gaXNGaWxlSW5wdXQoIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50IClcbiAgICBpZihpc0ZpbGUpe1xuICAgICAgcmV0dXJuIHRoaXMuZmlsZUVsbSA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgZWxtIGlzIE5PVCBhIGZpbGUgaW5wdXRcbiAgICByZXR1cm4gdGhpcy5maWxlRWxtID0gdGhpcy5jcmVhdGVGaWxlRWxtKHtcbiAgICAgIGNoYW5nZTogdGhpcy5jaGFuZ2VGbi5iaW5kKHRoaXMpXG4gICAgfSlcbiAgfVxuXG4gIC8qKiBPbmx5IHVzZWQgd2hlbiBob3N0IGVsZW1lbnQgd2UgYXJlIGF0dGFjaGVkIHRvIGlzIE5PVCBhIGZpbGVFbGVtZW50ICovXG4gIGNyZWF0ZUZpbGVFbG0oe2NoYW5nZX06IHtjaGFuZ2U6KCkgPT4gYW55fSkge1xuICAgIC8vIHVzZSBzcGVjaWZpYyB0ZWNobmlxdWUgdG8gaGlkZSBmaWxlIGVsZW1lbnQgd2l0aGluXG4gICAgY29uc3QgbGFiZWwgPSBjcmVhdGVJbnZpc2libGVGaWxlSW5wdXRXcmFwKClcbiAgICBjb25zdCBmaWxlRWxtID0gbGFiZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2lucHV0JylbMF1cblxuICAgIGZpbGVFbG0uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2hhbmdlKTtcbiAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCggbGFiZWwgKSAvLyBwdXQgb24gaHRtbCBzdGFnZVxuXG4gICAgcmV0dXJuIGZpbGVFbG1cbiAgfVxuXG4gIGVuYWJsZVNlbGVjdGluZygpe1xuICAgIGxldCBlbG0gPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudFxuXG4gICAgaWYoIGlzRmlsZUlucHV0KGVsbSkgKXtcbiAgICAgIGNvbnN0IGJpbmRlZEhhbmRsZXIgPSBldmVudCA9PiB0aGlzLmJlZm9yZVNlbGVjdChldmVudClcbiAgICAgIGVsbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGJpbmRlZEhhbmRsZXIpXG4gICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJpbmRlZEhhbmRsZXIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBiaW5kZWRIYW5kbGVyID0gZXYgPT4gdGhpcy5jbGlja0hhbmRsZXIoZXYpXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYmluZGVkSGFuZGxlcilcbiAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGJpbmRlZEhhbmRsZXIpXG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgYmluZGVkSGFuZGxlcilcbiAgfVxuXG4gIGdldFZhbGlkRmlsZXMoIGZpbGVzOkZpbGVbXSApOkZpbGVbXXtcbiAgICBjb25zdCBydG46RmlsZVtdID0gW11cbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIGlmKCB0aGlzLmlzRmlsZVZhbGlkKGZpbGVzW3hdKSApe1xuICAgICAgICBydG4ucHVzaCggZmlsZXNbeF0gKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcnRuXG4gIH1cblxuICBnZXRJbnZhbGlkRmlsZXMoZmlsZXM6RmlsZVtdKTpJbnZhbGlkRmlsZUl0ZW1bXXtcbiAgICBjb25zdCBydG46SW52YWxpZEZpbGVJdGVtW10gPSBbXVxuICAgIGZvcihsZXQgeD1maWxlcy5sZW5ndGgtMTsgeCA+PSAwOyAtLXgpe1xuICAgICAgbGV0IGZhaWxSZWFzb24gPSB0aGlzLmdldEZpbGVGaWx0ZXJGYWlsTmFtZShmaWxlc1t4XSlcbiAgICAgIGlmKCBmYWlsUmVhc29uICl7XG4gICAgICAgIHJ0bi5wdXNoKHtcbiAgICAgICAgICBmaWxlIDogZmlsZXNbeF0sXG4gICAgICAgICAgdHlwZSA6IGZhaWxSZWFzb25cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ0blxuICB9XG5cbiAgLy8gUHJpbWFyeSBoYW5kbGVyIG9mIGZpbGVzIGNvbWluZyBpblxuICBoYW5kbGVGaWxlcyhmaWxlczpGaWxlW10pe1xuICAgIGNvbnN0IHZhbGlkcyA9IHRoaXMuZ2V0VmFsaWRGaWxlcyhmaWxlcylcblxuICAgIGlmKGZpbGVzLmxlbmd0aCE9dmFsaWRzLmxlbmd0aCl7XG4gICAgICB0aGlzLmxhc3RJbnZhbGlkcyA9IHRoaXMuZ2V0SW52YWxpZEZpbGVzKGZpbGVzKVxuICAgIH1lbHNle1xuICAgICAgZGVsZXRlIHRoaXMubGFzdEludmFsaWRzXG4gICAgfVxuXG4gICAgdGhpcy5sYXN0SW52YWxpZHNDaGFuZ2UuZW1pdCh0aGlzLmxhc3RJbnZhbGlkcylcblxuICAgIGlmKCB2YWxpZHMubGVuZ3RoICl7XG4gICAgICBpZiggdGhpcy5uZ2ZGaXhPcmllbnRhdGlvbiApe1xuICAgICAgICB0aGlzLmFwcGx5RXhpZlJvdGF0aW9ucyh2YWxpZHMpXG4gICAgICAgIC50aGVuKCBmaXhlZEZpbGVzPT50aGlzLnF1ZShmaXhlZEZpbGVzKSApXG4gICAgICB9ZWxzZXtcbiAgICAgICAgdGhpcy5xdWUodmFsaWRzKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRW1wdHlBZnRlclNlbGVjdGlvbigpKSB7XG4gICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXG4gICAgfVxuICB9XG5cbiAgcXVlKCBmaWxlczpGaWxlW10gKXtcbiAgICB0aGlzLmZpbGVzID0gdGhpcy5maWxlcyB8fCBbXVxuICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuZmlsZXMsIGZpbGVzKVxuXG4gICAgLy9iZWxvdyBicmVhayBtZW1vcnkgcmVmIGFuZCBkb2VzbnQgYWN0IGxpa2UgYSBxdWVcbiAgICAvL3RoaXMuZmlsZXMgPSBmaWxlcy8vY2F1c2VzIG1lbW9yeSBjaGFuZ2Ugd2hpY2ggdHJpZ2dlcnMgYmluZGluZ3MgbGlrZSA8bmdmRm9ybURhdGEgW2ZpbGVzXT1cImZpbGVzXCI+PC9uZ2ZGb3JtRGF0YT5cblxuICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCggdGhpcy5maWxlcyApXG5cbiAgICBpZihmaWxlcy5sZW5ndGgpe1xuICAgICAgdGhpcy5maWxlQ2hhbmdlLmVtaXQoIHRoaXMuZmlsZT1maWxlc1swXSApXG5cbiAgICAgIGlmKHRoaXMubGFzdEJhc2VVcmxDaGFuZ2Uub2JzZXJ2ZXJzLmxlbmd0aCl7XG4gICAgICAgIGRhdGFVcmwoIGZpbGVzWzBdIClcbiAgICAgICAgLnRoZW4oIHVybD0+dGhpcy5sYXN0QmFzZVVybENoYW5nZS5lbWl0KHVybCkgKVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vd2lsbCBiZSBjaGVja2VkIGZvciBpbnB1dCB2YWx1ZSBjbGVhcmluZ1xuICAgIHRoaXMubGFzdEZpbGVDb3VudCA9IHRoaXMuZmlsZXMubGVuZ3RoXG4gIH1cblxuICAvKiogY2FsbGVkIHdoZW4gaW5wdXQgaGFzIGZpbGVzICovXG4gIGNoYW5nZUZuKGV2ZW50OmFueSkge1xuICAgIHZhciBmaWxlTGlzdCA9IGV2ZW50Ll9fZmlsZXNfIHx8IChldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LmZpbGVzKVxuXG4gICAgaWYgKCFmaWxlTGlzdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgIHRoaXMuaGFuZGxlRmlsZXMoZmlsZUxpc3QpXG4gIH1cblxuICBjbGlja0hhbmRsZXIoZXZ0OiBFdmVudCl7XG4gICAgY29uc3QgZWxtID0gdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnRcbiAgICBpZiAoZWxtLmdldEF0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCB0aGlzLmZpbGVEcm9wRGlzYWJsZWQpe1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciByID0gZGV0ZWN0U3dpcGUoZXZ0KTtcbiAgICAvLyBwcmV2ZW50IHRoZSBjbGljayBpZiBpdCBpcyBhIHN3aXBlXG4gICAgaWYgKCByIT09ZmFsc2UgKSByZXR1cm4gcjtcblxuICAgIGNvbnN0IGZpbGVFbG0gPSB0aGlzLnBhcmFtRmlsZUVsbSgpXG4gICAgZmlsZUVsbS5jbGljaygpXG4gICAgLy9maWxlRWxtLmRpc3BhdGNoRXZlbnQoIG5ldyBFdmVudCgnY2xpY2snKSApO1xuICAgIHRoaXMuYmVmb3JlU2VsZWN0KGV2dClcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGJlZm9yZVNlbGVjdChldmVudDogRXZlbnQpe1xuICAgIHRoaXMuZmlsZVNlbGVjdFN0YXJ0LmVtaXQoZXZlbnQpXG5cbiAgICBpZiggdGhpcy5maWxlcyAmJiB0aGlzLmxhc3RGaWxlQ291bnQ9PT10aGlzLmZpbGVzLmxlbmd0aCApcmV0dXJuXG5cbiAgICAvLyBpZiBubyBmaWxlcyBpbiBhcnJheSwgYmUgc3VyZSBicm93c2VyIGRvZXMgbm90IHByZXZlbnQgcmVzZWxlY3Qgb2Ygc2FtZSBmaWxlIChzZWUgZ2l0aHViIGlzc3VlIDI3KVxuICAgIHRoaXMuY2xlYXJGaWxlRWxtVmFsdWUoKVxuICB9XG5cbiAgY2xlYXJGaWxlRWxtVmFsdWUoKSB7XG4gICAgaWYgKCF0aGlzLmZpbGVFbG0pIHJldHVyblxuXG4gICAgdGhpcy5maWxlRWxtLnZhbHVlID0gbnVsbFxuICB9XG5cbiAgaXNFbXB0eUFmdGVyU2VsZWN0aW9uKCk6Ym9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuYXR0cmlidXRlcy5tdWx0aXBsZTtcbiAgfVxuXG4gIHN0b3BFdmVudChldmVudDphbnkpOmFueSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHRyYW5zZmVySGFzRmlsZXModHJhbnNmZXI6YW55KTphbnkge1xuICAgIGlmICghdHJhbnNmZXIudHlwZXMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHJhbnNmZXIudHlwZXMuaW5kZXhPZikge1xuICAgICAgcmV0dXJuIHRyYW5zZmVyLnR5cGVzLmluZGV4T2YoJ0ZpbGVzJykgIT09IC0xO1xuICAgIH0gZWxzZSBpZiAodHJhbnNmZXIudHlwZXMuY29udGFpbnMpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zlci50eXBlcy5jb250YWlucygnRmlsZXMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGV2ZW50VG9GaWxlcyhldmVudDpFdmVudCl7XG4gICAgY29uc3QgdHJhbnNmZXIgPSBldmVudFRvVHJhbnNmZXIoZXZlbnQpO1xuICAgIGlmKCB0cmFuc2ZlciApe1xuICAgICAgaWYodHJhbnNmZXIuZmlsZXMgJiYgdHJhbnNmZXIuZmlsZXMubGVuZ3RoKXtcbiAgICAgICAgcmV0dXJuIHRyYW5zZmVyLmZpbGVzXG4gICAgICB9XG4gICAgICBpZih0cmFuc2Zlci5pdGVtcyAmJiB0cmFuc2Zlci5pdGVtcy5sZW5ndGgpe1xuICAgICAgICByZXR1cm4gdHJhbnNmZXIuaXRlbXNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBhcHBseUV4aWZSb3RhdGlvbnMoXG4gICAgZmlsZXM6RmlsZVtdXG4gICk6UHJvbWlzZTxGaWxlW10+e1xuICAgIGNvbnN0IG1hcHBlciA9IChcbiAgICAgIGZpbGU6RmlsZSxpbmRleDpudW1iZXJcbiAgICApOlByb21pc2U8YW55Pj0+e1xuICAgICAgcmV0dXJuIGFwcGx5RXhpZlJvdGF0aW9uKGZpbGUpXG4gICAgICAudGhlbiggZml4ZWRGaWxlPT5maWxlcy5zcGxpY2UoaW5kZXgsIDEsIGZpeGVkRmlsZSkgKVxuICAgIH1cblxuICAgIGNvbnN0IHByb21zOlByb21pc2U8YW55PltdID0gW11cbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIHByb21zW3hdID0gbWFwcGVyKCBmaWxlc1t4XSwgeCApXG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbCggcHJvbXMgKS50aGVuKCAoKT0+ZmlsZXMgKVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2hhbmdlJywgWyckZXZlbnQnXSlcbiAgb25DaGFuZ2UoZXZlbnQ6RXZlbnQpOnZvaWQge1xuICAgIGxldCBmaWxlcyA9IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmZpbGVzIHx8IHRoaXMuZXZlbnRUb0ZpbGVzKGV2ZW50KVxuXG4gICAgaWYoIWZpbGVzLmxlbmd0aClyZXR1cm5cblxuICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVzKVxuICB9XG5cbiAgZ2V0RmlsZUZpbHRlckZhaWxOYW1lKFxuICAgIGZpbGU6RmlsZVxuICApOnN0cmluZyB8IHVuZGVmaW5lZHtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSsrKXtcbiAgICAgIGlmKCAhdGhpcy5maWx0ZXJzW2ldLmZuLmNhbGwodGhpcywgZmlsZSkgKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyc1tpXS5uYW1lXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIGlzRmlsZVZhbGlkKGZpbGU6RmlsZSk6Ym9vbGVhbntcbiAgICBjb25zdCBub0ZpbHRlcnMgPSAhdGhpcy5hY2NlcHQgJiYgKCF0aGlzLmZpbHRlcnMgfHwgIXRoaXMuZmlsdGVycy5sZW5ndGgpXG4gICAgaWYoIG5vRmlsdGVycyApe1xuICAgICAgcmV0dXJuIHRydWUvL3dlIGhhdmUgbm8gZmlsdGVycyBzbyBhbGwgZmlsZXMgYXJlIHZhbGlkXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsZUZpbHRlckZhaWxOYW1lKGZpbGUpID8gZmFsc2UgOiB0cnVlXG4gIH1cblxuICBpc0ZpbGVzVmFsaWQoZmlsZXM6RmlsZVtdKXtcbiAgICBmb3IobGV0IHg9ZmlsZXMubGVuZ3RoLTE7IHggPj0gMDsgLS14KXtcbiAgICAgIGlmKCAhdGhpcy5pc0ZpbGVWYWxpZChmaWxlc1t4XSkgKXtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBwcm90ZWN0ZWQgX2FjY2VwdEZpbHRlcihpdGVtOkZpbGUpOmJvb2xlYW4ge1xuICAgIHJldHVybiBhY2NlcHRUeXBlKHRoaXMuYWNjZXB0LCBpdGVtLnR5cGUsIGl0ZW0ubmFtZSlcbiAgfVxuXG4gIHByb3RlY3RlZCBfZmlsZVNpemVGaWx0ZXIoaXRlbTpGaWxlKTpib29sZWFuIHtcbiAgICByZXR1cm4gISh0aGlzLm1heFNpemUgJiYgaXRlbS5zaXplID4gdGhpcy5tYXhTaXplKTtcbiAgfVxufVxuXG5cbi8qKiBicm93c2VycyB0cnkgaGFyZCB0byBjb25jZWFsIGRhdGEgYWJvdXQgZmlsZSBkcmFncywgdGhpcyB0ZW5kcyB0byB1bmRvIHRoYXQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxlc1RvV3JpdGVhYmxlT2JqZWN0KCBmaWxlczpGaWxlW10gKTpkcmFnTWV0YVtde1xuICBjb25zdCBqc29uRmlsZXM6ZHJhZ01ldGFbXSA9IFtdXG4gIGZvcihsZXQgeD0wOyB4IDwgZmlsZXMubGVuZ3RoOyArK3gpe1xuICAgIGpzb25GaWxlcy5wdXNoKHtcbiAgICAgIHR5cGU6ZmlsZXNbeF0udHlwZSxcbiAgICAgIGtpbmQ6ZmlsZXNbeF1bXCJraW5kXCJdXG4gICAgfSlcbiAgfVxuICByZXR1cm4ganNvbkZpbGVzXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRvVHJhbnNmZXIoZXZlbnQ6IGFueSk6IFRyYW5zZmVyT2JqZWN0IHtcbiAgaWYoZXZlbnQuZGF0YVRyYW5zZmVyKXJldHVybiBldmVudC5kYXRhVHJhbnNmZXJcbiAgcmV0dXJuICBldmVudC5vcmlnaW5hbEV2ZW50ID8gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIgOiBudWxsXG59XG5cblxuaW50ZXJmYWNlIFRyYW5zZmVyT2JqZWN0IHtcbiAgaXRlbXM/OiBhbnlbXVxuICBmaWxlcz86IGFueVtdXG4gIGRyb3BFZmZlY3Q/OiAnY29weScgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RhdGFUcmFuc2Zlci9kcm9wRWZmZWN0XG59XG4iXX0=
import { CommonModule } from '@angular/common';
import { NgModule } from '@angular/core';
import { ngfBackground } from './ngfBackground.directive';
import { ngfDrop } from './ngfDrop.directive';
import { ngf } from './ngf.directive';
import { ngfSelect } from './ngfSelect.directive';
import { ngfUploadStatus } from './ngfUploadStatus.directive';
import { ngfFormData } from './ngfFormData.directive';
import { ngfSrc } from './ngfSrc.directive';
//import{ HttpModule } from '@angular/http';
const declarations = [
ngfDrop,
ngfSelect,
ngfBackground,
ngfSrc,
ngfUploadStatus,
ngfFormData,
ngf
];
export class ngfModule {
}
ngfModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule
//,HttpModule
],
declarations: declarations,
exports: declarations //[HttpModule, ...declarations]
},] }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2YubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDOUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1Qyw0Q0FBNEM7QUFFNUMsTUFBTSxZQUFZLEdBQUc7SUFDbkIsT0FBTztJQUNQLFNBQVM7SUFDVCxhQUFhO0lBQ2IsTUFBTTtJQUNOLGVBQWU7SUFDZixXQUFXO0lBQ1gsR0FBRztDQUNKLENBQUE7QUFTRSxNQUFNLE9BQU8sU0FBUzs7O1lBUHhCLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUU7b0JBQ1AsWUFBWTtvQkFDWixhQUFhO2lCQUNkO2dCQUNELFlBQVksRUFBRSxZQUFZO2dCQUMxQixPQUFPLEVBQUUsWUFBWSxDQUFBLCtCQUErQjthQUNyRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBuZ2ZCYWNrZ3JvdW5kIH0gZnJvbSAnLi9uZ2ZCYWNrZ3JvdW5kLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBuZ2ZEcm9wIH0gZnJvbSAnLi9uZ2ZEcm9wLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBuZ2YgfSBmcm9tICcuL25nZi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgbmdmU2VsZWN0IH0gZnJvbSAnLi9uZ2ZTZWxlY3QuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZlVwbG9hZFN0YXR1cyB9IGZyb20gJy4vbmdmVXBsb2FkU3RhdHVzLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBuZ2ZGb3JtRGF0YSB9IGZyb20gJy4vbmdmRm9ybURhdGEuZGlyZWN0aXZlJztcbmltcG9ydCB7IG5nZlNyYyB9IGZyb20gJy4vbmdmU3JjLmRpcmVjdGl2ZSc7XG4vL2ltcG9ydHsgSHR0cE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2h0dHAnO1xuXG5jb25zdCBkZWNsYXJhdGlvbnMgPSBbXG4gIG5nZkRyb3AsXG4gIG5nZlNlbGVjdCxcbiAgbmdmQmFja2dyb3VuZCxcbiAgbmdmU3JjLFxuICBuZ2ZVcGxvYWRTdGF0dXMsXG4gIG5nZkZvcm1EYXRhLFxuICBuZ2Zcbl1cblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICAgIC8vLEh0dHBNb2R1bGVcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBkZWNsYXJhdGlvbnMsXG4gIGV4cG9ydHM6IGRlY2xhcmF0aW9ucy8vW0h0dHBNb2R1bGUsIC4uLmRlY2xhcmF0aW9uc11cbn0pIGV4cG9ydCBjbGFzcyBuZ2ZNb2R1bGUge30iXX0=
import { Directive, ElementRef, Input } from '@angular/core';
import { dataUrl } from './fileTools';
export class ngfBackground {
constructor(ElementRef) {
this.ElementRef = ElementRef;
}
ngOnChanges(_changes) {
dataUrl(this.file)
.then(src => {
const urlString = 'url(\'' + (src || '') + '\')';
this.ElementRef.nativeElement.style.backgroundImage = urlString;
});
}
}
ngfBackground.decorators = [
{ type: Directive, args: [{ selector: '[ngfBackground]' },] }
];
ngfBackground.ctorParameters = () => [
{ type: ElementRef }
];
ngfBackground.propDecorators = {
file: [{ type: Input, args: ['ngfBackground',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmQmFja2dyb3VuZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZS11cGxvYWQvbmdmQmFja2dyb3VuZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHdEMsTUFBTSxPQUFPLGFBQWE7SUFHeEIsWUFBbUIsVUFBcUI7UUFBckIsZUFBVSxHQUFWLFVBQVUsQ0FBVztJQUFFLENBQUM7SUFFM0MsV0FBVyxDQUFFLFFBQVk7UUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQSxFQUFFO1lBQ1QsTUFBTSxTQUFTLEdBQUcsUUFBUSxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQTtZQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQTtRQUNqRSxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7OztZQVpGLFNBQVMsU0FBQyxFQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBQzs7O1lBSHBCLFVBQVU7OzttQkFLM0IsS0FBSyxTQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkYXRhVXJsIH0gZnJvbSAnLi9maWxlVG9vbHMnO1xuXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1tuZ2ZCYWNrZ3JvdW5kXSd9KVxuZXhwb3J0IGNsYXNzIG5nZkJhY2tncm91bmQge1xuICBASW5wdXQoJ25nZkJhY2tncm91bmQnKSBmaWxlOmFueVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBFbGVtZW50UmVmOkVsZW1lbnRSZWYpe31cblxuICBuZ09uQ2hhbmdlcyggX2NoYW5nZXM6YW55ICl7XG4gICAgZGF0YVVybCh0aGlzLmZpbGUpXG4gICAgLnRoZW4oc3JjPT57XG4gICAgICBjb25zdCB1cmxTdHJpbmcgPSAndXJsKFxcJycgKyAoc3JjIHx8ICcnKSArICdcXCcpJ1xuICAgICAgdGhpcy5FbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYmFja2dyb3VuZEltYWdlID0gdXJsU3RyaW5nXG4gICAgfSlcbiAgfVxufVxuIl19
import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
import { ngf, eventToTransfer, filesToWriteableObject } from "./ngf.directive";
export class ngfDrop extends ngf {
constructor() {
super(...arguments);
this.fileOver = new EventEmitter();
this.validDrag = false;
this.validDragChange = new EventEmitter();
this.invalidDrag = false;
this.invalidDragChange = new EventEmitter();
this.dragFilesChange = new EventEmitter();
}
onDrop(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
let files = this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
}
handleFiles(files) {
this.fileOver.emit(false); //turn-off dragover
super.handleFiles(files);
}
onDragOver(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
const transfer = eventToTransfer(event);
let files = this.eventToFiles(event);
let jsonFiles = filesToWriteableObject(files);
this.dragFilesChange.emit(this.dragFiles = jsonFiles);
if (files.length) {
this.validDrag = this.isFilesValid(files);
}
else {
//Safari, IE11 & some browsers do NOT tell you about dragged files until dropped. Always consider a valid drag
this.validDrag = true;
}
this.validDragChange.emit(this.validDrag);
this.invalidDrag = !this.validDrag;
this.invalidDragChange.emit(this.invalidDrag);
transfer.dropEffect = 'copy'; // change cursor and visual display
this.stopEvent(event);
this.fileOver.emit(true);
}
closeDrags() {
delete this.validDrag;
this.validDragChange.emit(this.validDrag);
this.invalidDrag = false;
this.invalidDragChange.emit(this.invalidDrag);
delete this.dragFiles;
this.dragFilesChange.emit(this.dragFiles);
}
onDragLeave(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
if (this.element) {
if (event.currentTarget === this.element[0]) {
return;
}
}
this.stopEvent(event);
this.fileOver.emit(false);
}
}
ngfDrop.decorators = [
{ type: Directive, args: [{
selector: "[ngfDrop]",
exportAs: "ngfDrop"
},] }
];
ngfDrop.propDecorators = {
fileOver: [{ type: Output }],
validDrag: [{ type: Input }],
validDragChange: [{ type: Output }],
invalidDrag: [{ type: Input }],
invalidDragChange: [{ type: Output }],
dragFiles: [{ type: Input }],
dragFilesChange: [{ type: Output }],
onDrop: [{ type: HostListener, args: ['drop', ['$event'],] }],
onDragOver: [{ type: HostListener, args: ['dragover', ['$event'],] }],
onDragLeave: [{ type: HostListener, args: ['dragleave', ['$event'],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmRHJvcC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZmlsZS11cGxvYWQvbmdmRHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUM1QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsR0FBRyxFQUFZLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBTXhGLE1BQU0sT0FBTyxPQUFRLFNBQVEsR0FBRztJQUpoQzs7UUFLWSxhQUFRLEdBQXFCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakQsY0FBUyxHQUFXLEtBQUssQ0FBQTtRQUN4QixvQkFBZSxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRTNELGdCQUFXLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLHNCQUFpQixHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFBO1FBRzVELG9CQUFlLEdBQTRCLElBQUksWUFBWSxFQUFFLENBQUE7SUFpRnpFLENBQUM7SUE5RUMsTUFBTSxDQUFDLEtBQVc7UUFDaEIsSUFBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUM7WUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixPQUFNO1NBQ1A7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUE7UUFDakIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVwQyxJQUFHLENBQUMsS0FBSyxDQUFDLE1BQU07WUFBQyxPQUFNO1FBRXZCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN6QixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQVk7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUEsQ0FBQSxtQkFBbUI7UUFDNUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxQixDQUFDO0lBR0QsVUFBVSxDQUFDLEtBQVc7UUFDcEIsSUFBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUM7WUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixPQUFNO1NBQ1A7UUFFRCxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFdkMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUVwQyxJQUFJLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsU0FBUyxHQUFDLFNBQVMsQ0FBRSxDQUFBO1FBRXJELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDMUM7YUFBSTtZQUNILDhHQUE4RztZQUM5RyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtTQUN0QjtRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUV6QyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQTtRQUNsQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUU3QyxRQUFRLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQSxDQUFDLG1DQUFtQztRQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQzFCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFBO1FBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTtRQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUM3QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUE7UUFDckIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBRSxDQUFBO0lBQzdDLENBQUM7SUFHRCxXQUFXLENBQUMsS0FBVztRQUNyQixJQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBQztZQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RCLE9BQU07U0FDUDtRQUVELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtRQUVqQixJQUFLLElBQVksQ0FBQyxPQUFPLEVBQUU7WUFDekIsSUFBSSxLQUFLLENBQUMsYUFBYSxLQUFNLElBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BELE9BQU87YUFDUjtTQUNGO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDOzs7WUE5RkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxXQUFXO2dCQUNyQixRQUFRLEVBQUUsU0FBUzthQUNwQjs7O3VCQUVFLE1BQU07d0JBRU4sS0FBSzs4QkFDTCxNQUFNOzBCQUVOLEtBQUs7Z0NBQ0wsTUFBTTt3QkFFTixLQUFLOzhCQUNMLE1BQU07cUJBRU4sWUFBWSxTQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQzt5QkFxQi9CLFlBQVksU0FBQyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7MEJBd0NuQyxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG5nZiwgZHJhZ01ldGEsIGV2ZW50VG9UcmFuc2ZlciwgZmlsZXNUb1dyaXRlYWJsZU9iamVjdCB9IGZyb20gXCIuL25nZi5kaXJlY3RpdmVcIlxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IFwiW25nZkRyb3BdXCIsXG4gIGV4cG9ydEFzOiBcIm5nZkRyb3BcIlxufSlcbmV4cG9ydCBjbGFzcyBuZ2ZEcm9wIGV4dGVuZHMgbmdmIHtcbiAgQE91dHB1dCgpIGZpbGVPdmVyOkV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBJbnB1dCgpIHZhbGlkRHJhZzpib29sZWFuID0gZmFsc2VcbiAgQE91dHB1dCgpIHZhbGlkRHJhZ0NoYW5nZTpFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICBASW5wdXQoKSBpbnZhbGlkRHJhZyA9IGZhbHNlXG4gIEBPdXRwdXQoKSBpbnZhbGlkRHJhZ0NoYW5nZTpFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcblxuICBASW5wdXQoKSBkcmFnRmlsZXMgITogZHJhZ01ldGFbXVxuICBAT3V0cHV0KCkgZHJhZ0ZpbGVzQ2hhbmdlOkV2ZW50RW1pdHRlcjxkcmFnTWV0YVtdPiA9IG5ldyBFdmVudEVtaXR0ZXIoKVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxuICBvbkRyb3AoZXZlbnQ6RXZlbnQpOnZvaWQge1xuICAgIGlmKHRoaXMuZmlsZURyb3BEaXNhYmxlZCl7XG4gICAgICB0aGlzLnN0b3BFdmVudChldmVudCk7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlRHJhZ3MoKVxuICAgIGxldCBmaWxlcyA9IHRoaXMuZXZlbnRUb0ZpbGVzKGV2ZW50KVxuXG4gICAgaWYoIWZpbGVzLmxlbmd0aClyZXR1cm5cblxuICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICB0aGlzLmhhbmRsZUZpbGVzKGZpbGVzKVxuICB9XG5cbiAgaGFuZGxlRmlsZXMoZmlsZXM6RmlsZVtdKXtcbiAgICB0aGlzLmZpbGVPdmVyLmVtaXQoZmFsc2UpLy90dXJuLW9mZiBkcmFnb3ZlclxuICAgIHN1cGVyLmhhbmRsZUZpbGVzKGZpbGVzKVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKVxuICBvbkRyYWdPdmVyKGV2ZW50OkV2ZW50KTp2b2lkIHtcbiAgICBpZih0aGlzLmZpbGVEcm9wRGlzYWJsZWQpe1xuICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNmZXIgPSBldmVudFRvVHJhbnNmZXIoZXZlbnQpXG5cbiAgICBsZXQgZmlsZXMgPSB0aGlzLmV2ZW50VG9GaWxlcyhldmVudClcblxuICAgIGxldCBqc29uRmlsZXMgPSBmaWxlc1RvV3JpdGVhYmxlT2JqZWN0KGZpbGVzKVxuICAgIHRoaXMuZHJhZ0ZpbGVzQ2hhbmdlLmVtaXQoIHRoaXMuZHJhZ0ZpbGVzPWpzb25GaWxlcyApXG5cbiAgICBpZiggZmlsZXMubGVuZ3RoICl7XG4gICAgICB0aGlzLnZhbGlkRHJhZyA9IHRoaXMuaXNGaWxlc1ZhbGlkKGZpbGVzKVxuICAgIH1lbHNle1xuICAgICAgLy9TYWZhcmksIElFMTEgJiBzb21lIGJyb3dzZXJzIGRvIE5PVCB0ZWxsIHlvdSBhYm91dCBkcmFnZ2VkIGZpbGVzIHVudGlsIGRyb3BwZWQuIEFsd2F5cyBjb25zaWRlciBhIHZhbGlkIGRyYWdcbiAgICAgIHRoaXMudmFsaWREcmFnID0gdHJ1ZVxuICAgIH1cblxuICAgIHRoaXMudmFsaWREcmFnQ2hhbmdlLmVtaXQodGhpcy52YWxpZERyYWcpXG5cbiAgICB0aGlzLmludmFsaWREcmFnID0gIXRoaXMudmFsaWREcmFnXG4gICAgdGhpcy5pbnZhbGlkRHJhZ0NoYW5nZS5lbWl0KHRoaXMuaW52YWxpZERyYWcpXG5cbiAgICB0cmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknIC8vIGNoYW5nZSBjdXJzb3IgYW5kIHZpc3VhbCBkaXNwbGF5XG4gICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpXG4gICAgdGhpcy5maWxlT3Zlci5lbWl0KHRydWUpXG4gIH1cblxuICBjbG9zZURyYWdzKCl7XG4gICAgZGVsZXRlIHRoaXMudmFsaWREcmFnXG4gICAgdGhpcy52YWxpZERyYWdDaGFuZ2UuZW1pdCh0aGlzLnZhbGlkRHJhZylcbiAgICB0aGlzLmludmFsaWREcmFnID0gZmFsc2VcbiAgICB0aGlzLmludmFsaWREcmFnQ2hhbmdlLmVtaXQodGhpcy5pbnZhbGlkRHJhZylcbiAgICBkZWxldGUgdGhpcy5kcmFnRmlsZXNcbiAgICB0aGlzLmRyYWdGaWxlc0NoYW5nZS5lbWl0KCB0aGlzLmRyYWdGaWxlcyApXG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBbJyRldmVudCddKVxuICBvbkRyYWdMZWF2ZShldmVudDpFdmVudCk6YW55IHtcbiAgICBpZih0aGlzLmZpbGVEcm9wRGlzYWJsZWQpe1xuICAgICAgdGhpcy5zdG9wRXZlbnQoZXZlbnQpO1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZURyYWdzKClcblxuICAgIGlmICgodGhpcyBhcyBhbnkpLmVsZW1lbnQpIHtcbiAgICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0ID09PSAodGhpcyBhcyBhbnkpLmVsZW1lbnRbMF0pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc3RvcEV2ZW50KGV2ZW50KTtcbiAgICB0aGlzLmZpbGVPdmVyLmVtaXQoZmFsc2UpO1xuICB9XG59Il19
import { IterableDiffers, Directive, EventEmitter, Output, Input } from '@angular/core';
export class ngfFormData {
constructor(IterableDiffers) {
this.postName = "file";
this.FormData = new FormData();
this.FormDataChange = new EventEmitter();
this.differ = IterableDiffers.find([]).create();
}
ngDoCheck() {
var changes = this.differ.diff(this.files);
if (changes) {
setTimeout(() => this.buildFormData(), 0);
}
}
buildFormData() {
const isArray = typeof (this.files) === 'object' && this.files.constructor === Array;
if (isArray) {
this.FormData = new FormData();
const files = this.files || [];
files.forEach(file => this.FormData.append(this.postName, file, this.fileName || file.name));
this.FormDataChange.emit(this.FormData);
}
else {
delete this.FormData;
}
}
}
ngfFormData.decorators = [
{ type: Directive, args: [{ selector: 'ngfFormData' },] }
];
ngfFormData.ctorParameters = () => [
{ type: IterableDiffers }
];
ngfFormData.propDecorators = {
files: [{ type: Input }],
postName: [{ type: Input }],
fileName: [{ type: Input }],
FormData: [{ type: Input }],
FormDataChange: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmRm9ybURhdGEuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZpbGUtdXBsb2FkL25nZkZvcm1EYXRhLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZUFBZSxFQUNmLFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLE1BQU0sRUFBRSxLQUFLLEVBQ2QsTUFBTSxlQUFlLENBQUM7QUFHdkIsTUFBTSxPQUFPLFdBQVc7SUFVdEIsWUFBWSxlQUFnQztRQVJuQyxhQUFRLEdBQVUsTUFBTSxDQUFBO1FBR3hCLGFBQVEsR0FBWSxJQUFJLFFBQVEsRUFBRSxDQUFBO1FBQ2pDLG1CQUFjLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUE7UUFLbEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ2pELENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBRSxDQUFDO1FBRTdDLElBQUksT0FBTyxFQUFFO1lBQ1gsVUFBVSxDQUFDLEdBQUUsRUFBRSxDQUFBLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQTtTQUN4QztJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsTUFBTSxPQUFPLEdBQUcsT0FBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUcsS0FBSyxDQUFBO1FBRS9FLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRSxDQUFBO1lBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFBO1lBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFBLEVBQUUsQ0FDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsSUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3BFLENBQUE7WUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFFLENBQUE7U0FDMUM7YUFBSTtZQUNILE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQTtTQUNyQjtJQUNILENBQUM7OztZQXBDRixTQUFTLFNBQUMsRUFBQyxRQUFRLEVBQUUsYUFBYSxFQUFDOzs7WUFMbEMsZUFBZTs7O29CQU9kLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLO3VCQUVMLEtBQUs7NkJBQ0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEl0ZXJhYmxlRGlmZmVyLFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLFxuICBPdXRwdXQsIElucHV0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ25nZkZvcm1EYXRhJ30pXG5leHBvcnQgY2xhc3MgbmdmRm9ybURhdGEge1xuICBASW5wdXQoKSBmaWxlcyAhOiBGaWxlW11cbiAgQElucHV0KCkgcG9zdE5hbWU6c3RyaW5nID0gXCJmaWxlXCJcbiAgQElucHV0KCkgZmlsZU5hbWUgITogc3RyaW5nLy9mb3JjZSBmaWxlIG5hbWVcblxuICBASW5wdXQoKSBGb3JtRGF0YTpGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gIEBPdXRwdXQoKSBGb3JtRGF0YUNoYW5nZTpFdmVudEVtaXR0ZXI8Rm9ybURhdGE+ID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgZGlmZmVyOkl0ZXJhYmxlRGlmZmVyPHt9PlxuXG4gIGNvbnN0cnVjdG9yKEl0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzKXtcbiAgICB0aGlzLmRpZmZlciA9IEl0ZXJhYmxlRGlmZmVycy5maW5kKFtdKS5jcmVhdGUoKVxuICB9XG5cbiAgbmdEb0NoZWNrKCl7XG4gICAgdmFyIGNoYW5nZXMgPSB0aGlzLmRpZmZlci5kaWZmKCB0aGlzLmZpbGVzICk7XG5cbiAgICBpZiAoY2hhbmdlcykge1xuICAgICAgc2V0VGltZW91dCgoKT0+dGhpcy5idWlsZEZvcm1EYXRhKCksIDApXG4gICAgfVxuICB9XG5cbiAgYnVpbGRGb3JtRGF0YSgpe1xuICAgIGNvbnN0IGlzQXJyYXkgPSB0eXBlb2YodGhpcy5maWxlcyk9PT0nb2JqZWN0JyAmJiB0aGlzLmZpbGVzLmNvbnN0cnVjdG9yPT09QXJyYXlcblxuICAgIGlmKCBpc0FycmF5ICl7XG4gICAgICB0aGlzLkZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAgIGNvbnN0IGZpbGVzID0gdGhpcy5maWxlcyB8fCBbXVxuICAgICAgZmlsZXMuZm9yRWFjaChmaWxlPT5cbiAgICAgICAgdGhpcy5Gb3JtRGF0YS5hcHBlbmQodGhpcy5wb3N0TmFtZSwgZmlsZSwgdGhpcy5maWxlTmFtZXx8ZmlsZS5uYW1lKVxuICAgICAgKVxuICAgICAgdGhpcy5Gb3JtRGF0YUNoYW5nZS5lbWl0KCB0aGlzLkZvcm1EYXRhIClcbiAgICB9ZWxzZXtcbiAgICAgIGRlbGV0ZSB0aGlzLkZvcm1EYXRhXG4gICAgfVxuICB9XG59Il19
import { Directive, Input } from "@angular/core";
import { ngf } from "./ngf.directive";
export class ngfSelect extends ngf {
constructor() {
super(...arguments);
this.selectable = true;
}
}
ngfSelect.decorators = [
{ type: Directive, args: [{
selector: "[ngfSelect]",
exportAs: "ngfSelect"
},] }
];
ngfSelect.propDecorators = {
selectable: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmU2VsZWN0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZTZWxlY3QuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQU1yQyxNQUFNLE9BQU8sU0FBVSxTQUFRLEdBQUc7SUFKbEM7O1FBS1csZUFBVSxHQUFPLElBQUksQ0FBQTtJQUNoQyxDQUFDOzs7WUFOQSxTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLFFBQVEsRUFBRSxXQUFXO2FBQ3RCOzs7eUJBRUUsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5pbXBvcnQgeyBuZ2YgfSBmcm9tIFwiLi9uZ2YuZGlyZWN0aXZlXCJcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiBcIltuZ2ZTZWxlY3RdXCIsXG4gIGV4cG9ydEFzOiBcIm5nZlNlbGVjdFwiXG59KVxuZXhwb3J0IGNsYXNzIG5nZlNlbGVjdCBleHRlbmRzIG5nZiB7XG4gIEBJbnB1dCgpIHNlbGVjdGFibGU6YW55ID0gdHJ1ZVxufSJdfQ==
import { Directive, ElementRef, Input } from '@angular/core';
import { dataUrl } from './fileTools';
export class ngfSrc {
constructor(ElementRef) {
this.ElementRef = ElementRef;
}
ngOnChanges(_changes) {
dataUrl(this.file)
.then(src => this.ElementRef.nativeElement.src = src);
}
}
ngfSrc.decorators = [
{ type: Directive, args: [{ selector: '[ngfSrc]' },] }
];
ngfSrc.ctorParameters = () => [
{ type: ElementRef }
];
ngfSrc.propDecorators = {
file: [{ type: Input, args: ['ngfSrc',] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmU3JjLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZTcmMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3RDLE1BQU0sT0FBTyxNQUFNO0lBR2pCLFlBQW1CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFBSSxDQUFDO0lBRTlDLFdBQVcsQ0FBQyxRQUFhO1FBQ3ZCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2pCLElBQUksQ0FBQyxHQUFHLENBQUEsRUFBRSxDQUNULElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQ3hDLENBQUE7SUFDSCxDQUFDOzs7WUFYRixTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFOzs7WUFIZixVQUFVOzs7bUJBSzNCLEtBQUssU0FBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGF0YVVybCB9IGZyb20gJy4vZmlsZVRvb2xzJztcblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25nZlNyY10nIH0pXG5leHBvcnQgY2xhc3MgbmdmU3JjIHtcbiAgQElucHV0KCduZ2ZTcmMnKSBmaWxlOiBhbnlcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgRWxlbWVudFJlZjogRWxlbWVudFJlZikgeyB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IGFueSkge1xuICAgIGRhdGFVcmwodGhpcy5maWxlKVxuICAgIC50aGVuKHNyYz0+XG4gICAgICB0aGlzLkVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zcmMgPSBzcmNcbiAgICApXG4gIH1cbn1cbiJdfQ==
import { Directive, EventEmitter, Output, Input } from '@angular/core';
export class ngfUploadStatus {
constructor() {
this.percent = 0;
this.percentChange = new EventEmitter();
}
ngOnChanges(changes) {
if (changes.httpEvent && changes.httpEvent.currentValue) {
const event = changes.httpEvent.currentValue;
if (event.loaded && event.total) {
setTimeout(() => {
this.percent = Math.round(100 * event.loaded / event.total);
this.percentChange.emit(this.percent);
}, 0);
}
}
}
}
ngfUploadStatus.decorators = [
{ type: Directive, args: [{ selector: 'ngfUploadStatus' },] }
];
ngfUploadStatus.propDecorators = {
percent: [{ type: Input }],
percentChange: [{ type: Output }],
httpEvent: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdmVXBsb2FkU3RhdHVzLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9maWxlLXVwbG9hZC9uZ2ZVcGxvYWRTdGF0dXMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdkUsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFFVyxZQUFPLEdBQVUsQ0FBQyxDQUFBO1FBQ2pCLGtCQUFhLEdBQXdCLElBQUksWUFBWSxFQUFFLENBQUE7SUFjbkUsQ0FBQztJQVhDLFdBQVcsQ0FBRSxPQUFPO1FBQ2xCLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRTtZQUN2RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQTtZQUM1QyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLEtBQUssRUFBRTtnQkFDL0IsVUFBVSxDQUFDLEdBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM1RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFFLENBQUE7Z0JBQ3pDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTthQUNOO1NBQ0Y7SUFDSCxDQUFDOzs7WUFoQkYsU0FBUyxTQUFDLEVBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFDOzs7c0JBRXJDLEtBQUs7NEJBQ0wsTUFBTTt3QkFDTixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICduZ2ZVcGxvYWRTdGF0dXMnfSlcbmV4cG9ydCBjbGFzcyBuZ2ZVcGxvYWRTdGF0dXMge1xuICBASW5wdXQoKSBwZXJjZW50Om51bWJlciA9IDBcbiAgQE91dHB1dCgpIHBlcmNlbnRDaGFuZ2U6RXZlbnRFbWl0dGVyPG51bWJlcj4gPSBuZXcgRXZlbnRFbWl0dGVyKClcbiAgQElucHV0KCkgaHR0cEV2ZW50ICE6IEV2ZW50XG5cbiAgbmdPbkNoYW5nZXMoIGNoYW5nZXMgKXtcbiAgICBpZiggY2hhbmdlcy5odHRwRXZlbnQgJiYgY2hhbmdlcy5odHRwRXZlbnQuY3VycmVudFZhbHVlICl7XG4gICAgICBjb25zdCBldmVudCA9IGNoYW5nZXMuaHR0cEV2ZW50LmN1cnJlbnRWYWx1ZVxuICAgICAgaWYgKGV2ZW50LmxvYWRlZCAmJiBldmVudC50b3RhbCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgdGhpcy5wZXJjZW50ID0gTWF0aC5yb3VuZCgxMDAgKiBldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCk7XG4gICAgICAgICAgdGhpcy5wZXJjZW50Q2hhbmdlLmVtaXQoIHRoaXMucGVyY2VudCApXG4gICAgICAgIH0sIDApXG4gICAgICB9XG4gICAgfVxuICB9XG59Il19
/*
* Public API Surface of angular-file
*/
export * from './file-upload/ngfSelect.directive';
export * from './file-upload/ngfDrop.directive';
export * from './file-upload/ngf.directive';
export * from './file-upload/ngf.module';
export { ngfBackground } from './file-upload/ngfBackground.directive';
export { ngfSrc } from './file-upload/ngfSrc.directive';
export { ngfUploadStatus } from './file-upload/ngfUploadStatus.directive';
export { ngfFormData } from './file-upload/ngfFormData.directive';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFuZ3VsYXItZmlsZVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vZmlsZS11cGxvYWQvbmdmU2VsZWN0LmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZkRyb3AuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vZmlsZS11cGxvYWQvbmdmLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2ZpbGUtdXBsb2FkL25nZi5tb2R1bGUnO1xuZXhwb3J0IHsgbmdmQmFja2dyb3VuZCB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmQmFja2dyb3VuZC5kaXJlY3RpdmUnO1xuZXhwb3J0IHsgbmdmU3JjIH0gZnJvbSAnLi9maWxlLXVwbG9hZC9uZ2ZTcmMuZGlyZWN0aXZlJztcbmV4cG9ydCB7IG5nZlVwbG9hZFN0YXR1cyB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmVXBsb2FkU3RhdHVzLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBuZ2ZGb3JtRGF0YSB9IGZyb20gJy4vZmlsZS11cGxvYWQvbmdmRm9ybURhdGEuZGlyZWN0aXZlJzsiXX0=
import { EventEmitter, Directive, ElementRef, Input, Output, HostListener, IterableDiffers, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
const isFileInput = function (elm) {
const ty = elm.getAttribute('type');
return elm.tagName.toLowerCase() === 'input' && ty && ty.toLowerCase() === 'file';
};
let initialTouchStartY = 0;
let initialTouchStartX = 0;
const detectSwipe = function (evt) {
var touches = evt.changedTouches || (evt.originalEvent && evt.originalEvent.changedTouches);
if (touches) {
if (evt.type === 'touchstart') {
initialTouchStartX = touches[0].clientX;
initialTouchStartY = touches[0].clientY;
return true; // don't block event default
}
else {
// prevent scroll from triggering event
if (evt.type === 'touchend') {
var currentX = touches[0].clientX;
var currentY = touches[0].clientY;
if ((Math.abs(currentX - initialTouchStartX) > 20) ||
(Math.abs(currentY - initialTouchStartY) > 20)) {
evt.stopPropagation();
if (evt.cancelable) {
evt.preventDefault();
}
return false;
}
}
return true;
}
}
return false;
};
const createInvisibleFileInputWrap = function () {
var fileElem = createFileInput();
var label = document.createElement('label');
label.innerHTML = 'upload';
label.style.visibility = 'hidden';
label.style.position = 'absolute';
label.style.overflow = 'hidden';
label.style.width = '0px';
label.style.height = '0px';
label.style.border = 'none';
label.style.margin = '0px';
label.style.padding = '0px';
label.setAttribute('tabindex', '-1');
//bindAttrToFileInput(fileElem, label);
//generatedElems.push({el: elem, ref: label});
label.appendChild(fileElem);
//document.body.appendChild( label );
return label;
};
const createFileInput = function () {
var fileElem = document.createElement('input');
fileElem.type = "file";
return fileElem;
};
function getWindow() { return window; }
function acceptType(accept, type, name) {
if (!accept) {
return true;
}
const defs = accept.split(',');
let regx;
let acceptRegString;
for (let x = defs.length - 1; x >= 0; --x) {
//Escapes dots in mimetype
acceptRegString = defs[x];
//trim
acceptRegString = acceptRegString.replace(/(^\s+|\s+$)/g, '');
//Escapes stars in mimetype
acceptRegString = acceptRegString.replace(/\*/g, '.*');
//let acceptReg = '^((' + acceptRegString
//acceptReg = acceptReg.replace(/,/g,')|(') + '))$'
//try by mime
regx = new RegExp(acceptRegString, 'gi');
if (type.search(regx) >= 0) {
return true;
}
//try by ext
if (acceptRegString.substring(0, 1) == '.') {
acceptRegString = '\\' + acceptRegString; //.substring(1, acceptRegString.length-1)//remove dot at front
regx = new RegExp(acceptRegString + '$', 'i');
if ((name || type).search(regx) >= 0) {
return true;
}
}
}
return false;
}
function arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
function dataUrltoBlob(dataurl, name, origSize) {
var arr = dataurl.split(',');
var mimeMatch = arr[0].match(/:(.*?);/);
var mime = mimeMatch ? mimeMatch[1] : 'text/plain';
var bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var blob = new window.Blob([u8arr], { type: mime });
blob["name"] = name;
blob["$ngfOrigSize"] = origSize;
return blob;
}
function applyTransform(ctx, orientation, width, height) {
switch (orientation) {
case 2:
return ctx.transform(-1, 0, 0, 1, width, 0);
case 3:
return ctx.transform(-1, 0, 0, -1, width, height);
case 4:
return ctx.transform(1, 0, 0, -1, 0, height);
case 5:
return ctx.transform(0, 1, 1, 0, 0, 0);
case 6:
return ctx.transform(0, 1, -1, 0, height, 0);
case 7:
return ctx.transform(0, -1, -1, 0, height, width);
case 8:
return ctx.transform(0, -1, 1, 0, 0, width);
}
}
function fixFileOrientationByMeta(file, result) {
return dataUrl(file, true)
.then(url => {
var canvas = document.createElement('canvas');
var img = document.createElement('img');
return new Promise(function (res, rej) {
img.onload = function () {
try {
canvas.width = result.orientation > 4 ? img.height : img.width;
canvas.height = result.orientation > 4 ? img.width : img.height;
var ctx = canvas.getContext('2d');
applyTransform(ctx, result.orientation, img.width, img.height);
ctx.drawImage(img, 0, 0);
var dataUrl = canvas.toDataURL(file.type || 'image/WebP', 0.934);
const base = arrayBufferToBase64(result.fixedArrayBuffer);
dataUrl = restoreExif(base, dataUrl);
var blob = dataUrltoBlob(dataUrl, file.name);
const newFile = blobToFile(blob, file.name);
res(newFile);
}
catch (e) {
rej(e);
}
};
img.onerror = rej;
img.src = url;
});
});
}
function applyExifRotation(file) {
if (file.type.indexOf('image/jpeg') !== 0) {
return Promise.resolve(file);
}
return readOrientation(file)
.then((result) => {
if (result.orientation < 2 || result.orientation > 8) {
return file;
}
return fixFileOrientationByMeta(file, result);
});
}
function readOrientation(file) {
return new Promise((res, rej) => {
var reader = new FileReader();
var slicedFile = file.slice ? file.slice(0, 64 * 1024) : file;
reader.readAsArrayBuffer(slicedFile);
reader.onerror = rej;
reader.onload = function (e) {
var result = { orientation: 1 };
var view = new DataView(this.result);
if (view.getUint16(0, false) !== 0xFFD8)
return res(result);
var length = view.byteLength, offset = 2;
while (offset < length) {
var marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xFFE1) {
if (view.getUint32(offset += 2, false) !== 0x45786966)
return res(result);
var little = view.getUint16(offset += 6, false) === 0x4949;
offset += view.getUint32(offset + 4, little);
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++)
if (view.getUint16(offset + (i * 12), little) === 0x0112) {
var orientation = view.getUint16(offset + (i * 12) + 8, little);
if (orientation >= 2 && orientation <= 8) {
view.setUint16(offset + (i * 12) + 8, 1, little);
result.fixedArrayBuffer = e.target.result;
}
result.orientation = orientation;
return res(result);
}
}
else if ((marker & 0xFF00) !== 0xFF00)
break;
else
offset += view.getUint16(offset, false);
}
return res(result);
};
});
}
/** converts file-input file into base64 dataUri */
function dataUrl(file, disallowObjectUrl) {
if (!file)
return Promise.resolve(file);
if ((disallowObjectUrl && file.$ngfDataUrl != null) || (!disallowObjectUrl && file.$ngfBlobUrl != null)) {
return Promise.resolve(disallowObjectUrl ? file.$ngfDataUrl : file.$ngfBlobUrl);
}
var p = disallowObjectUrl ? file.$$ngfDataUrlPromise : file.$$ngfBlobUrlPromise;
if (p)
return p;
const win = getWindow();
let deferred;
if (win.FileReader && file &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = win.URL || win.webkitURL;
if (FileReader) {
deferred = new Promise((res, rej) => {
var fileReader = new FileReader();
fileReader.onload = function (event) {
file.$ngfDataUrl = event.target.result;
delete file.$ngfDataUrl;
res(event.target.result);
};
fileReader.onerror = function (e) {
file.$ngfDataUrl = '';
rej(e);
};
fileReader.readAsDataURL(file);
});
}
else {
var url;
try {
url = URL.createObjectURL(file);
}
catch (e) {
return Promise.reject(e);
}
deferred = Promise.resolve(url);
file.$ngfBlobUrl = url;
}
}
else {
file[disallowObjectUrl ? '$ngfDataUrl' : '$ngfBlobUrl'] = '';
return Promise.reject(new Error('Browser does not support window.FileReader, window.FileReader, or window.FileAPI')); //deferred.reject();
}
if (disallowObjectUrl) {
p = file.$$ngfDataUrlPromise = deferred;
}
else {
p = file.$$ngfBlobUrlPromise = deferred;
}
p = p.then((x) => {
delete file[disallowObjectUrl ? '$$ngfDataUrlPromise' : '$$ngfBlobUrlPromise'];
return x;
});
return p;
}
function restoreExif(orig, resized) {
var ExifRestorer = {
KEY_STR: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
};
ExifRestorer.encode64 = function (input) {
var output = '', chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0;
do {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
}
else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this.KEY_STR.charAt(enc1) +
this.KEY_STR.charAt(enc2) +
this.KEY_STR.charAt(enc3) +
this.KEY_STR.charAt(enc4);
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return output;
};
ExifRestorer.restore = function (origFileBase64, resizedFileBase64) {
if (origFileBase64.match('data:image/jpeg;base64,')) {
origFileBase64 = origFileBase64.replace('data:image/jpeg;base64,', '');
}
var rawImage = this.decode64(origFileBase64);
var segments = this.slice2Segments(rawImage);
var image = this.exifManipulation(resizedFileBase64, segments);
return 'data:image/jpeg;base64,' + this.encode64(image);
};
ExifRestorer.exifManipulation = function (resizedFileBase64, segments) {
var exifArray = this.getExifArray(segments), newImageArray = this.insertExif(resizedFileBase64, exifArray);
return new Uint8Array(newImageArray);
};
ExifRestorer.getExifArray = function (segments) {
var seg;
for (var x = 0; x < segments.length; x++) {
seg = segments[x];
if (seg[0] === 255 && seg[1] === 225) //(ff e1)
{
return seg;
}
}
return [];
};
ExifRestorer.insertExif = function (resizedFileBase64, exifArray) {
var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', ''), buf = this.decode64(imageData), separatePoint = buf.indexOf(255, 3), mae = buf.slice(0, separatePoint), ato = buf.slice(separatePoint), array = mae;
array = array.concat(exifArray);
array = array.concat(ato);
return array;
};
ExifRestorer.slice2Segments = function (rawImageArray) {
var head = 0, segments = [];
while (1) {
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 218) {
break;
}
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 216) {
head += 2;
}
else {
var length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];
var endPoint = head + length + 2;
var seg = rawImageArray.slice(head, endPoint);
segments.push(seg);
head = endPoint;
}
if (head > rawImageArray.length) {
break;
}
}
return segments;
};
ExifRestorer.decode64 = function (input) {
var chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0, buf = [];
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)) {
console.log('There were invalid base64 characters in the input text.');
}
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
do {
enc1 = this.KEY_STR.indexOf(input.charAt(i++));
enc2 = this.KEY_STR.indexOf(input.charAt(i++));
enc3 = this.KEY_STR.indexOf(input.charAt(i++));
enc4 = this.KEY_STR.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
buf.push(chr1);
if (enc3 !== 64) {
buf.push(chr2);
}
if (enc4 !== 64) {
buf.push(chr3);
}
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return buf;
};
return ExifRestorer.restore(orig, resized); //<= EXIF
}
;
function blobToFile(theBlob, fileName) {
var b = theBlob;
//A Blob() is almost a File() - it's just missing the two properties below which we will add
b.lastModifiedDate = new Date();
b.name = fileName;
//Cast to a File() type
return theBlob;
}
/** A master base set of logic intended to support file select/drag/drop operations
NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting
*/
class ngf {
constructor(element) {
this.element = element;
this.filters = [];
this.lastFileCount = 0;
this.ngfFixOrientation = true;
this.fileDropDisabled = false;
this.selectable = false;
this.directiveInit = new EventEmitter();
this.lastInvalids = [];
this.lastInvalidsChange = new EventEmitter();
this.lastBaseUrlChange = new EventEmitter();
this.fileChange = new EventEmitter();
this.files = [];
this.filesChange = new EventEmitter();
this.fileSelectStart = new EventEmitter();
this.initFilters();
}
initFilters() {
// the order is important
this.filters.push({ name: 'accept', fn: this._acceptFilter });
this.filters.push({ name: 'fileSize', fn: this._fileSizeFilter });
//this.filters.push({name: 'fileType', fn: this._fileTypeFilter})
//this.filters.push({name: 'queueLimit', fn: this._queueLimitFilter})
//this.filters.push({name: 'mimeType', fn: this._mimeTypeFilter})
}
ngOnDestroy() {
delete this.fileElm; //faster memory release of dom element
this.destroyPasteListener();
}
ngOnInit() {
const selectable = (this.selectable || this.selectable === '') && !['false', 'null', '0'].includes(this.selectable);
if (selectable) {
this.enableSelecting();
}
if (this.multiple) {
this.paramFileElm().setAttribute('multiple', this.multiple);
}
this.evalCapturePaste();
// create reference to this class with one cycle delay to avoid ExpressionChangedAfterItHasBeenCheckedError
setTimeout(() => {
this.directiveInit.emit(this);
}, 0);
}
ngOnChanges(changes) {
var _a, _b;
if (changes.accept) {
this.paramFileElm().setAttribute('accept', changes.accept.currentValue || '*');
}
if (changes.capturePaste) {
this.evalCapturePaste();
}
// Did we go from having a file to not having a file? Clear file element then
if (changes.file && changes.file.previousValue && !changes.file.currentValue) {
this.clearFileElmValue();
}
// Did we go from having files to not having files? Clear file element then
if (changes.files) {
const filesWentToZero = ((_a = changes.files.previousValue) === null || _a === void 0 ? void 0 : _a.length) && !((_b = changes.files.currentValue) === null || _b === void 0 ? void 0 : _b.length);
if (filesWentToZero) {
this.clearFileElmValue();
}
}
}
evalCapturePaste() {
const isActive = this.capturePaste || this.capturePaste === '' || ['false', '0', 'null'].includes(this.capturePaste);
if (isActive) {
if (this.pasteCapturer) {
return; // already listening
}
this.pasteCapturer = (e) => {
const clip = e.clipboardData;
if (clip && clip.files && clip.files.length) {
this.handleFiles(clip.files);
e.preventDefault();
}
};
window.addEventListener('paste', this.pasteCapturer);
return;
}
this.destroyPasteListener();
}
destroyPasteListener() {
if (this.pasteCapturer) {
window.removeEventListener('paste', this.pasteCapturer);
delete this.pasteCapturer;
}
}
paramFileElm() {
if (this.fileElm)
return this.fileElm; // already defined
// elm already is a file input
const isFile = isFileInput(this.element.nativeElement);
if (isFile) {
return this.fileElm = this.element.nativeElement;
}
// the host elm is NOT a file input
return this.fileElm = this.createFileElm({
change: this.changeFn.bind(this)
});
}
/** Only used when host element we are attached to is NOT a fileElement */
createFileElm({ change }) {
// use specific technique to hide file element within
const label = createInvisibleFileInputWrap();
const fileElm = label.getElementsByTagName('input')[0];
fileElm.addEventListener('change', change);
this.element.nativeElement.appendChild(label); // put on html stage
return fileElm;
}
enableSelecting() {
let elm = this.element.nativeElement;
if (isFileInput(elm)) {
const bindedHandler = event => this.beforeSelect(event);
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
return;
}
const bindedHandler = ev => this.clickHandler(ev);
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
elm.addEventListener('touchend', bindedHandler);
}
getValidFiles(files) {
const rtn = [];
for (let x = files.length - 1; x >= 0; --x) {
if (this.isFileValid(files[x])) {
rtn.push(files[x]);
}
}
return rtn;
}
getInvalidFiles(files) {
const rtn = [];
for (let x = files.length - 1; x >= 0; --x) {
let failReason = this.getFileFilterFailName(files[x]);
if (failReason) {
rtn.push({
file: files[x],
type: failReason
});
}
}
return rtn;
}
// Primary handler of files coming in
handleFiles(files) {
const valids = this.getValidFiles(files);
if (files.length != valids.length) {
this.lastInvalids = this.getInvalidFiles(files);
}
else {
delete this.lastInvalids;
}
this.lastInvalidsChange.emit(this.lastInvalids);
if (valids.length) {
if (this.ngfFixOrientation) {
this.applyExifRotations(valids)
.then(fixedFiles => this.que(fixedFiles));
}
else {
this.que(valids);
}
}
if (this.isEmptyAfterSelection()) {
this.element.nativeElement.value = '';
}
}
que(files) {
this.files = this.files || [];
Array.prototype.push.apply(this.files, files);
//below break memory ref and doesnt act like a que
//this.files = files//causes memory change which triggers bindings like <ngfFormData [files]="files"></ngfFormData>
this.filesChange.emit(this.files);
if (files.length) {
this.fileChange.emit(this.file = files[0]);
if (this.lastBaseUrlChange.observers.length) {
dataUrl(files[0])
.then(url => this.lastBaseUrlChange.emit(url));
}
}
//will be checked for input value clearing
this.lastFileCount = this.files.length;
}
/** called when input has files */
changeFn(event) {
var fileList = event.__files_ || (event.target && event.target.files);
if (!fileList)
return;
this.stopEvent(event);
this.handleFiles(fileList);
}
clickHandler(evt) {
const elm = this.element.nativeElement;
if (elm.getAttribute('disabled') || this.fileDropDisabled) {
return false;
}
var r = detectSwipe(evt);
// prevent the click if it is a swipe
if (r !== false)
return r;
const fileElm = this.paramFileElm();
fileElm.click();
//fileElm.dispatchEvent( new Event('click') );
this.beforeSelect(evt);
return false;
}
beforeSelect(event) {
this.fileSelectStart.emit(event);
if (this.files && this.lastFileCount === this.files.length)
return;
// if no files in array, be sure browser does not prevent reselect of same file (see github issue 27)
this.clearFileElmValue();
}
clearFileElmValue() {
if (!this.fileElm)
return;
this.fileElm.value = null;
}
isEmptyAfterSelection() {
return !!this.element.nativeElement.attributes.multiple;
}
stopEvent(event) {
event.preventDefault();
event.stopPropagation();
}
transferHasFiles(transfer) {
if (!transfer.types) {
return false;
}
if (transfer.types.indexOf) {
return transfer.types.indexOf('Files') !== -1;
}
else if (transfer.types.contains) {
return transfer.types.contains('Files');
}
else {
return false;
}
}
eventToFiles(event) {
const transfer = eventToTransfer(event);
if (transfer) {
if (transfer.files && transfer.files.length) {
return transfer.files;
}
if (transfer.items && transfer.items.length) {
return transfer.items;
}
}
return [];
}
applyExifRotations(files) {
const mapper = (file, index) => {
return applyExifRotation(file)
.then(fixedFile => files.splice(index, 1, fixedFile));
};
const proms = [];
for (let x = files.length - 1; x >= 0; --x) {
proms[x] = mapper(files[x], x);
}
return Promise.all(proms).then(() => files);
}
onChange(event) {
let files = this.element.nativeElement.files || this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
}
getFileFilterFailName(file) {
for (let i = 0; i < this.filters.length; i++) {
if (!this.filters[i].fn.call(this, file)) {
return this.filters[i].name;
}
}
return undefined;
}
isFileValid(file) {
const noFilters = !this.accept && (!this.filters || !this.filters.length);
if (noFilters) {
return true; //we have no filters so all files are valid
}
return this.getFileFilterFailName(file) ? false : true;
}
isFilesValid(files) {
for (let x = files.length - 1; x >= 0; --x) {
if (!this.isFileValid(files[x])) {
return false;
}
}
return true;
}
_acceptFilter(item) {
return acceptType(this.accept, item.type, item.name);
}
_fileSizeFilter(item) {
return !(this.maxSize && item.size > this.maxSize);
}
}
ngf.decorators = [
{ type: Directive, args: [{
selector: "[ngf]",
exportAs: "ngf"
},] }
];
ngf.ctorParameters = () => [
{ type: ElementRef }
];
ngf.propDecorators = {
multiple: [{ type: Input }],
accept: [{ type: Input }],
maxSize: [{ type: Input }],
ngfFixOrientation: [{ type: Input }],
fileDropDisabled: [{ type: Input }],
selectable: [{ type: Input }],
directiveInit: [{ type: Output, args: ['init',] }],
lastInvalids: [{ type: Input }],
lastInvalidsChange: [{ type: Output }],
lastBaseUrl: [{ type: Input }],
lastBaseUrlChange: [{ type: Output }],
file: [{ type: Input }],
fileChange: [{ type: Output }],
files: [{ type: Input }],
filesChange: [{ type: Output }],
fileSelectStart: [{ type: Output }],
capturePaste: [{ type: Input }],
onChange: [{ type: HostListener, args: ['change', ['$event'],] }]
};
/** browsers try hard to conceal data about file drags, this tends to undo that */
function filesToWriteableObject(files) {
const jsonFiles = [];
for (let x = 0; x < files.length; ++x) {
jsonFiles.push({
type: files[x].type,
kind: files[x]["kind"]
});
}
return jsonFiles;
}
function eventToTransfer(event) {
if (event.dataTransfer)
return event.dataTransfer;
return event.originalEvent ? event.originalEvent.dataTransfer : null;
}
class ngfSelect extends ngf {
constructor() {
super(...arguments);
this.selectable = true;
}
}
ngfSelect.decorators = [
{ type: Directive, args: [{
selector: "[ngfSelect]",
exportAs: "ngfSelect"
},] }
];
ngfSelect.propDecorators = {
selectable: [{ type: Input }]
};
class ngfDrop extends ngf {
constructor() {
super(...arguments);
this.fileOver = new EventEmitter();
this.validDrag = false;
this.validDragChange = new EventEmitter();
this.invalidDrag = false;
this.invalidDragChange = new EventEmitter();
this.dragFilesChange = new EventEmitter();
}
onDrop(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
let files = this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
}
handleFiles(files) {
this.fileOver.emit(false); //turn-off dragover
super.handleFiles(files);
}
onDragOver(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
const transfer = eventToTransfer(event);
let files = this.eventToFiles(event);
let jsonFiles = filesToWriteableObject(files);
this.dragFilesChange.emit(this.dragFiles = jsonFiles);
if (files.length) {
this.validDrag = this.isFilesValid(files);
}
else {
//Safari, IE11 & some browsers do NOT tell you about dragged files until dropped. Always consider a valid drag
this.validDrag = true;
}
this.validDragChange.emit(this.validDrag);
this.invalidDrag = !this.validDrag;
this.invalidDragChange.emit(this.invalidDrag);
transfer.dropEffect = 'copy'; // change cursor and visual display
this.stopEvent(event);
this.fileOver.emit(true);
}
closeDrags() {
delete this.validDrag;
this.validDragChange.emit(this.validDrag);
this.invalidDrag = false;
this.invalidDragChange.emit(this.invalidDrag);
delete this.dragFiles;
this.dragFilesChange.emit(this.dragFiles);
}
onDragLeave(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
if (this.element) {
if (event.currentTarget === this.element[0]) {
return;
}
}
this.stopEvent(event);
this.fileOver.emit(false);
}
}
ngfDrop.decorators = [
{ type: Directive, args: [{
selector: "[ngfDrop]",
exportAs: "ngfDrop"
},] }
];
ngfDrop.propDecorators = {
fileOver: [{ type: Output }],
validDrag: [{ type: Input }],
validDragChange: [{ type: Output }],
invalidDrag: [{ type: Input }],
invalidDragChange: [{ type: Output }],
dragFiles: [{ type: Input }],
dragFilesChange: [{ type: Output }],
onDrop: [{ type: HostListener, args: ['drop', ['$event'],] }],
onDragOver: [{ type: HostListener, args: ['dragover', ['$event'],] }],
onDragLeave: [{ type: HostListener, args: ['dragleave', ['$event'],] }]
};
class ngfBackground {
constructor(ElementRef) {
this.ElementRef = ElementRef;
}
ngOnChanges(_changes) {
dataUrl(this.file)
.then(src => {
const urlString = 'url(\'' + (src || '') + '\')';
this.ElementRef.nativeElement.style.backgroundImage = urlString;
});
}
}
ngfBackground.decorators = [
{ type: Directive, args: [{ selector: '[ngfBackground]' },] }
];
ngfBackground.ctorParameters = () => [
{ type: ElementRef }
];
ngfBackground.propDecorators = {
file: [{ type: Input, args: ['ngfBackground',] }]
};
class ngfUploadStatus {
constructor() {
this.percent = 0;
this.percentChange = new EventEmitter();
}
ngOnChanges(changes) {
if (changes.httpEvent && changes.httpEvent.currentValue) {
const event = changes.httpEvent.currentValue;
if (event.loaded && event.total) {
setTimeout(() => {
this.percent = Math.round(100 * event.loaded / event.total);
this.percentChange.emit(this.percent);
}, 0);
}
}
}
}
ngfUploadStatus.decorators = [
{ type: Directive, args: [{ selector: 'ngfUploadStatus' },] }
];
ngfUploadStatus.propDecorators = {
percent: [{ type: Input }],
percentChange: [{ type: Output }],
httpEvent: [{ type: Input }]
};
class ngfFormData {
constructor(IterableDiffers) {
this.postName = "file";
this.FormData = new FormData();
this.FormDataChange = new EventEmitter();
this.differ = IterableDiffers.find([]).create();
}
ngDoCheck() {
var changes = this.differ.diff(this.files);
if (changes) {
setTimeout(() => this.buildFormData(), 0);
}
}
buildFormData() {
const isArray = typeof (this.files) === 'object' && this.files.constructor === Array;
if (isArray) {
this.FormData = new FormData();
const files = this.files || [];
files.forEach(file => this.FormData.append(this.postName, file, this.fileName || file.name));
this.FormDataChange.emit(this.FormData);
}
else {
delete this.FormData;
}
}
}
ngfFormData.decorators = [
{ type: Directive, args: [{ selector: 'ngfFormData' },] }
];
ngfFormData.ctorParameters = () => [
{ type: IterableDiffers }
];
ngfFormData.propDecorators = {
files: [{ type: Input }],
postName: [{ type: Input }],
fileName: [{ type: Input }],
FormData: [{ type: Input }],
FormDataChange: [{ type: Output }]
};
class ngfSrc {
constructor(ElementRef) {
this.ElementRef = ElementRef;
}
ngOnChanges(_changes) {
dataUrl(this.file)
.then(src => this.ElementRef.nativeElement.src = src);
}
}
ngfSrc.decorators = [
{ type: Directive, args: [{ selector: '[ngfSrc]' },] }
];
ngfSrc.ctorParameters = () => [
{ type: ElementRef }
];
ngfSrc.propDecorators = {
file: [{ type: Input, args: ['ngfSrc',] }]
};
//import{ HttpModule } from '@angular/http';
const declarations = [
ngfDrop,
ngfSelect,
ngfBackground,
ngfSrc,
ngfUploadStatus,
ngfFormData,
ngf
];
class ngfModule {
}
ngfModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule
//,HttpModule
],
declarations: declarations,
exports: declarations //[HttpModule, ...declarations]
},] }
];
/*
* Public API Surface of angular-file
*/
/**
* Generated bundle index. Do not edit.
*/
export { eventToTransfer, filesToWriteableObject, ngf, ngfBackground, ngfDrop, ngfFormData, ngfModule, ngfSelect, ngfSrc, ngfUploadStatus };
//# sourceMappingURL=angular-file-src.js.map

Sorry, the diff of this file is too big to display

import { CommonModule } from '@angular/common';
import { Directive, ElementRef, Input, EventEmitter, Output, HostListener, IterableDiffers, NgModule } from '@angular/core';
function getWindow() { return window; }
function acceptType(accept, type, name) {
if (!accept) {
return true;
}
const defs = accept.split(',');
let regx;
let acceptRegString;
for (let x = defs.length - 1; x >= 0; --x) {
//Escapes dots in mimetype
acceptRegString = defs[x];
//trim
acceptRegString = acceptRegString.replace(/(^\s+|\s+$)/g, '');
//Escapes stars in mimetype
acceptRegString = acceptRegString.replace(/\*/g, '.*');
//let acceptReg = '^((' + acceptRegString
//acceptReg = acceptReg.replace(/,/g,')|(') + '))$'
//try by mime
regx = new RegExp(acceptRegString, 'gi');
if (type.search(regx) >= 0) {
return true;
}
//try by ext
if (acceptRegString.substring(0, 1) == '.') {
acceptRegString = '\\' + acceptRegString; //.substring(1, acceptRegString.length-1)//remove dot at front
regx = new RegExp(acceptRegString + '$', 'i');
if ((name || type).search(regx) >= 0) {
return true;
}
}
}
return false;
}
function arrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}
function dataUrltoBlob(dataurl, name, origSize) {
var arr = dataurl.split(',');
var mimeMatch = arr[0].match(/:(.*?);/);
var mime = mimeMatch ? mimeMatch[1] : 'text/plain';
var bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var blob = new window.Blob([u8arr], { type: mime });
blob["name"] = name;
blob["$ngfOrigSize"] = origSize;
return blob;
}
function applyTransform(ctx, orientation, width, height) {
switch (orientation) {
case 2:
return ctx.transform(-1, 0, 0, 1, width, 0);
case 3:
return ctx.transform(-1, 0, 0, -1, width, height);
case 4:
return ctx.transform(1, 0, 0, -1, 0, height);
case 5:
return ctx.transform(0, 1, 1, 0, 0, 0);
case 6:
return ctx.transform(0, 1, -1, 0, height, 0);
case 7:
return ctx.transform(0, -1, -1, 0, height, width);
case 8:
return ctx.transform(0, -1, 1, 0, 0, width);
}
}
function fixFileOrientationByMeta(file, result) {
return dataUrl(file, true)
.then(url => {
var canvas = document.createElement('canvas');
var img = document.createElement('img');
return new Promise(function (res, rej) {
img.onload = function () {
try {
canvas.width = result.orientation > 4 ? img.height : img.width;
canvas.height = result.orientation > 4 ? img.width : img.height;
var ctx = canvas.getContext('2d');
applyTransform(ctx, result.orientation, img.width, img.height);
ctx.drawImage(img, 0, 0);
var dataUrl = canvas.toDataURL(file.type || 'image/WebP', 0.934);
const base = arrayBufferToBase64(result.fixedArrayBuffer);
dataUrl = restoreExif(base, dataUrl);
var blob = dataUrltoBlob(dataUrl, file.name);
const newFile = blobToFile(blob, file.name);
res(newFile);
}
catch (e) {
rej(e);
}
};
img.onerror = rej;
img.src = url;
});
});
}
function applyExifRotation(file) {
if (file.type.indexOf('image/jpeg') !== 0) {
return Promise.resolve(file);
}
return readOrientation(file)
.then((result) => {
if (result.orientation < 2 || result.orientation > 8) {
return file;
}
return fixFileOrientationByMeta(file, result);
});
}
function readOrientation(file) {
return new Promise((res, rej) => {
var reader = new FileReader();
var slicedFile = file.slice ? file.slice(0, 64 * 1024) : file;
reader.readAsArrayBuffer(slicedFile);
reader.onerror = rej;
reader.onload = function (e) {
var result = { orientation: 1 };
var view = new DataView(this.result);
if (view.getUint16(0, false) !== 0xFFD8)
return res(result);
var length = view.byteLength, offset = 2;
while (offset < length) {
var marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xFFE1) {
if (view.getUint32(offset += 2, false) !== 0x45786966)
return res(result);
var little = view.getUint16(offset += 6, false) === 0x4949;
offset += view.getUint32(offset + 4, little);
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++)
if (view.getUint16(offset + (i * 12), little) === 0x0112) {
var orientation = view.getUint16(offset + (i * 12) + 8, little);
if (orientation >= 2 && orientation <= 8) {
view.setUint16(offset + (i * 12) + 8, 1, little);
result.fixedArrayBuffer = e.target.result;
}
result.orientation = orientation;
return res(result);
}
}
else if ((marker & 0xFF00) !== 0xFF00)
break;
else
offset += view.getUint16(offset, false);
}
return res(result);
};
});
}
/** converts file-input file into base64 dataUri */
function dataUrl(file, disallowObjectUrl) {
if (!file)
return Promise.resolve(file);
if ((disallowObjectUrl && file.$ngfDataUrl != null) || (!disallowObjectUrl && file.$ngfBlobUrl != null)) {
return Promise.resolve(disallowObjectUrl ? file.$ngfDataUrl : file.$ngfBlobUrl);
}
var p = disallowObjectUrl ? file.$$ngfDataUrlPromise : file.$$ngfBlobUrlPromise;
if (p)
return p;
const win = getWindow();
let deferred;
if (win.FileReader && file &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 8') === -1 || file.size < 20000) &&
(!win.FileAPI || navigator.userAgent.indexOf('MSIE 9') === -1 || file.size < 4000000)) {
//prefer URL.createObjectURL for handling refrences to files of all sizes
//since it doesn´t build a large string in memory
var URL = win.URL || win.webkitURL;
if (FileReader) {
deferred = new Promise((res, rej) => {
var fileReader = new FileReader();
fileReader.onload = function (event) {
file.$ngfDataUrl = event.target.result;
delete file.$ngfDataUrl;
res(event.target.result);
};
fileReader.onerror = function (e) {
file.$ngfDataUrl = '';
rej(e);
};
fileReader.readAsDataURL(file);
});
}
else {
var url;
try {
url = URL.createObjectURL(file);
}
catch (e) {
return Promise.reject(e);
}
deferred = Promise.resolve(url);
file.$ngfBlobUrl = url;
}
}
else {
file[disallowObjectUrl ? '$ngfDataUrl' : '$ngfBlobUrl'] = '';
return Promise.reject(new Error('Browser does not support window.FileReader, window.FileReader, or window.FileAPI')); //deferred.reject();
}
if (disallowObjectUrl) {
p = file.$$ngfDataUrlPromise = deferred;
}
else {
p = file.$$ngfBlobUrlPromise = deferred;
}
p = p.then((x) => {
delete file[disallowObjectUrl ? '$$ngfDataUrlPromise' : '$$ngfBlobUrlPromise'];
return x;
});
return p;
}
function restoreExif(orig, resized) {
var ExifRestorer = {
KEY_STR: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
};
ExifRestorer.encode64 = function (input) {
var output = '', chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0;
do {
chr1 = input[i++];
chr2 = input[i++];
chr3 = input[i++];
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
}
else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this.KEY_STR.charAt(enc1) +
this.KEY_STR.charAt(enc2) +
this.KEY_STR.charAt(enc3) +
this.KEY_STR.charAt(enc4);
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return output;
};
ExifRestorer.restore = function (origFileBase64, resizedFileBase64) {
if (origFileBase64.match('data:image/jpeg;base64,')) {
origFileBase64 = origFileBase64.replace('data:image/jpeg;base64,', '');
}
var rawImage = this.decode64(origFileBase64);
var segments = this.slice2Segments(rawImage);
var image = this.exifManipulation(resizedFileBase64, segments);
return 'data:image/jpeg;base64,' + this.encode64(image);
};
ExifRestorer.exifManipulation = function (resizedFileBase64, segments) {
var exifArray = this.getExifArray(segments), newImageArray = this.insertExif(resizedFileBase64, exifArray);
return new Uint8Array(newImageArray);
};
ExifRestorer.getExifArray = function (segments) {
var seg;
for (var x = 0; x < segments.length; x++) {
seg = segments[x];
if (seg[0] === 255 && seg[1] === 225) //(ff e1)
{
return seg;
}
}
return [];
};
ExifRestorer.insertExif = function (resizedFileBase64, exifArray) {
var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', ''), buf = this.decode64(imageData), separatePoint = buf.indexOf(255, 3), mae = buf.slice(0, separatePoint), ato = buf.slice(separatePoint), array = mae;
array = array.concat(exifArray);
array = array.concat(ato);
return array;
};
ExifRestorer.slice2Segments = function (rawImageArray) {
var head = 0, segments = [];
while (1) {
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 218) {
break;
}
if (rawImageArray[head] === 255 && rawImageArray[head + 1] === 216) {
head += 2;
}
else {
var length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];
var endPoint = head + length + 2;
var seg = rawImageArray.slice(head, endPoint);
segments.push(seg);
head = endPoint;
}
if (head > rawImageArray.length) {
break;
}
}
return segments;
};
ExifRestorer.decode64 = function (input) {
var chr1, chr2, chr3 = '', enc1, enc2, enc3, enc4 = '', i = 0, buf = [];
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
var base64test = /[^A-Za-z0-9\+\/\=]/g;
if (base64test.exec(input)) {
console.log('There were invalid base64 characters in the input text.');
}
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
do {
enc1 = this.KEY_STR.indexOf(input.charAt(i++));
enc2 = this.KEY_STR.indexOf(input.charAt(i++));
enc3 = this.KEY_STR.indexOf(input.charAt(i++));
enc4 = this.KEY_STR.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
buf.push(chr1);
if (enc3 !== 64) {
buf.push(chr2);
}
if (enc4 !== 64) {
buf.push(chr3);
}
chr1 = chr2 = chr3 = '';
enc1 = enc2 = enc3 = enc4 = '';
} while (i < input.length);
return buf;
};
return ExifRestorer.restore(orig, resized); //<= EXIF
}
;
function blobToFile(theBlob, fileName) {
var b = theBlob;
//A Blob() is almost a File() - it's just missing the two properties below which we will add
b.lastModifiedDate = new Date();
b.name = fileName;
//Cast to a File() type
return theBlob;
}
class ngfBackground {
constructor(ElementRef) {
this.ElementRef = ElementRef;
}
ngOnChanges(_changes) {
dataUrl(this.file)
.then(src => {
const urlString = 'url(\'' + (src || '') + '\')';
this.ElementRef.nativeElement.style.backgroundImage = urlString;
});
}
}
ngfBackground.decorators = [
{ type: Directive, args: [{ selector: '[ngfBackground]' },] }
];
ngfBackground.ctorParameters = () => [
{ type: ElementRef }
];
ngfBackground.propDecorators = {
file: [{ type: Input, args: ['ngfBackground',] }]
};
const isFileInput = function (elm) {
const ty = elm.getAttribute('type');
return elm.tagName.toLowerCase() === 'input' && ty && ty.toLowerCase() === 'file';
};
let initialTouchStartY = 0;
let initialTouchStartX = 0;
const detectSwipe = function (evt) {
var touches = evt.changedTouches || (evt.originalEvent && evt.originalEvent.changedTouches);
if (touches) {
if (evt.type === 'touchstart') {
initialTouchStartX = touches[0].clientX;
initialTouchStartY = touches[0].clientY;
return true; // don't block event default
}
else {
// prevent scroll from triggering event
if (evt.type === 'touchend') {
var currentX = touches[0].clientX;
var currentY = touches[0].clientY;
if ((Math.abs(currentX - initialTouchStartX) > 20) ||
(Math.abs(currentY - initialTouchStartY) > 20)) {
evt.stopPropagation();
if (evt.cancelable) {
evt.preventDefault();
}
return false;
}
}
return true;
}
}
return false;
};
const createInvisibleFileInputWrap = function () {
var fileElem = createFileInput();
var label = document.createElement('label');
label.innerHTML = 'upload';
label.style.visibility = 'hidden';
label.style.position = 'absolute';
label.style.overflow = 'hidden';
label.style.width = '0px';
label.style.height = '0px';
label.style.border = 'none';
label.style.margin = '0px';
label.style.padding = '0px';
label.setAttribute('tabindex', '-1');
//bindAttrToFileInput(fileElem, label);
//generatedElems.push({el: elem, ref: label});
label.appendChild(fileElem);
//document.body.appendChild( label );
return label;
};
const createFileInput = function () {
var fileElem = document.createElement('input');
fileElem.type = "file";
return fileElem;
};
/** A master base set of logic intended to support file select/drag/drop operations
NOTE: Use ngfDrop for full drag/drop. Use ngfSelect for selecting
*/
class ngf {
constructor(element) {
this.element = element;
this.filters = [];
this.lastFileCount = 0;
this.ngfFixOrientation = true;
this.fileDropDisabled = false;
this.selectable = false;
this.directiveInit = new EventEmitter();
this.lastInvalids = [];
this.lastInvalidsChange = new EventEmitter();
this.lastBaseUrlChange = new EventEmitter();
this.fileChange = new EventEmitter();
this.files = [];
this.filesChange = new EventEmitter();
this.fileSelectStart = new EventEmitter();
this.initFilters();
}
initFilters() {
// the order is important
this.filters.push({ name: 'accept', fn: this._acceptFilter });
this.filters.push({ name: 'fileSize', fn: this._fileSizeFilter });
//this.filters.push({name: 'fileType', fn: this._fileTypeFilter})
//this.filters.push({name: 'queueLimit', fn: this._queueLimitFilter})
//this.filters.push({name: 'mimeType', fn: this._mimeTypeFilter})
}
ngOnDestroy() {
delete this.fileElm; //faster memory release of dom element
this.destroyPasteListener();
}
ngOnInit() {
const selectable = (this.selectable || this.selectable === '') && !['false', 'null', '0'].includes(this.selectable);
if (selectable) {
this.enableSelecting();
}
if (this.multiple) {
this.paramFileElm().setAttribute('multiple', this.multiple);
}
this.evalCapturePaste();
// create reference to this class with one cycle delay to avoid ExpressionChangedAfterItHasBeenCheckedError
setTimeout(() => {
this.directiveInit.emit(this);
}, 0);
}
ngOnChanges(changes) {
var _a, _b;
if (changes.accept) {
this.paramFileElm().setAttribute('accept', changes.accept.currentValue || '*');
}
if (changes.capturePaste) {
this.evalCapturePaste();
}
// Did we go from having a file to not having a file? Clear file element then
if (changes.file && changes.file.previousValue && !changes.file.currentValue) {
this.clearFileElmValue();
}
// Did we go from having files to not having files? Clear file element then
if (changes.files) {
const filesWentToZero = ((_a = changes.files.previousValue) === null || _a === void 0 ? void 0 : _a.length) && !((_b = changes.files.currentValue) === null || _b === void 0 ? void 0 : _b.length);
if (filesWentToZero) {
this.clearFileElmValue();
}
}
}
evalCapturePaste() {
const isActive = this.capturePaste || this.capturePaste === '' || ['false', '0', 'null'].includes(this.capturePaste);
if (isActive) {
if (this.pasteCapturer) {
return; // already listening
}
this.pasteCapturer = (e) => {
const clip = e.clipboardData;
if (clip && clip.files && clip.files.length) {
this.handleFiles(clip.files);
e.preventDefault();
}
};
window.addEventListener('paste', this.pasteCapturer);
return;
}
this.destroyPasteListener();
}
destroyPasteListener() {
if (this.pasteCapturer) {
window.removeEventListener('paste', this.pasteCapturer);
delete this.pasteCapturer;
}
}
paramFileElm() {
if (this.fileElm)
return this.fileElm; // already defined
// elm already is a file input
const isFile = isFileInput(this.element.nativeElement);
if (isFile) {
return this.fileElm = this.element.nativeElement;
}
// the host elm is NOT a file input
return this.fileElm = this.createFileElm({
change: this.changeFn.bind(this)
});
}
/** Only used when host element we are attached to is NOT a fileElement */
createFileElm({ change }) {
// use specific technique to hide file element within
const label = createInvisibleFileInputWrap();
const fileElm = label.getElementsByTagName('input')[0];
fileElm.addEventListener('change', change);
this.element.nativeElement.appendChild(label); // put on html stage
return fileElm;
}
enableSelecting() {
let elm = this.element.nativeElement;
if (isFileInput(elm)) {
const bindedHandler = event => this.beforeSelect(event);
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
return;
}
const bindedHandler = ev => this.clickHandler(ev);
elm.addEventListener('click', bindedHandler);
elm.addEventListener('touchstart', bindedHandler);
elm.addEventListener('touchend', bindedHandler);
}
getValidFiles(files) {
const rtn = [];
for (let x = files.length - 1; x >= 0; --x) {
if (this.isFileValid(files[x])) {
rtn.push(files[x]);
}
}
return rtn;
}
getInvalidFiles(files) {
const rtn = [];
for (let x = files.length - 1; x >= 0; --x) {
let failReason = this.getFileFilterFailName(files[x]);
if (failReason) {
rtn.push({
file: files[x],
type: failReason
});
}
}
return rtn;
}
// Primary handler of files coming in
handleFiles(files) {
const valids = this.getValidFiles(files);
if (files.length != valids.length) {
this.lastInvalids = this.getInvalidFiles(files);
}
else {
delete this.lastInvalids;
}
this.lastInvalidsChange.emit(this.lastInvalids);
if (valids.length) {
if (this.ngfFixOrientation) {
this.applyExifRotations(valids)
.then(fixedFiles => this.que(fixedFiles));
}
else {
this.que(valids);
}
}
if (this.isEmptyAfterSelection()) {
this.element.nativeElement.value = '';
}
}
que(files) {
this.files = this.files || [];
Array.prototype.push.apply(this.files, files);
//below break memory ref and doesnt act like a que
//this.files = files//causes memory change which triggers bindings like <ngfFormData [files]="files"></ngfFormData>
this.filesChange.emit(this.files);
if (files.length) {
this.fileChange.emit(this.file = files[0]);
if (this.lastBaseUrlChange.observers.length) {
dataUrl(files[0])
.then(url => this.lastBaseUrlChange.emit(url));
}
}
//will be checked for input value clearing
this.lastFileCount = this.files.length;
}
/** called when input has files */
changeFn(event) {
var fileList = event.__files_ || (event.target && event.target.files);
if (!fileList)
return;
this.stopEvent(event);
this.handleFiles(fileList);
}
clickHandler(evt) {
const elm = this.element.nativeElement;
if (elm.getAttribute('disabled') || this.fileDropDisabled) {
return false;
}
var r = detectSwipe(evt);
// prevent the click if it is a swipe
if (r !== false)
return r;
const fileElm = this.paramFileElm();
fileElm.click();
//fileElm.dispatchEvent( new Event('click') );
this.beforeSelect(evt);
return false;
}
beforeSelect(event) {
this.fileSelectStart.emit(event);
if (this.files && this.lastFileCount === this.files.length)
return;
// if no files in array, be sure browser does not prevent reselect of same file (see github issue 27)
this.clearFileElmValue();
}
clearFileElmValue() {
if (!this.fileElm)
return;
this.fileElm.value = null;
}
isEmptyAfterSelection() {
return !!this.element.nativeElement.attributes.multiple;
}
stopEvent(event) {
event.preventDefault();
event.stopPropagation();
}
transferHasFiles(transfer) {
if (!transfer.types) {
return false;
}
if (transfer.types.indexOf) {
return transfer.types.indexOf('Files') !== -1;
}
else if (transfer.types.contains) {
return transfer.types.contains('Files');
}
else {
return false;
}
}
eventToFiles(event) {
const transfer = eventToTransfer(event);
if (transfer) {
if (transfer.files && transfer.files.length) {
return transfer.files;
}
if (transfer.items && transfer.items.length) {
return transfer.items;
}
}
return [];
}
applyExifRotations(files) {
const mapper = (file, index) => {
return applyExifRotation(file)
.then(fixedFile => files.splice(index, 1, fixedFile));
};
const proms = [];
for (let x = files.length - 1; x >= 0; --x) {
proms[x] = mapper(files[x], x);
}
return Promise.all(proms).then(() => files);
}
onChange(event) {
let files = this.element.nativeElement.files || this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
}
getFileFilterFailName(file) {
for (let i = 0; i < this.filters.length; i++) {
if (!this.filters[i].fn.call(this, file)) {
return this.filters[i].name;
}
}
return undefined;
}
isFileValid(file) {
const noFilters = !this.accept && (!this.filters || !this.filters.length);
if (noFilters) {
return true; //we have no filters so all files are valid
}
return this.getFileFilterFailName(file) ? false : true;
}
isFilesValid(files) {
for (let x = files.length - 1; x >= 0; --x) {
if (!this.isFileValid(files[x])) {
return false;
}
}
return true;
}
_acceptFilter(item) {
return acceptType(this.accept, item.type, item.name);
}
_fileSizeFilter(item) {
return !(this.maxSize && item.size > this.maxSize);
}
}
ngf.decorators = [
{ type: Directive, args: [{
selector: "[ngf]",
exportAs: "ngf"
},] }
];
ngf.ctorParameters = () => [
{ type: ElementRef }
];
ngf.propDecorators = {
multiple: [{ type: Input }],
accept: [{ type: Input }],
maxSize: [{ type: Input }],
ngfFixOrientation: [{ type: Input }],
fileDropDisabled: [{ type: Input }],
selectable: [{ type: Input }],
directiveInit: [{ type: Output, args: ['init',] }],
lastInvalids: [{ type: Input }],
lastInvalidsChange: [{ type: Output }],
lastBaseUrl: [{ type: Input }],
lastBaseUrlChange: [{ type: Output }],
file: [{ type: Input }],
fileChange: [{ type: Output }],
files: [{ type: Input }],
filesChange: [{ type: Output }],
fileSelectStart: [{ type: Output }],
capturePaste: [{ type: Input }],
onChange: [{ type: HostListener, args: ['change', ['$event'],] }]
};
/** browsers try hard to conceal data about file drags, this tends to undo that */
function filesToWriteableObject(files) {
const jsonFiles = [];
for (let x = 0; x < files.length; ++x) {
jsonFiles.push({
type: files[x].type,
kind: files[x]["kind"]
});
}
return jsonFiles;
}
function eventToTransfer(event) {
if (event.dataTransfer)
return event.dataTransfer;
return event.originalEvent ? event.originalEvent.dataTransfer : null;
}
class ngfDrop extends ngf {
constructor() {
super(...arguments);
this.fileOver = new EventEmitter();
this.validDrag = false;
this.validDragChange = new EventEmitter();
this.invalidDrag = false;
this.invalidDragChange = new EventEmitter();
this.dragFilesChange = new EventEmitter();
}
onDrop(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
let files = this.eventToFiles(event);
if (!files.length)
return;
this.stopEvent(event);
this.handleFiles(files);
}
handleFiles(files) {
this.fileOver.emit(false); //turn-off dragover
super.handleFiles(files);
}
onDragOver(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
const transfer = eventToTransfer(event);
let files = this.eventToFiles(event);
let jsonFiles = filesToWriteableObject(files);
this.dragFilesChange.emit(this.dragFiles = jsonFiles);
if (files.length) {
this.validDrag = this.isFilesValid(files);
}
else {
//Safari, IE11 & some browsers do NOT tell you about dragged files until dropped. Always consider a valid drag
this.validDrag = true;
}
this.validDragChange.emit(this.validDrag);
this.invalidDrag = !this.validDrag;
this.invalidDragChange.emit(this.invalidDrag);
transfer.dropEffect = 'copy'; // change cursor and visual display
this.stopEvent(event);
this.fileOver.emit(true);
}
closeDrags() {
delete this.validDrag;
this.validDragChange.emit(this.validDrag);
this.invalidDrag = false;
this.invalidDragChange.emit(this.invalidDrag);
delete this.dragFiles;
this.dragFilesChange.emit(this.dragFiles);
}
onDragLeave(event) {
if (this.fileDropDisabled) {
this.stopEvent(event);
return;
}
this.closeDrags();
if (this.element) {
if (event.currentTarget === this.element[0]) {
return;
}
}
this.stopEvent(event);
this.fileOver.emit(false);
}
}
ngfDrop.decorators = [
{ type: Directive, args: [{
selector: "[ngfDrop]",
exportAs: "ngfDrop"
},] }
];
ngfDrop.propDecorators = {
fileOver: [{ type: Output }],
validDrag: [{ type: Input }],
validDragChange: [{ type: Output }],
invalidDrag: [{ type: Input }],
invalidDragChange: [{ type: Output }],
dragFiles: [{ type: Input }],
dragFilesChange: [{ type: Output }],
onDrop: [{ type: HostListener, args: ['drop', ['$event'],] }],
onDragOver: [{ type: HostListener, args: ['dragover', ['$event'],] }],
onDragLeave: [{ type: HostListener, args: ['dragleave', ['$event'],] }]
};
class ngfSelect extends ngf {
constructor() {
super(...arguments);
this.selectable = true;
}
}
ngfSelect.decorators = [
{ type: Directive, args: [{
selector: "[ngfSelect]",
exportAs: "ngfSelect"
},] }
];
ngfSelect.propDecorators = {
selectable: [{ type: Input }]
};
class ngfUploadStatus {
constructor() {
this.percent = 0;
this.percentChange = new EventEmitter();
}
ngOnChanges(changes) {
if (changes.httpEvent && changes.httpEvent.currentValue) {
const event = changes.httpEvent.currentValue;
if (event.loaded && event.total) {
setTimeout(() => {
this.percent = Math.round(100 * event.loaded / event.total);
this.percentChange.emit(this.percent);
}, 0);
}
}
}
}
ngfUploadStatus.decorators = [
{ type: Directive, args: [{ selector: 'ngfUploadStatus' },] }
];
ngfUploadStatus.propDecorators = {
percent: [{ type: Input }],
percentChange: [{ type: Output }],
httpEvent: [{ type: Input }]
};
class ngfFormData {
constructor(IterableDiffers) {
this.postName = "file";
this.FormData = new FormData();
this.FormDataChange = new EventEmitter();
this.differ = IterableDiffers.find([]).create();
}
ngDoCheck() {
var changes = this.differ.diff(this.files);
if (changes) {
setTimeout(() => this.buildFormData(), 0);
}
}
buildFormData() {
const isArray = typeof (this.files) === 'object' && this.files.constructor === Array;
if (isArray) {
this.FormData = new FormData();
const files = this.files || [];
files.forEach(file => this.FormData.append(this.postName, file, this.fileName || file.name));
this.FormDataChange.emit(this.FormData);
}
else {
delete this.FormData;
}
}
}
ngfFormData.decorators = [
{ type: Directive, args: [{ selector: 'ngfFormData' },] }
];
ngfFormData.ctorParameters = () => [
{ type: IterableDiffers }
];
ngfFormData.propDecorators = {
files: [{ type: Input }],
postName: [{ type: Input }],
fileName: [{ type: Input }],
FormData: [{ type: Input }],
FormDataChange: [{ type: Output }]
};
class ngfSrc {
constructor(ElementRef) {
this.ElementRef = ElementRef;
}
ngOnChanges(_changes) {
dataUrl(this.file)
.then(src => this.ElementRef.nativeElement.src = src);
}
}
ngfSrc.decorators = [
{ type: Directive, args: [{ selector: '[ngfSrc]' },] }
];
ngfSrc.ctorParameters = () => [
{ type: ElementRef }
];
ngfSrc.propDecorators = {
file: [{ type: Input, args: ['ngfSrc',] }]
};
//import{ HttpModule } from '@angular/http';
const declarations = [
ngfDrop,
ngfSelect,
ngfBackground,
ngfSrc,
ngfUploadStatus,
ngfFormData,
ngf
];
class ngfModule {
}
ngfModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule
//,HttpModule
],
declarations: declarations,
exports: declarations //[HttpModule, ...declarations]
},] }
];
/**
* Generated bundle index. Do not edit.
*/
export { ngfModule, ngfDrop as ɵa, ngf as ɵb, ngfSelect as ɵc, ngfBackground as ɵd, ngfSrc as ɵe, ngfUploadStatus as ɵf, ngfFormData as ɵg };
//# sourceMappingURL=angular-file.js.map

Sorry, the diff of this file is too big to display

export * from './file-upload/ngfSelect.directive';
export * from './file-upload/ngfDrop.directive';
export * from './file-upload/ngf.directive';
export * from './file-upload/ngf.module';
export { ngfBackground } from './file-upload/ngfBackground.directive';
export { ngfSrc } from './file-upload/ngfSrc.directive';
export { ngfUploadStatus } from './file-upload/ngfUploadStatus.directive';
export { ngfFormData } from './file-upload/ngfFormData.directive';