Blame view

esm5/lib/modal-step/modal-step.component.js 137 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
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { Component, EventEmitter, 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 { DxDataGridComponent } from 'devextreme-angular';
import * as _ from 'lodash';
import { DateService } from '../_services/date.service';
import { UploadAttachmentComponent } from '../upload-attachment/upload-attachment.component';
import { B2bService } from '../_services/b2b.service';
var Options = /** @class */ (function () {
    function Options() {
    }
    return Options;
}());
if (false) {
    /**
     * title ที่ต้องการแสดง
     * @type {?}
     */
    Options.prototype.title;
    /**
     * data
     * @type {?}
     */
    Options.prototype.data;
}
var ModalStepComponent = /** @class */ (function (_super) {
    tslib_1.__extends(ModalStepComponent, _super);
    function ModalStepComponent(appConfigService, request, formBuilder, common, date, b2bService) {
        var _this = _super.call(this) || this;
        _this.appConfigService = appConfigService;
        _this.request = request;
        _this.formBuilder = formBuilder;
        _this.common = common;
        _this.date = date;
        _this.b2bService = b2bService;
        _this.onUpdateModal = new EventEmitter();
        _this.submitted = false;
        _this.submittedSend = false;
        _this.submittedRecieve = false;
        _this.title = '';
        _this.selectList = [];
        _this.sendList = [];
        _this.recieveList = [];
        _this.modalConfig = {
            ignoreBackdropClick: true
        };
        _this.selectedStep = null;
        _this.isMore = false;
        _this.stepData = {};
        _this.sendData = {};
        _this.recieveData = {};
        _this.lastStep = '';
        _this.isSend = false;
        _this.isRecieve = false;
        _this.isEditSend = false;
        _this.isEditRecieve = false;
        _this.tmpData = {};
        _this.filteredDepartments = [];
        _this.departmentList = [];
        _this.departmentUrl = "/db/ct_ext_department";
        _this.causeUrl = "/db/ct_dropdown";
        _this.causeFilter = "system_id,eq,23)$and(dropdown_type,like,เรื่องส่งคืน";
        _this.tempId = -1;
        _this.filter_ref_ext_department_id = false;
        _this.filter_ref_ext_department_id_show = true;
        _this.config = appConfigService.getConfig();
        _this.attachmentUrl = _.get(_this.config, 'apiServers.alfresco.url') || "https://203.154.32.126:2585/api/mfec/Alfresco";
        _this.system_id = _.get(_this.config, 'system_id');
        return _this;
    }
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        this.th = this.common.fnLocalPCalendar('th');
        this.recieveForm = this.formBuilder.group({
            book_no: ['', [Validators.required]],
            recv_date: [''],
        });
        this.sendForm = this.formBuilder.group({
            send_to: [''],
            book_no: [''],
            send_date: [''],
            is_important: [''],
        });
        this.registerForm = this.formBuilder.group({
            name: [''],
            step_id: ['', Validators.required],
            step_date: [''],
            remark: [''],
            lastStep: [''],
            moreField: this.formBuilder.array([]),
            soc_recv_no: [''],
            soc_recv_date: [''],
            gtc_recv_no: [''],
            gtc_recv_date: [''],
            book_no: [''],
            book_date: [''],
            'for': [''],
            dept_name: [''],
            ministry: ['']
        });
    };
    /**
     * @param {?=} options
     * @return {?}
     */
    ModalStepComponent.prototype.open = /**
     * @param {?=} options
     * @return {?}
     */
    function (options) {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var _a;
            return tslib_1.__generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        console.log(options);
                        this.stepData = {};
                        if (!options) return [3 /*break*/, 2];
                        this.title = options.title || '';
                        this.lastStep = options.data.lastStep;
                        this.stepData = JSON.parse(JSON.stringify(options.data));
                        this.stepData.step_date = this.date.getNow();
                        delete this.stepData['lastStep'];
                        _a = this;
                        return [4 /*yield*/, this.request.get('/db/ct_step?_where=(category_id,eq,' + options.data.category_id + ')&_sort=seq_no')];
                    case 1:
                        _a.selectList = _b.sent();
                        _b.label = 2;
                    case 2:
                        this.uploadAttachment.clearValue();
                        this.modal.show();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.f = /**
     * @return {?}
     */
    function () { return this.registerForm.controls; };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.fs = /**
     * @return {?}
     */
    function () { return this.sendForm.controls; };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.fr = /**
     * @return {?}
     */
    function () { return this.recieveForm.controls; };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.closeModal = /**
     * @return {?}
     */
    function () {
        this.submitted = false;
        this.selectList = [];
        this.sendList = [];
        this.selectedStep = null;
        this.isMore = false;
        this.isSend = false;
        this.moreField = [];
        this.stepData = {};
        this.lastStep = '';
        this.modal.hide();
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.closeSendModal = /**
     * @return {?}
     */
    function () {
        this.submittedSend = false;
        this.sendData = {};
        this.isEditSend = false;
        this.tmpData = {};
        this.sendModal.hide();
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.closeRecieveModal = /**
     * @return {?}
     */
    function () {
        this.submittedRecieve = false;
        this.recieveData = {};
        this.isEditRecieve = false;
        this.tmpData = {};
        this.recieveModal.hide();
    };
    /**
     * @param {?} modal
     * @return {?}
     */
    ModalStepComponent.prototype.onYesClick = /**
     * @param {?} modal
     * @return {?}
     */
    function (modal) {
        modal.hide();
    };
    /**
     * @param {?} modal
     * @return {?}
     */
    ModalStepComponent.prototype.onNoClick = /**
     * @param {?} modal
     * @return {?}
     */
    function (modal) {
        modal.hide();
    };
    /**
     * @param {?} $event
     * @return {?}
     */
    ModalStepComponent.prototype.onHidden = /**
     * @param {?} $event
     * @return {?}
     */
    function ($event) {
        console.log('LOG MESSAGE: ModalConfirm -> onHidden -> $event', $event);
    };
    /**
     * @param {?} value
     * @return {?}
     */
    ModalStepComponent.prototype.valueSeleteMinistry = /**
     * @param {?} value
     * @return {?}
     */
    function (value) {
        var _this = this;
        this.filter_ref_ext_department_id_show = false;
        console.log('value', value);
        // this.stepData.ministry_id = value && value.id ? value.id : null
        if (value && value.id) {
            this.stepData.dept_name = null;
            this.filter_ref_ext_department_id = "&_where=(ref_ext_department_id,eq," + value.id + ")$and(type,in,2,3,4,5)";
        }
        else {
            this.filter_ref_ext_department_id = false;
        }
        setTimeout(function () {
            _this.filter_ref_ext_department_id_show = true;
        }, 50);
    };
    /**
     * @param {?} value
     * @return {?}
     */
    ModalStepComponent.prototype.valueSeleteDeptName = /**
     * @param {?} value
     * @return {?}
     */
    function (value) {
        console.log('value', value);
        this.stepData.code_dept = value && value.id ? value.id : null;
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.checkExtraField = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var i, flag, requireFlag, ct_step_flag, newField, _a;
            return tslib_1.__generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        this.stepData.step_id = this.selectedStep.id;
                        this.stepData.step_name = this.selectedStep.name;
                        console.log(this.isMore);
                        this.moreField = [];
                        if (!(this.selectedStep.flag && this.selectedStep.flag !== '')) return [3 /*break*/, 6];
                        i = 0;
                        _b.label = 1;
                    case 1:
                        if (!(i < this.selectedStep.flag.length)) return [3 /*break*/, 5];
                        flag = this.selectedStep.flag.charAt(i);
                        requireFlag = this.selectedStep.require_flag ? this.selectedStep.require_flag.charAt(i) : 0;
                        return [4 /*yield*/, this.request.get('/db/ct_step_flag?_where=(flag,eq,' + flag + ')')];
                    case 2:
                        ct_step_flag = _b.sent();
                        newField = ct_step_flag[0];
                        return [4 /*yield*/, this.addField(newField, +requireFlag)];
                    case 3:
                        _b.sent();
                        this.moreField.push(newField);
                        console.log(this.f);
                        _b.label = 4;
                    case 4:
                        i++;
                        return [3 /*break*/, 1];
                    case 5:
                        this.isMore = true;
                        this.isSend = false;
                        this.isRecieve = false;
                        return [3 /*break*/, 9];
                    case 6:
                        this.isMore = false;
                        if (!(this.selectedStep.type_id === 8 || this.selectedStep.type_id === 13)) return [3 /*break*/, 8];
                        _a = this;
                        return [4 /*yield*/, this.request.get('/db/ct_ext_department?_sort=name')];
                    case 7:
                        _a.departmentList = _b.sent();
                        this.departmentList = this.departmentList.map(function (a) { return a.name; });
                        this.isSend = true;
                        this.isRecieve = false;
                        // } else if (this.selectedStep.type_id === 9 || this.selectedStep.type_id === 14) {
                        //     const data = await this.request.post('/sql/getLastSend', this.stepData);
                        //     if (data.resultData && data.resultData.length > 0) {
                        //         const ct_step_data_id = data.resultData[0].id;
                        //         const ct_sendList = await this.request.get('/db/ct_send?_where=(ct_step_data_id,eq,' + ct_step_data_id + ')');
                        //         for (const ct_send of ct_sendList) {
                        //             const recvData: any = {
                        //                 ct_send_id: ct_send.id,
                        //                 send_book_no: ct_send.book_no,
                        //                 send_date: ct_send.send_date,
                        //                 recv_from: ct_send.send_to,
                        //                 name: ct_send.name
                        //             };
                        //             this.recieveList.push(recvData);
                        //         }
                        //     }
                        //     this.isRecieve = true;
                        //     this.isSend = false;
                        return [3 /*break*/, 9];
                    case 8:
                        this.isSend = false;
                        this.isRecieve = false;
                        _b.label = 9;
                    case 9: return [2 /*return*/];
                }
            });
        });
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.getFieldId = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        /** @type {?} */
        var id = '';
        if (data.type === 'text') {
            id += 'txt';
        }
        else if (data.type === 'datetime') {
            id += 'txt';
        }
        else {
            id += 'txt';
        }
        /** @type {?} */
        var field = data.field_name.charAt(0).toLocaleUpperCase() + data.field_name.substring(1);
        id += field;
        return id;
    };
    /**
     * @param {?} data
     * @param {?} required
     * @return {?}
     */
    ModalStepComponent.prototype.addField = /**
     * @param {?} data
     * @param {?} required
     * @return {?}
     */
    function (data, required) {
        /** @type {?} */
        var control = /** @type {?} */ (this.registerForm.controls['moreField']);
        /** @type {?} */
        var newgroup;
        this.stepData[data.field_name] = null;
        if (data.type === 'text') {
            if (required) {
                /** @type {?} */
                var group = {};
                group[data.field_name] = ['', Validators.required];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                var group = {};
                group[data.field_name] = [''];
                newgroup = this.formBuilder.group(group);
            }
        }
        else if (data.type === 'datetime') {
            if (required) {
                /** @type {?} */
                var group = {};
                group[data.field_name] = ['', Validators.required, CustomValidators.date];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                var group = {};
                group[data.field_name] = [''];
                newgroup = this.formBuilder.group(group);
            }
            this.stepData[data.field_name] = this.date.getNow();
        }
        else if (data.type === 'number') {
            if (required) {
                /** @type {?} */
                var group = {};
                group[data.field_name] = [Validators.required];
                newgroup = this.formBuilder.group(group);
            }
            else {
                /** @type {?} */
                var group = {};
                group[data.field_name] = [''];
                newgroup = this.formBuilder.group(group);
            }
        }
        else if (data.type === 'special') {
            if (data.field_name === 'amount') {
                if (required) {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = ['', Validators.required];
                    group['amount_type'] = ['', Validators.required];
                    newgroup = this.formBuilder.group(group);
                }
                else {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = [''];
                    group['amount_type'] = [''];
                    newgroup = this.formBuilder.group(group);
                }
            }
            else if (data.field_name === 'follow') {
                if (required) {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = ['', Validators.required];
                    group['follow_remark'] = ['', Validators.required];
                    newgroup = this.formBuilder.group(group);
                }
                else {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = [''];
                    group['follow_remark'] = [''];
                    newgroup = this.formBuilder.group(group);
                }
            }
            else {
                if (required) {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = ['', Validators.required];
                    newgroup = this.formBuilder.group(group);
                }
                else {
                    /** @type {?} */
                    var group = {};
                    group[data.field_name] = [''];
                    newgroup = this.formBuilder.group(group);
                }
            }
        }
        control.push(newgroup);
    };
    /**
     * @param {?} i
     * @param {?} field
     * @param {?=} validateType
     * @return {?}
     */
    ModalStepComponent.prototype.getValidateMoreField = /**
     * @param {?} i
     * @param {?} field
     * @param {?=} validateType
     * @return {?}
     */
    function (i, field, validateType) {
        /** @type {?} */
        var 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 {?}
     */
    ModalStepComponent.prototype.getRowIndex = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        if (!data.data) {
            return '';
        }
        /** @type {?} */
        var no = data.row.dataIndex + 1;
        return no;
    };
    /**
     * @param {?} e
     * @return {?}
     */
    ModalStepComponent.prototype.onCellPrepared = /**
     * @param {?} e
     * @return {?}
     */
    function (e) {
        if (e.rowType === 'data') {
            for (var i in e.component.columns) {
                if (e.column.dataField === e.component.columns[i]) {
                    e.cellElement.accessKey = e.component.columns[i];
                }
            }
        }
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.addSend = /**
     * @return {?}
     */
    function () {
        this.sendData.send_date = this.date.getNow();
        this.sendModal.show();
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.editSend = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        this.tmpData = data;
        this.sendData = JSON.parse(JSON.stringify(data));
        // this.sendData.send_date = new Date(this.sendData.send_date);
        this.isEditSend = true;
        this.sendModal.show();
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.editRecieve = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        this.tmpData = data;
        this.recieveData = JSON.parse(JSON.stringify(data));
        this.recieveData.recv_date = this.recieveData.recv_date ? new Date(this.recieveData.recv_date) : this.recieveData.recv_date;
        this.isEditRecieve = true;
        this.recieveModal.show();
    };
    /**
     * @param {?} event
     * @return {?}
     */
    ModalStepComponent.prototype.filterDepartments = /**
     * @param {?} event
     * @return {?}
     */
    function (event) {
        this.filteredDepartments = [];
        for (var i = 0; i < this.departmentList.length; i++) {
            /** @type {?} */
            var department = this.departmentList[i];
            if (department.toLowerCase().indexOf(event.query.toLowerCase()) == 0) {
                this.filteredDepartments.push(department);
            }
        }
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.onSubmit = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var e_1, _a, e_2, _b, postData, data, userData, main, ct_send, ct_recieve, _c, _d, data_1, ct_recieve, _e, _f, data_2, postResponse, stepList;
            return tslib_1.__generator(this, function (_g) {
                switch (_g.label) {
                    case 0:
                        this.submitted = true;
                        // ถ้า form ไม่ครบหรือผิดตามเงื่อนไขที่ตั้งไว้จะจบที่ตรงนี้
                        console.log('this.registerForm.invalid: ', this.registerForm.invalid);
                        if (this.registerForm.invalid) {
                            return [2 /*return*/];
                        }
                        postData = [];
                        data = _.cloneDeep(this.stepData);
                        data.action = "add";
                        userData = this.b2bService.getVerifyToken();
                        data.username = userData.username;
                        if (data.remind_date)
                            data.remind_date = this.date.getNow().add(data.remind_date, 'd').toDate();
                        delete data["ct_main_id"];
                        delete data["update_date"];
                        main = {
                            "ct_step_data": [data]
                        };
                        postData.push(main);
                        if (this.sendList && this.sendList.length > 0) {
                            ct_send = {
                                "ct_send": []
                            };
                            ct_recieve = {
                                "ct_recieve": []
                            };
                            try {
                                for (_c = tslib_1.__values(this.sendList), _d = _c.next(); !_d.done; _d = _c.next()) {
                                    data_1 = _d.value;
                                    data_1.name = data_1.name;
                                    data_1.action = "add";
                                    delete data_1.id;
                                    ct_send.ct_send.push(data_1);
                                }
                            }
                            catch (e_1_1) { e_1 = { error: e_1_1 }; }
                            finally {
                                try {
                                    if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
                                }
                                finally { if (e_1) throw e_1.error; }
                            }
                            postData.push(ct_send);
                        }
                        if (this.recieveList && this.recieveList.length > 0) {
                            ct_recieve = {
                                "ct_recieve": []
                            };
                            try {
                                for (_e = tslib_1.__values(this.recieveList), _f = _e.next(); !_f.done; _f = _e.next()) {
                                    data_2 = _f.value;
                                    delete data_2['send_book_no'];
                                    delete data_2['send_date'];
                                    data_2.name = data_2.name;
                                    data_2.action = "add";
                                    ct_recieve.ct_recieve.push(data_2);
                                }
                            }
                            catch (e_2_1) { e_2 = { error: e_2_1 }; }
                            finally {
                                try {
                                    if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
                                }
                                finally { if (e_2) throw e_2.error; }
                            }
                            postData.push(ct_recieve);
                        }
                        console.log('postData', postData);
                        return [4 /*yield*/, this.request.post("/ct/main", postData)];
                    case 1:
                        postResponse = _g.sent();
                        if (!this.stepData.update_date) return [3 /*break*/, 5];
                        return [4 /*yield*/, this.getStepList()];
                    case 2:
                        stepList = _g.sent();
                        console.log("stepList", stepList);
                        if (!(stepList.length > 0)) return [3 /*break*/, 4];
                        return [4 /*yield*/, this.request.put("/db/" + this.stepData.ref_table + "/" + this.stepData.ref_id, { status: stepList[0].step_name, status_date: stepList[0].step_date })];
                    case 3:
                        _g.sent();
                        this.common.fnCheckResponse(postResponse, this.myModal);
                        _g.label = 4;
                    case 4: return [3 /*break*/, 7];
                    case 5: return [4 /*yield*/, this.request.put("/db/" + this.stepData.ref_table + "/" + this.stepData.ref_id, { status: this.stepData.step_name })];
                    case 6:
                        _g.sent();
                        this.common.fnCheckResponse(postResponse, this.myModal);
                        _g.label = 7;
                    case 7:
                        // }else{
                        //     this.onCreateModal.emit(postData);
                        // }
                        return [2 /*return*/];
                }
            });
        });
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.getStepList = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var filter, data;
            return tslib_1.__generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        console.log('getStepList');
                        filter = {
                            filter: {
                                ref_table: "=" + this.stepData.ref_table,
                                ref_id: this.stepData.ref_id,
                                system_id: this.stepData.system_id
                            },
                            order_by: ["step_date desc"]
                        };
                        return [4 /*yield*/, this.request.post('/search/ct_step_data', filter)];
                    case 1:
                        data = _a.sent();
                        return [2 /*return*/, data.resultData || []];
                }
            });
        });
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.onClickBack = /**
     * @return {?}
     */
    function () {
        this.onUpdateModal.emit();
        this.closeModal();
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.onSubmitSend = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var e_3, _a, tmpList, _b, _c, tmpSend;
            return tslib_1.__generator(this, function (_d) {
                this.submittedSend = true;
                // ถ้า form ไม่ครบหรือผิดตามเงื่อนไขที่ตั้งไว้จะจบที่ตรงนี้
                if (this.sendForm.invalid) {
                    return [2 /*return*/];
                }
                if (this.isEditSend) {
                    tmpList = [];
                    try {
                        for (_b = tslib_1.__values(this.sendList), _c = _b.next(); !_c.done; _c = _b.next()) {
                            tmpSend = _c.value;
                            if (tmpSend.id === this.tmpData.id) {
                                tmpList.push(this.sendData);
                            }
                            else {
                                tmpList.push(tmpSend);
                            }
                        }
                    }
                    catch (e_3_1) { e_3 = { error: e_3_1 }; }
                    finally {
                        try {
                            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
                        }
                        finally { if (e_3) throw e_3.error; }
                    }
                    this.sendList = tmpList;
                }
                else {
                    this.sendData.id = this.tempId;
                    this.tempId--;
                    this.sendList.push(this.sendData);
                }
                this.closeSendModal();
                return [2 /*return*/];
            });
        });
    };
    /**
     * @return {?}
     */
    ModalStepComponent.prototype.onSubmitRecieve = /**
     * @return {?}
     */
    function () {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var e_4, _a, tmpList, _b, _c, tmpSend;
            return tslib_1.__generator(this, function (_d) {
                this.submittedSend = true;
                // ถ้า form ไม่ครบหรือผิดตามเงื่อนไขที่ตั้งไว้จะจบที่ตรงนี้
                if (this.recieveForm.invalid) {
                    return [2 /*return*/];
                }
                if (this.isEditRecieve) {
                    tmpList = [];
                    try {
                        for (_b = tslib_1.__values(this.recieveList), _c = _b.next(); !_c.done; _c = _b.next()) {
                            tmpSend = _c.value;
                            if (tmpSend.recv_from === this.tmpData.recv_from) {
                                tmpList.push(this.recieveData);
                            }
                            else {
                                tmpList.push(tmpSend);
                            }
                        }
                    }
                    catch (e_4_1) { e_4 = { error: e_4_1 }; }
                    finally {
                        try {
                            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
                        }
                        finally { if (e_4) throw e_4.error; }
                    }
                    this.recieveList = tmpList;
                }
                else {
                    this.recieveList.push(this.recieveData);
                }
                this.closeRecieveModal();
                return [2 /*return*/];
            });
        });
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.isImportant = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        return data.is_important ? "สำคัญ" : "";
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.onUploaded = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        this.stepData.url = this.attachmentUrl + '/' + data.uuid;
        this.stepData.uuid = data.uuid;
    };
    /**
     * @param {?} field
     * @return {?}
     */
    ModalStepComponent.prototype.checkDisable = /**
     * @param {?} field
     * @return {?}
     */
    function (field) {
        if (this.stepData[field.field_name] !== 'ไม่ทางการ') {
            return true;
        }
        else {
            return false;
        }
    };
    /**
     * @param {?} data
     * @return {?}
     */
    ModalStepComponent.prototype.getImageLink = /**
     * @param {?} data
     * @return {?}
     */
    function (data) {
        return tslib_1.__awaiter(this, void 0, void 0, function () {
            var url;
            return tslib_1.__generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.request.getAttachmentLinkToken(data.url)];
                    case 1:
                        url = _a.sent();
                        return [2 /*return*/, url];
                }
            });
        });
    };
    ModalStepComponent.decorators = [
        { type: Component, args: [{
                    selector: 'modal-step',
                    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\"><label>{{title}}</label></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 class=\"m-form m-form--state m-form--fit m-form--label-align-right\" [formGroup]=\"registerForm\" (ngSubmit)=\"onSubmit()\">\n                            <div class=\"m-portlet__body\">\n\n                                <!-- \u0E2A\u0E16\u0E32\u0E19\u0E30\u0E25\u0E48\u0E32\u0E2A\u0E38\u0E14 -->\n                                <div class=\"row\">\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19 :</span>-->\n                                    <!--</div>-->\n                                    <div class=\"col-sm-6\">\n                                        <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().lastStep.errors }\">\n                                            <label class=\"control-label\">\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E1B\u0E31\u0E08\u0E08\u0E38\u0E1A\u0E31\u0E19</label>\n                                            <input type=\"text\" formControlName=\"lastStep\" class=\"form-control m-input\" id=\"txtLastStatus\" [(ngModel)]=\"lastStep\" disabled>\n                                        </div>\n                                    </div>\n                                    <div class=\"col-sm-6\">\n                                        <!--<select id=\"selNewStatus\" style=\"width: 100%\">-->\n                                        <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().step_id.errors }\">\n                                            <label class=\"control-label\">\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E43\u0E2B\u0E21\u0E48<span class=\"color-red\">&nbsp;*</span></label>\n                                            <select id=\"selNewStatus\" class=\"form-control\" style=\"width: 100%\" [(ngModel)]=\"selectedStep\" formControlName=\"step_id\" (change)=\"checkExtraField()\">\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 step of selectList\" [ngValue]=\"step\">{{step.name}}</option>\n                                            </select>\n                                            <!-- <div *ngIf=\"submitted && f().step_id.errors\" class=\"invalid-feedback\">\n                                                <div *ngIf=\"f().step_id.errors.required\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                            </div> -->\n                                        </div>\n                                    </div>\n                                </div>\n                                <br>\n                                <!--<div class=\"row\">-->\n                                    <!-- \u0E2A\u0E16\u0E32\u0E19\u0E30\u0E43\u0E2B\u0E21\u0E48 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E2A\u0E16\u0E32\u0E19\u0E30\u0E43\u0E2B\u0E21\u0E48 :</span>-->\n                                    <!--</div>-->\n                                <!--</div>-->\n                                <!--<br>-->\n                                <div class=\"row\">\n                                    <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n                                    <!--</div>-->\n                                    <div class=\"col-sm-6\">\n                                        <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && f().step_date.errors }\">\n                                            <label class=\"control-label\" *ngIf=\"stepData.system_id === 161\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48</label>\n                                            <label class=\"control-label\" *ngIf=\"stepData.system_id !== 161\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23</label>\n                                            <soc-date-box [id]=\"'txtDate'\" [(value)]=\"stepData.step_date\"></soc-date-box>\n                                            <div *ngIf=\"submitted && f().step_date.errors\" >\n                                                <div *ngIf=\"f().step_date.errors.required\" class=\"lable-error\">Date is required</div>\n                                                <div *ngIf=\"f().step_date.errors.date\" class=\"lable-error\">Date is invalid</div>\n                                            </div>\n                                        </div>\n                                    </div>\n                                </div>\n                                <br>\n                                \n                                \n                                \n                                <!--<div class=\"row\" *ngIf=\"stepData.system_id === 23\">-->\n                                    <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n                                    <!--</div>-->\n                                <!--    <div class=\"col-sm-6\">-->\n                                <!--      <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D</label>-->\n                                <!--      <input type=\"text\" class=\"form-control m-input\" id=\"book_no\" [(ngModel)]=\"stepData.book_no\"-->\n                                <!--      formControlName=\"book_no\">-->\n                                <!--  </div>-->\n                                <!--  <div class=\"col-sm-6\">-->\n                                <!--      <label class=\"control-label\">\u0E25\u0E07\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48</label>-->\n                                <!--      <soc-date-box [id]=\"'book_date'\" [(value)]=\"stepData.book_date\" formControlName=\"book_date\"></soc-date-box>-->\n                                      <!-- <input type=\"text\" class=\"form-control m-input\" id=\"book_date\" [(ngModel)]=\"stepData.book_date\"-->\n                                <!--      formControlName=\"book_date\"> -->\n                                <!--  </div>-->\n\n                                <!--</div>-->\n                                <!--<br>-->\n                                <!--<div class=\"row\" *ngIf=\"stepData.system_id === 23\">-->\n                                    <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n                                    <!--</div>-->\n                                <!--     <div class=\"col-sm-6\">-->\n                                <!--        <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>-->\n                                <!--        <input type=\"text\" class=\"form-control m-input\" id=\"soc_recv_no\" formControlName=\"soc_recv_no\" [(ngModel)]=\"stepData.soc_recv_no\">-->\n                                <!--    </div>-->\n                                <!--    <div class=\"col-sm-6\">-->\n                                <!--        <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>-->\n                                <!--        <soc-date-box [id]=\"'soc_recv_date'\" [(value)]=\"stepData.soc_recv_date\" formControlName=\"soc_recv_date\"></soc-date-box>-->\n                                <!--    </div>-->\n                                <!--</div>-->\n                                <!--<br>-->\n                                <!--<div class=\"row\" *ngIf=\"stepData.system_id === 23\">-->\n                                    <!-- \u0E27\u0E31\u0E19\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 -->\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E14\u0E33\u0E40\u0E19\u0E34\u0E19\u0E01\u0E32\u0E23 :</span>-->\n                                    <!--</div>-->\n                                <!--     <div class=\"col-sm-6\">-->\n                                <!--      <label class=\"control-label\">\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A-\u0E2A\u0E48\u0E07</label>-->\n                                <!--      <input type=\"text\" class=\"form-control m-input\" id=\"dept_name\" [(ngModel)]=\"stepData.dept_name\" formControlName=\"dept_name\">-->\n                                <!--  </div>-->\n                                <!--</div>-->\n                                <!--<br>-->\n                                \n                                \n                                \n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>\n                                        <input type=\"text\" class=\"form-control m-input\" id=\"soc_recv_no\" formControlName=\"soc_recv_no\" [(ngModel)]=\"stepData.soc_recv_no\">\n                                    </div>\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E2A\u0E25\u0E04.</label>\n                                        <soc-date-box [id]=\"'soc_recv_date'\" [(value)]=\"stepData.soc_recv_date\" formControlName=\"soc_recv_date\"></soc-date-box>\n                                    </div>\n                                </div>\n                                <br>\n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E01\u0E2D\u0E04.</label>\n                                        <input type=\"text\" class=\"form-control m-input\" id=\"gtc_recv_no\" [(ngModel)]=\"stepData.gtc_recv_no\" formControlName=\"gtc_recv_no\">\n                                    </div>\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A \u0E01\u0E2D\u0E04.</label>\n                                        <soc-date-box [id]=\"'gtc_recv_date'\" [(value)]=\"stepData.gtc_recv_date\" formControlName=\"gtc_recv_date\"></soc-date-box>\n                                    </div>\n                                </div>\n                                <br>\n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                  <div class=\"col-sm-6\">\n                                      <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D</label>\n                                      <input type=\"text\" class=\"form-control m-input\" id=\"book_no\" [(ngModel)]=\"stepData.book_no\"\n                                      formControlName=\"book_no\">\n                                  </div>\n                                  <div class=\"col-sm-6\">\n                                      <label class=\"control-label\">\u0E25\u0E07\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48</label>\n                                      <soc-date-box [id]=\"'book_date'\" [(value)]=\"stepData.book_date\" formControlName=\"book_date\"></soc-date-box>\n                                      <!-- <input type=\"text\" class=\"form-control m-input\" id=\"book_date\" [(ngModel)]=\"stepData.book_date\"\n                                      formControlName=\"book_date\"> -->\n                                  </div>\n                                </div>\n                                <br>\n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E40\u0E23\u0E35\u0E22\u0E19</label>\n                                        <input type=\"text\" class=\"form-control m-input\" id=\"for\" [(ngModel)]=\"stepData.for\" formControlName=\"for\">\n                                    </div>\n\n                                </div>\n                                <br>\n                                <div class=\"row\" *ngIf=\"stepData.system_id === 23\">\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E01\u0E23\u0E30\u0E17\u0E23\u0E27\u0E07</label>\n                                        <soc-auto-complete-2 [id]=\"'ministry'\"  mode=\"local\"\n                                          [api]=\"'/db/ct_ext_department'\" [acceptCustomValue]=\"false\" field=\"name\" fieldApi=\"id,name,code,type\"\n                                          [filter]=\"'&_where=(type,in,1,9)'\" (valueSelete)=\"valueSeleteMinistry($event)\"\n                                          [(value)]=\"stepData.ministry\" [(ngModel)]=\"stepData.ministry\"\n                                          formControlName=\"ministry\">\n                                        </soc-auto-complete-2>\n                                    </div>\n                                    <div class=\"col-sm-6\">\n                                        <label class=\"control-label\">\u0E01\u0E23\u0E21</label>\n                                        <div *ngIf=\"filter_ref_ext_department_id_show\">\n                                        <soc-auto-complete-2 [acceptCustomValue]=\"false\" [id]=\"'dept_name'\"\n                                          mode=\"local\" [filter]=\"filter_ref_ext_department_id\"\n                                           [api]=\"'/db/ct_ext_department'\" field=\"name\"\n                                          fieldApi=\"id,name,code,type\" [(value)]=\"stepData.dept_name\" (valueSelete)=\"valueSeleteDeptName($event)\"\n                                          [(ngModel)]=\"stepData.dept_name\" [disabled]=\"!filter_ref_ext_department_id\"\n                                          formControlName=\"dept_name\">\n                                        </soc-auto-complete-2>\n                                        </div>\n                                    </div>\n\n                                </div>\n                                <br>\n                                \n                                <!-- \u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38 -->\n                                <div class=\"row\">\n                                    <!--<div class=\"col-sm-3\">-->\n                                        <!--<span>\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38 :</span>-->\n                                    <!--</div>-->\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                                            <textarea class=\"form-control m-input\" id=\"txtRemark\" rows=\"5\" formControlName=\"remark\" [(ngModel)]=\"stepData.remark\"></textarea>\n                                        </div>\n                                    </div>\n                                </div>\n                                <br>\n                                <!-- \u0E40\u0E2D\u0E01\u0E2A\u0E32\u0E23\u0E41\u0E19\u0E1A -->\n                                <div class=\"row\">\n                                    <!--<div class=\"col-sm-3\">-->\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]=\"stepData.system_id\" (uploaded)=\"onUploaded($event)\"></upload-attachment>\n                                        <!--<dx-tab-panel-->\n                                                <!--#tabPanel-->\n                                                <!--[items]=\"upLoadType\"-->\n                                                <!--[selectedIndex]=\"0\"-->\n                                                <!--[loop]=\"false\"-->\n                                                <!--[animationEnabled]=\"false\"-->\n                                                <!--[swipeEnabled]=\"false\"-->\n                                                <!--itemTemplate=\"itemTemplate\"-->\n                                        <!--&gt;-->\n                                            <!--&lt;!&ndash;<div *dxTemplate=\"let type of upLoadType\">&ndash;&gt;-->\n                                                <!--&lt;!&ndash;<span>{{type.name.toUpperCase()}}</span>&ndash;&gt;-->\n                                            <!--&lt;!&ndash;</div>&ndash;&gt;-->\n                                            <!--<div *dxTemplate=\"let item of 'itemTemplate'\">-->\n                                                <!--<div class=\"tabpanel-item\">-->\n                                                    <!--<div *ngIf=\"item.type === 1\">-->\n                                                        <!--<div class=\"col-sm-10\" style=\"text-align: center\">-->\n                                                            <!--<dx-file-uploader selectButtonText=\"\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E44\u0E1F\u0E25\u0E4C\" labelText=\"\" accept=\"*\" uploadMode=\"useForm\" uploadMethod=\"POST\"-->\n                                                                              <!--multiple=\"true\" uploadMode=\"instantly\" labelText=\"\u0E2B\u0E23\u0E37\u0E2D\u0E27\u0E32\u0E07\u0E44\u0E1F\u0E25\u0E4C\u0E17\u0E35\u0E48\u0E19\u0E35\u0E48\" uploadUrl=\"https://filemanager-dot-smartrms-api.appspot.com/api/http/upload\"-->\n                                                            <!--&gt;-->\n                                                            <!--</dx-file-uploader>-->\n                                                        <!--</div>-->\n                                                    <!--</div>-->\n                                                <!--</div>-->\n                                            <!--</div>-->\n                                        <!--</dx-tab-panel>-->\n                                    </div>\n                                </div>\n                                <br>\n                                <!-- field \u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21 -->\n                                <div *ngIf=\"isMore\">\n                                    <div formArrayName=\"moreField\">\n                                        <div *ngFor=\"let field of moreField; let i=index\">\n                                            <div [formGroupName]=\"i\">\n                                                <div class=\"row\">\n                                                    <!--<div class=\"col-sm-3\">-->\n                                                        <!--<span>field.display_name :</span>-->\n                                                    <!--</div>-->\n                                                    <!-- field \u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21 type text -->\n                                                    <div *ngIf=\"field.type === 'text'\">\n                                                        <div class=\"col-sm-12\">\n                                                            <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                <label class=\"control-label\">{{field.display_name}}</label>\n                                                                <input type=\"text\" class=\"form-control m-input\" [id]=\"getFieldId(field)\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n                                                                <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n                                                                    <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                    <!-- field \u0E40\u0E1E\u0E34\u0E48\u0E21\u0E40\u0E15\u0E34\u0E21 type datetime -->\n                                                    <div *ngIf=\"field.type === 'datetime'\">\n\n                                                        <div class=\"col-sm-6\">\n                                                            <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                <label class=\"control-label\">{{field.display_name}}</label>\n                                                                <soc-date-box  [id]=\"getFieldId(field)\" [(value)]=\"stepData[field.field_name]\"></soc-date-box>\n                                                                <!--<div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\" class=\"lable-error\">Date is required</div>-->\n                                                                <!--<div *ngIf=\"getValidateMoreField(i,field.field_name,'date')\" class=\"lable-error\">Date is invalid</div>-->\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                    <div *ngIf=\"field.type === 'number'\">\n                                                        <div class=\"col-sm-4\">\n                                                            <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                <label class=\"control-label\">{{field.display_name}}</label>\n                                                                <div class=\"input-group\">\n                                                                    <input type=\"number\" class=\"form-control m-input\" [id]=\"getFieldId(field)\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n                                                                    <div *ngIf=\"field.field_name === 'remind_date'\" class=\"input-group-addon\"><span>\u0E27\u0E31\u0E19</span></div>\n                                                                </div>\n                                                                <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n                                                                    <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                        <!--<div class=\"col-sm-2\" *ngIf=\"field.field_name === 'remind_date'\">-->\n                                                            <!--<span>\u0E27\u0E31\u0E19</span>-->\n                                                        <!--</div>-->\n                                                    </div>\n                                                    <div *ngIf=\"field.type === 'special'\">\n                                                        <div *ngIf=\"field.field_name === 'term'\">\n\n                                                        </div>\n                                                        <div *ngIf=\"field.field_name === 'amount'\">\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                    <label class=\"control-label\">{{field.display_name}}</label>\n                                                                    <input type=\"number\" class=\"form-control m-input\" [id]=\"getFieldId(field)\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n                                                                    <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n                                                                        <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                                                    </div>\n                                                                </div>\n                                                            </div>\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,'amount_type') }\">\n                                                                    <div class=\"m-radio-inline\">\n                                                                        <label class=\"m-radio\">\n                                                                            <input type=\"radio\" id=\"rdlAmountType1\" name=\"amount_type\" value=\"0\" [formControlName]=\"'amount_type'\" [(ngModel)]=\"stepData['amount_type']\" checked>\n                                                                            \u0E19\u0E31\u0E1A\u0E41\u0E15\u0E48<span></span>\n                                                                        </label>\n                                                                        <label class=\"m-radio\">\n                                                                            <input type=\"radio\" id=\"rdlAmountType2\" name=\"amount_type\" value=\"1\" [formControlName]=\"'amount_type'\" [(ngModel)]=\"stepData['amount_type']\">\n                                                                            \u0E19\u0E31\u0E1A\u0E16\u0E31\u0E14<span></span>\n                                                                        </label>\n                                                                    </div>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                        <div *ngIf=\"field.field_name === 'follow'\">\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,'amount_type') }\">\n                                                                    <label class=\"control-label\">{{field.display_name}}</label>\n                                                                    <div class=\"m-radio-inline\">\n                                                                        <label class=\"m-radio\">\n                                                                            <input type=\"radio\" [id]=\"getFieldId(field) + '1'\" [name]=\"field.field_name\" value=\"\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\" checked>\n                                                                            \u0E17\u0E32\u0E07\u0E01\u0E32\u0E23<span></span>\n                                                                        </label>\n                                                                        <label class=\"m-radio\">\n                                                                            <input type=\"radio\" [id]=\"getFieldId(field) + '2'\" [name]=\"field.field_name\" value=\"\u0E44\u0E21\u0E48\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23\" [formControlName]=\"field.field_name\" [(ngModel)]=\"stepData[field.field_name]\">\n                                                                            \u0E44\u0E21\u0E48\u0E17\u0E32\u0E07\u0E01\u0E32\u0E23<span></span>\n                                                                        </label>\n                                                                    </div>\n                                                                </div>\n                                                            </div>\n                                                            <!--<div class=\"col-sm-3\">-->\n                                                                <!--<span>\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38 :</span>-->\n                                                            <!--</div>-->\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,'follow_remark') }\">\n                                                                    <label class=\"control-label\">\u0E2B\u0E21\u0E32\u0E22\u0E40\u0E2B\u0E15\u0E38</label>\n                                                                    <input type=\"text\" class=\"form-control m-input\" id=\"txtFollowRemark\" [formControlName]=\"'follow_remark'\" [(ngModel)]=\"stepData['follow_remark']\" [disableControl]=\"checkDisable(field)\">\n                                                                    <!--<div *ngIf=\"submitted && getValidateMoreField(i,'follow_remark')\" class=\"invalid-feedback\">-->\n                                                                        <!--<div *ngIf=\"getValidateMoreField(i,'follow_remark','required')\">First Name is required</div>-->\n                                                                    <!--</div>-->\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                        <div *ngIf=\"field.field_name === 'cause'\">\n                                                            <div class=\"col-sm-6\">\n                                                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submitted && getValidateMoreField(i,field.field_name) }\">\n                                                                    <label class=\"control-label\">{{field.display_name}}</label>\n                                                                    <soc-auto-complete id=\"'txtCause'\" mode=\"local\" [orderBy]=\"'name'\" [filter]=\"causeFilter\"\n                                                                                       [api]=\"causeUrl\" field=\"name\" [(value)]=\"stepData['cause']\"></soc-auto-complete>\n                                                                    <div *ngIf=\"submitted && getValidateMoreField(i,field.field_name)\" class=\"invalid-feedback\">\n                                                                        <div *ngIf=\"getValidateMoreField(i,field.field_name,'required')\"><font color=\"red\"> * \u0E01\u0E23\u0E38\u0E13\u0E32\u0E01\u0E23\u0E2D\u0E01</font></div>\n                                                                    </div>\n                                                                </div>\n                                                            </div>\n                                                        </div>\n                                                    </div>\n                                                </div>\n                                            </div>\n                                        </div>\n                                        <br>\n                                    </div>\n                                </div>\n                                <div *ngIf=\"isSend\">\n                                    <div class=\"row\">\n                                        <div class=\"col-sm-3\">\n                                            <span>\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E2A\u0E48\u0E07 :</span>\n                                        </div>\n                                        <div class=\"col-sm-9\">\n                                            <!--<a id=\"btnSendAdd\" (click)=\"sendModal.show()\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Add\"><i class=\"fal fa-plus\"></i></a>-->\n                                            <a id=\"btnSendAdd\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"addSend()\">\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E2A\u0E48\u0E07</a>\n                                        </div>\n                                    </div>\n                                    <br>\n                                    <dx-data-grid #dxDataGridStepSendList class=\"card-list-table\"\n                                                  id=\"gridStepSendList\" noDataText=\"\"\n                                                  (onCellPrepared)=\"onCellPrepared($event)\" [dataSource]=\"sendList\"\n                                                  [wordWrapEnabled]=\"true\"\n                                                  [showBorders]=\"true\">\n                                        <dxi-column caption=\"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\" [allowSorting]=\"false\" cellTemplate=\"cellTemplate\" alignment=\"center\"></dxi-column>\n                                        <dxi-column caption=\"\u0E08\u0E31\u0E14\u0E01\u0E32\u0E23\" [allowSorting]=\"false\" cellTemplate=\"cellTemplateAction\" alignment=\"center\"></dxi-column>\n                                        <dxi-column dataField=\"send_to\" caption=\"\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19\"></dxi-column>\n                                        <dxi-column dataField=\"book_no\" caption=\"\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\"></dxi-column>\n                                        <dxi-column dataField=\"send_date\" caption=\"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\" dataType=\"date\" alignment=\"center\"></dxi-column>\n                                        <dxi-column [calculateCellValue]=\"isImportant\" caption=\"\u0E04\u0E27\u0E32\u0E21\u0E2A\u0E33\u0E04\u0E31\u0E0D\"></dxi-column>\n                                        <div *dxTemplate=\"let data of 'cellTemplate'\">\n                                            {{getRowIndex(data)}}\n                                        </div>\n                                        <div *dxTemplate=\"let data of 'cellTemplateAction'\">\n                                            <a id=\"btnEditSend\" (click)=\"editSend(data.data)\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\u0E41\u0E01\u0E49\u0E44\u0E02\"><i class=\"fal fa-pencil-alt\"></i></a>\n                                        </div>\n                                    </dx-data-grid>\n                                    <br>\n                                </div>\n                                <div *ngIf=\"isRecieve\">\n                                    <div class=\"row\">\n                                        <div class=\"col-sm-3\">\n                                            <span>\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E23\u0E31\u0E1A :</span>\n                                        </div>\n                                        <div class=\"col-sm-9\">\n                                            <!--<a id=\"btnSendAdd\" (click)=\"sendModal.show()\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"Add\"><i class=\"fal fa-plus\"></i></a>-->\n                                            <a id=\"btnRecieveAdd\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"recieveModal.show()\">\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E23\u0E31\u0E1A</a>\n                                        </div>\n                                    </div>\n                                    <br>\n                                    <dx-data-grid #dxDataGridStepRecieveList class=\"card-list-table\"\n                                                  id=\"gridStepRecieveList\" noDataText=\"\"\n                                                  (onCellPrepared)=\"onCellPrepared($event)\" [dataSource]=\"recieveList\"\n                                                  [wordWrapEnabled]=\"true\"\n                                                  [showBorders]=\"true\">\n                                        <dxi-column caption=\"\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E17\u0E35\u0E48\" [allowSorting]=\"false\" cellTemplate=\"cellTemplate\"></dxi-column>\n                                        <dxi-column caption=\"\u0E08\u0E31\u0E14\u0E01\u0E32\u0E23\" [allowSorting]=\"false\" cellTemplate=\"cellTemplateAction\"></dxi-column>\n                                        <dxi-column dataField=\"recv_from\" caption=\"\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19\"></dxi-column>\n                                        <dxi-column dataField=\"send_book_no\" caption=\"\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\"></dxi-column>\n                                        <dxi-column dataField=\"send_date\" caption=\"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01\" dataType=\"date\"></dxi-column>\n                                        <dxi-column dataField=\"book_no\" caption=\"\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\"></dxi-column>\n                                        <dxi-column dataField=\"recv_date\" caption=\"\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A\" dataType=\"date\"></dxi-column>\n                                        <div *dxTemplate=\"let data of 'cellTemplate'\">\n                                            {{getRowIndex(data)}}\n                                        </div>\n                                        <div *dxTemplate=\"let data of 'cellTemplateAction'\">\n                                            <a id=\"btnEditRecieve\" (click)=\"editRecieve(data.data)\" class=\"btn btn-default btn-sm icon\" data-toggle=\"tooltip\" data-placement=\"top\" title=\"\u0E41\u0E01\u0E49\u0E44\u0E02\"><i class=\"fal fa-pencil-alt\"></i></a>\n                                        </div>\n                                    </dx-data-grid>\n                                    <br>\n                                </div>\n                            </div>\n                            <div class=\"m-portlet__foot m-portlet__foot--fit text-right\">\n                                <div class=\"m-form__actions\">\n                                    <button type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">\n                                        \u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\n                                    </button>\n                                    <button type=\"reset\" 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>\n<div class=\"modal fade\" bsModal #sendModal=\"bs-modal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"dialog-static-name2\" [config]=\"{backdrop: 'static'}\">\n    <div class=\"modal-dialog modal-md\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h4 id=\"dialog-static-send\" class=\"modal-title pull-left\"><label>\u0E23\u0E32\u0E22\u0E01\u0E32\u0E23\u0E2A\u0E48\u0E07</label></h4>\n                <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"closeSendModal()\">\n                    <span aria-hidden=\"true\">&times;</span>\n                </button>\n            </div>\n            <div class=\"modal-body\">\n                <form class=\"m-form m-form--state m-form--fit m-form--label-align-right\" [formGroup]=\"sendForm\" (ngSubmit)=\"onSubmitSend()\">\n                    <div class=\"ibox-body\">\n                        <div class=\"row\">\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E2B\u0E19\u0E48\u0E27\u0E22\u0E07\u0E32\u0E19</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedSend && fs().send_to.errors }\">\n                                    <soc-auto-complete [id]=\"'txtSendTo'\" mode=\"local\" [orderBy]=\"'name'\"\n                                                       [api]=\"departmentUrl\" field=\"name\" [(value)]=\"sendData.send_to\"></soc-auto-complete>\n                                    <!--<p-autoComplete type=\"text\" styleClass=\"form-control m-input\" id=\"txtSendTo\" formControlName=\"send_to\" [(ngModel)]=\"sendData.send_to\"-->\n                                                    <!--[suggestions]=\"filteredDepartments\" (completeMethod)=\"filterDepartments($event)\"></p-autoComplete>-->\n                                    <div *ngIf=\"submittedSend && fs().send_to.errors\" class=\"invalid-feedback\">\n                                        <div *ngIf=\"fs().send_to.errors.required\">First Name is required</div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedSend && fs().book_no.errors }\">\n                                    <input type=\"text\" class=\"form-control m-input\" id=\"txtSendBookNo\" formControlName=\"book_no\" [(ngModel)]=\"sendData.book_no\">\n                                    <div *ngIf=\"submittedSend && fs().book_no.errors\" class=\"invalid-feedback\">\n                                        <div *ngIf=\"fs().book_no.errors.required\">First Name is required</div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E2A\u0E48\u0E07\u0E2D\u0E2D\u0E01</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedSend && fs().send_date.errors }\">\n                                    <soc-date-box [id]=\"'txtSendDate'\" [(value)]=\"sendData.send_date\"></soc-date-box>\n                                    <div *ngIf=\"submittedSend && fs().send_date.errors\" >\n                                        <div *ngIf=\"fs().send_date.errors.required\" class=\"lable-error\">Date is required</div>\n                                        <div *ngIf=\"fs().send_date.errors.date\" class=\"lable-error\">Date is invalid</div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"control-label\"></label>\n                                <input type=\"checkbox\" id=\"chkIsImportant\"  name=\"is_important\" formControlName=\"is_important\" [(ngModel)]=\"sendData.is_important\" ng-checked> \u0E2A\u0E33\u0E04\u0E31\u0E0D\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 type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">\n                                \u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\n                            </button>\n                            <button type=\"reset\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"closeSendModal()\">\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 class=\"modal fade\" bsModal #recieveModal=\"bs-modal\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"dialog-static-name2\" [config]=\"{backdrop: 'static'}\">\n    <div class=\"modal-dialog modal-md\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h4 id=\"dialog-static-recieve\" class=\"modal-title pull-left\"><label>\u0E23\u0E31\u0E1A\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D \u0E15\u0E2D\u0E1A\u0E04\u0E27\u0E32\u0E21\u0E40\u0E2B\u0E47\u0E19</label></h4>\n                <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"closeRecieveModal()\">\n                    <span aria-hidden=\"true\">&times;</span>\n                </button>\n            </div>\n            <div class=\"modal-body\">\n                <form class=\"m-form m-form--state m-form--fit m-form--label-align-right\" [formGroup]=\"recieveForm\" (ngSubmit)=\"onSubmitRecieve()\">\n                    <div class=\"ibox-body\">\n                        <div class=\"row\">\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E40\u0E25\u0E02\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A\u0E2B\u0E19\u0E31\u0E07\u0E2A\u0E37\u0E2D</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedRecieve && fr().book_no.errors }\">\n                                    <input type=\"text\" class=\"form-control m-input\" id=\"txtRecieveBookNo\" formControlName=\"book_no\" [(ngModel)]=\"recieveData.book_no\">\n                                    <div *ngIf=\"submittedRecieve && fr().book_no.errors\" class=\"invalid-feedback\">\n                                        <div *ngIf=\"fr().book_no.errors.required\">First Name is required</div>\n                                    </div>\n                                </div>\n                            </div>\n                            <div class=\"form-group\">\n                                <label class=\"control-label\">\u0E27\u0E31\u0E19\u0E17\u0E35\u0E48\u0E23\u0E31\u0E1A</label>\n                                <div class=\"form-group m-form__group\" [ngClass]=\"{ 'has-error': submittedRecieve && fr().recv_date.errors }\">\n                                    <soc-date-box [id]=\"'txtRecieveDate'\" [(value)]=\"recieveData.recv_date\"></soc-date-box>\n                                    <div *ngIf=\"submittedRecieve && fr().recv_date.errors\" >\n                                        <div *ngIf=\"fr().recv_date.errors.required\" class=\"lable-error\">Date is required</div>\n                                        <div *ngIf=\"fr().recv_date.errors.date\" class=\"lable-error\">Date is invalid</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 type=\"submit\" class=\"btn btn-success btn-md btn-md-save\">\n                                \u0E1A\u0E31\u0E19\u0E17\u0E36\u0E01\n                            </button>\n                            <button type=\"reset\" class=\"btn btn-default btn-md btn-md-search\" (click)=\"closeRecieveModal()\">\n                                \u0E22\u0E01\u0E40\u0E25\u0E34\u0E01\n                            </button>\n                        </div>\n                    </div>\n                </form>\n            </div>\n        </div>\n    </div>\n</div>\n<app-alert #myModal (onClickBack)=\"onClickBack()\"></app-alert>\n"
                }] }
    ];
    /** @nocollapse */
    ModalStepComponent.ctorParameters = function () { return [
        { type: AppConfigService },
        { type: Request },
        { type: FormBuilder },
        { type: Common },
        { type: DateService },
        { type: B2bService }
    ]; };
    ModalStepComponent.propDecorators = {
        onUpdateModal: [{ type: Output }],
        modal: [{ type: ViewChild, args: ['modal',] }],
        myModal: [{ type: ViewChild, args: ['myModal',] }],
        sendModal: [{ type: ViewChild, args: ['sendModal',] }],
        recieveModal: [{ type: ViewChild, args: ['recieveModal',] }],
        dxDataGridStepSendList: [{ type: ViewChild, args: ['dxDataGridStepSendList',] }],
        uploadAttachment: [{ type: ViewChild, args: ['uploadAttachment',] }]
    };
    return ModalStepComponent;
}(Options));
export { ModalStepComponent };
if (false) {
    /** @type {?} */
    ModalStepComponent.prototype.onUpdateModal;
    /** @type {?} */
    ModalStepComponent.prototype.modal;
    /** @type {?} */
    ModalStepComponent.prototype.myModal;
    /** @type {?} */
    ModalStepComponent.prototype.sendModal;
    /** @type {?} */
    ModalStepComponent.prototype.recieveModal;
    /** @type {?} */
    ModalStepComponent.prototype.dxDataGridStepSendList;
    /** @type {?} */
    ModalStepComponent.prototype.uploadAttachment;
    /** @type {?} */
    ModalStepComponent.prototype.registerForm;
    /** @type {?} */
    ModalStepComponent.prototype.sendForm;
    /** @type {?} */
    ModalStepComponent.prototype.recieveForm;
    /** @type {?} */
    ModalStepComponent.prototype.submitted;
    /** @type {?} */
    ModalStepComponent.prototype.submittedSend;
    /** @type {?} */
    ModalStepComponent.prototype.submittedRecieve;
    /** @type {?} */
    ModalStepComponent.prototype.title;
    /** @type {?} */
    ModalStepComponent.prototype.selectList;
    /** @type {?} */
    ModalStepComponent.prototype.sendList;
    /** @type {?} */
    ModalStepComponent.prototype.recieveList;
    /** @type {?} */
    ModalStepComponent.prototype.modalConfig;
    /** @type {?} */
    ModalStepComponent.prototype.th;
    /** @type {?} */
    ModalStepComponent.prototype.selectedStep;
    /** @type {?} */
    ModalStepComponent.prototype.isMore;
    /** @type {?} */
    ModalStepComponent.prototype.moreField;
    /** @type {?} */
    ModalStepComponent.prototype.config;
    /** @type {?} */
    ModalStepComponent.prototype.stepData;
    /** @type {?} */
    ModalStepComponent.prototype.sendData;
    /** @type {?} */
    ModalStepComponent.prototype.recieveData;
    /** @type {?} */
    ModalStepComponent.prototype.lastStep;
    /** @type {?} */
    ModalStepComponent.prototype.isSend;
    /** @type {?} */
    ModalStepComponent.prototype.isRecieve;
    /** @type {?} */
    ModalStepComponent.prototype.isEditSend;
    /** @type {?} */
    ModalStepComponent.prototype.isEditRecieve;
    /** @type {?} */
    ModalStepComponent.prototype.tmpData;
    /** @type {?} */
    ModalStepComponent.prototype.filteredDepartments;
    /** @type {?} */
    ModalStepComponent.prototype.departmentList;
    /** @type {?} */
    ModalStepComponent.prototype.departmentUrl;
    /** @type {?} */
    ModalStepComponent.prototype.causeUrl;
    /** @type {?} */
    ModalStepComponent.prototype.causeFilter;
    /** @type {?} */
    ModalStepComponent.prototype.tempId;
    /** @type {?} */
    ModalStepComponent.prototype.attachmentUrl;
    /** @type {?} */
    ModalStepComponent.prototype.system_id;
    /** @type {?} */
    ModalStepComponent.prototype.filter_ref_ext_department_id;
    /** @type {?} */
    ModalStepComponent.prototype.filter_ref_ext_department_id_show;
    /** @type {?} */
    ModalStepComponent.prototype.appConfigService;
    /** @type {?} */
    ModalStepComponent.prototype.request;
    /** @type {?} */
    ModalStepComponent.prototype.formBuilder;
    /** @type {?} */
    ModalStepComponent.prototype.common;
    /** @type {?} */
    ModalStepComponent.prototype.date;
    /** @type {?} */
    ModalStepComponent.prototype.b2bService;
}

//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtc3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9zb2MtYXBwLWxpYnJhcnkvIiwic291cmNlcyI6WyJsaWIvbW9kYWwtc3RlcC9tb2RhbC1zdGVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsWUFBWSxFQUE0QixNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBZSxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUF3QixVQUFVLEVBQWtCLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDJCQUEyQixDQUFDO0FBQ3RELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzNGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUVwRCxJQUFBOzs7a0JBZEE7SUFtQkMsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7SUFNdUMsOENBQU87SUFnRDNDLDRCQUFvQixnQkFBa0MsRUFBVSxPQUFnQixFQUFVLFdBQXdCLEVBQVMsTUFBYyxFQUFTLElBQWlCLEVBQVMsVUFBc0I7UUFBbE0sWUFDSSxpQkFBTyxTQUlWO1FBTG1CLHNCQUFnQixHQUFoQixnQkFBZ0IsQ0FB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LEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFDLEdBQUcsR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7S0FDbEM7Ozs7O0lBQ0QseUNBQVk7Ozs7SUFBWixVQUFhLEtBQUs7UUFDZCxJQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLFdBQVcsRUFBQztZQUMvQyxPQUFPLElBQUksQ0FBQztTQUNmO2FBQUk7WUFDRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtLQUNKOzs7OztJQUVLLHlDQUFZOzs7O0lBQWxCLFVBQW1CLElBQUk7Ozs7OzRCQUNULHFCQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFBOzt3QkFBekQsR0FBRyxHQUFHLFNBQW1EO3dCQUM3RCxzQkFBTyxHQUFHLEVBQUM7Ozs7S0FDZDs7Z0JBamhCSixTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLG0zbERBQTBDO2lCQUM3Qzs7OztnQkF0Qk8sZ0JBQWdCO2dCQUNmLE9BQU87Z0JBRVIsV0FBVztnQkFEWCxNQUFNO2dCQU1OLFdBQVc7Z0JBRVgsVUFBVTs7O2dDQWNiLE1BQU07d0JBRU4sU0FBUyxTQUFDLE9BQU87MEJBQ2pCLFNBQVMsU0FBQyxTQUFTOzRCQUNuQixTQUFTLFNBQUMsV0FBVzsrQkFDckIsU0FBUyxTQUFDLGNBQWM7eUNBQ3hCLFNBQVMsU0FBQyx3QkFBd0I7bUNBRWxDLFNBQVMsU0FBQyxrQkFBa0I7OzZCQWxDakM7RUF5QndDLE9BQU87U0FBbEMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge01vZGFsT3B0aW9ucywgTW9kYWxEaXJlY3RpdmV9IGZyb20gJ25neC1ib290c3RyYXAnO1xuaW1wb3J0IHtBcHBDb25maWdTZXJ2aWNlfSBmcm9tICcuLi9hcHAtY29uZmlnL2FwcC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0IH0gZnJvbSAnLi4vX3NlcnZpY2VzL3JlcXVlc3Quc2VydmljZSc7XG5pbXBvcnQge0NvbW1vbn0gZnJvbSAnLi4vX3NlcnZpY2VzL2NvbW1vbi5zZXJ2aWNlJztcbmltcG9ydCB7Rm9ybUJ1aWxkZXIsIEZvcm1BcnJheSwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzLCBBYnN0cmFjdENvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7Q3VzdG9tVmFsaWRhdG9yc30gZnJvbSAnbmcyLXZhbGlkYXRpb24nO1xuaW1wb3J0IHtEeERhdGFHcmlkQ29tcG9uZW50fSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xuaW1wb3J0ICogYXMgdXVpZCBmcm9tICd1dWlkJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7RGF0ZVNlcnZpY2V9IGZyb20gJy4uL19zZXJ2aWNlcy9kYXRlLnNlcnZpY2UnO1xuaW1wb3J0IHtVcGxvYWRBdHRhY2htZW50Q29tcG9uZW50fSBmcm9tICcuLi91cGxvYWQtYXR0YWNobWVudC91cGxvYWQtYXR0YWNobWVudC5jb21wb25lbnQnO1xuaW1wb3J0IHtCMmJTZXJ2aWNlfSBmcm9tICcuLi9fc2VydmljZXMvYjJiLnNlcnZpY2UnO1xuXG5jbGFzcyBPcHRpb25zIHtcbiAgICAvKiogdGl0bGUg4LiX4Li14LmI4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LmB4Liq4LiU4LiHICovXG4gICAgdGl0bGU/OiBTdHJpbmc7XG4gICAgLyoqIGRhdGEgKi9cbiAgICBkYXRhOiBhbnk7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbW9kYWwtc3RlcCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLXN0ZXAuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbFN0ZXBDb21wb25lbnQgZXh0ZW5kcyBPcHRpb25zIGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBAT3V0cHV0KCkgb25VcGRhdGVNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAvLyBAT3V0cHV0KCkgb25DcmVhdGVNb2RhbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAVmlld0NoaWxkKCdtb2RhbCcpIG1vZGFsOiBNb2RhbERpcmVjdGl2ZTtcbiAgICBAVmlld0NoaWxkKCdteU1vZGFsJykgbXlNb2RhbDtcbiAgICBAVmlld0NoaWxkKCdzZW5kTW9kYWwnKSBzZW5kTW9kYWw6IE1vZGFsRGlyZWN0aXZlO1xuICAgIEBWaWV3Q2hpbGQoJ3JlY2lldmVNb2RhbCcpIHJlY2lldmVNb2RhbDogTW9kYWxEaXJlY3RpdmU7XG4gICAgQFZpZXdDaGlsZCgnZHhEYXRhR3JpZFN0ZXBTZW5kTGlzdCcpXG4gICAgZHhEYXRhR3JpZFN0ZXBTZW5kTGlzdDogRHhEYXRhR3JpZENvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCd1cGxvYWRBdHRhY2htZW50JykgdXBsb2FkQXR0YWNobWVudDogVXBsb2FkQXR0YWNobWVudENvbXBvbmVudDtcblxuICAgIHJlZ2lzdGVyRm9ybTogRm9ybUdyb3VwO1xuICAgIHNlbmRGb3JtOiBGb3JtR3JvdXA7XG4gICAgcmVjaWV2ZUZvcm06IEZvcm1Hcm91cDtcbiAgICBzdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICBzdWJtaXR0ZWRTZW5kID0gZmFsc2U7XG4gICAgc3VibWl0dGVkUmVjaWV2ZSA9IGZhbHNlO1xuICAgIHRpdGxlOiBhbnkgPSAnJztcbiAgICBzZWxlY3RMaXN0OiBhbnkgPSBbXTtcbiAgICBzZW5kTGlzdDogYW55ID0gW107XG4gICAgcmVjaWV2ZUxpc3Q6IGFueSA9IFtdO1xuICAgIG1vZGFsQ29uZmlnOiBNb2RhbE9wdGlvbnMgPSB7XG4gICAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWVcbiAgICB9O1xuICAgIHRoO1xuICAgIHNlbGVjdGVkU3RlcDogYW55ID0gbnVsbDtcbiAgICBpc01vcmUgPSBmYWxzZTtcbiAgICBtb3JlRmllbGQ6IGFueTtcbiAgICBwdWJsaWMgY29uZmlnOiBhbnk7XG4gICAgc3RlcERhdGE6IGFueSA9IHt9O1xuICAgIHNlbmREYXRhOiBhbnkgPSB7fTtcbiAgICByZWNpZXZlRGF0YTogYW55ID0ge307XG4gICAgbGFzdFN0ZXAgPSAnJztcbiAgICBpc1NlbmQgPSBmYWxzZTtcbiAgICBpc1JlY2lldmUgPSBmYWxzZTtcbiAgICBpc0VkaXRTZW5kID0gZmFsc2U7XG4gICAgaXNFZGl0UmVjaWV2ZSA9IGZhbHNlO1xuICAgIHRtcERhdGE6YW55ID0ge307XG4gICAgZmlsdGVyZWREZXBhcnRtZW50czphbnkgPSBbXTtcbiAgICBkZXBhcnRtZW50TGlzdDphbnkgPSBbXTtcbiAgICBkZXBhcnRtZW50VXJsID0gXCIvZGIvY3RfZXh0X2RlcGFydG1lbnRcIjtcbiAgICBjYXVzZVVybCA9IFwiL2RiL2N0X2Ryb3Bkb3duXCI7XG4gICAgY2F1c2VGaWx0ZXIgPSBcInN5c3RlbV9pZCxlcSwyMykkYW5kKGRyb3Bkb3duX3R5cGUsbGlrZSzguYDguKPguLfguYjguK3guIfguKrguYjguIfguITguLfguJlcIjtcbiAgICB0ZW1wSWQgPSAtMTtcbiAgICBhdHRhY2htZW50VXJsO1xuICAgIHN5c3RlbV9pZDtcbiAgICBmaWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkOiBhbnkgPSBmYWxzZTtcbiAgICBmaWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkX3Nob3cgPSB0cnVlO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwQ29uZmlnU2VydmljZTogQXBwQ29uZmlnU2VydmljZSwgcHJpdmF0ZSByZXF1ZXN0OiBSZXF1ZXN0LCBwcml2YXRlIGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlciwgcHVibGljIGNvbW1vbjogQ29tbW9uLCBwdWJsaWMgZGF0ZTogRGF0ZVNlcnZpY2UsIHB1YmxpYyBiMmJTZXJ2aWNlOiBCMmJTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuY29uZmlnID0gYXBwQ29uZmlnU2VydmljZS5nZXRDb25maWcoKTtcbiAgICAgICAgdGhpcy5hdHRhY2htZW50VXJsID0gXy5nZXQodGhpcy5jb25maWcsICdhcGlTZXJ2ZXJzLmFsZnJlc2NvLnVybCcpIHx8IFwiaHR0cHM6Ly8yMDMuMTU0LjMyLjEyNjoyNTg1L2FwaS9tZmVjL0FsZnJlc2NvXCI7XG4gICAgICAgIHRoaXMuc3lzdGVtX2lkID0gXy5nZXQodGhpcy5jb25maWcsICdzeXN0ZW1faWQnKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy50aCA9IHRoaXMuY29tbW9uLmZuTG9jYWxQQ2FsZW5kYXIoJ3RoJyk7XG4gICAgICAgIHRoaXMucmVjaWV2ZUZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGJvb2tfbm86IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgICAgIHJlY3ZfZGF0ZTogWycnXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2VuZEZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIHNlbmRfdG86IFsnJ10sXG4gICAgICAgICAgICBib29rX25vOiBbJyddLFxuICAgICAgICAgICAgc2VuZF9kYXRlOiBbJyddLFxuICAgICAgICAgICAgaXNfaW1wb3J0YW50OiBbJyddLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIG5hbWU6IFsnJ10sXG4gICAgICAgICAgICBzdGVwX2lkOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgICAgICAgc3RlcF9kYXRlOiBbJyddLFxuICAgICAgICAgICAgcmVtYXJrOiBbJyddLFxuICAgICAgICAgICAgbGFzdFN0ZXA6IFsnJ10sXG4gICAgICAgICAgICBtb3JlRmllbGQ6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW10pLFxuICAgICAgICAgICAgc29jX3JlY3Zfbm86IFsnJ10sXG4gICAgICAgICAgICBzb2NfcmVjdl9kYXRlOiBbJyddLFxuICAgICAgICAgICAgZ3RjX3JlY3Zfbm86IFsnJ10sXG4gICAgICAgICAgICBndGNfcmVjdl9kYXRlOiBbJyddLFxuICAgICAgICAgICAgYm9va19ubzogWycnXSxcbiAgICAgICAgICAgIGJvb2tfZGF0ZTogWycnXSxcbiAgICAgICAgICAgICdmb3InOiBbJyddLFxuICAgICAgICAgICAgZGVwdF9uYW1lOiBbJyddLFxuICAgICAgICAgICAgbWluaXN0cnk6IFsnJ11cblxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhc3luYyBvcGVuKG9wdGlvbnM/OiBPcHRpb25zKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnN0ZXBEYXRhID0ge307XG4gICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlID0gb3B0aW9ucy50aXRsZSB8fCAnJztcbiAgICAgICAgICAgIHRoaXMubGFzdFN0ZXAgPSBvcHRpb25zLmRhdGEubGFzdFN0ZXA7XG4gICAgICAgICAgICB0aGlzLnN0ZXBEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb25zLmRhdGEpKTtcbiAgICAgICAgICAgIHRoaXMuc3RlcERhdGEuc3RlcF9kYXRlID0gdGhpcy5kYXRlLmdldE5vdygpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3RlcERhdGFbJ2xhc3RTdGVwJ107XG4gICAgICAgICAgICB0aGlzLnNlbGVjdExpc3QgPSBhd2FpdCB0aGlzLnJlcXVlc3QuZ2V0KCcvZGIvY3Rfc3RlcD9fd2hlcmU9KGNhdGVnb3J5X2lkLGVxLCcgKyBvcHRpb25zLmRhdGEuY2F0ZWdvcnlfaWQgKyAnKSZfc29ydD1zZXFfbm8nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwbG9hZEF0dGFjaG1lbnQuY2xlYXJWYWx1ZSgpO1xuICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICB9XG5cbiAgICBmKCkgeyByZXR1cm4gdGhpcy5yZWdpc3RlckZvcm0uY29udHJvbHM7IH1cbiAgICBmcygpIHsgcmV0dXJuIHRoaXMuc2VuZEZvcm0uY29udHJvbHM7IH1cbiAgICBmcigpIHsgcmV0dXJuIHRoaXMucmVjaWV2ZUZvcm0uY29udHJvbHM7IH1cblxuICAgIGNsb3NlTW9kYWwoKSB7XG4gICAgICAgIHRoaXMuc3VibWl0dGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0TGlzdCA9IFtdO1xuICAgICAgICB0aGlzLnNlbmRMaXN0ID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdGVwID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc01vcmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1NlbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tb3JlRmllbGQgPSBbXTtcbiAgICAgICAgdGhpcy5zdGVwRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLmxhc3RTdGVwID0gJyc7XG4gICAgICAgIHRoaXMubW9kYWwuaGlkZSgpO1xuICAgIH1cblxuICAgIGNsb3NlU2VuZE1vZGFsKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZFNlbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZW5kRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLmlzRWRpdFNlbmQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50bXBEYXRhID0ge307XG4gICAgICAgIHRoaXMuc2VuZE1vZGFsLmhpZGUoKTtcbiAgICB9XG5cbiAgICBjbG9zZVJlY2lldmVNb2RhbCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWRSZWNpZXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVjaWV2ZURhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5pc0VkaXRSZWNpZXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG1wRGF0YSA9IHt9O1xuICAgICAgICB0aGlzLnJlY2lldmVNb2RhbC5oaWRlKCk7XG4gICAgfVxuXG4gICAgb25ZZXNDbGljayhtb2RhbCkge1xuICAgICAgICBtb2RhbC5oaWRlKCk7XG4gICAgfVxuXG4gICAgb25Ob0NsaWNrKG1vZGFsKSB7XG4gICAgICAgIG1vZGFsLmhpZGUoKTtcbiAgICB9XG5cbiAgICBvbkhpZGRlbigkZXZlbnQ6IE1vZGFsRGlyZWN0aXZlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdMT0cgTUVTU0FHRTogTW9kYWxDb25maXJtIC0+IG9uSGlkZGVuIC0+ICRldmVudCcsICRldmVudCk7XG5cbiAgICB9XG4gICAgXG4gICAgdmFsdWVTZWxldGVNaW5pc3RyeSh2YWx1ZSkge1xuICAgICAgdGhpcy5maWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkX3Nob3cgPSBmYWxzZTtcbiAgICAgIGNvbnNvbGUubG9nKCd2YWx1ZScsIHZhbHVlKVxuICAgICAgLy8gdGhpcy5zdGVwRGF0YS5taW5pc3RyeV9pZCA9IHZhbHVlICYmIHZhbHVlLmlkID8gdmFsdWUuaWQgOiBudWxsXG4gICAgICBpZiAodmFsdWUgJiYgdmFsdWUuaWQpIHtcbiAgICAgICAgdGhpcy5zdGVwRGF0YS5kZXB0X25hbWUgPSBudWxsXG4gICAgICAgIHRoaXMuZmlsdGVyX3JlZl9leHRfZGVwYXJ0bWVudF9pZCA9IGAmX3doZXJlPShyZWZfZXh0X2RlcGFydG1lbnRfaWQsZXEsJHt2YWx1ZS5pZH0pJGFuZCh0eXBlLGluLDIsMyw0LDUpYFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5maWx0ZXJfcmVmX2V4dF9kZXBhcnRtZW50X2lkX3Nob3cgPSB0cnVlO1xuICAgICAgfSwgNTApXG5cbiAgICB9XG5cbiAgICB2YWx1ZVNlbGV0ZURlcHROYW1lKHZhbHVlKSB7XG4gICAgICBjb25zb2xlLmxvZygndmFsdWUnLCB2YWx1ZSlcbiAgICAgIHRoaXMuc3RlcERhdGEuY29kZV9kZXB0ID0gdmFsdWUgJiYgdmFsdWUuaWQgPyB2YWx1ZS5pZCA6IG51bGxcbiAgICB9XG5cblxuICAgIGFzeW5jIGNoZWNrRXh0cmFGaWVsZCgpIHtcbiAgICAgICAgdGhpcy5zdGVwRGF0YS5zdGVwX2lkID0gdGhpcy5zZWxlY3RlZFN0ZXAuaWQ7XG4gICAgICAgIHRoaXMuc3RlcERhdGEuc3RlcF9uYW1lID0gdGhpcy5zZWxlY3RlZFN0ZXAubmFtZTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5pc01vcmUpO1xuICAgICAgICB0aGlzLm1vcmVGaWVsZCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFN0ZXAuZmxhZyAmJiB0aGlzLnNlbGVjdGVkU3RlcC5mbGFnICE9PSAnJykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkU3RlcC5mbGFnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmxhZyA9IHRoaXMuc2VsZWN0ZWRTdGVwLmZsYWcuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVGbGFnID0gdGhpcy5zZWxlY3RlZFN0ZXAucmVxdWlyZV9mbGFnID8gdGhpcy5zZWxlY3RlZFN0ZXAucmVxdWlyZV9mbGFnLmNoYXJBdChpKSA6IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY3Rfc3RlcF9mbGFnID0gYXdhaXQgdGhpcy5yZXF1ZXN0LmdldCgnL2RiL2N0X3N0ZXBfZmxhZz9fd2hlcmU9KGZsYWcsZXEsJyArIGZsYWcgKyAnKScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0ZpZWxkID0gY3Rfc3RlcF9mbGFnWzBdO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkRmllbGQobmV3RmllbGQsICtyZXF1aXJlRmxhZyk7XG4gICAgICAgICAgICAgICAgdGhpcy5tb3JlRmllbGQucHVzaChuZXdGaWVsZCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5mKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNNb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaXNTZW5kID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmlzUmVjaWV2ZSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc01vcmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU3RlcC50eXBlX2lkID09PSA4IHx8IHRoaXMuc2VsZWN0ZWRTdGVwLnR5cGVfaWQgPT09IDEzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBhcnRtZW50TGlzdCA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXQoJy9kYi9jdF9leHRfZGVwYXJ0bWVudD9fc29ydD1uYW1lJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZXBhcnRtZW50TGlzdCA9IHRoaXMuZGVwYXJ0bWVudExpc3QubWFwKGEgPT4gYS5uYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1JlY2lldmUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFN0ZXAudHlwZV9pZCA9PT0gOSB8fCB0aGlzLnNlbGVjdGVkU3RlcC50eXBlX2lkID09PSAxNCkge1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnJlcXVlc3QucG9zdCgnL3NxbC9nZXRMYXN0U2VuZCcsIHRoaXMuc3RlcERhdGEpO1xuICAgICAgICAgICAgLy8gICAgIGlmIChkYXRhLnJlc3VsdERhdGEgJiYgZGF0YS5yZXN1bHREYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY29uc3QgY3Rfc3RlcF9kYXRhX2lkID0gZGF0YS5yZXN1bHREYXRhWzBdLmlkO1xuICAgICAgICAgICAgLy8gICAgICAgICBjb25zdCBjdF9zZW5kTGlzdCA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXQoJy9kYi9jdF9zZW5kP193aGVyZT0oY3Rfc3RlcF9kYXRhX2lkLGVxLCcgKyBjdF9zdGVwX2RhdGFfaWQgKyAnKScpO1xuICAgICAgICAgICAgLy8gICAgICAgICBmb3IgKGNvbnN0IGN0X3NlbmQgb2YgY3Rfc2VuZExpc3QpIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IHJlY3ZEYXRhOiBhbnkgPSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgY3Rfc2VuZF9pZDogY3Rfc2VuZC5pZCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBzZW5kX2Jvb2tfbm86IGN0X3NlbmQuYm9va19ubyxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBzZW5kX2RhdGU6IGN0X3NlbmQuc2VuZF9kYXRlLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHJlY3ZfZnJvbTogY3Rfc2VuZC5zZW5kX3RvLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIG5hbWU6IGN0X3NlbmQubmFtZVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIHRoaXMucmVjaWV2ZUxpc3QucHVzaChyZWN2RGF0YSk7XG4gICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5pc1JlY2lldmUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gICAgIHRoaXMuaXNTZW5kID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNTZW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1JlY2lldmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEZpZWxkSWQoZGF0YSkge1xuICAgICAgICBsZXQgaWQgPSAnJztcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBpZCArPSAndHh0JztcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdkYXRldGltZScpIHtcbiAgICAgICAgICAgIGlkICs9ICd0eHQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWQgKz0gJ3R4dCc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmllbGQgPSBkYXRhLmZpZWxkX25hbWUuY2hhckF0KDApLnRvTG9jYWxlVXBwZXJDYXNlKCkgKyBkYXRhLmZpZWxkX25hbWUuc3Vic3RyaW5nKDEpO1xuICAgICAgICBpZCArPSBmaWVsZDtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIGFkZEZpZWxkKGRhdGEsIHJlcXVpcmVkKSB7XG4gICAgICAgIGxldCBjb250cm9sOmFueSA9IDxGb3JtQXJyYXk+dGhpcy5yZWdpc3RlckZvcm0uY29udHJvbHNbJ21vcmVGaWVsZCddO1xuICAgICAgICBsZXQgbmV3Z3JvdXA7XG4gICAgICAgIHRoaXMuc3RlcERhdGFbZGF0YS5maWVsZF9uYW1lXSA9IG51bGw7XG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdO1xuICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnXTtcbiAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIGdyb3VwW2RhdGEuZmllbGRfbmFtZV0gPSBbJycsVmFsaWRhdG9ycy5yZXF1aXJlZCwgQ3VzdG9tVmFsaWRhdG9ycy5kYXRlXTtcbiAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RlcERhdGFbZGF0YS5maWVsZF9uYW1lXSA9IHRoaXMuZGF0ZS5nZXROb3coKTtcbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFtWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdzcGVjaWFsJyl7XG4gICAgICAgICAgICBpZihkYXRhLmZpZWxkX25hbWUgPT09ICdhbW91bnQnKXtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbJ2Ftb3VudF90eXBlJ10gPSBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdO1xuICAgICAgICAgICAgICAgICAgICBuZXdncm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoZ3JvdXApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwWydhbW91bnRfdHlwZSddID0gWycnXTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ZWxzZSBpZihkYXRhLmZpZWxkX25hbWUgPT09ICdmb2xsb3cnKXtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbJ2ZvbGxvd19yZW1hcmsnXSA9IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnXTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbJ2ZvbGxvd19yZW1hcmsnXSA9IFsnJ107XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBbZGF0YS5maWVsZF9uYW1lXSA9IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF07XG4gICAgICAgICAgICAgICAgICAgIG5ld2dyb3VwID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cChncm91cCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXA6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBncm91cFtkYXRhLmZpZWxkX25hbWVdID0gWycnXTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Z3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKGdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250cm9sLnB1c2gobmV3Z3JvdXApO1xuICAgIH1cblxuICAgIGdldFZhbGlkYXRlTW9yZUZpZWxkKGksIGZpZWxkLCB2YWxpZGF0ZVR5cGU/KSB7XG4gICAgICAgIGxldCBmb3JtTW9yZUZpZWxkOiBhbnkgPSB0aGlzLmYoKVsnbW9yZUZpZWxkJ107XG4gICAgICAgIGlmICh2YWxpZGF0ZVR5cGUpIHtcbiAgICAgICAgICAgIGZvcm1Nb3JlRmllbGQgPSBmb3JtTW9yZUZpZWxkLmNvbnRyb2xzW2ldO1xuICAgICAgICAgICAgZm9ybU1vcmVGaWVsZCA9IGZvcm1Nb3JlRmllbGQuY29udHJvbHNbZmllbGRdO1xuICAgICAgICAgICAgaWYgKGZvcm1Nb3JlRmllbGQuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1Nb3JlRmllbGQuZXJyb3JzW3ZhbGlkYXRlVHlwZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtTW9yZUZpZWxkLmVycm9ycztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtTW9yZUZpZWxkLmVycm9ycztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFJvd0luZGV4KGRhdGEpIHtcbiAgICAgICAgaWYgKCFkYXRhLmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBubyA9IGRhdGEucm93LmRhdGFJbmRleCArIDE7XG4gICAgICAgIHJldHVybiBubztcbiAgICB9XG5cbiAgICBvbkNlbGxQcmVwYXJlZChlKSB7XG4gICAgICAgIGlmIChlLnJvd1R5cGUgPT09ICdkYXRhJykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIGUuY29tcG9uZW50LmNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5jb2x1bW4uZGF0YUZpZWxkID09PSBlLmNvbXBvbmVudC5jb2x1bW5zW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGUuY2VsbEVsZW1lbnQuYWNjZXNzS2V5ID0gZS5jb21wb25lbnQuY29sdW1uc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRTZW5kKCl7XG4gICAgICAgIHRoaXMuc2VuZERhdGEuc2VuZF9kYXRlID0gdGhpcy5kYXRlLmdldE5vdygpO1xuICAgICAgICB0aGlzLnNlbmRNb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgZWRpdFNlbmQoZGF0YSkge1xuICAgICAgICB0aGlzLnRtcERhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnNlbmREYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgIC8vIHRoaXMuc2VuZERhdGEuc2VuZF9kYXRlID0gbmV3IERhdGUodGhpcy5zZW5kRGF0YS5zZW5kX2RhdGUpO1xuICAgICAgICB0aGlzLmlzRWRpdFNlbmQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlbmRNb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgZWRpdFJlY2lldmUoZGF0YSkge1xuICAgICAgICB0aGlzLnRtcERhdGEgPSBkYXRhO1xuICAgICAgICB0aGlzLnJlY2lldmVEYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkYXRhKSk7XG4gICAgICAgIHRoaXMucmVjaWV2ZURhdGEucmVjdl9kYXRlID0gdGhpcy5yZWNpZXZlRGF0YS5yZWN2X2RhdGUgPyBuZXcgRGF0ZSh0aGlzLnJlY2lldmVEYXRhLnJlY3ZfZGF0ZSkgOiB0aGlzLnJlY2lldmVEYXRhLnJlY3ZfZGF0ZTtcbiAgICAgICAgdGhpcy5pc0VkaXRSZWNpZXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWNpZXZlTW9kYWwuc2hvdygpO1xuICAgIH1cblxuICAgIGZpbHRlckRlcGFydG1lbnRzKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGVwYXJ0bWVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcGFydG1lbnQgPSB0aGlzLmRlcGFydG1lbnRMaXN0W2ldO1xuICAgICAgICAgICAgaWYgKGRlcGFydG1lbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKGV2ZW50LnF1ZXJ5LnRvTG93ZXJDYXNlKCkpID09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkRGVwYXJ0bWVudHMucHVzaChkZXBhcnRtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIG9uU3VibWl0KCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIC8vIOC4luC5ieC4siBmb3JtIOC5hOC4oeC5iOC4hOC4o+C4muC4q+C4o+C4t+C4reC4nOC4tOC4lOC4leC4suC4oeC5gOC4h+C4t+C5iOC4reC4meC5hOC4guC4l+C4teC5iOC4leC4seC5ieC4h+C5hOC4p+C5ieC4iOC4sOC4iOC4muC4l+C4teC5iOC4leC4o+C4h+C4meC4teC5iVxuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5yZWdpc3RlckZvcm0uaW52YWxpZDogJywgdGhpcy5yZWdpc3RlckZvcm0uaW52YWxpZCk7XG4gICAgICAgIGlmICh0aGlzLnJlZ2lzdGVyRm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvc3REYXRhID0gW107XG4gICAgICAgIGxldCBkYXRhID0gXy5jbG9uZURlZXAodGhpcy5zdGVwRGF0YSk7XG4gICAgICAgIGRhdGEuYWN0aW9uID0gXCJhZGRcIjtcbiAgICAgICAgbGV0IHVzZXJEYXRhOmFueSA9IHRoaXMuYjJiU2VydmljZS5nZXRWZXJpZnlUb2tlbigpO1xuICAgICAgICBkYXRhLnVzZXJuYW1lID0gdXNlckRhdGEudXNlcm5hbWU7XG4gICAgICAgIGlmKGRhdGEucmVtaW5kX2RhdGUpIGRhdGEucmVtaW5kX2RhdGUgPSB0aGlzLmRhdGUuZ2V0Tm93KCkuYWRkKGRhdGEucmVtaW5kX2RhdGUsICdkJykudG9EYXRlKCk7XG4gICAgICAgIGRlbGV0ZSBkYXRhW1wiY3RfbWFpbl9pZFwiXTtcbiAgICAgICAgZGVsZXRlIGRhdGFbXCJ1cGRhdGVfZGF0ZVwiXTtcbiAgICAgICAgbGV0IG1haW4gPSB7XG4gICAgICAgICAgICBcImN0X3N0ZXBfZGF0YVwiOltkYXRhXVxuICAgICAgICB9XG4gICAgICAgIHBvc3REYXRhLnB1c2gobWFpbik7XG4gICAgICAgIGlmKHRoaXMuc2VuZExpc3QgJiYgdGhpcy5zZW5kTGlzdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIGxldCBjdF9zZW5kID0ge1xuICAgICAgICAgICAgICAgIFwiY3Rfc2VuZFwiOltdXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGN0X3JlY2lldmUgPSB7XG4gICAgICAgICAgICAgICAgXCJjdF9yZWNpZXZlXCI6W11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IobGV0IGRhdGEgb2YgdGhpcy5zZW5kTGlzdCl7XG4gICAgICAgICAgICAgICAgZGF0YS5uYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgIGRhdGEuYWN0aW9uID0gXCJhZGRcIjtcbiAgICAgICAgICAgICAgICBkZWxldGUgZGF0YS5pZDtcbiAgICAgICAgICAgICAgICBjdF9zZW5kLmN0X3NlbmQucHVzaChkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc3REYXRhLnB1c2goY3Rfc2VuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5yZWNpZXZlTGlzdCAmJiB0aGlzLnJlY2lldmVMaXN0Lmxlbmd0aCA+IDApe1xuICAgICAgICAgICAgbGV0IGN0X3JlY2lldmUgPSB7XG4gICAgICAgICAgICAgICAgXCJjdF9yZWNpZXZlXCI6W11cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IobGV0IGRhdGEgb2YgdGhpcy5yZWNpZXZlTGlzdCl7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGRhdGFbJ3NlbmRfYm9va19ubyddO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhWydzZW5kX2RhdGUnXTtcbiAgICAgICAgICAgICAgICBkYXRhLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgICAgICAgICAgICAgZGF0YS5hY3Rpb24gPSBcImFkZFwiO1xuICAgICAgICAgICAgICAgIGN0X3JlY2lldmUuY3RfcmVjaWV2ZS5wdXNoKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9zdERhdGEucHVzaChjdF9yZWNpZXZlKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZygncG9zdERhdGEnLHBvc3REYXRhKTtcbiAgICAgICAgLy8gaWYodGhpcy5tb2RlID09PSAnRURJVCcpe1xuICAgICAgICBsZXQgcG9zdFJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0LnBvc3QoXCIvY3QvbWFpblwiLHBvc3REYXRhKTtcbiAgICAgICAgaWYodGhpcy5zdGVwRGF0YS51cGRhdGVfZGF0ZSl7XG4gICAgICAgICAgbGV0IHN0ZXBMaXN0ID0gYXdhaXQgdGhpcy5nZXRTdGVwTGlzdCgpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwic3RlcExpc3RcIixzdGVwTGlzdClcbiAgICAgICAgICBpZihzdGVwTGlzdC5sZW5ndGggPiAwKXtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVxdWVzdC5wdXQoXCIvZGIvXCIrdGhpcy5zdGVwRGF0YS5yZWZfdGFibGUrXCIvXCIrdGhpcy5zdGVwRGF0YS5yZWZfaWQse3N0YXR1czpzdGVwTGlzdFswXS5zdGVwX25hbWUsc3RhdHVzX2RhdGU6c3RlcExpc3RbMF0uc3RlcF9kYXRlfSk7XG4gICAgICAgICAgICB0aGlzLmNvbW1vbi5mbkNoZWNrUmVzcG9uc2UocG9zdFJlc3BvbnNlLCB0aGlzLm15TW9kYWwpXG4gICAgICAgICAgfVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlcXVlc3QucHV0KFwiL2RiL1wiK3RoaXMuc3RlcERhdGEucmVmX3RhYmxlK1wiL1wiK3RoaXMuc3RlcERhdGEucmVmX2lkLHtzdGF0dXM6dGhpcy5zdGVwRGF0YS5zdGVwX25hbWV9KTtcbiAgICAgICAgICB0aGlzLmNvbW1vbi5mbkNoZWNrUmVzcG9uc2UocG9zdFJlc3BvbnNlLCB0aGlzLm15TW9kYWwpXG4gICAgICAgIH1cblxuICAgICAgICAvLyB9ZWxzZXtcbiAgICAgICAgLy8gICAgIHRoaXMub25DcmVhdGVNb2RhbC5lbWl0KHBvc3REYXRhKTtcbiAgICAgICAgLy8gfVxuICAgIH1cblxuICAgIGFzeW5jIGdldFN0ZXBMaXN0KCkge1xuICAgICAgICBjb25zb2xlLmxvZygnZ2V0U3RlcExpc3QnKTtcbiAgICAgICAgbGV0IGZpbHRlciA9IHtcbiAgICAgICAgICAgIGZpbHRlcjp7XG4gICAgICAgICAgICAgICAgcmVmX3RhYmxlOlwiPVwiK3RoaXMuc3RlcERhdGEucmVmX3RhYmxlLFxuICAgICAgICAgICAgICAgIHJlZl9pZDp0aGlzLnN0ZXBEYXRhLnJlZl9pZCxcbiAgICAgICAgICAgICAgICBzeXN0ZW1faWQ6dGhpcy5zdGVwRGF0YS5zeXN0ZW1faWRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcmRlcl9ieTpbXCJzdGVwX2RhdGUgZGVzY1wiXVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLnJlcXVlc3QucG9zdCgnL3NlYXJjaC9jdF9zdGVwX2RhdGEnLCBmaWx0ZXIpO1xuICAgICAgICByZXR1cm4gZGF0YS5yZXN1bHREYXRhIHx8IFtdO1xuICAgIH1cblxuXG4gICAgb25DbGlja0JhY2soKXtcbiAgICAgICAgdGhpcy5vblVwZGF0ZU1vZGFsLmVtaXQoKTtcbiAgICAgICAgdGhpcy5jbG9zZU1vZGFsKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25TdWJtaXRTZW5kKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZFNlbmQgPSB0cnVlO1xuICAgICAgICAvLyDguJbguYnguLIgZm9ybSDguYTguKHguYjguITguKPguJrguKvguKPguLfguK3guJzguLTguJTguJXguLLguKHguYDguIfguLfguYjguK3guJnguYTguILguJfguLXguYjguJXguLHguYnguIfguYTguKfguYnguIjguLDguIjguJrguJfguLXguYjguJXguKPguIfguJnguLXguYlcbiAgICAgICAgaWYgKHRoaXMuc2VuZEZvcm0uaW52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRWRpdFNlbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHRtcExpc3QgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdG1wU2VuZCBvZiB0aGlzLnNlbmRMaXN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRtcFNlbmQuaWQgPT09IHRoaXMudG1wRGF0YS5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0bXBMaXN0LnB1c2godGhpcy5zZW5kRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wTGlzdC5wdXNoKHRtcFNlbmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2VuZExpc3QgPSB0bXBMaXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZW5kRGF0YS5pZCA9IHRoaXMudGVtcElkO1xuICAgICAgICAgICAgdGhpcy50ZW1wSWQtLTtcbiAgICAgICAgICAgIHRoaXMuc2VuZExpc3QucHVzaCh0aGlzLnNlbmREYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlU2VuZE1vZGFsKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25TdWJtaXRSZWNpZXZlKCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZFNlbmQgPSB0cnVlO1xuXG4gICAgICAgIC8vIOC4luC5ieC4siBmb3JtIOC5hOC4oeC5iOC4hOC4o+C4muC4q+C4o+C4t+C4reC4nOC4tOC4lOC4leC4suC4oeC5gOC4h+C4t+C5iOC4reC4meC5hOC4guC4l+C4teC5iOC4leC4seC5ieC4h+C5hOC4p+C5ieC4iOC4sOC4iOC4muC4l+C4teC5iOC4leC4o+C4h+C4meC4teC5iVxuICAgICAgICBpZiAodGhpcy5yZWNpZXZlRm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0UmVjaWV2ZSkge1xuICAgICAgICAgICAgY29uc3QgdG1wTGlzdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0bXBTZW5kIG9mIHRoaXMucmVjaWV2ZUxpc3QpIHtcbiAgICAgICAgICAgICAgICBpZiAodG1wU2VuZC5yZWN2X2Zyb20gPT09IHRoaXMudG1wRGF0YS5yZWN2X2Zyb20pIHtcbiAgICAgICAgICAgICAgICAgICAgdG1wTGlzdC5wdXNoKHRoaXMucmVjaWV2ZURhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRtcExpc3QucHVzaCh0bXBTZW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlY2lldmVMaXN0ID0gdG1wTGlzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVjaWV2ZUxpc3QucHVzaCh0aGlzLnJlY2lldmVEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlUmVjaWV2ZU1vZGFsKCk7XG4gICAgfVxuICAgIGlzSW1wb3J0YW50KGRhdGEpe1xuICAgICAgICByZXR1cm4gZGF0YS5pc19pbXBvcnRhbnQ/XCLguKrguLPguITguLHguI1cIjpcIlwiO1xuICAgIH1cbiAgICBvblVwbG9hZGVkKGRhdGEpe1xuICAgICAgICB0aGlzLnN0ZXBEYXRhLnVybCA9IHRoaXMuYXR0YWNobWVudFVybCsnLycrZGF0YS51dWlkO1xuICAgICAgICB0aGlzLnN0ZXBEYXRhLnV1aWQgPSBkYXRhLnV1aWQ7XG4gICAgfVxuICAgIGNoZWNrRGlzYWJsZShmaWVsZCl7XG4gICAgICAgIGlmKHRoaXMuc3RlcERhdGFbZmllbGQuZmllbGRfbmFtZV0gIT09ICfguYTguKHguYjguJfguLLguIfguIHguLLguKMnKXtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldEltYWdlTGluayhkYXRhKXtcbiAgICAgICAgbGV0IHVybCA9IGF3YWl0IHRoaXMucmVxdWVzdC5nZXRBdHRhY2htZW50TGlua1Rva2VuKGRhdGEudXJsKTtcbiAgICAgICAgcmV0dXJuIHVybDtcbiAgICB9XG59XG4iXX0=