@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
394 lines • 57.7 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ElementRef, Injector, Input, ViewChild } from '@angular/core';
import { Logging } from '@microsoft/windows-admin-center-sdk/core/diagnostics/logging';
import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom';
import { SmeSchemaProperty } from '../../../schema/schema-decorator';
import { SimplePropertySchemaFieldLoaderComponent } from '../../../schema/schema-field-host.component';
import { SchemaPrimitiveType } from '../../../schema/schema-models';
import { ValidationAlertSeverity } from '../../validation-alert/validation-alert';
import { SmeInternalFormFieldComponent } from '../form-field.component';
import { WebkitFileSystem } from './webkitFileSystem';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../form-field-accessor.directive";
import * as i3 from "../form-field-validator.directive";
import * as i4 from "../form-field-async-validator.directive";
import * as i5 from "@angular/common";
import * as i6 from "../../../../directives/disabled/disabled.directive";
import * as i7 from "../../../drop-zone/drop-zone.component";
import * as i8 from "../../../tooltip/tooltip.directive";
import * as i9 from "../../validation-alert/validation-alert.component";
import * as i10 from "../../fieldset/fieldset.directive";
import * as i11 from "../../form-field-layout/form-field-layout.component";
import * as i12 from "../../../../pipes/byte-unit-converter-pipe";
import * as i13 from "../../../../pipes/format-pipe";
const _c0 = ["file"];
const _c1 = ["type", "file"];
function FileFormFieldComponent_ng_container_16_div_1_Template(rf, ctx) { if (rf & 1) {
const _r6 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "div", 12);
i0.ɵɵelement(1, "div", 13);
i0.ɵɵelementStart(2, "div", 14)(3, "label", 15);
i0.ɵɵtext(4);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "label", 15);
i0.ɵɵtext(6);
i0.ɵɵpipe(7, "smeByteUnitConverter");
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(8, "button", 16);
i0.ɵɵlistener("click", function FileFormFieldComponent_ng_container_16_div_1_Template_button_click_8_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const i_r4 = restoredCtx.index; const ctx_r5 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r5.removeItemAt(i_r4)); });
i0.ɵɵpipe(9, "smeFormat");
i0.ɵɵelement(10, "span", 17);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const file_r3 = ctx.$implicit;
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵadvance(1);
i0.ɵɵclassProp("sme-icon-openFile", !ctx_r2.isDirectory(file_r3))("sme-icon-openFolderHorizontal", ctx_r2.isDirectory(file_r3));
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(file_r3.name);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(7, 9, file_r3.size, 1024), " ");
i0.ɵɵadvance(2);
i0.ɵɵproperty("title", ctx_r2.strings.MsftSmeShell.Angular.Form.File.removeButtonTooltip)("smeDisabled", ctx_r2.loadingOrDisabled);
i0.ɵɵattribute("aria-label", i0.ɵɵpipeBind2(9, 12, ctx_r2.strings.MsftSmeShell.Angular.Form.File.removeButtonAriaLabelFormat, file_r3.name));
} }
function FileFormFieldComponent_ng_container_16_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, FileFormFieldComponent_ng_container_16_div_1_Template, 11, 15, "div", 11);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngForOf", ctx_r1.files);
} }
/* eslint-disable max-len */
/* eslint-enable max-len */
export class FileFormFieldLoaderComponent extends SimplePropertySchemaFieldLoaderComponent {
}
/** @nocollapse */ FileFormFieldLoaderComponent.ɵfac = /** @pureOrBreakMyCode */ function () { let ɵFileFormFieldLoaderComponent_BaseFactory; return function FileFormFieldLoaderComponent_Factory(t) { return (ɵFileFormFieldLoaderComponent_BaseFactory || (ɵFileFormFieldLoaderComponent_BaseFactory = i0.ɵɵgetInheritedFactory(FileFormFieldLoaderComponent)))(t || FileFormFieldLoaderComponent); }; }();
/** @nocollapse */ FileFormFieldLoaderComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: FileFormFieldLoaderComponent, selectors: [["ng-component"]], features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 12, consts: [["type", "file", 3, "ngModel", "name", "label", "description", "required", "readonly", "disabled", "multiple", "fileTypes", "pendingMessage", "customAsyncValidateDisabled", "customAsyncValidateDebounceTime", "ngModelChange", "customValidate", "customAsyncValidate"], ["field", ""]], template: function FileFormFieldLoaderComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "sme-form-field", 0, 1);
i0.ɵɵlistener("ngModelChange", function FileFormFieldLoaderComponent_Template_sme_form_field_ngModelChange_0_listener($event) { return ctx.data = $event; })("customValidate", function FileFormFieldLoaderComponent_Template_sme_form_field_customValidate_0_listener($event) { return ctx.resolveFunction(ctx.propertySchema.customValidation)($event); })("customAsyncValidate", function FileFormFieldLoaderComponent_Template_sme_form_field_customAsyncValidate_0_listener($event) { return ctx.propertySchema.customAsyncValidation && ctx.resolveFunction(ctx.propertySchema.customAsyncValidation.handler)($event); });
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵproperty("ngModel", ctx.data)("name", ctx.propertySchema.name)("label", ctx.localize(ctx.propertySchema.label))("description", ctx.localize(ctx.propertySchema.description))("required", ctx.propertySchema.required)("readonly", !!ctx.evalExpression(ctx.propertySchema.readonlyCondition))("disabled", !!(ctx.propertySchema.disabledCondition && ctx.evalExpression(ctx.propertySchema.disabledCondition)))("multiple", ctx.propertySchema.options.multiple)("fileTypes", ctx.propertySchema.options.fileTypes)("pendingMessage", ctx.propertySchema.customAsyncValidation && ctx.localize(ctx.propertySchema.customAsyncValidation.pendingMessage))("customAsyncValidateDisabled", ctx.shouldCustomAsyncValidationBeDisabled())("customAsyncValidateDebounceTime", ctx.propertySchema.customAsyncValidation && +ctx.propertySchema.customAsyncValidation.handler);
} }, dependencies: function () { return [i1.NgControlStatus, i1.RequiredValidator, i1.NgModel, FileFormFieldComponent, i2.FormFieldAccessorDirective, i3.FormFieldValidatorDirective, i4.FormFieldAsyncValidatorDirective]; }, encapsulation: 2 });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FileFormFieldLoaderComponent, [{
type: Component,
args: [{
template: `
<sme-form-field #field type="file" [(ngModel)]="data" [name]="propertySchema.name" [label]="localize(propertySchema.label)"
[description]="localize(propertySchema.description)" [required]="propertySchema.required"
[readonly]="!!evalExpression(propertySchema.readonlyCondition)"
[disabled]="!!(propertySchema.disabledCondition && evalExpression(propertySchema.disabledCondition))"
[multiple]="propertySchema.options.multiple" [fileTypes]="propertySchema.options.fileTypes"
(customValidate)="resolveFunction(propertySchema.customValidation)($event)"
(customAsyncValidate)="propertySchema.customAsyncValidation && resolveFunction(propertySchema.customAsyncValidation.handler)($event)"
[pendingMessage]="propertySchema.customAsyncValidation && localize(propertySchema.customAsyncValidation.pendingMessage)"
[customAsyncValidateDisabled]="shouldCustomAsyncValidationBeDisabled()"
[customAsyncValidateDebounceTime]="propertySchema.customAsyncValidation && +propertySchema.customAsyncValidation.handler"
></sme-form-field>
`
}]
}], null, null); })();
/**
* Accessible file field implementation
*/
let FileFormFieldComponent = class FileFormFieldComponent extends SmeInternalFormFieldComponent {
/**
* Initializes a new instance of the FileFormFieldComponent
*/
constructor(injector) {
super(injector);
this.placeholder = this.strings.MsftSmeShell.Angular.Form.File.placeholder;
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'FileFormFieldComponent';
}
/**
* The aria label for this instance
*/
get ariaLabel() {
return this.getMergedDescriptionLabel();
}
/**
* gets the file count label
*/
get fileCountLabel() {
return this.hasFiles
? this.hasMultipleFiles
? this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.plural.format(this.files.length)
: this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.singular
: this.multiple
? this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.multipleEnabled.none
: this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.none;
}
/**
* gets aria-label text
*/
get ariaLabelText() {
let labelText = this.buttonLabel || (this.multiple
? this.strings.MsftSmeShell.Angular.Form.File.buttonText.plural
: this.strings.MsftSmeShell.Angular.Form.File.buttonText.singular);
if (this.required) {
// Append the announced label with "Required" if the field is marked as required
const requiredLabel = this.strings.MsftSmeShell.Angular.Common.Form.Validation.Required.label;
labelText = labelText.concat(requiredLabel);
}
return this.hasFiles
? this.strings.MsftSmeShell.Angular.Form.File.selectedFilesFormat.plural.format(this.files.length).concat(labelText)
: labelText;
}
/**
* Indicates if there are any files selected
*/
get files() {
return Array.isArray(this.value) ? this.value : !!this.value ? [this.value] : [];
}
/**
* Indicates if there are any files selected
*/
get hasFiles() {
return this.multiple ? Array.isArray(this.value) && this.value.length > 0 : !!this.value;
}
/**
* Indicates if there are multiple files selected
*/
get hasMultipleFiles() {
return this.hasFiles && Array.isArray(this.value) && this.value.length > 1;
}
/**
* Indicates if there are any file type restrictions
*/
get hasFileTypes() {
return !!this.fileTypes && this.fileTypes.length > 0;
}
/**
* Returns a formatted accept property for our file input
*/
get acceptedFileTypes() {
return this.fileTypes ? this.fileTypes.join(', ') : '';
}
get directoryUploadSupported() {
return !!DataTransferItem.prototype.webkitGetAsEntry;
}
reset() {
this.fileInput.nativeElement.value = null;
super.reset();
}
/**
* Occurs when the file input has changed
*/
onFileChanged() {
this.updateValue(MsftSme.getValue(this.fileInput, 'nativeElement.files'));
}
/**
* Occurs when the there is a drop onto this control
*/
onDrop(data) {
// if we dropped something other than a file, then just update value to an empty list
if (data.files.length === 0 || data.items.length === 0) {
this.updateValue([]);
return;
}
if (!this.directoryUploadSupported) {
// If webkit is not supported, there is no reliable way to detect folders being dropped without excluding some file types.
// both Edge and Chrome fully support this api. So we should be good as far a our supported browser matrix is concerned.
this.updateValue(data.files);
}
const fileSystem = new WebkitFileSystem(data.items);
this.activeDroppedFileSystem = fileSystem;
fileSystem.getFileList().subscribe({
next: files => {
if (this.activeDroppedFileSystem === fileSystem) {
this.updateValue(files);
}
},
error: error => {
Logging.logError(this.logSourceName, 'An Error occurred resolving dropped files', { error: error });
}
});
}
/**
* Updates the controls value to reflect dropped or browsed files
*/
updateValue(files) {
this.activeDroppedFileSystem = null;
if (MsftSme.isNullOrUndefined(files)) {
this.value = this.multiple ? [] : null;
}
else if (this.multiple) {
const fileArray = [];
for (let i = 0; i < files.length; i++) {
fileArray.push(files[i]);
}
this.value = fileArray;
}
else {
this.value = files[0];
}
this.ngModel.control.updateValueAndValidity();
this.fileInput.nativeElement.value = null;
}
/**
* Removes an item at the given index
*/
removeItemAt(index) {
if (Array.isArray(this.value)) {
this.value.splice(index, 1);
this.value = [...this.value];
}
else {
this.value = null;
}
const firstFocusable = Dom.getFirstFocusableDescendent(this.hostElement.nativeElement);
if (firstFocusable) {
firstFocusable.focus();
}
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
detailsSpan: ''
};
}
isDirectory(file) {
return !!file[WebkitFileSystem.isDirectoryPropertyName];
}
/**
* Performs validation that is internal to this control
* @param c The form control attached to this instance
*/
validate(c) {
// Stop if there are no files, fallback to super validation
if (!this.hasFiles) {
return super.validate(c);
}
// Check for invalid file entries
for (let i = 0; i < this.files.length; i++) {
const file = this.files[i];
// dont allow directories
if (this.isDirectory(file)) {
return {
noDirectories: {
message: this.strings.MsftSmeShell.Angular.Form.File.directoriesNotAllowed,
valid: false,
severity: ValidationAlertSeverity.Error
}
};
}
// Do not allow invalid file types
if (this.hasFileTypes) {
const segments = file.name.split('.');
let extension = segments.length > 1 ? MsftSme.last(segments) : null;
if (extension) {
extension = `.${extension}`;
}
if (!this.fileTypes.some(type => type === file.type || (extension !== null && type === extension))) {
let message;
if (extension || file.type) {
message = this.strings.MsftSmeShell.Angular.Form.File.invalidFileTypeFormat.format(extension || file.type);
}
else {
message = this.strings.MsftSmeShell.Angular.Form.File.invalidFileUnknownTypeFormat.format(file.name);
}
return {
invalidFileType: {
message: message,
valid: false,
severity: ValidationAlertSeverity.Error
}
};
}
}
}
return super.validate(c);
}
};
/** @nocollapse */ FileFormFieldComponent.ɵfac = function FileFormFieldComponent_Factory(t) { return new (t || FileFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ FileFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: FileFormFieldComponent, selectors: [["sme-form-field", "type", "file"]], viewQuery: function FileFormFieldComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fileInput = _t.first);
} }, inputs: { multiple: "multiple", fileTypes: "fileTypes", buttonLabel: "buttonLabel" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c1, decls: 18, vars: 19, consts: [[3, "formField"], [1, "sme-file-drop-zone", "sme-subform-indent-none", "sme-subform-no-bottom-margin"], [1, "sme-padding-inset-xs", "sme-margin-bottom-xs", "sme-arrange-stack-v", 3, "smeDrop"], [1, "sme-file-input", "sme-margin-bottom-xxs"], ["type", "file", 1, "sme-layout-none", 3, "disabled", "change"], ["file", ""], ["type", "button", 1, "sme-button-primary", "sme-button-auto-width", "sme-margin-right-xs", 3, "smeDisabled", "click"], [1, "sme-position-flex-align-center"], [1, "sme-margin-bottom-xs"], [4, "ngIf"], [3, "alert"], ["class", "sme-arrange-stack-h sme-margin-bottom-xs", 4, "ngFor", "ngForOf"], [1, "sme-arrange-stack-h", "sme-margin-bottom-xs"], [1, "sme-position-flex-none", "sme-icon", "sme-icon-size-lg"], [1, "sme-position-flex-auto", "sme-padding-left-sm", "sme-arrange-stack-v"], [1, "sme-position-flex-auto", "sme-arrange-ellipsis", "sme-padding-inset-none"], ["type", "button", 1, "sme-button-trigger", "sme-position-flex-none", "sme-button-auto-width", "sme-focus-zone", 3, "title", "smeDisabled", "click"], [1, "sme-icon", "sme-icon-cancel", "sme-color-red"]], template: function FileFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
const _r7 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "fieldset", 1)(2, "sme-drop-zone", 2);
i0.ɵɵlistener("smeDrop", function FileFormFieldComponent_Template_sme_drop_zone_smeDrop_2_listener($event) { return ctx.onDrop($event); });
i0.ɵɵelementStart(3, "div", 3)(4, "input", 4, 5);
i0.ɵɵlistener("change", function FileFormFieldComponent_Template_input_change_4_listener() { return ctx.onFileChanged(); });
i0.ɵɵelementEnd();
i0.ɵɵelementStart(6, "button", 6);
i0.ɵɵlistener("click", function FileFormFieldComponent_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r7); const _r0 = i0.ɵɵreference(5); return i0.ɵɵresetView(_r0.click()); });
i0.ɵɵtext(7);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(8, "b", 7);
i0.ɵɵtext(9);
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(10, "p");
i0.ɵɵtext(11);
i0.ɵɵpipe(12, "smeFormat");
i0.ɵɵpipe(13, "smeFormat");
i0.ɵɵelementEnd()();
i0.ɵɵelementStart(14, "p", 8);
i0.ɵɵtext(15);
i0.ɵɵelementEnd();
i0.ɵɵtemplate(16, FileFormFieldComponent_ng_container_16_Template, 2, 1, "ng-container", 9);
i0.ɵɵelementEnd();
i0.ɵɵelement(17, "sme-validation-alert", 10);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵproperty("formField", ctx);
i0.ɵɵadvance(1);
i0.ɵɵattribute("aria-label", ctx.ariaLabel);
i0.ɵɵadvance(3);
i0.ɵɵproperty("disabled", ctx.loadingOrDisabled);
i0.ɵɵattribute("multiple", ctx.multiple || undefined)("accept", ctx.hasFileTypes ? ctx.acceptedFileTypes : undefined);
i0.ɵɵadvance(2);
i0.ɵɵproperty("smeDisabled", ctx.loadingOrDisabled);
i0.ɵɵattribute("aria-label", ctx.ariaLabelText);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx.buttonLabel || (ctx.multiple ? ctx.strings.MsftSmeShell.Angular.Form.File.buttonText.plural : ctx.strings.MsftSmeShell.Angular.Form.File.buttonText.singular), " ");
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", ctx.multiple ? ctx.strings.MsftSmeShell.Angular.Form.File.dragDropText.plural : ctx.strings.MsftSmeShell.Angular.Form.File.dragDropText.singular, " ");
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate(ctx.hasFileTypes ? i0.ɵɵpipeBind2(12, 13, ctx.strings.MsftSmeShell.Angular.Form.File.allowedFileTypesFormat, ctx.acceptedFileTypes) : i0.ɵɵpipeBind2(13, 16, ctx.strings.MsftSmeShell.Angular.Form.File.allowedFileTypesFormat, ctx.strings.MsftSmeShell.Angular.Form.File.allFileTypes));
i0.ɵɵadvance(4);
i0.ɵɵtextInterpolate(ctx.fileCountLabel);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.hasFiles);
i0.ɵɵadvance(1);
i0.ɵɵproperty("alert", ctx.alert);
} }, dependencies: [i5.NgForOf, i5.NgIf, i6.DisabledDirective, i7.DropZoneComponent, i8.TooltipDirective, i9.ValidationAlertComponent, i10.FieldsetDirective, i11.FormFieldLayoutComponent, i12.ByteUnitConverterPipe, i13.FormatPipe], encapsulation: 2 });
FileFormFieldComponent = __decorate([
SmeSchemaProperty({
type: SchemaPrimitiveType.File,
format: 'default',
isDefaultFormat: true,
description: 'A file upload control binding to file data.',
loaderComponent: FileFormFieldLoaderComponent
}),
__metadata("design:paramtypes", [Injector])
], FileFormFieldComponent);
export { FileFormFieldComponent };
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FileFormFieldComponent, [{
type: Component,
args: [{ selector: 'sme-form-field[type="file"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <fieldset [attr.aria-label]=\"ariaLabel\"\r\n class=\"sme-file-drop-zone sme-subform-indent-none sme-subform-no-bottom-margin\">\r\n <sme-drop-zone class=\"sme-padding-inset-xs sme-margin-bottom-xs sme-arrange-stack-v\" (smeDrop)=\"onDrop($event)\">\r\n <div class=\"sme-file-input sme-margin-bottom-xxs\">\r\n <input #file type=\"file\" class=\"sme-layout-none\" [disabled]=\"loadingOrDisabled\" (change)=\"onFileChanged()\"\r\n [attr.multiple]=\"multiple || undefined\" [attr.accept]=\"hasFileTypes ? acceptedFileTypes : undefined\">\r\n <button type=\"button\" [smeDisabled]=\"loadingOrDisabled\"\r\n class=\"sme-button-primary sme-button-auto-width sme-margin-right-xs\" (click)=\"file.click()\" [attr.aria-label]=\"ariaLabelText\">\r\n {{ buttonLabel || ( multiple\r\n ? strings.MsftSmeShell.Angular.Form.File.buttonText.plural\r\n : strings.MsftSmeShell.Angular.Form.File.buttonText.singular )\r\n }}\r\n </button>\r\n <b class=\"sme-position-flex-align-center\">\r\n {{\r\n multiple\r\n ? strings.MsftSmeShell.Angular.Form.File.dragDropText.plural\r\n : strings.MsftSmeShell.Angular.Form.File.dragDropText.singular\r\n }}\r\n </b>\r\n </div>\r\n <p>{{ hasFileTypes ? (strings.MsftSmeShell.Angular.Form.File.allowedFileTypesFormat | smeFormat:acceptedFileTypes)\r\n : ( strings.MsftSmeShell.Angular.Form.File.allowedFileTypesFormat | smeFormat:strings.MsftSmeShell.Angular.Form.File.allFileTypes) }}</p>\r\n </sme-drop-zone>\r\n <p class=\"sme-margin-bottom-xs\">{{fileCountLabel}}</p>\r\n\r\n <ng-container *ngIf=\"hasFiles\">\r\n <div *ngFor=\"let file of files; let i = index\" class=\"sme-arrange-stack-h sme-margin-bottom-xs\">\r\n <div class=\"sme-position-flex-none sme-icon sme-icon-size-lg\" [class.sme-icon-openFile]=\"!isDirectory(file)\"\r\n [class.sme-icon-openFolderHorizontal]=\"isDirectory(file)\"></div>\r\n <div class=\"sme-position-flex-auto sme-padding-left-sm sme-arrange-stack-v\">\r\n <label class=\"sme-position-flex-auto sme-arrange-ellipsis sme-padding-inset-none\">{{ file.name }}</label>\r\n <label class=\"sme-position-flex-auto sme-arrange-ellipsis sme-padding-inset-none\">\r\n {{file.size | smeByteUnitConverter:1024}}\r\n </label>\r\n </div>\r\n <button type=\"button\" class=\"sme-button-trigger sme-position-flex-none sme-button-auto-width sme-focus-zone\"\r\n (click)=\"removeItemAt(i)\"\r\n [attr.aria-label]=\"strings.MsftSmeShell.Angular.Form.File.removeButtonAriaLabelFormat | smeFormat:file.name\"\r\n [title]=\"strings.MsftSmeShell.Angular.Form.File.removeButtonTooltip\" [smeDisabled]=\"loadingOrDisabled\">\r\n <span class=\"sme-icon sme-icon-cancel sme-color-red\"></span>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </fieldset>\r\n <sme-validation-alert [alert]=\"alert\"></sme-validation-alert>\r\n</sme-form-field-layout>\r\n" }]
}], function () { return [{ type: i0.Injector }]; }, { fileInput: [{
type: ViewChild,
args: ['file']
}], multiple: [{
type: Input
}], fileTypes: [{
type: Input
}], buttonLabel: [{
type: Input
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1mb3JtLWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2Zvcm0vZm9ybS1maWVsZC9maWxlL2ZpbGUtZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvZmlsZS9maWxlLWZvcm0tZmllbGQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUN2RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLHdDQUF3QyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDdkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFvQix1QkFBdUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BHLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDbUJoRCwrQkFBZ0c7SUFDOUYsMEJBQ3FFO0lBQ3JFLCtCQUE0RSxnQkFBQTtJQUNRLFlBQWU7SUFBQSxpQkFBUTtJQUN6RyxpQ0FBa0Y7SUFDaEYsWUFDRjs7SUFBQSxpQkFBUSxFQUFBO0lBRVYsa0NBRytHO0lBRnZHLHdPQUFTLGVB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LDRDQUE2RDtRQUMvRCxpQkFBd0I7O1FBL0NELCtCQUFrQjtRQUM3QixlQUE2QjtRQUE3QiwyQ0FBNkI7UUFJZ0IsZUFBOEI7UUFBOUIsZ0RBQThCO1FBQ3hFLHFEQUF1QyxnRUFBQTtRQUN4QixlQUFpQztRQUFqQyxtREFBaUM7UUFDNkMsK0NBQWlDO1FBQ25JLGVBSUY7UUFKRSxrTUFJRjtRQUVFLGVBS0Y7UUFMRSxpTEFLRjtRQUVDLGVBQ29JO1FBRHBJLDhTQUNvSTtRQUV6RyxlQUFrQjtRQUFsQix3Q0FBa0I7UUFFbkMsZUFBYztRQUFkLG1DQUFjO1FBbUJULGVBQWU7UUFBZixpQ0FBZTs7QUREMUIsc0JBQXNCO0lBWGxDLGlCQUFpQixDQUFDO1FBQ2YsSUFBSSxFQUFFLG1CQUFtQixDQUFDLElBQUk7UUFDOUIsTUFBTSxFQUFFLFNBQVM7UUFDakIsZUFBZSxFQUFFLElBQUk7UUFDckIsV0FBVyxFQUFFLDZDQUE2QztRQUMxRCxlQUFlLEVBQUUsNEJBQTRCO0tBQ2hELENBQUM7cUNBMEhnQixRQUFRO0dBckhiLHNCQUFzQixDQTJRbEM7U0EzUVksc0JBQXNCO3VGQUF0QixzQkFBc0I7Y0FKbEMsU0FBUzsyQkFDSSw2QkFBNkI7MkRBZ0JoQyxTQUFTO2tCQURmLFNBQVM7bUJBQUMsTUFBTTtZQU9WLFFBQVE7a0JBRGQsS0FBSztZQU9DLFNBQVM7a0JBRGYsS0FBSztZQU9DLFdBQVc7a0JBRGpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RpYWdub3N0aWNzL2xvZ2dpbmcnO1xyXG5pbXBvcnQgeyBEb20gfSBmcm9tICdAbWljcm9zb2Z0L3dpbmRvd3MtYWRtaW4tY2VudGVyLXNkay9jb3JlL2RvbS9kb20nO1xyXG5pbXBvcnQgeyBTbWVTY2hlbWFQcm9wZXJ0eSB9IGZyb20gJy4uLy4uLy4uL3NjaGVtYS9zY2hlbWEtZGVjb3JhdG9yJztcclxuaW1wb3J0IHsgU2ltcGxlUHJvcGVydHlTY2hlbWFGaWVsZExvYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL3NjaGVtYS9zY2hlbWEtZmllbGQtaG9zdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTY2hlbWFQcmltaXRpdmVUeXBlIH0gZnJvbSAnLi4vLi4vLi4vc2NoZW1hL3NjaGVtYS1tb2RlbHMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0aW9uQWxlcnRzLCBWYWxpZGF0aW9uQWxlcnRTZXZlcml0eSB9IGZyb20gJy4uLy4uL3ZhbGlkYXRpb24tYWxlcnQvdmFsaWRhdGlvbi1hbGVydCc7XHJcbmltcG9ydCB7IFNtZUludGVybmFsRm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBXZWJraXRGaWxlU3lzdGVtIH0gZnJvbSAnLi93ZWJraXRGaWxlU3lzdGVtJztcclxuXHJcbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICB0ZW1wbGF0ZTogYFxyXG4gICAgPHNtZS1mb3JtLWZpZWxkICNmaWVsZCB0eXBlPVwiZmlsZVwiIFsobmdNb2RlbCldPVwiZGF0YVwiIFtuYW1lXT1cInByb3BlcnR5U2NoZW1hLm5hbWVcIiBbbGFiZWxdPVwibG9jYWxpemUocHJvcGVydHlTY2hlbWEubGFiZWwpXCJcclxuICAgICAgICBbZGVzY3JpcHRpb25dPVwibG9jYWxpemUocHJvcGVydHlTY2hlbWEuZGVzY3JpcHRpb24pXCIgW3JlcXVpcmVkXT1cInByb3BlcnR5U2NoZW1hLnJlcXVpcmVkXCJcclxuICAgICAgICBbcmVhZG9ubHldPVwiISFldmFsRXhwcmVzc2lvbihwcm9wZXJ0eVNjaGVtYS5yZWFkb25seUNvbmRpdGlvbilcIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhIShwcm9wZXJ0eVNjaGVtYS5kaXNhYmxlZENvbmRpdGlvbiAmJiBldmFsRXhwcmVzc2lvbihwcm9wZXJ0eVNjaGVtYS5kaXNhYmxlZENvbmRpdGlvbikpXCJcclxuICAgICAgICBbbXVsdGlwbGVdPVwicHJvcGVydHlTY2hlbWEub3B0aW9ucy5tdWx0aXBsZVwiIFtmaWxlVHlwZXNdPVwicHJvcGVydHlTY2hlbWEub3B0aW9ucy5maWxlVHlwZXNcIlxyXG4gICAgICAgIChjdXN0b21WYWxpZGF0ZSk9XCJyZXNvbHZlRnVuY3Rpb24ocHJvcGVydHlTY2hlbWEuY3VzdG9tVmFsaWRhdGlvbikoJGV2ZW50KVwiXHJcbiAgICAgICAgKGN1c3RvbUFzeW5jVmFsaWRhdGUpPVwicHJvcGVydHlTY2hlbWEuY3VzdG9tQXN5bmNWYWxpZGF0aW9uICYmIHJlc29sdmVGdW5jdGlvbihwcm9wZXJ0eVNjaGVtYS5jdXN0b21Bc3luY1ZhbGlkYXRpb24uaGFuZGxlcikoJGV2ZW50KVwiXHJcbiAgICAgICAgW3BlbmRpbmdNZXNzYWdlXT1cInByb3BlcnR5U2NoZW1hLmN1c3RvbUFzeW5jVmFsaWRhdGlvbiAmJiBsb2NhbGl6ZShwcm9wZXJ0eVNjaGVtYS5jdXN0b21Bc3luY1ZhbGlkYXRpb24ucGVuZGluZ01lc3NhZ2UpXCJcclxuICAgICAgICBbY3VzdG9tQXN5bmNWYWxpZGF0ZURpc2FibGVkXT1cInNob3VsZEN1c3RvbUFzeW5jVmFsaWRhdGlvbkJlRGlzYWJsZWQoKVwiXHJcbiAgICAgICAgW2N1c3RvbUFzeW5jVmFsaWRhdGVEZWJvdW5jZVRpbWVdPVwicHJvcGVydHlTY2hlbWEuY3VzdG9tQXN5bmNWYWxpZGF0aW9uICYmICtwcm9wZXJ0eVNjaGVtYS5jdXN0b21Bc3luY1ZhbGlkYXRpb24uaGFuZGxlclwiXHJcbiAgICAgICAgPjwvc21lLWZvcm0tZmllbGQ+XHJcbiAgICBgXHJcbn0pXHJcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xyXG5leHBvcnQgY2xhc3MgRmlsZUZvcm1GaWVsZExvYWRlckNvbXBvbmVudCBleHRlbmRzIFNpbXBsZVByb3BlcnR5U2NoZW1hRmllbGRMb2FkZXJDb21wb25lbnQge1xyXG59XHJcblxyXG4vKipcclxuICogQWNjZXNzaWJsZSBmaWxlIGZpZWxkIGltcGxlbWVudGF0aW9uXHJcbiAqL1xyXG5AU21lU2NoZW1hUHJvcGVydHkoe1xyXG4gICAgdHlwZTogU2NoZW1hUHJpbWl0aXZlVHlwZS5GaWxlLFxyXG4gICAgZm9ybWF0OiAnZGVmYXVsdCcsXHJcbiAgICBpc0RlZmF1bHRGb3JtYXQ6IHRydWUsXHJcbiAgICBkZXNjcmlwdGlvbjogJ0EgZmlsZSB1cGxvYWQgY29udHJvbCBiaW5kaW5nIHRvIGZpbGUgZGF0YS4nLFxyXG4gICAgbG9hZGVyQ29tcG9uZW50OiBGaWxlRm9ybUZpZWxkTG9hZGVyQ29tcG9uZW50XHJcbn0pXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtZm9ybS1maWVsZFt0eXBlPVwiZmlsZVwiXScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRmlsZUZvcm1GaWVsZENvbXBvbmVudCBleHRlbmRzIFNtZUludGVybmFsRm9ybUZpZWxkQ29tcG9uZW50PEZpbGUgfCBGaWxlW10+IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnRmlsZUZvcm1GaWVsZENvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZmlsZSBpbnB1dCBwYXJ0IG9mIHRoaXMgY29udHJvbFxyXG4gICAgICovXHJcbiAgICBAVmlld0NoaWxkKCdmaWxlJylcclxuICAgIHB1YmxpYyBmaWxlSW5wdXQ6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgdGhhdCBtdWx0aXBsZSBmaWxlcyBhcmUgYWxsb3dlZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIG11bHRpcGxlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHRoZSB0eXBlIG9mIGZpbGVzIHRoYXQgYXJlIGFsbG93ZWRcclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBmaWxlVHlwZXM6IHN0cmluZ1tdO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGxhYmVsIHRvIHVzZSBvbiB0aGUgc2VsZWN0IGJ1dHRvblxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGJ1dHRvbkxhYmVsOiBzdHJpbmc7XHJcblxyXG4gICAgcHJpdmF0ZSBhY3RpdmVEcm9wcGVkRmlsZVN5c3RlbTogV2Via2l0RmlsZVN5c3RlbTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBhcmlhIGxhYmVsIGZvciB0aGlzIGluc3RhbmNlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXJpYUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TWVyZ2VkRGVzY3JpcHRpb25MYWJlbCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogZ2V0cyB0aGUgZmlsZSBjb3VudCBsYWJlbFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGZpbGVDb3VudExhYmVsKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmhhc0ZpbGVzXHJcbiAgICAgICAgICAgID8gdGhpcy5oYXNNdWx0aXBsZUZpbGVzXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Gb3JtLkZpbGUuc2VsZWN0ZWRGaWxlc0Zvcm1hdC5wbHVyYWwuZm9ybWF0KHRoaXMuZmlsZXMubGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5GaWxlLnNlbGVjdGVkRmlsZXNGb3JtYXQuc2luZ3VsYXJcclxuICAgICAgICAgICAgOiB0aGlzLm11bHRpcGxlXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Gb3JtLkZpbGUuc2VsZWN0ZWRGaWxlc0Zvcm1hdC5tdWx0aXBsZUVuYWJsZWQubm9uZVxyXG4gICAgICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5GaWxlLnNlbGVjdGVkRmlsZXNGb3JtYXQubm9uZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIGdldHMgYXJpYS1sYWJlbCB0ZXh0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgYXJpYUxhYmVsVGV4dCgpIHtcclxuICAgICAgICBsZXQgbGFiZWxUZXh0ID0gdGhpcy5idXR0b25MYWJlbCB8fCAodGhpcy5tdWx0aXBsZVxyXG4gICAgICAgICAgICA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Gb3JtLkZpbGUuYnV0dG9uVGV4dC5wbHVyYWxcclxuICAgICAgICAgICAgOiB0aGlzLnN0cmluZ3MuTXNmdFNtZVNoZWxsLkFuZ3VsYXIuRm9ybS5GaWxlLmJ1dHRvblRleHQuc2luZ3VsYXIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5yZXF1aXJlZCkge1xyXG4gICAgICAgICAgICAvLyBBcHBlbmQgdGhlIGFubm91bmNlZCBsYWJlbCB3aXRoIFwiUmVxdWlyZWRcIiBpZiB0aGUgZmllbGQgaXMgbWFya2VkIGFzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkTGFiZWwgPSAgdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNvbW1vbi5Gb3JtLlZhbGlkYXRpb24uUmVxdWlyZWQubGFiZWw7XHJcbiAgICAgICAgICAgIGxhYmVsVGV4dCA9IGxhYmVsVGV4dC5jb25jYXQocmVxdWlyZWRMYWJlbCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5oYXNGaWxlc1xyXG4gICAgICAgICAgICA/IHRoaXMuc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Gb3JtLkZpbGUuc2VsZWN0ZWRGaWxlc0Zvcm1hdC5wbHVyYWwuZm9ybWF0KHRoaXMuZmlsZXMubGVuZ3RoKS5jb25jYXQobGFiZWxUZXh0KVxyXG4gICAgICAgICAgICA6IGxhYmVsVGV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgYW55IGZpbGVzIHNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgZmlsZXMoKTogRmlsZVtdIHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/IHRoaXMudmFsdWUgOiAhIXRoaXMudmFsdWUgPyBbdGhpcy52YWx1ZV0gOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgYW55IGZpbGVzIHNlbGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXQgaGFzRmlsZXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMCA6ICEhdGhpcy52YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZmlsZXMgc2VsZWN0ZWRcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgaGFzTXVsdGlwbGVGaWxlcygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5oYXNGaWxlcyAmJiBBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyBpZiB0aGVyZSBhcmUgYW55IGZpbGUgdHlwZSByZXN0cmljdGlvbnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldCBoYXNGaWxlVHlwZXMoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICEhdGhpcy5maWxlVHlwZXMgJiYgdGhpcy5maWxlVHlwZXMubGVuZ3RoID4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgYSBmb3JtYXR0ZWQgYWNjZXB0IHByb3BlcnR5IGZvciBvdXIgZmlsZSBpbnB1dFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0IGFjY2VwdGVkRmlsZVR5cGVzKCk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZVR5cGVzID8gdGhpcy5maWxlVHlwZXMuam9pbignLCAnKSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXQgZGlyZWN0b3J5VXBsb2FkU3VwcG9ydGVkKCkge1xyXG4gICAgICAgIHJldHVybiAhIURhdGFUcmFuc2Zlckl0ZW0ucHJvdG90eXBlLndlYmtpdEdldEFzRW50cnk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRmlsZUZvcm1GaWVsZENvbXBvbmVudFxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3JcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkZvcm0uRmlsZS5wbGFjZWhvbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIucmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9jY3VycyB3aGVuIHRoZSBmaWxlIGlucHV0IGhhcyBjaGFuZ2VkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkZpbGVDaGFuZ2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUoTXNmdFNtZS5nZXRWYWx1ZSh0aGlzLmZpbGVJbnB1dCwgJ25hdGl2ZUVsZW1lbnQuZmlsZXMnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPY2N1cnMgd2hlbiB0aGUgdGhlcmUgaXMgYSBkcm9wIG9udG8gdGhpcyBjb250cm9sXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRyb3AoZGF0YTogRGF0YVRyYW5zZmVyKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgZHJvcHBlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIGZpbGUsIHRoZW4ganVzdCB1cGRhdGUgdmFsdWUgdG8gYW4gZW1wdHkgbGlzdFxyXG4gICAgICAgIGlmIChkYXRhLmZpbGVzLmxlbmd0aCA9PT0gMCB8fCBkYXRhLml0ZW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKFtdKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmRpcmVjdG9yeVVwbG9hZFN1cHBvcnRlZCkge1xyXG4gICAgICAgICAgICAvLyBJZiB3ZWJraXQgaXMgbm90IHN1cHBvcnRlZCwgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGRldGVjdCBmb2xkZXJzIGJlaW5nIGRyb3BwZWQgd2l0aG91dCBleGNsdWRpbmcgc29tZSBmaWxlIHR5cGVzLlxyXG4gICAgICAgICAgICAvLyBib3RoIEVkZ2UgYW5kIENocm9tZSBmdWxseSBzdXBwb3J0IHRoaXMgYXBpLiBTbyB3ZSBzaG91bGQgYmUgZ29vZCBhcyBmYXIgYSBvdXIgc3VwcG9ydGVkIGJyb3dzZXIgbWF0cml4IGlzIGNvbmNlcm5lZC5cclxuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShkYXRhLmZpbGVzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZpbGVTeXN0ZW0gPSBuZXcgV2Via2l0RmlsZVN5c3RlbShkYXRhLml0ZW1zKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZURyb3BwZWRGaWxlU3lzdGVtID0gZmlsZVN5c3RlbTtcclxuICAgICAgICBmaWxlU3lzdGVtLmdldEZpbGVMaXN0KCkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogZmlsZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlRHJvcHBlZEZpbGVTeXN0ZW0gPT09IGZpbGVTeXN0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKGZpbGVzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6IGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgIExvZ2dpbmcubG9nRXJyb3IodGhpcy5sb2dTb3VyY2VOYW1lLCAnQW4gRXJyb3Igb2NjdXJyZWQgcmVzb2x2aW5nIGRyb3BwZWQgZmlsZXMnLCB7IGVycm9yOiBlcnJvciB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgY29udHJvbHMgdmFsdWUgdG8gcmVmbGVjdCBkcm9wcGVkIG9yIGJyb3dzZWQgZmlsZXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVWYWx1ZShmaWxlczogRmlsZUxpc3QgfCBGaWxlW10pIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZURyb3BwZWRGaWxlU3lzdGVtID0gbnVsbDtcclxuICAgICAgICBpZiAoTXNmdFNtZS5pc051bGxPclVuZGVmaW5lZChmaWxlcykpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubXVsdGlwbGUgPyBbXSA6IG51bGw7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbGVBcnJheTogRmlsZVtdID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGZpbGVBcnJheS5wdXNoKGZpbGVzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gZmlsZUFycmF5O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBmaWxlc1swXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5uZ01vZGVsLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlcyBhbiBpdGVtIGF0IHRoZSBnaXZlbiBpbmRleFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVtb3ZlSXRlbUF0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZV07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBmaXJzdEZvY3VzYWJsZSA9IERvbS5nZXRGaXJzdEZvY3VzYWJsZURlc2NlbmRlbnQodGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgICBpZiAoZmlyc3RGb2N1c2FibGUpIHtcclxuICAgICAgICAgICAgZmlyc3RGb2N1c2FibGUuZm9jdXMoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIHRoZSBpZEJhZyB1c2VkIGJ5IHRoaXMgY29tcG9uZW50IHRvIHN0b3JlIHVuaXF1ZSBlbGVtZW50IGlkcy5cclxuICAgICAqIGlkIHZhbHVlcyB3aWxsIGJlIGFzc2lnbmVkIGJlIHRoZSBAc2VlIEJhc2VDb21wb25lbnQgc3VwZXIgY2xhc3MuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBjcmVhdGVJZEJhZygpOiBNc2Z0U21lLlN0cmluZ01hcDxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBkZXRhaWxzU3Bhbj