Blame view

esm2015/lib/modal-attachment-view/modal-attachment-view.component.js 55.8 KB
75f29219   Anan Sangthongtum   first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { ModalDirective } from 'ngx-bootstrap';
import { AppConfigService } from '../app-config/app-config.service';
import { Request } from '../_services/request.service';
import { Common } from '../_services/common.service';
import { FormBuilder, Validators } from '@angular/forms';
import { CustomValidators } from 'ng2-validation';
import { UploadAttachmentComponent } from '../upload-attachment/upload-attachment.component';
import * as _ from 'lodash';
class Options {
}
if (false) {
    /**
     * title ที่ต้องการแสดง
     * @type {?}
     */
    Options.prototype.title;
    /**
     * data
     * @type {?}
     */
    Options.prototype.data;
    /** @type {?} */
    Options.prototype.mode;
    /** @type {?} */
    Options.prototype.downloadToken;
    /**
     * name ที่ต้องการแสดง
     * @type {?}
     */
    Options.prototype.config;
}
export class ModalAttachmentViewComponent extends Options {
    /**
     * @param {?} appConfigService
     * @param {?} request
     * @param {?} formBuilder
     * @param {?} common
     */
    constructor(appConfigService, request, formBuilder, common) {
        super();
        this.appConfigService = appConfigService;
        this.request = request;
        this.formBuilder = formBuilder;
        this.common = common;
        this.isImage = false;
        this.onModalCreateSubmit = new EventEmitter();
        this.onModalEditSubmit = new EventEmitter();
        this.submitted = false;
        this.title = '';
        this.selectList = [];
        this.modalConfig = {
            ignoreBackdropClick: true
        };
        this.isMore = false;
        this.attachmentData = {
            doc_type: null
        };
        this.tmpData = {};
        this.filteredDepartments = [];
        this.departmentList = [];
        this.disabledForm = false;
        this.isOpen = false;
        this.config = appConfigService.getConfig();
        this.attachmentUrl = _.get(this.config, 'apiServers.alfresco.url') || "https://203.154.32.126:2585/api/mfec/Alfresco";
    }
    /**
     * @return {?}
     */
    ngOnInit() {
        this.th = this.common.fnLocalPCalendar('th');
        this.registerForm = this.formBuilder.group({
            name: [{ value: '', disabled: this.disabledForm }],
            doc_type: [{ value: '', disabled: this.disabledForm }],
            url: [{ value: '', disabled: this.disabledForm }],
            is_classifieds: [{ value: '', disabled: this.disabledForm }],
            is_image: [{ value: '', disabled: this.disabledForm }],
            keyword: [{ value: '', disabled: this.disabledForm }],
            book_no: [{ value: '', disabled: this.disabledForm }],
            amount: [{ value: '', disabled: this.disabledForm }],
            record_date: [{ value: '', disabled: this.disabledForm }],
            version: [{ value: '', disabled: this.disabledForm }],
            resolution: [{ value: '', disabled: this.disabledForm }],
            remark: [{ value: '', disabled: this.disabledForm }],
            moreField: this.formBuilder.array([])
        });
    }
    /**
     * @param {?=} options
     * @return {?}
     */
    open(options) {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            console.log(options);
            this.attachmentData = {};
            if (options) {
                this.mode = options.mode;
                this.title = options.title || '';
                this.downloadToken = options.downloadToken;
                this.attachmentData = _.cloneDeep(options.data);
                if (!this.attachmentData.doc_type) {
                    this.attachmentData.doc_type = null;
                }
                // ต้องเปลี่ยนเป็นเรียก api
                this.selectList = yield this.request.getDropDown(options.data.system_id, "ประเภทเอกสาร");
            }
            if (this.mode !== 'VIEW') {
                this.uploadAttachment.clearValue();
                this.disabledForm = false;
            }
            else {
                this.disabledForm = true;
            }
            this.modal.show();
            this.isOpen = true;
        });
    }
    /**
     * @return {?}
     */
    f() {
        return this.registerForm.controls;
    }
    /**
     * @return {?}
     */
    closeModal() {
        this.submitted = false;
        this.selectList = [];
        this.isMore = false;
        this.moreField = [];
        this.attachmentData = {};
        this.modal.hide();
        this.isOpen = false;
    }
    /**
     * @param {?} modal
     * @return {?}
     */
    onYesClick(modal) {
        modal.hide();
    }
    /**
     * @param {?} modal
     * @return {?}
     */
    onNoClick(modal) {
        modal.hide();
    }
    /**
     * @param {?} $event
     * @return {?}
     */
    onHidden($event) {
        console.log('LOG MESSAGE: ModalConfirm -> onHidden -> $event', $event);
    }
    /**
     * @return {?}
     */
    checkExtraField() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            this.moreField = [];
            if (this.attachmentData.system_id) {
                // this.addField(newField, +requireFlag);
                // this.moreField.push(newField);
                this.isMore = true;
            }
            else {
                this.isMore = false;
            }
        });
    }
    /**
     * @param {?} e
     * @return {?}
     */
    onCellPrepared(e) {
        if (e.rowType === 'data') {
            for (const i in e.component.columns) {
                if (e.column.dataField === e.component.columns[i]) {
                    e.cellElement.accessKey = e.component.columns[i];
                }
            }
        }
    }
    /**
     * @param {?} data
     * @param {?} required
     * @return {?}
     */
    addField(data, required) {
        /** @type {?} */
        const control = /** @type {?} */ (this.registerForm.controls['moreField']);
        /** @type {?} */
        let newgroup;
        if (data.type === 'text') {
            if (required) {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [{ value: '', disabled: this.disabledForm }];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [{ value: '', disabled: this.disabledForm }];
                newgroup = this.formBuilder.group(group);
            }
        }
        else if (data.type === 'datetime') {
            if (required) {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [Validators.required, CustomValidators.date];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [{ value: '', disabled: this.disabledForm }];
                newgroup = this.formBuilder.group(group);
            }
        }
        else if (data.type === 'special') {
            if (required) {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [{ value: '', disabled: this.disabledForm }];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                const group = {};
                group[data.field_name] = [{ value: '', disabled: this.disabledForm }];
                newgroup = this.formBuilder.group(group);
            }
            if (data.field_name === 'amount') {
                /** @type {?} */
                const group = {};
                group['amount_type'] = [{ value: '', disabled: this.disabledForm }];
                control.push(this.formBuilder.group(group));
            }
        }
        control.push(newgroup);
    }
    /**
     * @param {?} i
     * @param {?} field
     * @param {?=} validateType
     * @return {?}
     */
    getValidateMoreField(i, field, validateType) {
        /** @type {?} */
        let formMoreField = this.f['moreField'];
        if (validateType) {
            formMoreField = formMoreField.controls[i];
            formMoreField = formMoreField.controls[field];
            if (formMoreField.errors) {
                return formMoreField.errors[validateType];
            }
            else {
                return formMoreField.errors;
            }
        }
        else {
            return formMoreField.errors;
        }
    }
    /**
     * @param {?} data
     * @return {?}
     */
    getRowIndex(data) {
        if (!data.data) {
            return '';
        }
        /** @type {?} */
        const no = data.row.dataIndex + 1;
        return no;
    }
    /**
     * @return {?}
     */
    onSubmit() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            this.submitted = true;
            // ถ้า form ไม่ครบหรือผิดตามเงื่อนไขที่ตั้งไว้จะจบที่ตรงนี้
            if (this.registerForm.invalid) {
                return;
            }
            // let postData = [];
            // await this.request.post("/db/rc_attachment",this.attachmentData);
            if (this.mode === 'CREATE') {
                this.onModalCreateSubmit.emit(this.attachmentData);
            }
            else {
                this.onModalEditSubmit.emit(this.attachmentData);
            }
            this.closeModal();
            ;
            this.isOpen = false;
        });
    }
    /**
     * @param {?} data
     * @return {?}
     */
    onUploaded(data) {
        console.log("data", data);
        this.attachmentData.url = this.attachmentUrl + '/' + data.uuid;
        this.attachmentData.uuid = data.uuid;
        this.attachmentData.filename = data.fileName;
    }
    /**
     * @return {?}
     */
    clickUrl() {
        return tslib_1.__awaiter(this, void 0, void 0, function* () {
            window.open(yield this.request.getAttachmentLinkToken(this.attachmentData.url));
        });
    }
    /**
     * @param {?} data
     * @return {?}
     */
    getImageLink(data) {
        return data.url + "?downloadToken=" + this.downloadToken;
    }
}
ModalAttachmentViewComponent.decorators = [
    { type: Component, args: [{
                selector: 'modal-attachment-view',
                template: "<div class=\"modal fade\" bsModal #modal=\"bs-modal\" [config]=\"{backdrop: 'static'}\"\n     tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"dialog-static-name1\">\n    <div class=\"modal-dialog modal-lg\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h4 id=\"dialog-static-name\" class=\"modal-title pull-left\">{{title}}</h4>\n                <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"closeModal()\">\n                    <span aria-hidden=\"true\">&times;</span>\n                </button>\n            </div>\n            <div class=\"modal-body\">\n                <div class=\"row\">\n                    <div class=\"col-lg-12\">\n                        <!--<form *ngIf=\"isOpen\" class=\"m-form m-form&#45;&#45;state m-form&#45;&#45;fit m-form&#45;&#45;label-align-right\" [formGroup]=\"registerForm\" (ngSubmit)=\"onSubmit()\">-->\n                            <div class=\"m-portlet__body\">\n                                <!-- \u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A -->\n                                <div *ngIf=\"attachmentData.system_id !== 17\">\n                                    <div class=\"row\">\n                                        <!--<div class=\"col-sm-2\">-->\n                                            <!--<span>\u0E0A\u0E37\u0E48\u0E2D\u0E40\u0E23\u0E37\u0E48\u0E2D\u0E07 :</span>-->\n                                        <!--</div>-->\n                                        <div class=\"col-sm-12\">\n                                            <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().name.errors }\">-->\n                                                <label class=\"control-label\">\u0E0A\u0E37\u0E48\u0E2D\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23</label>\n                                                <!--<input type=\"text\" class=\"form-control m-input\" id=\"txtCategoryName\" disabled>-->\n                                                <input type=\"text\" class=\"form-control m-input\" id=\"txtCategoryName\" [(ngModel)]=\"attachmentData.name\" disabled>\n                                                <!--<div *ngIf=\"submitted && f().name.errors\" class=\"invalid-feedback\">-->\n                                                    <!--<div *ngIf=\"f().name.errors.required\">First Name is required</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"row\">\n                                    <!--<div class=\"col-sm-2\">-->\n                                        <!--<span>\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23 :</span>-->\n                                    <!--</div>-->\n                                    <div class=\"col-sm-12\">\n                                        <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().doc_type.errors }\">-->\n                                            <label class=\"control-label\">\u0E1B\u0E23\u0E30\u0E40\u0E20\u0E17\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23</label>\n                                            <select id=\"selNewStatus\" style=\"width: 100%\" [(ngModel)]=\"attachmentData.doc_type\" disabled>\n                                                <option value=\"null\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23</option>\n                                                <option *ngFor=\"let data of selectList\" [ngValue]=\"data.name\">{{data.name}}</option>\n                                            </select>\n                                            <!--<div *ngIf=\"submitted && f().doc_type.errors\" class=\"invalid-feedback\">-->\n                                                <!--<div *ngIf=\"f().doc_type.errors.required\">First Name is required</div>-->\n                                            <!--</div>-->\n                                        <!--</div>-->\n                                    </div>\n                                </div>\n                                <div *ngIf=\"attachmentData.system_id !== 17 && attachmentData.system_id !== 11\">\n                                    <div class=\"row\">\n                                        <div class=\"col-sm-12\">\n                                            <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().remark.errors }\">-->\n                                            <label class=\"control-label\">\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38</label>\n                                                <!--<input type=\"text\" class=\"form-control m-input\" id=\"txtRemark\" formControlName=\"remark\" [(ngModel)]=\"attachmentData.remark\" [disabled]=\"disabledForm\">-->\n                                            <input type=\"text\" class=\"form-control m-input\" id=\"txtRemark\" [(ngModel)]=\"attachmentData.remark\" disabled>\n                                                <!--<div *ngIf=\"submitted && f().remark.errors\" class=\"invalid-feedback\">-->\n                                                    <!--<div *ngIf=\"f().remark.errors.required\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01 \u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        </div>\n                                    </div>\n                                </div>\n                                <div class=\"row\">\n                                    <!--<div class=\"col-sm-2\">-->\n                                        <!--<span>\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A :</span>-->\n                                    <!--</div>-->\n                                    <div class=\"col-sm-12\">\n                                        <!--<label class=\"control-label\">\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A</label>-->\n                                        <!--<upload-attachment #uploadAttachment [systemId]=\"attachmentData.system_id\" (uploaded)=\"onUploaded($event)\" [onlyImage]=\"isImage\"></upload-attachment>-->\n                                    <!--</div>-->\n                                    <!--<div *ngIf=\"mode === 'VIEW'\" class=\"col-sm-12\">-->\n                                        <label *ngIf=\"!isImage\" class=\"control-label\">\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A</label>\n                                        <label *ngIf=\"isImage\" class=\"control-label\">\u0E40\u0E04\u0E23\u0E37\u0E48\u0E2D\u0E07\u0E2B\u0E21\u0E32\u0E22</label>\n                                        <br>\n                                        <a *ngIf=\"!isImage\" [href]=\"getImageLink(attachmentData)\" target=\"_blank\">{{attachmentData.url}}</a>\n                                        <img *ngIf=\"isImage\" [src]=\"getImageLink(attachmentData)\" style=\"width: auto !important; text-align: center\">\n                                    </div>\n                                </div>\n                                <br>\n                                <div *ngIf=\"attachmentData.system_id === 11\">\n                                    <div class=\"row\">\n                                        <!--<div class=\"col-sm-2\">-->\n                                            <!--<span>\u0E08\u0E31\u0E14\u0E40\u0E02\u0E49\u0E32\u0E27\u0E32\u0E23\u0E30 :</span>-->\n                                        <!--</div>-->\n                                        <div class=\"col-sm-12\">\n                                            <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().is_classifieds.errors }\">-->\n                                                <!--<label class=\"control-label\"></label>-->\n                                                <!--<label class=\"control-label\"></label>-->\n                                                <input type=\"checkbox\" class=\"form-control m-input\" id=\"chxIsClassifieds\" [(ngModel)]=\"attachmentData.is_classifieds\" disabled> \u0E08\u0E31\u0E14\u0E40\u0E02\u0E49\u0E32\u0E27\u0E32\u0E23\u0E30\n                                                <!--<input type=\"text\" class=\"form-control m-input\" id=\"txtCategoryName\" formControlName=\"name\" [(ngModel)]=\"attachmentData.is_classifieds\">-->\n                                                <!--<div *ngIf=\"submitted && f().is_classifieds.errors\" class=\"invalid-feedback\">-->\n                                                    <!--<div *ngIf=\"f().is_classifieds.errors.required\">First Name is required</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        </div>\n                                    </div>\n                                </div>\n                                <div *ngIf=\"attachmentData.system_id === 11\">\n                                    <div class=\"row\">\n                                        <!--<div class=\"col-sm-2\">-->\n                                            <!--<span>\u0E41\u0E1B\u0E25\u0E07\u0E40\u0E1B\u0E47\u0E19\u0E20\u0E32\u0E1E\u0E41\u0E25\u0E49\u0E27 :</span>-->\n                                        <!--</div>-->\n                                        <div class=\"col-sm-12\">\n                                            <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().is_image.errors }\">-->\n                                                <!--<label class=\"control-label\">\u0E41\u0E1B\u0E25\u0E07\u0E40\u0E1B\u0E47\u0E19\u0E20\u0E32\u0E1E\u0E41\u0E25\u0E49\u0E27</label>-->\n                                                <!--<label class=\"control-label\"></label>-->\n                                                <input type=\"checkbox\" class=\"form-control m-input\" id=\"chxIsImage\" [(ngModel)]=\"attachmentData.is_image\" disabled> \u0E41\u0E1B\u0E25\u0E07\u0E40\u0E1B\u0E47\u0E19\u0E20\u0E32\u0E1E\u0E41\u0E25\u0E49\u0E27\n                                                <!--<input type=\"text\" class=\"form-control m-input\" id=\"txtCategoryName\" formControlName=\"name\" [(ngModel)]=\"attachmentData.is_classifieds\">-->\n                                                <!--<div *ngIf=\"submitted && f().is_classifieds.errors\" class=\"invalid-feedback\">-->\n                                                <!--<div *ngIf=\"f().is_classifieds.errors.required\">First Name is required</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        </div>\n                                    </div>\n                                </div>\n                                <div *ngIf=\"attachmentData.system_id === 11\">\n                                    <div class=\"row\">\n                                        <!--<div class=\"col-sm-2\">-->\n                                            <!--<span>\u0E04\u0E33\u0E2A\u0E33\u0E04\u0E31\u0E0D :</span>-->\n                                        <!--</div>-->\n                                        <div class=\"col-sm-12\">\n                                            <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().keyword.errors }\">-->\n                                                <label class=\"control-label\">\u0E04\u0E33\u0E2A\u0E33\u0E04\u0E31\u0E0D</label>\n                                                <!--<label class=\"control-label\"></label>-->\n                                                <input type=\"text\" class=\"form-control m-input\" id=\"txtKeyword\" [(ngModel)]=\"attachmentData.keyword\" disabled>\n                                                <!--<input type=\"text\" class=\"form-control m-input\" id=\"txtCategoryName\" formControlName=\"name\" [(ngModel)]=\"attachmentData.is_classifieds\">-->\n                                                <!--<div *ngIf=\"submitted && f().keyword.errors\" class=\"invalid-feedback\">-->\n                                                    <!--<div *ngIf=\"f().keyword.errors.required\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01 \u0E04\u0E33\u0E2A\u0E33\u0E04\u0E31\u0E0D</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        </div>\n                                    </div>\n                                </div>\n                                <div *ngIf=\"attachmentData.system_id === 17\">\n                                    <div class=\"row\">\n                                        <!--<div class=\"col-sm-2\">-->\n                                            <!--<span>\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23 :</span>-->\n                                        <!--</div>-->\n                                        <div class=\"col-sm-12\">\n                                            <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().book_no.errors }\">-->\n                                                <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23</label>\n                                                <!--<label class=\"control-label\"></label>-->\n                                                <input type=\"text\" class=\"form-control m-input\" id=\"txtBookNo\"[(ngModel)]=\"attachmentData.book_no\" disabled>\n                                                <!--<input type=\"text\" class=\"form-control m-input\" id=\"txtCategoryName\" formControlName=\"name\" [(ngModel)]=\"attachmentData.is_classifieds\">-->\n                                                <!--<div *ngIf=\"submitted && f().book_no.errors\" class=\"invalid-feedback\">-->\n                                                    <!--<div *ngIf=\"f().book_no.errors.required\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01 \u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        </div>\n                                    </div>\n                                </div>\n                                <!--<div *ngIf=\"attachmentData.system_id === 17\">-->\n                                    <!--<div class=\"row\">-->\n                                        <!--<div class=\"col-sm-2\">-->\n                                            <!--<span>\u0E08\u0E33\u0E19\u0E27\u0E19 :</span>-->\n                                        <!--</div>-->\n                                        <!--<div class=\"col-sm-10\">-->\n                                            <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().amount.errors }\">-->\n                                                <!--&lt;!&ndash;<label class=\"control-label\"></label>&ndash;&gt;-->\n                                                <!--<input type=\"number\" class=\"form-control m-input\" id=\"txtAmount\" name=\"amount\" formControlName=\"amount\" [(ngModel)]=\"attachmentData.amount\">-->\n                                                <!--&lt;!&ndash;<input type=\"text\" class=\"form-control m-input\" id=\"txtCategoryName\" formControlName=\"name\" [(ngModel)]=\"attachmentData.is_classifieds\">&ndash;&gt;-->\n                                                <!--<div *ngIf=\"submitted && f().amount.errors\" class=\"invalid-feedback\">-->\n                                                    <!--<div *ngIf=\"f().amount.errors.required\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01 \u0E08\u0E33\u0E19\u0E27\u0E19</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        <!--</div>-->\n                                    <!--</div>-->\n                                <!--</div>-->\n                                <div *ngIf=\"attachmentData.system_id === 17\">\n                                    <div class=\"row\">\n                                        <!--<div class=\"col-sm-2\">-->\n                                            <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E08\u0E31\u0E14\u0E40\u0E01\u0E47\u0E1A :</span>-->\n                                        <!--</div>-->\n                                        <div class=\"col-sm-12\">\n                                            <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().record_date.errors }\">-->\n                                                <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E08\u0E31\u0E14\u0E40\u0E01\u0E47\u0E1A</label>\n                                                <soc-date-box [id]=\"'txtDate'\" [(value)]=\"attachmentData.record_date\" [disabled]=\"true\"></soc-date-box>\n                                                <!--<div *ngIf=\"submitted && f().record_date.errors\" >-->\n                                                    <!--<div *ngIf=\"f().record_date.errors.required\" class=\"lable-error\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01 \u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E08\u0E31\u0E14\u0E40\u0E01\u0E47\u0E1A</div>-->\n                                                    <!--<div *ngIf=\"f().record_date.errors.date\" class=\"lable-error\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01 \u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E08\u0E31\u0E14\u0E40\u0E01\u0E47\u0E1A \u0E43\u0E2B\u0E49\u0E16\u0E39\u0E01\u0E15\u0E49\u0E2D\u0E07</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        </div>\n                                    </div>\n                                </div>\n                                <!--<div *ngIf=\"attachmentData.system_id === 17\">-->\n                                    <!--<div class=\"row\">-->\n                                        <!--<div class=\"col-sm-2\">-->\n                                            <!--<span>\u0E40\u0E27\u0E2D\u0E23\u0E4C\u0E0A\u0E31\u0E48\u0E19/\u0E40\u0E25\u0E02\u0E23\u0E38\u0E48\u0E19 :</span>-->\n                                        <!--</div>-->\n                                        <!--<div class=\"col-sm-10\">-->\n                                            <!--<div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().version.errors }\">-->\n                                                <!--<input type=\"text\" class=\"form-control m-input\" id=\"txtVersion\"  name=\"version\" formControlName=\"version\" [(ngModel)]=\"attachmentData.version\">-->\n                                                <!--<div *ngIf=\"submitted && f().version.errors\" class=\"invalid-feedback\">-->\n                                                    <!--<div *ngIf=\"f().version.errors.required\">\u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01 \u0E40\u0E27\u0E2D\u0E23\u0E4C\u0E0A\u0E31\u0E48\u0E19/\u0E40\u0E25\u0E02\u0E23\u0E38\u0E48\u0E19</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        <!--</div>-->\n                                    <!--</div>-->\n                                <!--</div>-->\n                            </div>\n                            <div class=\"m-portlet__foot m-portlet__foot--fit text-right\">\n                                <div class=\"m-form__actions\">\n                                    <!--<button *ngIf=\"mode !== 'VIEW'\" type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">-->\n                                        <!--\u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01-->\n                                    <!--</button>-->\n                                    <button type=\"button\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"closeModal()\">\n                                        \u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\n                                    </button>\n                                </div>\n                            </div>\n                        <!--</form>-->\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>"
            }] }
];
/** @nocollapse */
ModalAttachmentViewComponent.ctorParameters = () => [
    { type: AppConfigService },
    { type: Request },
    { type: FormBuilder },
    { type: Common }
];
ModalAttachmentViewComponent.propDecorators = {
    isImage: [{ type: Input }],
    onModalCreateSubmit: [{ type: Output }],
    onModalEditSubmit: [{ type: Output }],
    modal: [{ type: ViewChild, args: ['modal',] }],
    uploadAttachment: [{ type: ViewChild, args: ['uploadAttachment',] }]
};
if (false) {
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.isImage;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.onModalCreateSubmit;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.onModalEditSubmit;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.modal;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.uploadAttachment;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.registerForm;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.control;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.submitted;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.title;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.selectList;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.modalConfig;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.th;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.isMore;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.moreField;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.config;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.attachmentData;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.tmpData;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.filteredDepartments;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.departmentList;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.attachmentUrl;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.disabledForm;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.isOpen;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.appConfigService;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.request;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.formBuilder;
    /** @type {?} */
    ModalAttachmentViewComponent.prototype.common;
}

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtYXR0YWNobWVudC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3NvYy1hcHAtbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi9tb2RhbC1hdHRhY2htZW50LXZpZXcvbW9kYWwtYXR0YWNobWVudC12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQWUsY0FBYyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFdBQVcsRUFBd0IsVUFBVSxFQUFrQixNQUFNLGdCQUFnQixDQUFDO0FBQzlGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR2hELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzNGLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCO0NBU0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNRCxNQUFNLG1DQUFvQyxTQUFRLE9BQU87Ozs7Ozs7SUE2QnJELFlBQW9CLGdCQUFrQyxFQUFVLE9BQWdCLEVBQVUsV0FBd0IsRUFBUyxNQUFjO1FBQ3JJLEtBQUssRUFBRSxDQUFDO1FBRFEscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFTLFdBQU0sR0FBTixNQUFNLENBQVE7dUJBM0I3RyxLQUFLO21DQUNELElBQUks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QyxNQUFNLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUMzRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDaEQ7Ozs7SUFFSyxRQUFROztZQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7S0FDbkY7Ozs7O0lBRUQsWUFBWSxDQUFDLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxHQUFHLEdBQUMsaUJBQWlCLEdBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztLQUN4RDs7O1lBbE9KLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyx5bHBCQUFxRDthQUN4RDs7OztZQXhCTyxnQkFBZ0I7WUFDZixPQUFPO1lBRVIsV0FBVztZQURYLE1BQU07OztzQkF5QlQsS0FBSztrQ0FDTCxNQUFNO2dDQUNOLE1BQU07b0JBQ04sU0FBUyxTQUFDLE9BQU87K0JBQ2pCLFNBQVMsU0FBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TW9kYWxPcHRpb25zLCBNb2RhbERpcmVjdGl2ZX0gZnJvbSAnbmd4LWJvb3RzdHJhcCc7XG5pbXBvcnQge0FwcENvbmZpZ1NlcnZpY2V9IGZyb20gJy4uL2FwcC1jb25maWcvYXBwLWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcXVlc3QgfSBmcm9tICcuLi9fc2VydmljZXMvcmVxdWVzdC5zZXJ2aWNlJztcbmltcG9ydCB7Q29tbW9ufSBmcm9tICcuLi9fc2VydmljZXMvY29tbW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtGb3JtQnVpbGRlciwgRm9ybUFycmF5LCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtDdXN0b21WYWxpZGF0b3JzfSBmcm9tICduZzItdmFsaWRhdGlvbic7XG5pbXBvcnQge0R4RGF0YUdyaWRDb21wb25lbnR9IGZyb20gJ2RldmV4dHJlbWUtYW5ndWxhcic7XG5pbXBvcnQgKiBhcyB1dWlkIGZyb20gJ3V1aWQnO1xuaW1wb3J0IHtVcGxvYWRBdHRhY2htZW50Q29tcG9uZW50fSBmcm9tICcuLi91cGxvYWQtYXR0YWNobWVudC91cGxvYWQtYXR0YWNobWVudC5jb21wb25lbnQnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5jbGFzcyBPcHRpb25zIHtcbiAgICAvKiogdGl0bGUg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmB4Liq4LiU4LiHICovXG4gICAgdGl0bGU/OiBTdHJpbmc7XG4gICAgLyoqIGRhdGEgKi9cbiAgICBkYXRhOiBhbnk7XG4gICAgbW9kZTogYW55O1xuICAgIGRvd25sb2FkVG9rZW46IGFueTtcbiAgICAvKiogbmFtZSDguJfguLXguYjguJXguYnguK3guIfguIHguLLguKPguYHguKrguJTguIcgKi9cbiAgICBjb25maWc6IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdtb2RhbC1hdHRhY2htZW50LXZpZXcnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9tb2RhbC1hdHRhY2htZW50LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbEF0dGFjaG1lbnRWaWV3Q29tcG9uZW50IGV4dGVuZHMgT3B0aW9ucyBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBpc0ltYWdlIDpib29sZWFuID0gZmFsc2U7XG4gICAgQE91dHB1dCgpIG9uTW9kYWxDcmVhdGVTdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIG9uTW9kYWxFZGl0U3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIEBWaWV3Q2hpbGQoJ21vZGFsJykgbW9kYWw6IE1vZGFsRGlyZWN0aXZlO1xuICAgIEBWaWV3Q2hpbGQoJ3VwbG9hZEF0dGFjaG1lbnQnKSB1cGxvYWRBdHRhY2htZW50OiBVcGxvYWRBdHRhY2htZW50Q29tcG9uZW50O1xuICAgIHJlZ2lzdGVyRm9ybTogRm9ybUdyb3VwO1xuICAgIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcbiAgICBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICB0aXRsZTogYW55ID0gJyc7XG4gICAgc2VsZWN0TGlzdDogYW55ID0gW107XG4gICAgbW9kYWxDb25maWc6IE1vZGFsT3B0aW9ucyA9IHtcbiAgICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZVxuICAgIH07XG4gICAgdGg7XG4gICAgaXNNb3JlID0gZmFsc2U7XG4gICAgbW9yZUZpZWxkOiBhbnk7XG4gICAgcHVibGljIGNvbmZpZzogYW55O1xuICAgIGF0dGFjaG1lbnREYXRhOiBhbnkgPSB7XG4gICAgICAgIGRvY190eXBlOm51bGxcbiAgICB9O1xuICAgIHRtcERhdGE6YW55ID0ge307XG4gICAgZmlsdGVyZWREZXBhcnRtZW50czphbnkgPSBbXTtcbiAgICBkZXBhcnRtZW50TGlzdDphbnkgPSBbXTtcbiAgICBhdHRhY2htZW50VXJsO1xuICAgIGRpc2FibGVkRm9ybSA9IGZhbHNlO1xuICAgIGlzT3BlbiA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhcHBDb25maWdTZXJ2aWNlOiBBcHBDb25maWdTZXJ2aWNlLCBwcml2YXRlIHJlcXVlc3Q6IFJlcXVlc3QsIHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwdWJsaWMgY29tbW9uOiBDb21tb24pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb25maWcgPSBhcHBDb25maWdTZXJ2aWNlLmdldENvbmZpZygpO1xuICAgICAgICB0aGlzLmF0dGFjaG1lbnRVcmwgPSBfLmdldCh0aGlzLmNvbmZpZywgJ2FwaVNlcnZlcnMuYWxmcmVzY28udXJsJykgfHwgXCJodHRwczovLzIwMy4xNTQuMzIuMTI2OjI1ODUvYXBpL21mZWMvQWxmcmVzY29cIjtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy50aCA9IHRoaXMuY29tbW9uLmZuTG9jYWxQQ2FsZW5kYXIoJ3RoJyk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgICAgICBuYW1lOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkRm9ybSB9XSxcbiAgICAgICAgICAgIGRvY190eXBlOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkRm9ybSB9XSxcbiAgICAgICAgICAgIHVybDogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZEZvcm0gfV0sXG4gICAgICAgICAgICBpc19jbGFzc2lmaWVkczogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZEZvcm0gfV0sXG4gICAgICAgICAgICBpc19pbWFnZTogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZEZvcm0gfV0sXG4gICAgICAgICAgICBrZXl3b3JkOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkRm9ybSB9XSxcbiAgICAgICAgICAgIGJvb2tfbm86IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWRGb3JtIH1dLFxuICAgICAgICAgICAgYW1vdW50OiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkRm9ybSB9XSxcbiAgICAgICAgICAgIHJlY29yZF9kYXRlOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkRm9ybSB9XSxcbiAgICAgICAgICAgIHZlcnNpb246IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWRGb3JtIH1dLFxuICAgICAgICAgICAgcmVzb2x1dGlvbjogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZEZvcm0gfV0sXG4gICAgICAgICAgICByZW1hcms6IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWRGb3JtIH1dLFxuICAgICAgICAgICAgbW9yZUZpZWxkOiB0aGlzLmZvcm1CdWlsZGVyLmFycmF5KFtdKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBvcGVuKG9wdGlvbnM/OiBPcHRpb25zKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmF0dGFjaG1lbnREYXRhID0ge307XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLm1vZGUgPSBvcHRpb25zLm1vZGU7XG4gICAgICAgICAgICB0aGlzLnRpdGxlID0gb3B0aW9ucy50aXRsZSB8fCAnJztcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRUb2tlbiA9IG9wdGlvbnMuZG93bmxvYWRUb2tlbjtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudERhdGEgPSBfLmNsb25lRGVlcChvcHRpb25zLmRhdGEpO1xuICAgICAgICAgICAgaWYoIXRoaXMuYXR0YWNobWVudERhdGEuZG9jX3R5cGUpe1xuICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudERhdGEuZG9jX3R5cGUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g4LiV4LmJ4Lit4LiH4LmA4Lib4Lil4Li14LmI4Lii4LiZ4LmA4Lib4LmH4LiZ4LmA4Lij4Li14Lii4LiBIGFwaVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RMaXN0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0LmdldERyb3BEb3duKG9wdGlvbnMuZGF0YS5zeXN0ZW1faWQsXCLguJvguKPguLDguYDguKDguJfguYDguK3guIHguKrguLLguKNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5tb2RlICE9PSAnVklFVycpe1xuICAgICAgICAgICAgdGhpcy51cGxvYWRBdHRhY2htZW50LmNsZWFyVmFsdWUoKTtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWRGb3JtID0gZmFsc2U7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZEZvcm0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubW9kYWwuc2hvdygpO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgfVxuXG4gICAgZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJGb3JtLmNvbnRyb2xzO1xuICAgIH1cblxuICAgIGNsb3NlTW9kYWwoKSB7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0TGlzdCA9IFtdO1xuICAgICAgICB0aGlzLmlzTW9yZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vcmVGaWVsZCA9IFtdO1xuICAgICAgICB0aGlzLmF0dGFjaG1lbnREYXRhID0ge307XG4gICAgICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uWWVzQ2xpY2sobW9kYWwpIHtcbiAgICAgICAgbW9kYWwuaGlkZSgpO1xuICAgIH1cblxuICAgIG9uTm9DbGljayhtb2RhbCkge1xuICAgICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfVxuXG4gICAgb25IaWRkZW4oJGV2ZW50OiBNb2RhbERpcmVjdGl2ZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnTE9HIE1FU1NBR0U6IE1vZGFsQ29uZmlybSAtPiBvbkhpZGRlbiAtPiAkZXZlbnQnLCAkZXZlbnQpO1xuXG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tFeHRyYUZpZWxkKCkge1xuICAgICAgICB0aGlzLm1vcmVGaWVsZCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5hdHRhY2htZW50RGF0YS5zeXN0ZW1faWQgKSB7XG4gICAgICAgICAgICAvLyB0aGlzLmFkZEZpZWxkKG5ld0ZpZWxkLCArcmVxdWlyZUZsYWcpO1xuICAgICAgICAgICAgLy8gdGhpcy5tb3JlRmllbGQucHVzaChuZXdGaWVsZCk7XG4gICAgICAgICAgICB0aGlzLmlzTW9yZSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzTW9yZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25DZWxsUHJlcGFyZWQoZSkge1xuICAgICAgICBpZiAoZS5yb3dUeXBlID09PSAnZGF0YScpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBlLmNvbXBvbmVudC5jb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuY29sdW1uLmRhdGFGaWVsZCA9PT0gZS5jb21wb25lbnQuY29sdW1uc1tpXSkge1xuICAgICAgICAgICAgICAgICAgICBlLmNlbGxFbGVtZW50LmFjY2Vzc0tleSA9IGUuY29tcG9uZW50LmNvbHVtbnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkRmllbGQoZGF0YSwgcmVxdWlyZWQpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IDxGb3JtQXJyYXk+dGhpcy5yZWdpc3RlckZvcm0uY29udHJvbHNbJ21vcmVGaWVsZCddO1xuICAgICAgICBsZXQgbmV3Z3JvdXA7XG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkRm9ybSB9XTtcbiAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWRGb3JtIH1dO1xuICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnZGF0ZXRpbWUnKSB7XG4gICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBDdXN0b21WYWxpZGF0b3JzLmRhdGVdO1xuICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZEZvcm0gfV07XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdzcGVjaWFsJyl7XG4gICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWRGb3JtIH1dO1xuICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZEZvcm0gfV07XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGRhdGEuZmllbGRfbmFtZSA9PT0gJ2Ftb3VudCcpe1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBncm91cFsnYW1vdW50X3R5cGUnXSA9IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRoaXMuZGlzYWJsZWRGb3JtIH1dO1xuICAgICAgICAgICAgICAgIGNvbnRyb2wucHVzaCh0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sLnB1c2gobmV3Z3JvdXApO1xuICAgIH1cblxuICAgIGdldFZhbGlkYXRlTW9yZUZpZWxkKGksIGZpZWxkLCB2YWxpZGF0ZVR5cGU/KSB7XG4gICAgICAgIGxldCBmb3JtTW9yZUZpZWxkOiBhbnkgPSB0aGlzLmZbJ21vcmVGaWVsZCddO1xuICAgICAgICBpZiAodmFsaWRhdGVUeXBlKSB7XG4gICAgICAgICAgICBmb3JtTW9yZUZpZWxkID0gZm9ybU1vcmVGaWVsZC5jb250cm9sc1tpXTtcbiAgICAgICAgICAgIGZvcm1Nb3JlRmllbGQgPSBmb3JtTW9yZUZpZWxkLmNvbnRyb2xzW2ZpZWxkXTtcbiAgICAgICAgICAgIGlmIChmb3JtTW9yZUZpZWxkLmVycm9ycykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtTW9yZUZpZWxkLmVycm9yc1t2YWxpZGF0ZVR5cGVdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybU1vcmVGaWVsZC5lcnJvcnM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybU1vcmVGaWVsZC5lcnJvcnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRSb3dJbmRleChkYXRhKSB7XG4gICAgICAgIGlmICghZGF0YS5kYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm8gPSBkYXRhLnJvdy5kYXRhSW5kZXggKyAxO1xuICAgICAgICByZXR1cm4gbm87XG4gICAgfVxuXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgLy8g4LiW4LmJ4LiyIGZvcm0g4LmE4Lih4LmI4LiE4Lij4Lia4Lir4Lij4Li34Lit4Lic4Li04LiU4LiV4Liy4Lih4LmA4LiH4Li34LmI4Lit4LiZ4LmE4LiC4LiX4Li14LmI4LiV4Lix4LmJ4LiH4LmE4Lin4LmJ4LiI4Liw4LiI4Lia4LiX4Li14LmI4LiV4Lij4LiH4LiZ4Li14LmJXG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdGVyRm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gbGV0IHBvc3REYXRhID0gW107XG4gICAgICAgIC8vIGF3YWl0IHRoaXMucmVxdWVzdC5wb3N0KFwiL2RiL3JjX2F0dGFjaG1lbnRcIix0aGlzLmF0dGFjaG1lbnREYXRhKTtcbiAgICAgICAgaWYodGhpcy5tb2RlID09PSAnQ1JFQVRFJyl7XG4gICAgICAgICAgICB0aGlzLm9uTW9kYWxDcmVhdGVTdWJtaXQuZW1pdCh0aGlzLmF0dGFjaG1lbnREYXRhKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLm9uTW9kYWxFZGl0U3VibWl0LmVtaXQodGhpcy5hdHRhY2htZW50RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsKCk7O1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uVXBsb2FkZWQoZGF0YSl7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiZGF0YVwiLGRhdGEpO1xuICAgICAgICB0aGlzLmF0dGFjaG1lbnREYXRhLnVybCA9IHRoaXMuYXR0YWNobWVudFVybCsnLycrZGF0YS51dWlkO1xuICAgICAgICB0aGlzLmF0dGFjaG1lbnREYXRhLnV1aWQgPSBkYXRhLnV1aWQ7XG4gICAgICAgIHRoaXMuYXR0YWNobWVudERhdGEuZmlsZW5hbWUgPSBkYXRhLmZpbGVOYW1lO1xuICAgIH1cblxuICAgIGFzeW5jIGNsaWNrVXJsKCl7XG4gICAgICAgIHdpbmRvdy5vcGVuKGF3YWl0IHRoaXMucmVxdWVzdC5nZXRBdHRhY2htZW50TGlua1Rva2VuKHRoaXMuYXR0YWNobWVudERhdGEudXJsKSk7XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2VMaW5rKGRhdGEpe1xuICAgICAgICByZXR1cm4gZGF0YS51cmwrXCI/ZG93bmxvYWRUb2tlbj1cIit0aGlzLmRvd25sb2FkVG9rZW47XG4gICAgfVxufVxuIl19