Sanakey
2021-06-11 9d34611fb7fa331f0e28867064edd5f7e0c06f22
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
"use strict";
var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
Object.defineProperty(exports, "__esModule", { value: true });
var myValidator_1 = require("../../utils/myValidator");
var validatorInstance;
Page({
    data: {
        autosize: { maxHeight: 120, minHeight: 50 },
        validatorInstance: {},
        freeId: 0,
        formId: 710804,
        formData: {},
        doccode: '',
        fromPage: '',
        delivery: {},
        feeRateForPay: 1,
        sellerUnCheckedNames: '',
        coverImageUrl: '',
        isShowDialog: false
    },
    onLoad: function (options) {
        var doccode = options.doccode || '';
        var fromPage = options.fromPage || '';
        var settings = wx.globalData.settings;
        this.setData({
            fileUploadUrl: "/shopping/panicBuying.do?m=uploadAttachment&formid=" + this.data.formId,
            doccode: doccode,
            fromPage: fromPage,
            feeRateForPay: (settings.feeRateForWxPay + settings.platformOperatorCommissionRatio) * 100
        });
        if (doccode) {
            this.getSaveData();
        }
        else {
            var storeEdit = this.selectComponent('#store-edit');
            storeEdit.getStoreList();
        }
    },
    getSaveData: function () {
        return __awaiter(this, void 0, void 0, function () {
            var doccode, _a, error, result, data, formData;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        doccode = this.data.doccode;
                        return [4, wx.$utils.to(wx.$http.request({
                                url: "/shopping/panicBuying.do?m=getPanicBuyingDetail",
                                data: {
                                    doccode: doccode,
                                    isEdit: true,
                                    RefOpenId: wx.globalData.OpenId
                                }
                            }))];
                    case 1:
                        _a = _b.sent(), error = _a[0], result = _a[1];
                        if (error) {
                            console.log(error);
                            return [2];
                        }
                        console.log(result);
                        data = result.list[0];
                        formData = {
                            promotionsTitle: data.title,
                            originalPrice: data.originalPrice,
                            flashSalePrice: data.salesPrice,
                            flashSaleTotal: data.numberOfTeam,
                            promotionDescription: data.description,
                            startTime: data.effectiveStartDate,
                            endTime: data.effectiveEndDate,
                            coverImageList: (data.coverImageUrl && this.getCoverImageList(data)) || [],
                            imagesList: data.imagesUrl,
                            coverImage: data.coverImage,
                            images: data.images,
                            freeId: data.freeId,
                        };
                        this.setData(__assign({}, formData, { coverImageUrl: data.coverImageUrl, sellerList: result.sellerList, storeList: result.storeList, status: data.panicBuyingStatus, delivery: {
                                freeId: data.freeId,
                                freeName: data.freeName,
                                isRequiredAddress: data.isRequiredAddress,
                                transCosts: data.transCosts,
                            } }));
                        console.log('配送数据。。。', this.data.delivery);
                        wx.setNavigationBarTitle({
                            title: data.title
                        });
                        return [2];
                }
            });
        });
    },
    getCoverImageList: function (data) {
        var _a = data.coverImage.split(";"), unid = _a[0], seq = _a[1];
        return [{
                url: data.coverImageUrl || '',
                unid: unid,
                seq: seq
            }];
    },
    onReady: function () {
        this.initValidator();
    },
    selectedStartTime: function (event) {
        console.log('开始', event);
        this.setData({
            startTime: event.detail.startTime,
        });
    },
    selectedEndTime: function (event) {
        console.log('结束', event);
        this.setData({
            endTime: event.detail.endTime,
        });
    },
    getDeliveryMethod: function (event) {
        console.log(event.detail);
        this.setData({
            freeId: event.detail.freeId,
        });
        console.log('this.data.freeId;', this.data.freeId);
    },
    checkPromotionsTitle: function (e) {
        var value = e.detail.value;
        console.log(e);
        validatorInstance.checkField('promotionsTitle', value);
        this.setData({
            promotionsTitle: value.trim()
        });
    },
    checkOriginalPrice: function (e) {
        var value = e.detail.value;
        console.log(e);
        validatorInstance.checkField('originalPrice', value);
        this.setData({
            originalPrice: value.trim()
        });
    },
    checkFlashSalePrice: function (e) {
        var value = e.detail.value;
        console.log(e);
        validatorInstance.checkField('flashSalePrice', value);
        this.setData({
            flashSalePrice: value.trim()
        });
    },
    checkFlashSaleTotal: function (e) {
        var value = e.detail.value;
        console.log(e);
        validatorInstance.checkField('flashSaleTotal', value);
        this.setData({
            flashSaleTotal: value.trim()
        });
    },
    checkPromotionDescription: function (e) {
        var value = e.detail.value;
        console.log(e);
        validatorInstance.checkField('promotionDescription', value);
        this.setData({
            promotionDescription: value.trim()
        });
    },
    postFormData: function (data) {
        return __awaiter(this, void 0, void 0, function () {
            var _a, error, res;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0: return [4, wx.$utils.to(wx.$http.request({
                            url: '/shopping/panicBuying.do?m=saveDocCode',
                            data: data,
                            method: 'POST'
                        }))];
                    case 1:
                        _a = _b.sent(), error = _a[0], res = _a[1];
                        if (error) {
                            console.log(error);
                            return [2, false];
                        }
                        console.log(res);
                        if (res.state === 'success') {
                            wx.showToast({
                                title: '成功',
                                duration: 2000
                            });
                            this.setData({
                                doccode: res.DocCode
                            });
                        }
                        if (res.state === 'failed' && res.sellerCheckedBalance > 0) {
                            this.setData({
                                sellerUnCheckedNames: res.sellerUnCheckedNames,
                                isShowDialog: true
                            });
                        }
                        return [2, res.state === 'success'];
                }
            });
        });
    },
    onSubmit: function () {
        return __awaiter(this, void 0, void 0, function () {
            var timeQuantum, sellerEdit, storeEdit, fileUploader, fileUploaderMultiple, deliveryMethod, checkTransCosts, transCosts, checkStartTime, checkEndTime, checkCoverImage, checkAllData, sellerList, storeList, checkDefaultSeller, checkArr, data, coverImage, coverImageUrl, images, formData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        timeQuantum = this.selectComponent('#time-quantum');
                        sellerEdit = this.selectComponent('#seller-edit');
                        storeEdit = this.selectComponent('#store-edit');
                        fileUploader = this.selectComponent('#file-uploader');
                        fileUploaderMultiple = this.selectComponent('#file-uploader-multiple');
                        deliveryMethod = this.selectComponent('#delivery-method');
                        checkTransCosts = true;
                        transCosts = 0;
                        if (deliveryMethod.data.isRequiredAddress) {
                            checkTransCosts = deliveryMethod.checkFields();
                            transCosts = Number(deliveryMethod.data.transCosts);
                        }
                        console.log('sellerEdit');
                        console.log(timeQuantum);
                        checkStartTime = timeQuantum.checkTime("startTime", "请选择计划开始时间");
                        checkEndTime = timeQuantum.checkTime("endTime", "请选择计划结束时间");
                        checkCoverImage = fileUploader.checkImages("coverImage", "请上传一张封面图");
                        checkAllData = validatorInstance.checkAllData();
                        sellerList = sellerEdit.getSellerList();
                        if (sellerList.length < 1) {
                            wx.showToast({
                                title: '请选择营销人员',
                                icon: 'none',
                                duration: 2000
                            });
                            return [2];
                        }
                        storeList = storeEdit.getSelectedStoreIdList();
                        console.log('待提交的门店id', storeList);
                        checkDefaultSeller = sellerEdit.checkDefaultSeller();
                        if (!checkDefaultSeller) {
                            wx.showToast({
                                title: '请选择默认营销人员',
                                icon: 'none',
                                duration: 2000
                            });
                            return [2];
                        }
                        console.log('checkDefaultSeller', checkDefaultSeller);
                        checkArr = [checkTransCosts, checkStartTime, checkEndTime, checkCoverImage, checkAllData];
                        data = {};
                        if (!checkArr.every(function (item) {
                            return item;
                        })) return [3, 2];
                        console.log('....提交成功');
                        coverImage = fileUploader.getCoverImageUnid();
                        coverImageUrl = fileUploader.getImgList()[0].url || '';
                        this.setData({
                            coverImageUrl: coverImageUrl
                        });
                        images = fileUploaderMultiple.getImagesUnid();
                        console.log(coverImage, images);
                        formData = this.data;
                        data = {
                            docCode: formData.doccode,
                            formId: formData.formId,
                            docStatus: 100,
                            coverImage: coverImage,
                            images: images,
                            transCosts: transCosts,
                            effectiveStartDate: formData.startTime,
                            effectiveEndDate: formData.endTime,
                            freeId: formData.freeId,
                            title: formData.promotionsTitle,
                            originalPrice: Number(formData.originalPrice),
                            salesPrice: Number(formData.flashSalePrice),
                            numberOfTeam: Number(formData.flashSaleTotal),
                            description: formData.promotionDescription,
                            storeList: storeList,
                            sellerList: sellerList,
                        };
                        console.log('待发布数据', data);
                        return [4, this.postFormData(data)];
                    case 1:
                        if (!(_a.sent()))
                            return [2];
                        if (this.data.fromPage == 'edit') {
                            wx.navigateBack();
                        }
                        else {
                            wx.redirectTo({
                                url: '../promotionsManageList/promotionsManageList?tab=3'
                            });
                        }
                        return [3, 3];
                    case 2:
                        wx.showToast({
                            title: '页面还有错误未处理',
                            icon: 'none',
                            duration: 2000
                        });
                        console.log('还有错误未处理');
                        _a.label = 3;
                    case 3: return [2];
                }
            });
        });
    },
    onSave: function () {
        var sellerEdit = this.selectComponent('#seller-edit');
        var sellerList = sellerEdit.getSellerList();
        var storeEdit = this.selectComponent('#store-edit');
        var storeList = storeEdit.getSelectedStoreIdList();
        console.log('待提交的门店id', storeList);
        var fileUploader = this.selectComponent('#file-uploader');
        var fileUploaderMultiple = this.selectComponent('#file-uploader-multiple');
        console.log('....提交成功');
        var coverImage = fileUploader.getCoverImageUnid();
        var images = fileUploaderMultiple.getImagesUnid();
        var deliveryMethod = this.selectComponent('#delivery-method');
        var transCosts = 0;
        if (deliveryMethod.data.isRequiredAddress) {
            transCosts = Number(deliveryMethod.data.transCosts);
        }
        console.log(coverImage, images);
        var formData = this.data;
        var data = {
            docCode: formData.doccode,
            formId: formData.formId,
            docStatus: 0,
            coverImage: coverImage,
            images: images,
            transCosts: transCosts,
            effectiveStartDate: formData.startTime,
            effectiveEndDate: formData.endTime,
            freeId: formData.freeId,
            title: formData.promotionsTitle,
            originalPrice: Number(formData.originalPrice) || 0,
            salesPrice: Number(formData.flashSalePrice) || 0,
            numberOfTeam: Number(formData.flashSaleTotal) || 0,
            description: formData.promotionDescription,
            storeList: storeList,
            sellerList: sellerList,
        };
        console.log('待保存数据', data);
        this.postFormData(data);
    },
    initValidator: function () {
        validatorInstance = new myValidator_1.default({
            rules: {
                promotionsTitle: {
                    required: true,
                    rangelength: [3, 14]
                },
                originalPrice: {
                    required: true,
                    number: true
                },
                flashSalePrice: {
                    required: true,
                    number: true
                },
                flashSaleTotal: {
                    required: true,
                    number: true
                },
            },
            messages: {
                promotionsTitle: {
                    required: '请输入活动标题',
                    rangelength: '文字长度请控制在3到14之间'
                },
                originalPrice: {
                    required: '请输入产品标价',
                    number: '价格必须为数字'
                },
                flashSalePrice: {
                    required: '请输入拼团价',
                    number: '价格必须为数字'
                },
                flashSaleTotal: {
                    required: '请输入成团人数',
                    number: '人数必须为数字'
                },
            },
            multiCheck: true
        }, this);
        console.log('hhhh,', validatorInstance);
    },
    onShareAppMessage: function () {
        var doccode = this.data.doccode || '';
        var imageUrl = this.data.coverImageUrl || '';
        var sellerUnCheckedNames = this.data.sellerUnCheckedNames || '';
        return {
            title: "\u8BF7\u8425\u9500\u4EBA\u5458[" + sellerUnCheckedNames + "]\u9A8C\u8BC1\u8EAB\u4EFD",
            imageUrl: imageUrl,
            path: "pages/sellerVerify/sellerVerify?doccode=" + doccode,
        };
    }
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXBCdXlpbmdDcmVhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJncm91cEJ1eWluZ0NyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx1REFBa0Q7QUFFbEQsSUFBSSxpQkFBNkIsQ0FBQztBQUVsQyxJQUFJLENBQUM7SUFDSCxJQUFJLEVBQUU7UUFDSixRQUFRLEVBQUMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7UUFDMUMsaUJBQWlCLEVBQUMsRUFBRTtRQUNwQixNQUFNLEVBQUMsQ0FBQztRQUNSLE1BQU0sRUFBQyxNQUFNO1FBQ2IsUUFBUSxFQUFFLEVBQUU7UUFDWixPQUFPLEVBQUMsRUFBRTtRQUNWLFFBQVEsRUFBQyxFQUFFO1FBQ1gsUUFBUSxFQUFDLEVBQUU7UUFDWCxhQUFhLEVBQUMsQ0FBQztRQUNmLG9CQUFvQixFQUFDLEVBQUU7UUFDdkIsYUFBYSxFQUFDLEVBQUU7UUFDaEIsWUFBWSxFQUFDLEtBQUs7S0FDbkI7SUFDRCxNQUFNLFlBQUMsT0FBTztRQUVaLElBQUksT0FBTyxHQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUUsRUFBRSxDQUFDO1FBQ2pDLElBQUksUUFBUSxHQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUUsRUFBRSxDQUFDO1FBQ25DLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDWCxhQUFhLEVBQUUsd0RBQXNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBUTtZQUN2RixPQUFPLFNBQUE7WUFDUCxRQUFRLFVBQUE7WUFDUixhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsZUFBZSxHQUFDLFFBQVEsQ0FBQywrQkFBK0IsQ0FBQyxHQUFDLEdBQUc7U0FDdkYsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxP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LE1BQU0sRUFBRSxJQUFJO2lCQUNiO2FBSUY7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsZUFBZSxFQUFFO29CQUNmLFFBQVEsRUFBRSxTQUFTO29CQUNuQixXQUFXLEVBQUUsZ0JBQWdCO2lCQUM5QjtnQkFDRCxhQUFhLEVBQUU7b0JBQ2IsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLE1BQU0sRUFBRSxTQUFTO2lCQUNsQjtnQkFDRCxjQUFjLEVBQUU7b0JBQ2QsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLE1BQU0sRUFBRSxTQUFTO2lCQUNsQjtnQkFDRCxjQUFjLEVBQUU7b0JBQ2QsUUFBUSxFQUFFLFNBQVM7b0JBQ25CLE1BQU0sRUFBRSxTQUFTO2lCQUNsQjthQUlGO1lBQ0QsVUFBVSxFQUFDLElBQUk7U0FDaEIsRUFBQyxJQUFJLENBQUMsQ0FBQTtRQUlQLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELGlCQUFpQjtRQUNmLElBQUksT0FBTyxHQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUU3QyxJQUFJLFFBQVEsR0FBVSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7UUFDcEQsSUFBSSxvQkFBb0IsR0FBVSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztRQUN2RSxPQUFPO1lBRUwsS0FBSyxFQUFFLG9DQUFTLG9CQUFvQiw4QkFBTztZQUMzQyxRQUFRLFVBQUE7WUFDUixJQUFJLEVBQUUsNkNBQTJDLE9BQVM7U0FDM0QsQ0FBQTtJQUNILENBQUM7Q0FDRixDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgKiBhcyBkYXlqcyBmcm9tIFwiZGF5anNcIjtcclxuaW1wb3J0IE15VmFsaWRhdG9yIGZyb20gXCIuLi8uLi91dGlscy9teVZhbGlkYXRvclwiO1xyXG5cclxubGV0IHZhbGlkYXRvckluc3RhbmNlOk15VmFsaWRhdG9yO1xyXG4vLyBjb25zdCBhcHAgPSBnZXRBcHA8SUFwcE9wdGlvbj4oKTtcclxuUGFnZSh7XHJcbiAgZGF0YToge1xyXG4gICAgYXV0b3NpemU6eyBtYXhIZWlnaHQ6IDEyMCwgbWluSGVpZ2h0OiA1MCB9LFxyXG4gICAgdmFsaWRhdG9ySW5zdGFuY2U6e30sXHJcbiAgICBmcmVlSWQ6MCxcclxuICAgIGZvcm1JZDo3MTA4MDQsIC8v5Yqf6IO95Y+377ya56eS5p2AIDcxMDgwMiDvvIwg5oql5ZCN6YKA57qmIDcxMDgwMyDvvIzlm6LotK0gNzEwODA0XHJcbiAgICBmb3JtRGF0YToge30sXHJcbiAgICBkb2Njb2RlOicnLFxyXG4gICAgZnJvbVBhZ2U6JycsXHJcbiAgICBkZWxpdmVyeTp7fSxcclxuICAgIGZlZVJhdGVGb3JQYXk6MSxcclxuICAgIHNlbGxlclVuQ2hlY2tlZE5hbWVzOicnLFxyXG4gICAgY292ZXJJbWFnZVVybDonJyxcclxuICAgIGlzU2hvd0RpYWxvZzpmYWxzZVxyXG4gIH0sXHJcbiAgb25Mb2FkKG9wdGlvbnMpIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKGFwcCk7XHJcbiAgICBsZXQgZG9jY29kZSA9b3B0aW9ucy5kb2Njb2RlfHwnJztcclxuICAgIGxldCBmcm9tUGFnZSA9b3B0aW9ucy5mcm9tUGFnZXx8Jyc7XHJcbiAgICBsZXQgc2V0dGluZ3MgPSB3eC5nbG9iYWxEYXRhLnNldHRpbmdzO1xyXG4gICAgdGhpcy5zZXREYXRhKHtcclxuICAgICAgZmlsZVVwbG9hZFVybDogYC9zaG9wcGluZy9wYW5pY0J1eWluZy5kbz9tPXVwbG9hZEF0dGFjaG1lbnQmZm9ybWlkPSR7dGhpcy5kYXRhLmZvcm1JZH1gLFxyXG4gICAgICBkb2Njb2RlLFxyXG4gICAgICBmcm9tUGFnZSxcclxuICAgICAgZmVlUmF0ZUZvclBheTogKHNldHRpbmdzLmZlZVJhdGVGb3JXeFBheStzZXR0aW5ncy5wbGF0Zm9ybU9wZXJhdG9yQ29tbWlzc2lvblJhdGlvKSoxMDBcclxuICAgIH0pXHJcbiAgICBpZiAoZG9jY29kZSkge1xyXG4gICAgICB0aGlzLmdldFNhdmVEYXRhKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHN0b3JlRWRpdCA9IHRoaXMuc2VsZWN0Q29tcG9uZW50KCcjc3RvcmUtZWRpdCcpO1xyXG4gICAgICBzdG9yZUVkaXQuZ2V0U3RvcmVMaXN0KCk7XHJcbiAgICB9XHJcbiAgfSxcclxuICBhc3luYyBnZXRTYXZlRGF0YSgpIHtcclxuICAgIGxldCBkb2Njb2RlID0gdGhpcy5kYXRhLmRvY2NvZGU7XHJcbiAgICBsZXQgW2Vycm9yLCByZXN1bHRdID0gYXdhaXQgd3guJHV0aWxzLnRvKFxyXG4gICAgICB3eC4kaHR0cC5yZXF1ZXN0KHtcclxuICAgICAgICB1cmw6YC9zaG9wcGluZy9wYW5pY0J1eWluZy5kbz9tPWdldFBhbmljQnV5aW5nRGV0YWlsYCxcclxuICAgICAgICBkYXRhOntcclxuICAgICAgICAgIGRvY2NvZGUsXHJcbiAgICAgICAgICBpc0VkaXQ6dHJ1ZSxcclxuICAgICAgICAgIFJlZk9wZW5JZDp3eC5nbG9iYWxEYXRhLk9wZW5JZFxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIClcclxuICAgIGlmIChlcnJvcil7XHJcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2cocmVzdWx0KTtcclxuICAgIGxldCBkYXRhID0gcmVzdWx0Lmxpc3RbMF07XHJcbiAgICBsZXQgZm9ybURhdGEgPSB7XHJcbiAgICAgIHByb21vdGlvbnNUaXRsZTogZGF0YS50aXRsZSxcclxuICAgICAgb3JpZ2luYWxQcmljZTogZGF0YS5vcmlnaW5hbFByaWNlLFxyXG4gICAgICBmbGFzaFNhbGVQcmljZTogZGF0YS5zYWxlc1ByaWNlLFxyXG4gICAgICBmbGFzaFNhbGVUb3RhbDogZGF0YS5udW1iZXJPZlRlYW0sXHJcbiAgICAgIHByb21vdGlvbkRlc2NyaXB0aW9uOiBkYXRhLmRlc2NyaXB0aW9uLFxyXG4gICAgICBzdGFydFRpbWU6IGRhdGEuZWZmZWN0aXZlU3RhcnREYXRlLFxyXG4gICAgICBlbmRUaW1lOiBkYXRhLmVmZmVjdGl2ZUVuZERhdGUsXHJcbiAgICAgIGNvdmVySW1hZ2VMaXN0OiAoZGF0YS5jb3ZlckltYWdlVXJsJiZ0aGlzLmdldENvdmVySW1hZ2VMaXN0KGRhdGEpKXx8W10sXHJcbiAgICAgIC8vIGltYWdlc0xpc3Q6IChkYXRhLmltYWdlc1VybC5sZW5ndGg+MCYmdGhpcy5nZXRJbWFnZXNMaXN0KGRhdGEpKXx8W10sXHJcbiAgICAgIGltYWdlc0xpc3Q6IGRhdGEuaW1hZ2VzVXJsLFxyXG4gICAgICBjb3ZlckltYWdlOiBkYXRhLmNvdmVySW1hZ2UsXHJcbiAgICAgIGltYWdlczogZGF0YS5pbWFnZXMsXHJcbiAgICAgIGZyZWVJZDpkYXRhLmZyZWVJZCxcclxuICAgIH07XHJcbiAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICAuLi5mb3JtRGF0YSxcclxuICAgICAgY292ZXJJbWFnZVVybDpkYXRhLmNvdmVySW1hZ2VVcmwsXHJcbiAgICAgIC8vIFtgZWZmZWN0aXZlU3RhcnREYXRlYF06IGRhdGEuZWZmZWN0aXZlU3RhcnREYXRlLFxyXG4gICAgICAvLyBbYGVmZmVjdGl2ZUVuZERhdGVgXTogZGF0YS5lZmZlY3RpdmVFbmREYXRlLFxyXG4gICAgICAvLyBbYGZyZWVJZGBdOiBkYXRhLmZyZWVJZCxcclxuICAgICAgLy8gW2B0aXRsZWBdOiBkYXRhLnRpdGxlLFxyXG4gICAgICAvLyBbYG9yaWdpbmFsUHJpY2VgXTogZGF0YS5vcmlnaW5hbFByaWNlLFxyXG4gICAgICAvLyBbYHNhbGVzUHJpY2VgXTogZGF0YS5zYWxlc1ByaWNlLFxyXG4gICAgICAvLyBbYHF1YW50aXR5YF06IGRhdGEucXVhbnRpdHksXHJcbiAgICAgIC8vIFtgcmVzdHJpY3RCdXlpbmdRdWFudGl0eWBdOiBkYXRhLnJlc3RyaWN0QnV5aW5nUXVhbnRpdHksXHJcbiAgICAgIC8vIFtgZGVzY3JpcHRpb25gXTogZGF0YS5kZXNjcmlwdGlvbixcclxuICAgICAgc2VsbGVyTGlzdDpyZXN1bHQuc2VsbGVyTGlzdCxcclxuICAgICAgc3RvcmVMaXN0OnJlc3VsdC5zdG9yZUxpc3QsXHJcbiAgICAgIHN0YXR1czpkYXRhLnBhbmljQnV5aW5nU3RhdHVzLFxyXG4gICAgICBkZWxpdmVyeTp7XHJcbiAgICAgICAgZnJlZUlkOmRhdGEuZnJlZUlkLFxyXG4gICAgICAgIGZyZWVOYW1lOmRhdGEuZnJlZU5hbWUsXHJcbiAgICAgICAgaXNSZXF1aXJlZEFkZHJlc3M6ZGF0YS5pc1JlcXVpcmVkQWRkcmVzcyxcclxuICAgICAgICB0cmFuc0Nvc3RzOmRhdGEudHJhbnNDb3N0cyxcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZygn6YWN6YCB5pWw5o2u44CC44CC44CCJyx0aGlzLmRhdGEuZGVsaXZlcnkpO1xyXG4gICAgd3guc2V0TmF2aWdhdGlvbkJhclRpdGxlKHtcclxuICAgICAgdGl0bGU6IGRhdGEudGl0bGVcclxuICAgIH0pXHJcbiAgfSxcclxuXHJcbiAgZ2V0Q292ZXJJbWFnZUxpc3QoZGF0YTphbnkpe1xyXG4gICAgbGV0IFt1bmlkLHNlcV0gPSBkYXRhLmNvdmVySW1hZ2Uuc3BsaXQoXCI7XCIpO1xyXG4gICAgcmV0dXJuIFt7XHJcbiAgICAgIHVybDogZGF0YS5jb3ZlckltYWdlVXJsfHwnJyxcclxuICAgICAgdW5pZCxcclxuICAgICAgc2VxXHJcbiAgICB9XVxyXG4gIH0sXHJcbiAgLy8gZ2V0SW1hZ2VzTGlzdChkYXRhOmFueSl7XHJcbiAgLy8gICBsZXQgW3VuaWQsc2VxXSA9IGRhdGEuaW1hZ2VzLnNwbGl0KFwiO1wiKTtcclxuICAvLyAgIHJldHVybiBkYXRhLmltYWdlc1VybC5tYXAoKGl0ZW06c3RyaW5nKT0+e1xyXG4gIC8vICAgICByZXR1cm4ge1xyXG4gIC8vICAgICAgIHVybDogaXRlbSxcclxuICAvLyAgICAgICB1bmlkLFxyXG4gIC8vICAgICAgIHNlcVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KVxyXG4gIC8vIH0sXHJcblxyXG4gIG9uUmVhZHkoKSB7XHJcbiAgICB0aGlzLmluaXRWYWxpZGF0b3IoKVxyXG4gIH0sXHJcbiAgc2VsZWN0ZWRTdGFydFRpbWUoZXZlbnQ6YW55KSB7XHJcbiAgICBjb25zb2xlLmxvZygn5byA5aeLJyxldmVudCk7XHJcbiAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICBzdGFydFRpbWU6IGV2ZW50LmRldGFpbC5zdGFydFRpbWUsXHJcbiAgICB9KVxyXG4gIH0sXHJcbiAgc2VsZWN0ZWRFbmRUaW1lKGV2ZW50OmFueSl7XHJcbiAgICBjb25zb2xlLmxvZygn57uT5p2fJyxldmVudCk7XHJcbiAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICBlbmRUaW1lOiBldmVudC5kZXRhaWwuZW5kVGltZSxcclxuICAgIH0pXHJcbiAgfSxcclxuICBnZXREZWxpdmVyeU1ldGhvZChldmVudDphbnkpe1xyXG4gICAgY29uc29sZS5sb2coZXZlbnQuZGV0YWlsKTtcclxuICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgIC8vIGRlbGl2ZXJ5TWV0aG9kOiBldmVudC5kZXRhaWwuZGVsaXZlcnlNZXRob2QsXHJcbiAgICAgIGZyZWVJZDogZXZlbnQuZGV0YWlsLmZyZWVJZCxcclxuICAgIH0pXHJcbiAgICBjb25zb2xlLmxvZygndGhpcy5kYXRhLmZyZWVJZDsnLHRoaXMuZGF0YS5mcmVlSWQpO1xyXG4gIH0sXHJcblxyXG4gIGNoZWNrUHJvbW90aW9uc1RpdGxlKGU6YW55KXtcclxuICAgIGxldCB7IHZhbHVlIH0gPSBlLmRldGFpbFxyXG4gICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB2YWxpZGF0b3JJbnN0YW5jZS5jaGVja0ZpZWxkKCdwcm9tb3Rpb25zVGl0bGUnLHZhbHVlKTtcclxuICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgIHByb21vdGlvbnNUaXRsZTp2YWx1ZS50cmltKClcclxuICAgIH0pXHJcbiAgfSxcclxuICBjaGVja09yaWdpbmFsUHJpY2UoZTphbnkpe1xyXG4gICAgbGV0IHsgdmFsdWUgfSA9IGUuZGV0YWlsXHJcbiAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIHZhbGlkYXRvckluc3RhbmNlLmNoZWNrRmllbGQoJ29yaWdpbmFsUHJpY2UnLHZhbHVlKTtcclxuICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgIG9yaWdpbmFsUHJpY2U6dmFsdWUudHJpbSgpXHJcbiAgICB9KVxyXG4gIH0sXHJcbiAgY2hlY2tGbGFzaFNhbGVQcmljZShlOmFueSl7XHJcbiAgICBsZXQgeyB2YWx1ZSB9ID0gZS5kZXRhaWxcclxuICAgIGNvbnNvbGUubG9nKGUpO1xyXG4gICAgdmFsaWRhdG9ySW5zdGFuY2UuY2hlY2tGaWVsZCgnZmxhc2hTYWxlUHJpY2UnLHZhbHVlKTtcclxuICAgIHRoaXMuc2V0RGF0YSh7XHJcbiAgICAgIGZsYXNoU2FsZVByaWNlOnZhbHVlLnRyaW0oKVxyXG4gICAgfSlcclxuICB9LFxyXG4gIGNoZWNrRmxhc2hTYWxlVG90YWwoZTphbnkpe1xyXG4gICAgbGV0IHsgdmFsdWUgfSA9IGUuZGV0YWlsXHJcbiAgICBjb25zb2xlLmxvZyhlKTtcclxuICAgIHZhbGlkYXRvckluc3RhbmNlLmNoZWNrRmllbGQoJ2ZsYXNoU2FsZVRvdGFsJyx2YWx1ZSk7XHJcbiAgICB0aGlzLnNldERhdGEoe1xyXG4gICAgICBmbGFzaFNhbGVUb3RhbDp2YWx1ZS50cmltKClcclxuICAgIH0pXHJcbiAgfSxcclxuICBjaGVja1Byb21vdGlvbkRlc2NyaXB0aW9uKGU6YW55KXtcclxuICAgIGxldCB7IHZhbHVlIH0gPSBlLmRldGFpbFxyXG4gICAgY29uc29sZS5sb2coZSk7XHJcbiAgICB2YWxpZGF0b3JJbnN0YW5jZS5jaGVja0ZpZWxkKCdwcm9tb3Rpb25EZXNjcmlwdGlvbicsdmFsdWUpO1xyXG4gICAgdGhpcy5zZXREYXRhKHtcclxuICAgICAgcHJvbW90aW9uRGVzY3JpcHRpb246dmFsdWUudHJpbSgpXHJcbiAgICB9KVxyXG4gIH0sXHJcblxyXG4gIGFzeW5jIHBvc3RGb3JtRGF0YShkYXRhOm9iamVjdCl7XHJcbiAgICBsZXQgW2Vycm9yLCByZXNdID0gYXdhaXQgd3guJHV0aWxzLnRvKFxyXG4gICAgICB3eC4kaHR0cC5yZXF1ZXN0KHtcclxuICAgICAgICB1cmw6Jy9zaG9wcGluZy9wYW5pY0J1eWluZy5kbz9tPXNhdmVEb2NDb2RlJyxcclxuICAgICAgICBkYXRhLFxyXG4gICAgICAgIG1ldGhvZDonUE9TVCdcclxuICAgICAgfSlcclxuICAgIClcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKHJlcyk7XHJcbiAgICBpZiAocmVzLnN0YXRlID09PSAnc3VjY2VzcycpIHtcclxuICAgICAgd3guc2hvd1RvYXN0KHtcclxuICAgICAgICB0aXRsZTogJ+aIkOWKnycsXHJcbiAgICAgICAgZHVyYXRpb246IDIwMDBcclxuICAgICAgfSlcclxuICAgICAgdGhpcy5zZXREYXRhKHtcclxuICAgICAgICBkb2Njb2RlOnJlcy5Eb2NDb2RlXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBpZiAocmVzLnN0YXRlID09PSAnZmFpbGVkJyYmcmVzLnNlbGxlckNoZWNrZWRCYWxhbmNlPjApIHtcclxuICAgICAgdGhpcy5zZXREYXRhKHtcclxuICAgICAgICBzZWxsZXJVbkNoZWNrZWROYW1lczogcmVzLnNlbGxlclVuQ2hlY2tlZE5hbWVzLFxyXG4gICAgICAgIGlzU2hvd0RpYWxvZzogdHJ1ZVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcy5zdGF0ZSA9PT0gJ3N1Y2Nlc3MnO1xyXG4gIH0sXHJcbiAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICBsZXQgdGltZVF1YW50dW0gPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI3RpbWUtcXVhbnR1bScpO1xyXG4gICAgbGV0IHNlbGxlckVkaXQgPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI3NlbGxlci1lZGl0Jyk7XHJcbiAgICBsZXQgc3RvcmVFZGl0ID0gdGhpcy5zZWxlY3RDb21wb25lbnQoJyNzdG9yZS1lZGl0Jyk7XHJcbiAgICBsZXQgZmlsZVVwbG9hZGVyID0gdGhpcy5zZWxlY3RDb21wb25lbnQoJyNmaWxlLXVwbG9hZGVyJyk7XHJcbiAgICBsZXQgZmlsZVVwbG9hZGVyTXVsdGlwbGUgPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI2ZpbGUtdXBsb2FkZXItbXVsdGlwbGUnKTtcclxuXHJcbiAgICBsZXQgZGVsaXZlcnlNZXRob2QgPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI2RlbGl2ZXJ5LW1ldGhvZCcpO1xyXG4gICAgbGV0IGNoZWNrVHJhbnNDb3N0cyA9IHRydWU7XHJcbiAgICBsZXQgdHJhbnNDb3N0cyA9IDA7XHJcbiAgICBpZiAoZGVsaXZlcnlNZXRob2QuZGF0YS5pc1JlcXVpcmVkQWRkcmVzcyl7XHJcbiAgICAgIGNoZWNrVHJhbnNDb3N0cyA9IGRlbGl2ZXJ5TWV0aG9kLmNoZWNrRmllbGRzKCk7XHJcbiAgICAgIHRyYW5zQ29zdHMgPSBOdW1iZXIoZGVsaXZlcnlNZXRob2QuZGF0YS50cmFuc0Nvc3RzKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY29uc29sZS5sb2coJ3NlbGxlckVkaXQnLCk7XHJcbiAgICBjb25zb2xlLmxvZyh0aW1lUXVhbnR1bSk7XHJcblxyXG4gICAgbGV0IGNoZWNrU3RhcnRUaW1lID0gdGltZVF1YW50dW0uY2hlY2tUaW1lKFwic3RhcnRUaW1lXCIsIFwi6K+36YCJ5oup6K6h5YiS5byA5aeL5pe26Ze0XCIpO1xyXG4gICAgbGV0IGNoZWNrRW5kVGltZSA9IHRpbWVRdWFudHVtLmNoZWNrVGltZShcImVuZFRpbWVcIiwgXCLor7fpgInmi6norqHliJLnu5PmnZ/ml7bpl7RcIik7XHJcbiAgICBsZXQgY2hlY2tDb3ZlckltYWdlID0gZmlsZVVwbG9hZGVyLmNoZWNrSW1hZ2VzKFwiY292ZXJJbWFnZVwiLCBcIuivt+S4iuS8oOS4gOW8oOWwgemdouWbvlwiKTtcclxuICAgIC8vIGxldCBjaGVja0ltYWdlcyA9IGZpbGVVcGxvYWRlck11bHRpcGxlLmNoZWNrSW1hZ2VzKFwiaW1hZ2VzXCIsIFwi6K+36Iez5bCR5LiK5Lyg5LiA5byg5Zu+54mHXCIpO1xyXG4gICAgbGV0IGNoZWNrQWxsRGF0YSA9IHZhbGlkYXRvckluc3RhbmNlLmNoZWNrQWxsRGF0YSgpO1xyXG4gICAgLy8gaWYgKHRoaXMuZGF0YS5nb29kc0ltZ0xpc3QubGVuZ3RoIDwgMSkge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZygn6K+35LiK5Lyg5Lqn5ZOB5Zu+54mHJyk7XHJcbiAgICAvLyB9XHJcbiAgICBsZXQgc2VsbGVyTGlzdCA9IHNlbGxlckVkaXQuZ2V0U2VsbGVyTGlzdCgpO1xyXG4gICAgaWYgKHNlbGxlckxpc3QubGVuZ3RoPDEpIHtcclxuICAgICAgd3guc2hvd1RvYXN0KHtcclxuICAgICAgICB0aXRsZTogJ+ivt+mAieaLqeiQpemUgOS6uuWRmCcsXHJcbiAgICAgICAgaWNvbjogJ25vbmUnLFxyXG4gICAgICAgIGR1cmF0aW9uOiAyMDAwXHJcbiAgICAgIH0pXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHN0b3JlTGlzdCA9IHN0b3JlRWRpdC5nZXRTZWxlY3RlZFN0b3JlSWRMaXN0KCk7XHJcbiAgICBjb25zb2xlLmxvZygn5b6F5o+Q5Lqk55qE6Zeo5bqXaWQnLHN0b3JlTGlzdCk7XHJcbiAgICBsZXQgY2hlY2tEZWZhdWx0U2VsbGVyID0gc2VsbGVyRWRpdC5jaGVja0RlZmF1bHRTZWxsZXIoKTtcclxuICAgIGlmICghY2hlY2tEZWZhdWx0U2VsbGVyKSB7XHJcbiAgICAgIHd4LnNob3dUb2FzdCh7XHJcbiAgICAgICAgdGl0bGU6ICfor7fpgInmi6npu5jorqTokKXplIDkurrlkZgnLFxyXG4gICAgICAgIGljb246ICdub25lJyxcclxuICAgICAgICBkdXJhdGlvbjogMjAwMFxyXG4gICAgICB9KVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKCdjaGVja0RlZmF1bHRTZWxsZXInLGNoZWNrRGVmYXVsdFNlbGxlcik7XHJcblxyXG4gICAgbGV0IGNoZWNrQXJyID0gW2NoZWNrVHJhbnNDb3N0cyxjaGVja1N0YXJ0VGltZSxjaGVja0VuZFRpbWUsY2hlY2tDb3ZlckltYWdlLGNoZWNrQWxsRGF0YV07XHJcbiAgICBsZXQgZGF0YSA9IHt9O1xyXG4gICAgaWYgKGNoZWNrQXJyLmV2ZXJ5KChpdGVtKT0+e1xyXG4gICAgICByZXR1cm4gaXRlbVxyXG4gICAgfSkpe1xyXG4gICAgICBjb25zb2xlLmxvZygnLi4uLuaPkOS6pOaIkOWKnycpO1xyXG4gICAgICBsZXQgY292ZXJJbWFnZSA9IGZpbGVVcGxvYWRlci5nZXRDb3ZlckltYWdlVW5pZCgpO1xyXG4gICAgICBsZXQgY292ZXJJbWFnZVVybCA9IGZpbGVVcGxvYWRlci5nZXRJbWdMaXN0KClbMF0udXJsfHwnJztcclxuICAgICAgdGhpcy5zZXREYXRhKHtcclxuICAgICAgICBjb3ZlckltYWdlVXJsXHJcbiAgICAgIH0pXHJcbiAgICAgIGxldCBpbWFnZXMgPSBmaWxlVXBsb2FkZXJNdWx0aXBsZS5nZXRJbWFnZXNVbmlkKCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKGNvdmVySW1hZ2UsaW1hZ2VzKTtcclxuICAgICAgbGV0IGZvcm1EYXRhOiBhbnkgPSB0aGlzLmRhdGE7XHJcbiAgICAgIGRhdGEgPSB7XHJcbiAgICAgICAgZG9jQ29kZTogZm9ybURhdGEuZG9jY29kZSwgLy/mtLvliqjljZXlj7fvvIzmlrDlu7rmtLvliqjml7bkuLrnqbrlgLzvvIznvJbovpHml7bpnIDopoFkb2Njb2Rl5YC8XHJcbiAgICAgICAgZm9ybUlkOiBmb3JtRGF0YS5mb3JtSWQsIC8v5Yqf6IO95Y+377ya56eS5p2AIDcxMDgwMiDvvIwg5oql5ZCN6YKA57qmIDcxMDgwMyDvvIzlm6LotK0gNzEwODA0XHJcbiAgICAgICAgZG9jU3RhdHVzOjEwMCwgLy/ljZXmja7nirbmgIE6IDAg5L+d5a2Y77yI6LW36I2J77yJIO+8jDEwMCDlj5HluINcclxuICAgICAgICBjb3ZlckltYWdlLFxyXG4gICAgICAgIGltYWdlcyxcclxuICAgICAgICB0cmFuc0Nvc3RzLCAvL+mAgei0p+S4iumXqOaXtiDphY3pgIHotLlcclxuICAgICAgICAvLyAuLi50aGlzLmRhdGEuZm9ybURhdGEsXHJcblxyXG4gICAgICAgIGVmZmVjdGl2ZVN0YXJ0RGF0ZTogZm9ybURhdGEuc3RhcnRUaW1lLFxyXG4gICAgICAgIGVmZmVjdGl2ZUVuZERhdGU6IGZvcm1EYXRhLmVuZFRpbWUsXHJcbiAgICAgICAgZnJlZUlkOiBmb3JtRGF0YS5mcmVlSWQsXHJcbiAgICAgICAgdGl0bGU6IGZvcm1EYXRhLnByb21vdGlvbnNUaXRsZSxcclxuICAgICAgICBvcmlnaW5hbFByaWNlOiBOdW1iZXIoZm9ybURhdGEub3JpZ2luYWxQcmljZSksXHJcbiAgICAgICAgc2FsZXNQcmljZTogTnVtYmVyKGZvcm1EYXRhLmZsYXNoU2FsZVByaWNlKSxcclxuICAgICAgICBudW1iZXJPZlRlYW06IE51bWJlcihmb3JtRGF0YS5mbGFzaFNhbGVUb3RhbCksXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGZvcm1EYXRhLnByb21vdGlvbkRlc2NyaXB0aW9uLFxyXG4gICAgICAgIHN0b3JlTGlzdCxcclxuICAgICAgICBzZWxsZXJMaXN0LFxyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUubG9nKCflvoXlj5HluIPmlbDmja4nLGRhdGEpO1xyXG4gICAgICBpZiAoIWF3YWl0IHRoaXMucG9zdEZvcm1EYXRhKGRhdGEpKSByZXR1cm47XHJcbiAgICAgIGlmICh0aGlzLmRhdGEuZnJvbVBhZ2U9PSdlZGl0Jyl7XHJcbiAgICAgICAgd3gubmF2aWdhdGVCYWNrKCk7XHJcbiAgICAgIH0gZWxzZXtcclxuICAgICAgICB3eC5yZWRpcmVjdFRvKHtcclxuICAgICAgICAgIHVybDonLi4vcHJvbW90aW9uc01hbmFnZUxpc3QvcHJvbW90aW9uc01hbmFnZUxpc3Q/dGFiPTMnXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHd4LnNob3dUb2FzdCh7XHJcbiAgICAgICAgdGl0bGU6ICfpobXpnaLov5jmnInplJnor6/mnKrlpITnkIYnLFxyXG4gICAgICAgIGljb246ICdub25lJyxcclxuICAgICAgICBkdXJhdGlvbjogMjAwMFxyXG4gICAgICB9KVxyXG4gICAgICBjb25zb2xlLmxvZygn6L+Y5pyJ6ZSZ6K+v5pyq5aSE55CGJyk7XHJcbiAgICB9XHJcblxyXG5cclxuICB9LFxyXG5cclxuICBvblNhdmUoKXtcclxuICAgIGxldCBzZWxsZXJFZGl0ID0gdGhpcy5zZWxlY3RDb21wb25lbnQoJyNzZWxsZXItZWRpdCcpO1xyXG4gICAgbGV0IHNlbGxlckxpc3QgPSBzZWxsZXJFZGl0LmdldFNlbGxlckxpc3QoKTtcclxuICAgIGxldCBzdG9yZUVkaXQgPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI3N0b3JlLWVkaXQnKTtcclxuICAgIGxldCBzdG9yZUxpc3QgPSBzdG9yZUVkaXQuZ2V0U2VsZWN0ZWRTdG9yZUlkTGlzdCgpO1xyXG4gICAgY29uc29sZS5sb2coJ+W+heaPkOS6pOeahOmXqOW6l2lkJyxzdG9yZUxpc3QpO1xyXG4gICAgbGV0IGZpbGVVcGxvYWRlciA9IHRoaXMuc2VsZWN0Q29tcG9uZW50KCcjZmlsZS11cGxvYWRlcicpO1xyXG4gICAgbGV0IGZpbGVVcGxvYWRlck11bHRpcGxlID0gdGhpcy5zZWxlY3RDb21wb25lbnQoJyNmaWxlLXVwbG9hZGVyLW11bHRpcGxlJyk7XHJcbiAgICBjb25zb2xlLmxvZygnLi4uLuaPkOS6pOaIkOWKnycpO1xyXG4gICAgbGV0IGNvdmVySW1hZ2UgPSBmaWxlVXBsb2FkZXIuZ2V0Q292ZXJJbWFnZVVuaWQoKTtcclxuICAgIGxldCBpbWFnZXMgPSBmaWxlVXBsb2FkZXJNdWx0aXBsZS5nZXRJbWFnZXNVbmlkKCk7XHJcbiAgICBsZXQgZGVsaXZlcnlNZXRob2QgPSB0aGlzLnNlbGVjdENvbXBvbmVudCgnI2RlbGl2ZXJ5LW1ldGhvZCcpO1xyXG4gICAgbGV0IHRyYW5zQ29zdHMgPSAwO1xyXG4gICAgaWYgKGRlbGl2ZXJ5TWV0aG9kLmRhdGEuaXNSZXF1aXJlZEFkZHJlc3Mpe1xyXG4gICAgICB0cmFuc0Nvc3RzID0gTnVtYmVyKGRlbGl2ZXJ5TWV0aG9kLmRhdGEudHJhbnNDb3N0cyk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhjb3ZlckltYWdlLGltYWdlcyk7XHJcbiAgICBsZXQgZm9ybURhdGE6IGFueSA9IHRoaXMuZGF0YTtcclxuICAgIGxldCBkYXRhID0ge1xyXG4gICAgICBkb2NDb2RlOiBmb3JtRGF0YS5kb2Njb2RlLCAvL+a0u+WKqOWNleWPt++8jOaWsOW7uua0u+WKqOaXtuS4uuepuuWAvO+8jOe8lui+keaXtumcgOimgWRvY2NvZGXlgLxcclxuICAgICAgZm9ybUlkOiBmb3JtRGF0YS5mb3JtSWQsIC8v5Yqf6IO95Y+377ya56eS5p2AIDcxMDgwMiDvvIwg5oql5ZCN6YKA57qmIDcxMDgwMyDvvIzlm6LotK0gNzEwODA0XHJcbiAgICAgIGRvY1N0YXR1czogMCwgLy/ljZXmja7nirbmgIE6IDAg5L+d5a2Y77yI6LW36I2J77yJIO+8jDEwMCDlj5HluINcclxuICAgICAgY292ZXJJbWFnZSxcclxuICAgICAgaW1hZ2VzLFxyXG4gICAgICB0cmFuc0Nvc3RzLCAvL+mAgei0p+S4iumXqOaXtiDphY3pgIHotLlcclxuICAgICAgLy8gLi4udGhpcy5kYXRhLmZvcm1EYXRhLFxyXG5cclxuICAgICAgZWZmZWN0aXZlU3RhcnREYXRlOiBmb3JtRGF0YS5zdGFydFRpbWUsXHJcbiAgICAgIGVmZmVjdGl2ZUVuZERhdGU6IGZvcm1EYXRhLmVuZFRpbWUsXHJcbiAgICAgIGZyZWVJZDogZm9ybURhdGEuZnJlZUlkLFxyXG4gICAgICB0aXRsZTogZm9ybURhdGEucHJvbW90aW9uc1RpdGxlLFxyXG4gICAgICBvcmlnaW5hbFByaWNlOiBOdW1iZXIoZm9ybURhdGEub3JpZ2luYWxQcmljZSl8fDAsXHJcbiAgICAgIHNhbGVzUHJpY2U6IE51bWJlcihmb3JtRGF0YS5mbGFzaFNhbGVQcmljZSl8fDAsXHJcbiAgICAgIG51bWJlck9mVGVhbTogTnVtYmVyKGZvcm1EYXRhLmZsYXNoU2FsZVRvdGFsKXx8MCxcclxuICAgICAgZGVzY3JpcHRpb246IGZvcm1EYXRhLnByb21vdGlvbkRlc2NyaXB0aW9uLFxyXG4gICAgICBzdG9yZUxpc3QsXHJcbiAgICAgIHNlbGxlckxpc3QsXHJcbiAgICB9XHJcbiAgICAvLyBsZXQgZGF0YSA9IHtcclxuICAgIC8vICAgZG9jQ29kZTp0aGlzLmRhdGEuZG9jY29kZSwgLy/mtLvliqjljZXlj7fvvIzmlrDlu7rmtLvliqjml7bkuLrnqbrlgLzvvIznvJbovpHml7bpnIDopoFkb2Njb2Rl5YC8XHJcbiAgICAvLyAgIGZvcm1JZDp0aGlzLmRhdGEuZm9ybUlkLCAvL+WKn+iDveWPt++8muenkuadgCA3MTA4MDIg77yMIOaKpeWQjemCgOe6piA3MTA4MDMg77yM5Zui6LStIDcxMDgwNFxyXG4gICAgLy8gICBkb2NTdGF0dXM6MCwgLy/ljZXmja7nirbmgIE6IDAg5L+d5a2Y77yI6LW36I2J77yJIO+8jDEwMCDlj5HluINcclxuICAgIC8vICAgY292ZXJJbWFnZSxcclxuICAgIC8vICAgaW1hZ2VzLFxyXG4gICAgLy8gICB0cmFuc0Nvc3RzLCAvL+mAgei0p+S4iumXqOaXtiDphY3pgIHotLlcclxuICAgIC8vICAgLi4udGhpcy5kYXRhLmZvcm1EYXRhLFxyXG4gICAgLy8gICBzZWxsZXJMaXN0LFxyXG4gICAgLy8gfVxyXG4gICAgY29uc29sZS5sb2coJ+W+heS/neWtmOaVsOaNricsZGF0YSk7XHJcbiAgICB0aGlzLnBvc3RGb3JtRGF0YShkYXRhKTtcclxuICB9LFxyXG4gIC8vIG9uSW5wdXRTdGFydERhdGUoKSB7fSxcclxuICAvLyBvbklucHV0RW5kRGF0ZSgpIHt9LFxyXG4gIGluaXRWYWxpZGF0b3IoKXtcclxuICAgIC8vIOWunuS+i+WMllxyXG4gICAgdmFsaWRhdG9ySW5zdGFuY2UgPSBuZXcgTXlWYWxpZGF0b3Ioe1xyXG4gICAgICBydWxlczoge1xyXG4gICAgICAgIHByb21vdGlvbnNUaXRsZToge1xyXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgICByYW5nZWxlbmd0aDogWzMsMTRdXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvcmlnaW5hbFByaWNlOiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcclxuICAgICAgICAgIG51bWJlcjogdHJ1ZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZmxhc2hTYWxlUHJpY2U6IHtcclxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxyXG4gICAgICAgICAgbnVtYmVyOiB0cnVlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBmbGFzaFNhbGVUb3RhbDoge1xyXG4gICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXHJcbiAgICAgICAgICBudW1iZXI6IHRydWVcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIHByb21vdGlvbkRlc2NyaXB0aW9uOiB7XHJcbiAgICAgICAgLy8gICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgICAgIC8vIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIG1lc3NhZ2VzOiB7XHJcbiAgICAgICAgcHJvbW90aW9uc1RpdGxlOiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogJ+ivt+i+k+WFpea0u+WKqOagh+mimCcsXHJcbiAgICAgICAgICByYW5nZWxlbmd0aDogJ+aWh+Wtl+mVv+W6puivt+aOp+WItuWcqDPliLAxNOS5i+mXtCdcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9yaWdpbmFsUHJpY2U6IHtcclxuICAgICAgICAgIHJlcXVpcmVkOiAn6K+36L6T5YWl5Lqn5ZOB5qCH5Lu3JyxcclxuICAgICAgICAgIG51bWJlcjogJ+S7t+agvOW/hemhu+S4uuaVsOWtlydcclxuICAgICAgICB9LFxyXG4gICAgICAgIGZsYXNoU2FsZVByaWNlOiB7XHJcbiAgICAgICAgICByZXF1aXJlZDogJ+ivt+i+k+WFpeaLvOWbouS7tycsXHJcbiAgICAgICAgICBudW1iZXI6ICfku7fmoLzlv4XpobvkuLrmlbDlrZcnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBmbGFzaFNhbGVUb3RhbDoge1xyXG4gICAgICAgICAgcmVxdWlyZWQ6ICfor7fovpPlhaXmiJDlm6LkurrmlbAnLFxyXG4gICAgICAgICAgbnVtYmVyOiAn5Lq65pWw5b+F6aG75Li65pWw5a2XJ1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLy8gcHJvbW90aW9uRGVzY3JpcHRpb246IHtcclxuICAgICAgICAvLyAgIHJlcXVpcmVkOiAn6K+36L6T5YWl5rS75Yqo5o+P6L+wJ1xyXG4gICAgICAgIC8vIH0sXHJcbiAgICAgIH0sXHJcbiAgICAgIG11bHRpQ2hlY2s6dHJ1ZVxyXG4gICAgfSx0aGlzKVxyXG4gICAgLy8gdGhpcy5zZXREYXRhKHtcclxuICAgIC8vICAgdmFsaWRhdG9ySW5zdGFuY2VcclxuICAgIC8vIH0pXHJcbiAgICBjb25zb2xlLmxvZygnaGhoaCwnLHZhbGlkYXRvckluc3RhbmNlKTtcclxuICB9LFxyXG4gIG9uU2hhcmVBcHBNZXNzYWdlKCkge1xyXG4gICAgbGV0IGRvY2NvZGU6c3RyaW5nID0gdGhpcy5kYXRhLmRvY2NvZGUgfHwgJyc7XHJcbiAgICAvLyBsZXQgdGl0bGU6c3RyaW5nID0gdGhpcy5kYXRhLnByb21vdGlvbnNEYXRhLnRpdGxlIHx8ICcnO1xyXG4gICAgbGV0IGltYWdlVXJsOnN0cmluZyA9IHRoaXMuZGF0YS5jb3ZlckltYWdlVXJsIHx8ICcnO1xyXG4gICAgbGV0IHNlbGxlclVuQ2hlY2tlZE5hbWVzOnN0cmluZyA9IHRoaXMuZGF0YS5zZWxsZXJVbkNoZWNrZWROYW1lcyB8fCAnJztcclxuICAgIHJldHVybiB7XHJcbiAgICAgIC8vIHRpdGxlOiB1dGlscy5nZXRTaGFyZVRpdGxlKCksXHJcbiAgICAgIHRpdGxlOiBg6K+36JCl6ZSA5Lq65ZGYWyR7c2VsbGVyVW5DaGVja2VkTmFtZXN9XemqjOivgei6q+S7vWAsXHJcbiAgICAgIGltYWdlVXJsLFxyXG4gICAgICBwYXRoOiBgcGFnZXMvc2VsbGVyVmVyaWZ5L3NlbGxlclZlcmlmeT9kb2Njb2RlPSR7ZG9jY29kZX1gLFxyXG4gICAgfVxyXG4gIH1cclxufSlcclxuZXhwb3J0IHt9XHJcbiJdfQ==