ng-zorro-antd-mobile
Version:
An enterprise-class mobile UI components based on Ant Design and Angular
475 lines • 32.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef } from '@angular/core';
/**
* @record
*/
export function ElementType() { }
if (false) {
/** @type {?} */
ElementType.prototype.type;
/** @type {?} */
ElementType.prototype.backgroundImage;
/** @type {?} */
ElementType.prototype.transform;
}
var ImagePickerComponent = /** @class */ (function () {
function ImagePickerComponent() {
this.prefixCls = 'am-image-picker';
this.flexEl = [];
this._accept = 'image/*';
this._count = 4;
this._selectable = true;
this._files = [];
this._multiple = false;
this.capture = false;
this.disableDelete = false;
this.onFail = new EventEmitter();
this.onChange = new EventEmitter();
this.onImageClick = new EventEmitter();
this.onAddImageClick = new EventEmitter();
}
Object.defineProperty(ImagePickerComponent.prototype, "files", {
get: /**
* @return {?}
*/
function () {
return this._files;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._files = value;
this.sortItem();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ImagePickerComponent.prototype, "accept", {
get: /**
* @return {?}
*/
function () {
return this._accept;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._accept = value;
this.sortItem();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ImagePickerComponent.prototype, "length", {
get: /**
* @return {?}
*/
function () {
return this._count;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value > 0) {
this._count = value;
}
else {
this._count = 4;
}
this.sortItem();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ImagePickerComponent.prototype, "multiple", {
get: /**
* @return {?}
*/
function () {
return this._multiple;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._multiple = value;
this.sortItem();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ImagePickerComponent.prototype, "selectable", {
get: /**
* @return {?}
*/
function () {
return this._selectable;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._selectable = value;
this.sortItem();
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ImagePickerComponent.prototype.sortItem = /**
* @return {?}
*/
function () {
var _this = this;
if (!this._files) {
return;
}
/** @type {?} */
var count = parseInt('' + this._count, 10);
if (count <= 0) {
count = 4;
}
/** @type {?} */
var allEl = this._files.map((/**
* @param {?} item
* @return {?}
*/
function (item) {
return {
type: 'img',
backgroundImage: 'url(' + item.url + ')',
transform: 'rotate(' + _this.getRotation(item.orientation) + ')deg'
};
}));
if (this._selectable) {
allEl.push({
type: 'select',
backgroundImage: '',
transform: ''
});
}
/** @type {?} */
var length = allEl.length;
if (length !== 0 && length % count !== 0) {
/** @type {?} */
var blankCount = count - (length % count);
/** @type {?} */
var fillBlankEl = [];
for (var i = 0; i < blankCount; i++) {
fillBlankEl.push({
type: 'white',
backgroundImage: '',
transform: ''
});
}
allEl = allEl.concat(fillBlankEl);
}
this.flexEl = [];
for (var i = 0; i < allEl.length / count; i++) {
/** @type {?} */
var rowEl = allEl.slice(i * count, i * count + count);
this.flexEl.push(rowEl);
}
};
/**
* @param {?} imgItem
* @return {?}
*/
ImagePickerComponent.prototype.addImage = /**
* @param {?} imgItem
* @return {?}
*/
function (imgItem) {
this._files.push({
type: 'img',
url: imgItem.url,
orientation: imgItem.orientation
});
this.sortItem();
this.onChange.emit({
files: this._files,
operationType: 'add',
index: this._files.length - 1
});
};
/**
* @param {?} index
* @return {?}
*/
ImagePickerComponent.prototype.removeImage = /**
* @param {?} index
* @return {?}
*/
function (index) {
this._files.splice(index, 1);
this.sortItem();
this.onChange.emit({
files: this._files,
operationType: 'remove',
index: index
});
};
/**
* @param {?} index
* @return {?}
*/
ImagePickerComponent.prototype.imageClick = /**
* @param {?} index
* @return {?}
*/
function (index) {
this.onImageClick.emit({
index: index,
files: this._files
});
};
/**
* @param {?} e
* @return {?}
*/
ImagePickerComponent.prototype.addImageClick = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.onAddImageClick.emit(e);
};
/**
* @param {?} file
* @param {?} index
* @return {?}
*/
ImagePickerComponent.prototype.parseFile = /**
* @param {?} file
* @param {?} index
* @return {?}
*/
function (file, index) {
var _this = this;
/** @type {?} */
var reader = new FileReader();
reader.onload = (/**
* @param {?} e
* @return {?}
*/
function (e) {
/** @type {?} */
var dataURL = ((/** @type {?} */ (e.target))).result;
if (!dataURL) {
_this.onFail.emit("Fail to get the " + index + " image");
return;
}
/** @type {?} */
var orientation = 1;
_this.getOrientation(file, (/**
* @param {?} res
* @return {?}
*/
function (res) {
// -2: not jpeg , -1: not defined
if (res > 0) {
orientation = res;
}
_this.addImage({
url: dataURL,
orientation: orientation,
file: file
});
}));
});
reader.readAsDataURL(file);
};
/**
* @param {?} event
* @return {?}
*/
ImagePickerComponent.prototype.fileChange = /**
* @param {?} event
* @return {?}
*/
function (event) {
/** @type {?} */
var fileList = event.target.files;
if (fileList && fileList.length) {
for (var i = 0; i < fileList.length; i++) {
this.parseFile(fileList[i], i);
}
}
};
/**
* @param {?=} orientation
* @return {?}
*/
ImagePickerComponent.prototype.getRotation = /**
* @param {?=} orientation
* @return {?}
*/
function (orientation) {
if (orientation === void 0) { orientation = 1; }
/** @type {?} */
var imgRotation = 0;
switch (orientation) {
case 3:
imgRotation = 180;
break;
case 6:
imgRotation = 90;
break;
case 8:
imgRotation = 270;
break;
default:
}
return imgRotation;
};
// https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side
// https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side
/**
* @param {?} file
* @param {?} callback
* @return {?}
*/
ImagePickerComponent.prototype.getOrientation =
// https://stackoverflow.com/questions/7584794/accessing-jpeg-exif-rotation-data-in-javascript-on-the-client-side
/**
* @param {?} file
* @param {?} callback
* @return {?}
*/
function (file, callback) {
/** @type {?} */
var reader = new FileReader();
reader.onload = (/**
* @param {?} e
* @return {?}
*/
function (e) {
/** @type {?} */
var view = new DataView(((/** @type {?} */ (e.target))).result);
if (view.getUint16(0, false) !== 0xffd8) {
return callback(-2);
}
/** @type {?} */
var length = view.byteLength;
/** @type {?} */
var offset = 2;
while (offset < length) {
/** @type {?} */
var marker = view.getUint16(offset, false);
offset += 2;
if (marker === 0xffe1) {
/** @type {?} */
var tmp = view.getUint32((offset += 2), false);
if (tmp !== 0x45786966) {
return callback(-1);
}
/** @type {?} */
var little = view.getUint16((offset += 6), false) === 0x4949;
offset += view.getUint32(offset + 4, little);
/** @type {?} */
var tags = view.getUint16(offset, little);
offset += 2;
for (var i = 0; i < tags; i++) {
if (view.getUint16(offset + i * 12, little) === 0x0112) {
return callback(view.getUint16(offset + i * 12 + 8, little));
}
}
}
else if ((marker & 0xff00) !== 0xff00) {
break;
}
else {
offset += view.getUint16(offset, false);
}
}
return callback(-1);
});
reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
};
ImagePickerComponent.decorators = [
{ type: Component, args: [{
selector: 'ImagePicker, nzm-image-picker',
template: "<div class=\"{{ prefixCls }}-list\" role=\"group\">\n <Flex *ngFor=\"let rowItem of flexEl; let i = index\">\n <FlexItem *ngFor=\"let item of rowItem; let j = index\">\n <div *ngIf=\"item && 'img' === item.type && item.backgroundImage\" class=\"{{ prefixCls }}-item\">\n <div\n role=\"button\"\n *ngIf=\"!disableDelete\"\n aria-label=\"Click and Remove this image\"\n class=\"{{ prefixCls }}-item-remove\"\n (click)=\"removeImage(i * length + j)\"\n ></div>\n <div\n role=\"button\"\n aria-label=\"Image can be clicked\"\n class=\"{{ prefixCls }}-item-content\"\n [ngStyle]=\"{ 'background-image': item.backgroundImage, transform: item.transform }\"\n (click)=\"imageClick(i * length + j)\"\n ></div>\n </div>\n <div\n role=\"button\"\n aria-label=\"Choose and add image\"\n *ngIf=\"item && 'select' === item.type\"\n class=\"{{ prefixCls }}-item {{ prefixCls }}-upload-btn\"\n (click)=\"addImageClick($event)\"\n >\n <input\n #fileSelectorInput\n type=\"file\"\n [accept]=\"accept\"\n [multiple]=\"multiple\"\n [attr.capture]=\"capture ? capture : null\"\n (change)=\"fileChange($event)\"\n />\n </div>\n <div *ngIf=\"item && 'white' === item.type\" class=\"{{ prefixCls }}-item-white\"></div>\n </FlexItem>\n </Flex>\n</div>\n"
}] }
];
/** @nocollapse */
ImagePickerComponent.ctorParameters = function () { return []; };
ImagePickerComponent.propDecorators = {
_fileSelectorInput: [{ type: ViewChild, args: ['fileSelectorInput', { read: ViewContainerRef },] }],
capture: [{ type: Input }],
disableDelete: [{ type: Input }],
files: [{ type: Input }],
accept: [{ type: Input }],
length: [{ type: Input }],
multiple: [{ type: Input }],
selectable: [{ type: Input }],
onFail: [{ type: Output }],
onChange: [{ type: Output }],
onImageClick: [{ type: Output }],
onAddImageClick: [{ type: Output }]
};
return ImagePickerComponent;
}());
export { ImagePickerComponent };
if (false) {
/** @type {?} */
ImagePickerComponent.prototype.prefixCls;
/** @type {?} */
ImagePickerComponent.prototype.flexEl;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._accept;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._count;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._selectable;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._files;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._multiple;
/**
* @type {?}
* @private
*/
ImagePickerComponent.prototype._fileSelectorInput;
/** @type {?} */
ImagePickerComponent.prototype.capture;
/** @type {?} */
ImagePickerComponent.prototype.disableDelete;
/** @type {?} */
ImagePickerComponent.prototype.onFail;
/** @type {?} */
ImagePickerComponent.prototype.onChange;
/** @type {?} */
ImagePickerComponent.prototype.onImageClick;
/** @type {?} */
ImagePickerComponent.prototype.onAddImageClick;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQtbW9iaWxlLyIsInNvdXJjZXMiOlsiaW1hZ2UtcGlja2VyL2ltYWdlLXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBRXBHLGlDQUlDOzs7SUFIQywyQkFBYTs7SUFDYixzQ0FBd0I7O0lBQ3hCLGdDQUFrQjs7QUFHcEI7SUF3RUU7UUFuRUEsY0FBUyxHQUFXLGlCQUFpQixDQUFDO1FBQ3RDLFdBQU0sR0FBb0IsRUFBRSxDQUFDO1FBRXJCLFlBQU8sR0FBVyxTQUFTLENBQUM7UUFDNUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQUNuQixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUM1QixXQUFNLEdBQWUsRUFBRSxDQUFDO1FBQ3hCLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFLMUIsWUFBTyxHQUFxQixLQUFLLENBQUM7UUFDbEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUE4Q3hDLFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUUvQyxhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakQsaUJBQVksR0FBc0IsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVyRCxvQkFBZSxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO0lBRXpDLENBQUM7SUFyRGhCLHNCQUNJLHVDQUFLOzs7O1FBRFQ7WUFFRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckIsQ0FBQzs7Ozs7UUFDRCxVQUFVLEtBQWlCO1lBQ3pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsQixDQUFDOzs7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b0JBQ3ZDLE1BQU07aUJBQ1A7cUJBQU07b0JBQ0wsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUN6QzthQUNGO1lBQ0QsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUEsQ0FBQztRQUNGLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDOztnQkE5T0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSwrQkFBK0I7b0JBQ3pDLDI5Q0FBNEM7aUJBQzdDOzs7OztxQ0FXRSxTQUFTLFNBQUMsbUJBQW1CLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7MEJBR3pELEtBQUs7Z0NBQ0wsS0FBSzt3QkFDTCxLQUFLO3lCQVFMLEtBQUs7eUJBUUwsS0FBSzsyQkFZTCxLQUFLOzZCQVFMLEtBQUs7eUJBUUwsTUFBTTsyQkFFTixNQUFNOytCQUVOLE1BQU07a0NBRU4sTUFBTTs7SUEwS1QsMkJBQUM7Q0FBQSxBQS9PRCxJQStPQztTQTNPWSxvQkFBb0I7OztJQUMvQix5Q0FBc0M7O0lBQ3RDLHNDQUE2Qjs7Ozs7SUFFN0IsdUNBQW9DOzs7OztJQUNwQyxzQ0FBMkI7Ozs7O0lBQzNCLDJDQUFvQzs7Ozs7SUFDcEMsc0NBQWdDOzs7OztJQUNoQyx5Q0FBbUM7Ozs7O0lBRW5DLGtEQUM2Qzs7SUFFN0MsdUNBQTJDOztJQUMzQyw2Q0FBd0M7O0lBNkN4QyxzQ0FDK0M7O0lBQy9DLHdDQUNpRDs7SUFDakQsNENBQ3FEOztJQUNyRCwrQ0FDd0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWxlbWVudFR5cGUge1xuICB0eXBlOiBzdHJpbmc7IC8vICdpbWcnIHwgJ3NlbGVjdCcgfCAnd2hpdGUnXG4gIGJhY2tncm91bmRJbWFnZTogc3RyaW5nO1xuICB0cmFuc2Zvcm06IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnSW1hZ2VQaWNrZXIsIG56bS1pbWFnZS1waWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vaW1hZ2UtcGlja2VyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBJbWFnZVBpY2tlckNvbXBvbmVudCB7XG4gIHByZWZpeENsczogc3RyaW5nID0gJ2FtLWltYWdlLXBpY2tlcic7XG4gIGZsZXhFbDogRWxlbWVudFR5cGVbXVtdID0gW107XG5cbiAgcHJpdmF0ZSBfYWNjZXB0OiBzdHJpbmcgPSAnaW1hZ2UvKic7XG4gIHByaXZhdGUgX2NvdW50OiBudW1iZXIgPSA0O1xuICBwcml2YXRlIF9zZWxlY3RhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZmlsZXM6IEFycmF5PGFueT4gPSBbXTtcbiAgcHJpdmF0ZSBfbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdmaWxlU2VsZWN0b3JJbnB1dCcsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxuICBwcml2YXRlIF9maWxlU2VsZWN0b3JJbnB1dDogVmlld0NvbnRhaW5lclJlZjtcblxuICBASW5wdXQoKSBjYXB0dXJlOiBib29sZWFuIHwgc3RyaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVEZWxldGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KClcbiAgZ2V0IGZpbGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9maWxlcztcbiAgfVxuICBzZXQgZmlsZXModmFsdWU6IEFycmF5PGFueT4pIHtcbiAgICB0aGlzLl9maWxlcyA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgYWNjZXB0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2FjY2VwdDtcbiAgfVxuICBzZXQgYWNjZXB0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hY2NlcHQgPSB2YWx1ZTtcbiAgICB0aGlzLnNvcnRJdGVtKCk7XG4gIH1cbiAgQElucHV0KClcbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jb3VudDtcbiAgfVxuICBzZXQgbGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodmFsdWUgPiAwKSB7XG4gICAgICB0aGlzLl9jb3VudCA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb3VudCA9IDQ7XG4gICAgfVxuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBASW5wdXQoKVxuICBnZXQgbXVsdGlwbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpcGxlO1xuICB9XG4gIHNldCBtdWx0aXBsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX211bHRpcGxlID0gdmFsdWU7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICB9XG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RhYmxlO1xuICB9XG4gIHNldCBzZWxlY3RhYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VsZWN0YWJsZSA9IHZhbHVlO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgfVxuICBAT3V0cHV0KClcbiAgb25GYWlsOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpXG4gIG9uSW1hZ2VDbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKVxuICBvbkFkZEltYWdlQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzb3J0SXRlbSgpIHtcbiAgICBpZiAoIXRoaXMuX2ZpbGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBjb3VudCA9IHBhcnNlSW50KCcnICsgdGhpcy5fY291bnQsIDEwKTtcbiAgICBpZiAoY291bnQgPD0gMCkge1xuICAgICAgY291bnQgPSA0O1xuICAgIH1cbiAgICBsZXQgYWxsRWw6IEVsZW1lbnRUeXBlW10gPSB0aGlzLl9maWxlcy5tYXAoaXRlbSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnaW1nJyxcbiAgICAgICAgYmFja2dyb3VuZEltYWdlOiAndXJsKCcgKyBpdGVtLnVybCArICcpJyxcbiAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKCcgKyB0aGlzLmdldFJvdGF0aW9uKGl0ZW0ub3JpZW50YXRpb24pICsgJylkZWcnXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGlmICh0aGlzLl9zZWxlY3RhYmxlKSB7XG4gICAgICBhbGxFbC5wdXNoKHtcbiAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgIGJhY2tncm91bmRJbWFnZTogJycsXG4gICAgICAgIHRyYW5zZm9ybTogJydcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBsZW5ndGggPSBhbGxFbC5sZW5ndGg7XG4gICAgaWYgKGxlbmd0aCAhPT0gMCAmJiBsZW5ndGggJSBjb3VudCAhPT0gMCkge1xuICAgICAgY29uc3QgYmxhbmtDb3VudCA9IGNvdW50IC0gKGxlbmd0aCAlIGNvdW50KTtcbiAgICAgIGNvbnN0IGZpbGxCbGFua0VsOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibGFua0NvdW50OyBpKyspIHtcbiAgICAgICAgZmlsbEJsYW5rRWwucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ3doaXRlJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kSW1hZ2U6ICcnLFxuICAgICAgICAgIHRyYW5zZm9ybTogJydcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhbGxFbCA9IGFsbEVsLmNvbmNhdChmaWxsQmxhbmtFbCk7XG4gICAgfVxuICAgIHRoaXMuZmxleEVsID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxFbC5sZW5ndGggLyBjb3VudDsgaSsrKSB7XG4gICAgICBjb25zdCByb3dFbCA9IGFsbEVsLnNsaWNlKGkgKiBjb3VudCwgaSAqIGNvdW50ICsgY291bnQpO1xuICAgICAgdGhpcy5mbGV4RWwucHVzaChyb3dFbCk7XG4gICAgfVxuICB9XG5cbiAgYWRkSW1hZ2UoaW1nSXRlbTogYW55KSB7XG4gICAgdGhpcy5fZmlsZXMucHVzaCh7XG4gICAgICB0eXBlOiAnaW1nJyxcbiAgICAgIHVybDogaW1nSXRlbS51cmwsXG4gICAgICBvcmllbnRhdGlvbjogaW1nSXRlbS5vcmllbnRhdGlvblxuICAgIH0pO1xuICAgIHRoaXMuc29ydEl0ZW0oKTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQoe1xuICAgICAgZmlsZXM6IHRoaXMuX2ZpbGVzLFxuICAgICAgb3BlcmF0aW9uVHlwZTogJ2FkZCcsXG4gICAgICBpbmRleDogdGhpcy5fZmlsZXMubGVuZ3RoIC0gMVxuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlSW1hZ2UoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuX2ZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgdGhpcy5zb3J0SXRlbSgpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh7XG4gICAgICBmaWxlczogdGhpcy5fZmlsZXMsXG4gICAgICBvcGVyYXRpb25UeXBlOiAncmVtb3ZlJyxcbiAgICAgIGluZGV4OiBpbmRleFxuICAgIH0pO1xuICB9XG5cbiAgaW1hZ2VDbGljayhpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5vbkltYWdlQ2xpY2suZW1pdCh7XG4gICAgICBpbmRleDogaW5kZXgsXG4gICAgICBmaWxlczogdGhpcy5fZmlsZXNcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEltYWdlQ2xpY2soZSkge1xuICAgIHRoaXMub25BZGRJbWFnZUNsaWNrLmVtaXQoZSk7XG4gIH1cblxuICBwYXJzZUZpbGUoZmlsZTogYW55LCBpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gZSA9PiB7XG4gICAgICBjb25zdCBkYXRhVVJMID0gKGUudGFyZ2V0IGFzIGFueSkucmVzdWx0O1xuICAgICAgaWYgKCFkYXRhVVJMKSB7XG4gICAgICAgIHRoaXMub25GYWlsLmVtaXQoYEZhaWwgdG8gZ2V0IHRoZSAke2luZGV4fSBpbWFnZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBvcmllbnRhdGlvbiA9IDE7XG4gICAgICB0aGlzLmdldE9yaWVudGF0aW9uKGZpbGUsIHJlcyA9PiB7XG4gICAgICAgIC8vIC0yOiBub3QganBlZyAsIC0xOiBub3QgZGVmaW5lZFxuICAgICAgICBpZiAocmVzID4gMCkge1xuICAgICAgICAgIG9yaWVudGF0aW9uID0gcmVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkSW1hZ2Uoe1xuICAgICAgICAgIHVybDogZGF0YVVSTCxcbiAgICAgICAgICBvcmllbnRhdGlvbixcbiAgICAgICAgICBmaWxlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgfVxuXG4gIGZpbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zdCBmaWxlTGlzdDogRmlsZUxpc3QgPSBldmVudC50YXJnZXQuZmlsZXM7XG4gICAgaWYgKGZpbGVMaXN0ICYmIGZpbGVMaXN0Lmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnBhcnNlRmlsZShmaWxlTGlzdFtpXSwgaSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Um90YXRpb24ob3JpZW50YXRpb24gPSAxKSB7XG4gICAgbGV0IGltZ1JvdGF0aW9uID0gMDtcbiAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGltZ1JvdGF0aW9uID0gMTgwO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjpcbiAgICAgICAgaW1nUm90YXRpb24gPSA5MDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDg6XG4gICAgICAgIGltZ1JvdGF0aW9uID0gMjcwO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICAgIHJldHVybiBpbWdSb3RhdGlvbjtcbiAgfVxuXG4gIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzc1ODQ3OTQvYWNjZXNzaW5nLWpwZWctZXhpZi1yb3RhdGlvbi1kYXRhLWluLWphdmFzY3JpcHQtb24tdGhlLWNsaWVudC1zaWRlXG4gIGdldE9yaWVudGF0aW9uKGZpbGU6IGFueSwgY2FsbGJhY2s6IChfOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSBlID0+IHtcbiAgICAgIGNvbnN0IHZpZXcgPSBuZXcgRGF0YVZpZXcoKGUudGFyZ2V0IGFzIGFueSkucmVzdWx0KTtcbiAgICAgIGlmICh2aWV3LmdldFVpbnQxNigwLCBmYWxzZSkgIT09IDB4ZmZkOCkge1xuICAgICAgICByZXR1cm4gY2FsbGJhY2soLTIpO1xuICAgICAgfVxuICAgICAgY29uc3QgbGVuZ3RoID0gdmlldy5ieXRlTGVuZ3RoO1xuICAgICAgbGV0IG9mZnNldCA9IDI7XG4gICAgICB3aGlsZSAob2Zmc2V0IDwgbGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG1hcmtlciA9IHZpZXcuZ2V0VWludDE2KG9mZnNldCwgZmFsc2UpO1xuICAgICAgICBvZmZzZXQgKz0gMjtcbiAgICAgICAgaWYgKG1hcmtlciA9PT0gMHhmZmUxKSB7XG4gICAgICAgICAgY29uc3QgdG1wID0gdmlldy5nZXRVaW50MzIoKG9mZnNldCArPSAyKSwgZmFsc2UpO1xuICAgICAgICAgIGlmICh0bXAgIT09IDB4NDU3ODY5NjYpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygtMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxpdHRsZSA9IHZpZXcuZ2V0VWludDE2KChvZmZzZXQgKz0gNiksIGZhbHNlKSA9PT0gMHg0OTQ5O1xuICAgICAgICAgIG9mZnNldCArPSB2aWV3LmdldFVpbnQzMihvZmZzZXQgKyA0LCBsaXR0bGUpO1xuICAgICAgICAgIGNvbnN0IHRhZ3MgPSB2aWV3LmdldFVpbnQxNihvZmZzZXQsIGxpdHRsZSk7XG4gICAgICAgICAgb2Zmc2V0ICs9IDI7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh2aWV3LmdldFVpbnQxNihvZmZzZXQgKyBpICogMTIsIGxpdHRsZSkgPT09IDB4MDExMikge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sodmlldy5nZXRVaW50MTYob2Zmc2V0ICsgaSAqIDEyICsgOCwgbGl0dGxlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKChtYXJrZXIgJiAweGZmMDApICE9PSAweGZmMDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgKz0gdmlldy5nZXRVaW50MTYob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjYWxsYmFjaygtMSk7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZS5zbGljZSgwLCA2NCAqIDEwMjQpKTtcbiAgfVxufVxuIl19