"use strict";
|
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 app = getApp();
|
Page({
|
data: {
|
currentStep: 0,
|
type: "0",
|
steps: [
|
{
|
text: "① 基本信息",
|
inactiveIcon: "location-o",
|
activeIcon: "success",
|
},
|
{
|
text: "② 直播间配置",
|
inactiveIcon: "like-o",
|
activeIcon: "plus",
|
},
|
],
|
timeErrorMsg: {
|
start: "请选择计划直播开始时间",
|
end: "请选择计划直播结束时间",
|
tips: "开播时间和结束时间间隔不得短于30分钟",
|
},
|
screenTypeOptions: [
|
{ text: "竖屏", value: 0 },
|
{ text: "横屏", value: 1 },
|
],
|
screenType: 0,
|
isFeedsPublic: false,
|
isShowInHomepage: false,
|
isLike: true,
|
isComment: true,
|
isGoods: true,
|
isShare: true,
|
isReplay: true,
|
isKf: false,
|
showQrCode: false,
|
qrCodeTempUrl: '',
|
anchorName: '',
|
roomTitle: '',
|
anchorWechat: '',
|
subAnchorWechat: '',
|
shareImg: '',
|
feedsImg: '',
|
coverImg: '',
|
bannerPhoto: '',
|
doccode: '',
|
qrCodeUrl: "",
|
minStartDate: new Date().getTime() + 1000 * 60 * 20,
|
maxStartDate: new Date().getTime() + 1000 * 60 * 60 * 24 * 180,
|
startDate: 0,
|
startTime: '',
|
minEndDate: new Date().getTime() + 1000 * 60 * 40,
|
maxEndDate: new Date().getTime() + 1000 * 60 * 60 * 24 * 180,
|
endDate: 0,
|
endTime: '',
|
formatter: function (type, value) {
|
if (type === "year") {
|
return value + "\u5E74";
|
}
|
else if (type === "month") {
|
return value + "\u6708";
|
}
|
else if (type === "day") {
|
return value + "\u65E5";
|
}
|
return value;
|
},
|
},
|
onChangeType: function (event) {
|
this.setData({
|
type: event.detail,
|
});
|
},
|
onClickType: function (event) {
|
var name = event.currentTarget.dataset.name;
|
this.setData({
|
type: name,
|
});
|
},
|
onInputStartDate: function () { },
|
onEnterStartDate: function (e) {
|
var startTime = wx.$utils.formatTime(e.detail);
|
if (this.data.endDate &&
|
Math.abs(e.detail - this.data.endDate) > 1000 * 60 * 60 * 24) {
|
var date = e.detail + 1000 * 60 * 60 * 24;
|
var time = wx.$utils.formatTime(date);
|
this.setData({
|
endDate: date,
|
endTime: time,
|
});
|
}
|
if (this.data.endDate &&
|
Math.abs(e.detail - this.data.endDate) < 1000 * 60 * 30) {
|
var date = e.detail + 1000 * 60 * 30;
|
var time = wx.$utils.formatTime(date);
|
this.setData({
|
endDate: date,
|
endTime: time,
|
});
|
}
|
console.log("选择开播时间", startTime);
|
this.setData({
|
startDate: e.detail,
|
startTime: startTime,
|
maxEndDate: e.detail + 1000 * 60 * 60 * 24,
|
minEndDate: e.detail + 1000 * 60 * 30,
|
});
|
this.handleLiveTime();
|
this.onCancelStartDate();
|
},
|
onCancelStartDate: function () {
|
this.selectComponent("#start-time").toggle();
|
this.checkTime("startTime", "请选择计划直播开始时间");
|
},
|
onInputEndDate: function () { },
|
onEnterEndDate: function (e) {
|
var endTime = wx.$utils.formatTime(e.detail);
|
console.log("选择下播时间", endTime);
|
this.setData({
|
endDate: e.detail,
|
endTime: endTime,
|
});
|
this.onCancelEndDate();
|
},
|
onCancelEndDate: function () {
|
this.selectComponent("#end-time").toggle();
|
this.checkTime("endTime", "请选择计划直播结束时间");
|
},
|
handleLiveTime: function () {
|
console.log("iii");
|
var startDate = this.data.startDate;
|
var startTime = this.data.startTime;
|
var endDate = this.data.endDate;
|
var endTime = this.data.endTime;
|
if (!startTime || !endTime)
|
return;
|
if (startDate - endDate > 0) {
|
this.setData({
|
startDate: endDate,
|
startTime: endTime,
|
endDate: startDate,
|
endTime: startTime,
|
});
|
}
|
},
|
checkTime: function (time, msg) {
|
var _a, _b;
|
if (this.data[time] == '') {
|
this.setData((_a = {},
|
_a[time + "Error"] = msg,
|
_a));
|
return false;
|
}
|
this.setData((_b = {},
|
_b[time + "Error"] = "",
|
_b));
|
return true;
|
},
|
onChangeFeeds: function (_a) {
|
var detail = _a.detail;
|
this.setData({ isFeedsPublic: detail });
|
},
|
onChangeShowHomepage: function (_a) {
|
var detail = _a.detail;
|
this.setData({ isShowInHomepage: detail });
|
},
|
checkAnchorName: function (event) {
|
var value = event.detail.value;
|
console.log(value);
|
this.setData({
|
anchorName: value,
|
});
|
this.checkInput("anchorName");
|
},
|
checkRoomTitle: function (event) {
|
var value = event.detail.value;
|
this.setData({
|
roomTitle: value,
|
});
|
this.checkInput("roomTitle");
|
},
|
checkAnchorWechat: function (event) {
|
var value = event.detail.value;
|
this.setData({
|
anchorWechat: value,
|
});
|
this.checkInput("anchorWechat");
|
},
|
checkSubAnchorWechat: function (event) {
|
var value = event.detail.value;
|
this.setData({
|
subAnchorWechat: value,
|
});
|
if (value.length > 0) {
|
this.checkInput("subAnchorWechat");
|
}
|
else {
|
this.setData({
|
subAnchorWechatError: ""
|
});
|
}
|
},
|
checkInput: function (type) {
|
var _a, _b;
|
var options = {
|
anchorName: {
|
error: "主播昵称必须为2-15个字",
|
regExp: /^.{2,15}$/,
|
},
|
roomTitle: {
|
error: "直播标题必须为3-17个字",
|
regExp: /^.{3,17}$/,
|
},
|
anchorWechat: {
|
error: "微信号不合规",
|
regExp: /^[a-zA-Z][a-zA-Z\d_-]{5,19}$/,
|
},
|
subAnchorWechat: {
|
error: "微信号不合规",
|
regExp: /^[a-zA-Z][a-zA-Z\d_-]{5,19}$/,
|
},
|
};
|
var value = this.data[type] || "";
|
console.log(value, options[type].regExp.test(value));
|
if (!options[type].regExp.test(value)) {
|
this.setData((_a = {},
|
_a[type + "Error"] = options[type].error,
|
_a));
|
return false;
|
}
|
else {
|
this.setData((_b = {},
|
_b[type + "Error"] = "",
|
_b));
|
return true;
|
}
|
},
|
onClickNextStep: function () {
|
return __awaiter(this, void 0, void 0, function () {
|
var arr, doccode, type, startTime, endTime, anchorName, roomTitle, anchorWechat, subAnchorWechat, screenType, isFeedsPublic, isShowBannerPhotoOnHomePage, data, _a, err, res;
|
return __generator(this, function (_b) {
|
switch (_b.label) {
|
case 0:
|
arr = [];
|
doccode = this.data.doccode || '';
|
type = this.data.type;
|
startTime = this.data.startTime;
|
endTime = this.data.endTime;
|
anchorName = this.data.anchorName;
|
roomTitle = this.data.roomTitle;
|
anchorWechat = this.data.anchorWechat;
|
subAnchorWechat = this.data.subAnchorWechat || '';
|
screenType = this.data.screenType;
|
isFeedsPublic = this.data.isFeedsPublic;
|
isShowBannerPhotoOnHomePage = this.data.isShowInHomepage;
|
arr.push(this.checkTime("startTime", "请选择计划直播开始时间"));
|
arr.push(this.checkTime("endTime", "请选择计划直播结束时间"));
|
arr.push(this.checkInput("anchorName"));
|
arr.push(this.checkInput("roomTitle"));
|
arr.push(this.checkInput("anchorWechat"));
|
if (subAnchorWechat.length > 0) {
|
arr.push(this.checkInput("subAnchorWechat"));
|
}
|
if (arr.includes(false)) {
|
console.log("不能下一步");
|
return [2];
|
}
|
data = {
|
type: type,
|
startTime: startTime,
|
endTime: endTime,
|
anchorName: anchorName,
|
name: roomTitle,
|
anchorWechat: anchorWechat,
|
subAnchorWechat: subAnchorWechat,
|
screenType: screenType,
|
isFeedsPublic: isFeedsPublic,
|
doccode: doccode,
|
isShowBannerPhotoOnHomePage: isShowBannerPhotoOnHomePage
|
};
|
console.log("第一步表单数据", data);
|
return [4, wx.$utils.to(wx.$http.request({
|
url: "/shopping/live/saveRoomStep1.do",
|
data: data,
|
}))];
|
case 1:
|
_a = _b.sent(), err = _a[0], res = _a[1];
|
if (err) {
|
return [2];
|
}
|
console.log("新建房间--第一步", res);
|
this.setData({
|
currentStep: 1,
|
doccode: res.doccode,
|
logoUrl: app.globalData.logoUrl,
|
shopName: app.globalData.shopName
|
});
|
return [2];
|
}
|
});
|
});
|
},
|
uploadImg: function (imgType) {
|
var _this = this;
|
wx.chooseImage({
|
count: 1,
|
sizeType: ["original", "compressed"],
|
sourceType: ["album", "camera"],
|
success: function (res) { return __awaiter(_this, void 0, void 0, function () {
|
var _a, imgList, files, fieldid, doccode, _b, err, result;
|
return __generator(this, function (_c) {
|
switch (_c.label) {
|
case 0:
|
imgList = res.tempFilePaths;
|
files = res.tempFiles;
|
fieldid = imgType;
|
doccode = this.data.doccode;
|
console.log(imgList, files, fieldid, doccode);
|
return [4, wx.$utils.to(wx.$http.uploadFile({
|
url: "/shopping/live/saveRoomAttachment.do?doccode=" + doccode + "&fieldid=" + fieldid,
|
formData: {
|
file: files[0],
|
},
|
filePath: imgList[0]
|
}))];
|
case 1:
|
_b = _c.sent(), err = _b[0], result = _b[1];
|
if (err) {
|
console.log(err);
|
return [2];
|
}
|
console.log(result);
|
this.setData((_a = {},
|
_a[imgType] = result.url,
|
_a[imgType + "Error"] = "",
|
_a));
|
return [2];
|
}
|
});
|
}); },
|
});
|
},
|
uploadShareImg: function () {
|
this.uploadImg("shareImg");
|
},
|
uploadFeedsImg: function () {
|
this.uploadImg("feedsImg");
|
},
|
uploadCoverImg: function () {
|
this.uploadImg("coverImg");
|
},
|
uploadBannerPhoto: function () {
|
this.uploadImg("bannerPhoto");
|
},
|
onClickLastStep: function () {
|
this.setData({
|
currentStep: 0,
|
});
|
},
|
onChangeLike: function (_a) {
|
var detail = _a.detail;
|
this.setData({ isLike: detail });
|
},
|
onChangeComment: function (_a) {
|
var detail = _a.detail;
|
this.setData({ isComment: detail });
|
},
|
onChangeGoods: function (_a) {
|
var detail = _a.detail;
|
this.setData({ isGoods: detail });
|
},
|
onChangeShare: function (_a) {
|
var detail = _a.detail;
|
this.setData({ isShare: detail });
|
},
|
onChangeReplay: function (_a) {
|
var detail = _a.detail;
|
this.setData({ isReplay: detail });
|
},
|
showErrorMsg: function (imgType, errMsg) {
|
var _a;
|
wx.showToast({
|
title: errMsg,
|
icon: "none",
|
duration: 2000,
|
});
|
this.setData((_a = {},
|
_a[imgType + "Error"] = errMsg,
|
_a));
|
},
|
isImgUpload: function () {
|
if (!this.data.shareImg) {
|
var errMsg = "请上传分享卡片封面图片";
|
this.showErrorMsg('shareImg', errMsg);
|
return false;
|
}
|
if (!this.data.feedsImg) {
|
var errMsg = "请上传直播卡片封面";
|
this.showErrorMsg('feedsImg', errMsg);
|
return false;
|
}
|
if (!this.data.coverImg) {
|
var errMsg = "请上传直播间背景墙";
|
this.showErrorMsg('coverImg', errMsg);
|
return false;
|
}
|
return true;
|
},
|
onClickSubmit: function () {
|
return __awaiter(this, void 0, void 0, function () {
|
var data, _a, err, res;
|
return __generator(this, function (_b) {
|
switch (_b.label) {
|
case 0:
|
data = {
|
doccode: this.data.doccode,
|
closeLike: !this.data.isLike,
|
closeGoods: !this.data.isGoods,
|
closeComment: !this.data.isComment,
|
closeReplay: !this.data.isReplay,
|
closeShare: !this.data.isShare,
|
closeKf: true,
|
};
|
console.log("第二步设置数据", data);
|
if (!this.isImgUpload()) {
|
return [2];
|
}
|
return [4, wx.$utils.to(wx.$http.request({
|
url: "/shopping/live/saveRoomStep2.do",
|
data: data,
|
}))];
|
case 1:
|
_a = _b.sent(), err = _a[0], res = _a[1];
|
if (err) {
|
return [2];
|
}
|
console.log("新建房间--第二步", res);
|
if (!res.QrCodeUrlUnid) return [3, 3];
|
wx.showLoading({
|
title: ''
|
});
|
return [4, this.downloadQr(res.QrCodeUrlUnid)];
|
case 2:
|
_b.sent();
|
wx.hideLoading();
|
this.setData({
|
showQrCode: true,
|
qrCodeUrl: res.QrCodeUrlUnid
|
});
|
return [3, 4];
|
case 3:
|
wx.showToast({
|
title: '直播间创建成功',
|
icon: "none",
|
duration: 2000,
|
});
|
setTimeout(function () {
|
wx.navigateBack();
|
}, 2000);
|
_b.label = 4;
|
case 4: return [2];
|
}
|
});
|
});
|
},
|
isAuthorizeSave: function () {
|
return __awaiter(this, void 0, void 0, function () {
|
var _a, err, res;
|
return __generator(this, function (_b) {
|
switch (_b.label) {
|
case 0: return [4, wx.$utils.to(wx.pro.getSetting())];
|
case 1:
|
_a = _b.sent(), err = _a[0], res = _a[1];
|
if (err) {
|
return [2, false];
|
}
|
console.log("getSetting", res);
|
return [2, res.authSetting["scope.writePhotosAlbum"] !== false];
|
}
|
});
|
});
|
},
|
downloadQr: function (qrCodeUrl) {
|
return __awaiter(this, void 0, void 0, function () {
|
var _a, err, res;
|
return __generator(this, function (_b) {
|
switch (_b.label) {
|
case 0: return [4, wx.$utils.to(wx.pro.downloadFile({
|
url: qrCodeUrl,
|
}))];
|
case 1:
|
_a = _b.sent(), err = _a[0], res = _a[1];
|
if (err) {
|
console.log("downloadQr", err);
|
return [2];
|
}
|
console.log("----downloadQr", res);
|
if (res.statusCode === 200) {
|
console.log('......头像', res.tempFilePath);
|
this.setData({
|
qrCodeTempUrl: res.tempFilePath
|
});
|
}
|
else {
|
wx.showToast({
|
title: '二维码下载失败,请重试',
|
icon: "none",
|
duration: 3000,
|
});
|
}
|
return [2];
|
}
|
});
|
});
|
},
|
saveQrImg: function () {
|
return __awaiter(this, void 0, void 0, function () {
|
var isAuthorizeSave;
|
return __generator(this, function (_a) {
|
switch (_a.label) {
|
case 0:
|
wx.showLoading({
|
title: "保存中...",
|
});
|
return [4, this.isAuthorizeSave()];
|
case 1:
|
isAuthorizeSave = _a.sent();
|
if (!isAuthorizeSave) {
|
wx.hideLoading();
|
wx.showModal({
|
title: "提示",
|
content: "您还未授权保存到相册,请在接下来打开的设置页面开启相册授权!",
|
success: function (res) {
|
if (res.confirm) {
|
console.log("用户点击确定");
|
wx.openSetting({
|
success: function (res) {
|
console.log(res.authSetting);
|
},
|
});
|
}
|
else if (res.cancel) {
|
console.log("用户点击取消");
|
}
|
},
|
});
|
return [2];
|
}
|
wx.saveImageToPhotosAlbum({
|
filePath: this.data.qrCodeTempUrl,
|
success: function () {
|
wx.showToast({
|
title: "二维码已保存到本地,赶紧分享给主播认证吧!",
|
icon: "none",
|
duration: 3000,
|
});
|
},
|
complete: function () {
|
wx.hideLoading();
|
},
|
});
|
return [2];
|
}
|
});
|
});
|
},
|
getTimeMS: function (time) {
|
return new Date(time.replace('-', '/')).getTime();
|
},
|
getRoomData: function (doccode) {
|
return __awaiter(this, void 0, void 0, function () {
|
var _a, err, res, roomData;
|
return __generator(this, function (_b) {
|
switch (_b.label) {
|
case 0: return [4, wx.$utils.to(wx.$http.request({
|
url: '/shopping/live/getLiveRoomListForMe.do',
|
data: {
|
doccode: doccode
|
}
|
}))];
|
case 1:
|
_a = _b.sent(), err = _a[0], res = _a[1];
|
if (err) {
|
console.log(err);
|
return [2];
|
}
|
roomData = res.list[0];
|
console.log('编辑直播间。。。', roomData.Type.toString(), roomData.Type);
|
this.setData({
|
anchorName: roomData.AnchorName,
|
anchorWechat: roomData.AnchorWechat,
|
subAnchorWechat: roomData.SubAnchorWechat,
|
roomTitle: roomData.RoomName,
|
screenType: roomData.ScreenType,
|
isFeedsPublic: roomData.isFeedsPublic,
|
isShowInHomepage: roomData.isShowBannerPhotoOnHomePage,
|
type: roomData.Type.toString() || '0',
|
startDate: this.getTimeMS(roomData.StartTime),
|
endDate: this.getTimeMS(roomData.EndTime),
|
startTime: roomData.StartTime,
|
endTime: roomData.EndTime,
|
doccode: roomData.DocCode,
|
shareImg: roomData.ShareImgUnidUrl || '',
|
coverImg: roomData.CoverImgUnidUrl || '',
|
feedsImg: roomData.FeedsImgUnidUrl || '',
|
bannerPhoto: roomData.BannerPhoto || '',
|
isLike: !roomData.isCloseLike,
|
isComment: !roomData.isCloseComment,
|
isGoods: !roomData.isCloseGoods,
|
isShare: !roomData.isCloseShare,
|
isReplay: !roomData.isCloseReplay,
|
});
|
return [2];
|
}
|
});
|
});
|
},
|
onLoad: function (options) {
|
var _this = this;
|
wx.$http.request({
|
url: '/shopping/account.do?m=accountInfo',
|
}).then(function (res) {
|
console.log('获取用户信息', res);
|
_this.setData({
|
HeadImgUrl: res.UserInfo.HeadImgUrl
|
});
|
});
|
var doccode = options.doccode || '';
|
if (doccode) {
|
this.getRoomData(doccode);
|
}
|
this.setData({
|
isShowBannerOnHomePage: app.globalData.isShowBannerPhotoOnHomePageForLiveUser
|
});
|
},
|
onReady: function () { },
|
onShow: function () { },
|
onHide: function () { },
|
onUnload: function () { },
|
onPullDownRefresh: function () { },
|
onReachBottom: function () { },
|
});
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZVJvb21DcmVhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJsaXZlUm9vbUNyZWF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsSUFBTSxHQUFHLEdBQUcsTUFBTSxFQUFjLENBQUM7QUFNakMsSUFBSSxDQUFDO0lBSUgsSUFBSSxFQUFFO1FBQ0osV0FBVyxFQUFFLENBQUM7UUFDZCxJQUFJLEVBQUUsR0FBRztRQUNULEtBQUssRUFBRTtZQUNMO2dCQUNFLElBQUksRUFBRSxRQUFRO2dCQUNkLFlBQVksRUFBRSxZQUFZO2dCQUMxQixVQUFVLEVBQUUsU0FBUzthQUN0QjtZQUNEO2dCQUNFLElBQUksRUFBRSxTQUFTO2dCQUNmLFlBQVksRUFBRSxRQUFRO2dCQUN0QixVQUFVLEVBQUUsTUFBTTthQUNuQjtTQUNGO1FBQ0QsWUFBWSxFQUFFO1lBQ1osS0FBSyxFQUFFLGFBQWE7WUFDcEIsR0FBRyxFQUFFLGFBQWE7WUFDbEIsSUFBSSxFQUFFLHFCQUFxQjtTQUM1QjtRQUNELGlCQUFpQixFQUFFO1lBQ2pCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQ3hCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1NBQ3pCO1FBQ0QsVUFBVSxFQUFFLENBQUM7UUFDYixhQUFhLEVBQUUsS0FBSztRQUNwQixnQkFBZ0IsRUFBRSxLQUFLO1FBQ3ZCLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLElBQUk7UUFDZixPQUFPLEVBQUUsSUFBSTtRQUNiLE9BQU8sRUFBRSxJQUFJO1FBQ2IsUUFBUSxFQUFFLElBQUk7UUFDZCxJQUFJLEVBQUUsS0FBSztRQUNYLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLGFBQWEsRUFBQyxFQUFFO1FBQ2hCLFVBQVUsRUFBQyxFQUFFO1FBQ2IsU0FBUyxFQUFDLEVBQUU7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QUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsYUFBYTt5QkFDbEMsQ0FBQyxDQUFBOzs7OztLQUNIO0lBSUQsTUFBTSxFQUFFLFVBQVUsT0FBTztRQUFqQixpQkFnQlA7UUFmQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztZQUNmLEdBQUcsRUFBQyxvQ0FBb0M7U0FDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLEdBQU87WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBQyxHQUFHLENBQUMsQ0FBQztZQUMxQixLQUFJLENBQUMsT0FBTyxDQUFDO2dCQUNYLFVBQVUsRUFBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVU7YUFDbkMsQ0FBQyxDQUFBO1FBQ0osQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDM0I7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ1gsc0JBQXNCLEVBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxzQ0FBc0M7U0FDN0UsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUtELE9BQU8sRUFBRSxjQUFhLENBQUM7SUFLdkIsTUFBTSxFQUFFLGNBQWEsQ0FBQztJQUt0QixNQUFNLEVBQUUsY0FBYSxDQUFDO0lBS3RCLFFBQVEsRUFBRSxjQUFhLENBQUM7SUFLeEIsaUJBQWlCLEVBQUUsY0FBYSxDQUFDO0lBS2pDLGFBQWEsRUFBRSxjQUFhLENBQUM7Q0FROUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gcGFnZXMvbGl2ZVJvb21DcmVhdGUvbGl2ZVJvb21DcmVhdGUuanNcbi8vIGNvbnN0IHd4LiR1dGlscyA9IHJlcXVpcmUoXCIuLi8uLi93eC4kdXRpbHMvdXRpbC5qc1wiKTtcbmNvbnN0IGFwcCA9IGdldEFwcDxJQXBwT3B0aW9uPigpO1xuXG50eXBlIHRpbWVUeXBlID0gJ3N0YXJ0VGltZSd8J2VuZFRpbWUnO1xudHlwZSBpbWdUeXBlID0gJ3NoYXJlSW1nJ3wnZmVlZHNJbWcnfCdjb3ZlckltZyd8J2Jhbm5lclBob3RvJztcbnR5cGUgaW5wdXRUeXBlID0gJ2FuY2hvck5hbWUnfCdyb29tVGl0bGUnfCdhbmNob3JXZWNoYXQnfCdzdWJBbmNob3JXZWNoYXQnO1xuXG5QYWdlKHtcbiAgLyoqXG4gICAqIOmhtemdoueahOWIneWni+aVsOaNrlxuICAgKi9cbiAgZGF0YToge1xuICAgIGN1cnJlbnRTdGVwOiAwLFxuICAgIHR5cGU6IFwiMFwiLFxuICAgIHN0ZXBzOiBbXG4gICAgICB7XG4gICAgICAgIHRleHQ6IFwi4pGgIOWfuuacrOS/oeaBr1wiLFxuICAgICAgICBpbmFjdGl2ZUljb246IFwibG9jYXRpb24tb1wiLFxuICAgICAgICBhY3RpdmVJY29uOiBcInN1Y2Nlc3NcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRleHQ6IFwi4pGhIOebtOaSremXtOmFjee9rlwiLFxuICAgICAgICBpbmFjdGl2ZUljb246IFwibGlrZS1vXCIsXG4gICAgICAgIGFjdGl2ZUljb246IFwicGx1c1wiLFxuICAgICAgfSxcbiAgICBdLFxuICAgIHRpbWVFcnJvck1zZzoge1xuICAgICAgc3RhcnQ6IFwi6K+36YCJ5oup6K6h5YiS55u05pKt5byA5aeL5pe26Ze0XCIsXG4gICAgICBlbmQ6IFwi6K+36YCJ5oup6K6h5YiS55u05pKt57uT5p2f5pe26Ze0XCIsXG4gICAgICB0aXBzOiBcIuW8gOaSreaXtumXtOWSjOe7k+adn+aXtumXtOmXtOmalOS4jeW+l+efreS6jjMw5YiG6ZKfXCIsXG4gICAgfSxcbiAgICBzY3JlZW5UeXBlT3B0aW9uczogW1xuICAgICAgeyB0ZXh0OiBcIuerluWxj1wiLCB2YWx1ZTogMCB9LFxuICAgICAgeyB0ZXh0OiBcIuaoquWxj1wiLCB2YWx1ZTogMSB9LFxuICAgIF0sXG4gICAgc2NyZWVuVHlwZTogMCxcbiAgICBpc0ZlZWRzUHVibGljOiBmYWxzZSxcbiAgICBpc1Nob3dJbkhvbWVwYWdlOiBmYWxzZSxcbiAgICBpc0xpa2U6IHRydWUsXG4gICAgaXNDb21tZW50OiB0cnVlLFxuICAgIGlzR29vZHM6IHRydWUsXG4gICAgaXNTaGFyZTogdHJ1ZSxcbiAgICBpc1JlcGxheTogdHJ1ZSxcbiAgICBpc0tmOiBmYWxzZSxcbiAgICBzaG93UXJDb2RlOiBmYWxzZSxcbiAgICBxckNvZGVUZW1wVXJsOicnLFxuICAgIGFuY2hvck5hbWU6JycsXG4gICAgcm9vbVRpdGxlOicnLFxuICAgIGFuY2hvcldlY2hhdDonJyxcbiAgICBzdWJBbmNob3JXZWNoYXQ6JycsXG4gICAgc2hhcmVJbWc6JycsXG4gICAgZmVlZHNJbWc6JycsXG4gICAgY292ZXJJbWc6JycsXG4gICAgYmFubmVyUGhvdG86JycsXG4gICAgZG9jY29kZTonJyxcbiAgICBxckNvZGVVcmw6XCJcIiwgLy9odHRwczovL3Jlcy53eC5xcS5jb20vb3BfcmVzL0JiVk5lY3pBMVh1ZGZqVnFDVm9LZ2Z1V2U3ZTNhVWhva2t0UlZPcWZfRjBJcVM2a1lSLS1hdENwVk5VVUMzenJcbiAgICBtaW5TdGFydERhdGU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgMTAwMCAqIDYwICogMjAsXG4gICAgbWF4U3RhcnREYXRlOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIDEwMDAgKiA2MCAqIDYwICogMjQgKiAxODAsXG4gICAgc3RhcnREYXRlOiAwLCAvL25ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgIHN0YXJ0VGltZTogJycsXG4gICAgbWluRW5kRGF0ZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgKyAxMDAwICogNjAgKiA0MCxcbiAgICBtYXhFbmREYXRlOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIDEwMDAgKiA2MCAqIDYwICogMjQgKiAxODAsXG4gICAgZW5kRGF0ZTogMCwgLy9uZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICBlbmRUaW1lOiAnJyxcbiAgICBmb3JtYXR0ZXIodHlwZTpzdHJpbmcsIHZhbHVlOnN0cmluZykge1xuICAgICAgLy8gY29uc29sZS5sb2codHlwZSx2YWx1ZSlcbiAgICAgIGlmICh0eXBlID09PSBcInllYXJcIikge1xuICAgICAgICByZXR1cm4gYCR7dmFsdWV95bm0YDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJtb250aFwiKSB7XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX3mnIhgO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImRheVwiKSB7XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX3ml6VgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gIH0sXG5cbiAgLy8g5YiH5o2i55u05pKt57G75Z6LXG4gIG9uQ2hhbmdlVHlwZShldmVudDphbnkpIHtcblxuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICB0eXBlOiBldmVudC5kZXRhaWwsXG4gICAgfSk7XG4gIH0sXG4gIG9uQ2xpY2tUeXBlKGV2ZW50OmFueSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdkZGQnLGV2ZW50KTtcbiAgICBjb25zdCB7IG5hbWUgfSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQuZGF0YXNldDtcbiAgICB0aGlzLnNldERhdGEoe1xuICAgICAgdHlwZTogbmFtZSxcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICog6YCJ5oup5pe26Ze0XG4gICAqL1xuICBvbklucHV0U3RhcnREYXRlKCkge30sXG4gIG9uRW50ZXJTdGFydERhdGUoZTphbnkpIHtcbiAgICBsZXQgc3RhcnRUaW1lID0gd3guJHV0aWxzLmZvcm1hdFRpbWUoZS5kZXRhaWwpO1xuICAgIGlmIChcbiAgICAgIHRoaXMuZGF0YS5lbmREYXRlICYmXG4gICAgICBNYXRoLmFicyhlLmRldGFpbCAtIHRoaXMuZGF0YS5lbmREYXRlKSA+IDEwMDAgKiA2MCAqIDYwICogMjRcbiAgICApIHtcbiAgICAgIGxldCBkYXRlID0gZS5kZXRhaWwgKyAxMDAwICogNjAgKiA2MCAqIDI0O1xuICAgICAgbGV0IHRpbWUgPSB3eC4kdXRpbHMuZm9ybWF0VGltZShkYXRlKTtcbiAgICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICAgIGVuZERhdGU6IGRhdGUsXG4gICAgICAgIGVuZFRpbWU6IHRpbWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5kYXRhLmVuZERhdGUgJiZcbiAgICAgIE1hdGguYWJzKGUuZGV0YWlsIC0gdGhpcy5kYXRhLmVuZERhdGUpIDwgMTAwMCAqIDYwICogMzBcbiAgICApIHtcbiAgICAgIGxldCBkYXRlID0gZS5kZXRhaWwgKyAxMDAwICogNjAgKiAzMDtcbiAgICAgIGxldCB0aW1lID0gd3guJHV0aWxzLmZvcm1hdFRpbWUoZGF0ZSk7XG4gICAgICB0aGlzLnNldERhdGEoe1xuICAgICAgICBlbmREYXRlOiBkYXRlLFxuICAgICAgICBlbmRUaW1lOiB0aW1lLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGlmICh0aGlzLmRhdGEuZW5kRGF0ZSAmJiBlLmRldGFpbCA+IHRoaXMuZGF0YS5lbmREYXRlKSB7XG4gICAgLy8gfVxuICAgIGNvbnNvbGUubG9nKFwi6YCJ5oup5byA5pKt5pe26Ze0XCIsIHN0YXJ0VGltZSk7XG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIHN0YXJ0RGF0ZTogZS5kZXRhaWwsXG4gICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZSxcbiAgICAgIG1heEVuZERhdGU6IGUuZGV0YWlsICsgMTAwMCAqIDYwICogNjAgKiAyNCxcbiAgICAgIG1pbkVuZERhdGU6IGUuZGV0YWlsICsgMTAwMCAqIDYwICogMzAsXG4gICAgfSk7XG4gICAgdGhpcy5oYW5kbGVMaXZlVGltZSgpO1xuICAgIHRoaXMub25DYW5jZWxTdGFydERhdGUoKTtcbiAgfSxcbiAgb25DYW5jZWxTdGFydERhdGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coZSk7XG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQoXCIjc3RhcnQtdGltZVwiKS50b2dnbGUoKTtcbiAgICB0aGlzLmNoZWNrVGltZShcInN0YXJ0VGltZVwiLCBcIuivt+mAieaLqeiuoeWIkuebtOaSreW8gOWni+aXtumXtFwiKTtcbiAgfSxcblxuICBvbklucHV0RW5kRGF0ZSgpIHt9LFxuICAvLyBvblRpdGxlVGFwKCl7XG4gIC8vICAgaWYgKCF0aGlzLmRhdGEuc3RhcnRUaW1lKXtcbiAgLy8gICAgIHd4LnNob3dUb2FzdCh7XG4gIC8vICAgICAgIHRpdGxlOiAn6K+35YWI6YCJ5oup5byA5pKt5pe26Ze0JyxcbiAgLy8gICAgICAgZHVyYXRpb246IDIwMDBcbiAgLy8gICAgIH0pXG4gIC8vXG4gIC8vICAgfVxuICAvLyB9LFxuXG4gIG9uRW50ZXJFbmREYXRlKGU6YW55KSB7XG4gICAgbGV0IGVuZFRpbWUgPSB3eC4kdXRpbHMuZm9ybWF0VGltZShlLmRldGFpbCk7XG4gICAgY29uc29sZS5sb2coXCLpgInmi6nkuIvmkq3ml7bpl7RcIiwgZW5kVGltZSk7XG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIGVuZERhdGU6IGUuZGV0YWlsLFxuICAgICAgZW5kVGltZTogZW5kVGltZSxcbiAgICAgIC8vIG1heFN0YXJ0RGF0ZTogZS5kZXRhaWwgLSAxMDAwICogNjAgKiAzMCxcbiAgICAgIC8vIG1pblN0YXJ0RGF0ZTogZS5kZXRhaWwgKyAxMDAwICogNjAgKiAyMCxcbiAgICAgIC8vIGUuZGV0YWlsIC0gMTAwMCAqIDYwICogMzAgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBlLmRldGFpbClcbiAgICB9KTtcbiAgICAvLyB0aGlzLmhhbmRsZUxpdmVUaW1lKCk7XG4gICAgdGhpcy5vbkNhbmNlbEVuZERhdGUoKTtcbiAgfSxcbiAgb25DYW5jZWxFbmREYXRlKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKGUpO1xuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50KFwiI2VuZC10aW1lXCIpLnRvZ2dsZSgpO1xuICAgIHRoaXMuY2hlY2tUaW1lKFwiZW5kVGltZVwiLCBcIuivt+mAieaLqeiuoeWIkuebtOaSree7k+adn+aXtumXtFwiKTtcbiAgfSxcblxuICBoYW5kbGVMaXZlVGltZSgpIHtcbiAgICBjb25zb2xlLmxvZyhcImlpaVwiKTtcblxuICAgIGxldCBzdGFydERhdGUgPSB0aGlzLmRhdGEuc3RhcnREYXRlO1xuICAgIGxldCBzdGFydFRpbWUgPSB0aGlzLmRhdGEuc3RhcnRUaW1lO1xuICAgIGxldCBlbmREYXRlID0gdGhpcy5kYXRhLmVuZERhdGU7XG4gICAgbGV0IGVuZFRpbWUgPSB0aGlzLmRhdGEuZW5kVGltZTtcbiAgICBpZiAoIXN0YXJ0VGltZSB8fCAhZW5kVGltZSkgcmV0dXJuO1xuICAgIGlmIChzdGFydERhdGUgLSBlbmREYXRlID4gMCkge1xuICAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgc3RhcnREYXRlOiBlbmREYXRlLFxuICAgICAgICBzdGFydFRpbWU6IGVuZFRpbWUsXG4gICAgICAgIGVuZERhdGU6IHN0YXJ0RGF0ZSxcbiAgICAgICAgZW5kVGltZTogc3RhcnRUaW1lLFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIGNoZWNrVGltZSh0aW1lOnRpbWVUeXBlLCBtc2c6c3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuZGF0YVt0aW1lXSA9PSAnJykge1xuICAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgW3RpbWUgKyBcIkVycm9yXCJdOiBtc2csXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIFt0aW1lICsgXCJFcnJvclwiXTogXCJcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgICAvLyB0aGlzLmhhbmRsZUxpdmVUaW1lKClcbiAgfSxcblxuICBvbkNoYW5nZUZlZWRzKHsgZGV0YWlsIH06YW55KSB7XG4gICAgLy8g6ZyA6KaB5omL5Yqo5a+5IGNoZWNrZWQg54q25oCB6L+b6KGM5pu05pawXG4gICAgdGhpcy5zZXREYXRhKHsgaXNGZWVkc1B1YmxpYzogZGV0YWlsIH0pO1xuICB9LFxuICBvbkNoYW5nZVNob3dIb21lcGFnZSh7IGRldGFpbCB9OmFueSkge1xuICAgIC8vIOmcgOimgeaJi+WKqOWvuSBjaGVja2VkIOeKtuaAgei/m+ihjOabtOaWsFxuICAgIHRoaXMuc2V0RGF0YSh7IGlzU2hvd0luSG9tZXBhZ2U6IGRldGFpbCB9KTtcbiAgfSxcbiAgLyoqXG4gICAqXG4gICAqL1xuICBjaGVja0FuY2hvck5hbWUoZXZlbnQ6YW55KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIGNvbnNvbGUubG9nKHZhbHVlKTtcbiAgICB0aGlzLnNldERhdGEoe1xuICAgICAgYW5jaG9yTmFtZTogdmFsdWUsXG4gICAgfSk7XG4gICAgdGhpcy5jaGVja0lucHV0KFwiYW5jaG9yTmFtZVwiKTtcbiAgfSxcbiAgY2hlY2tSb29tVGl0bGUoZXZlbnQ6YW55KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICByb29tVGl0bGU6IHZhbHVlLFxuICAgIH0pO1xuICAgIHRoaXMuY2hlY2tJbnB1dChcInJvb21UaXRsZVwiKTtcbiAgfSxcbiAgY2hlY2tBbmNob3JXZWNoYXQoZXZlbnQ6YW55KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBhbmNob3JXZWNoYXQ6IHZhbHVlLFxuICAgIH0pO1xuICAgIHRoaXMuY2hlY2tJbnB1dChcImFuY2hvcldlY2hhdFwiKTtcbiAgfSxcbiAgY2hlY2tTdWJBbmNob3JXZWNoYXQoZXZlbnQ6YW55KSB7XG4gICAgbGV0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBzdWJBbmNob3JXZWNoYXQ6IHZhbHVlLFxuICAgIH0pO1xuICAgIGlmICh2YWx1ZS5sZW5ndGg+MCkge1xuICAgICAgdGhpcy5jaGVja0lucHV0KFwic3ViQW5jaG9yV2VjaGF0XCIpO1xuICAgIH0gZWxzZXtcbiAgICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICAgIHN1YkFuY2hvcldlY2hhdEVycm9yOiBcIlwiXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgY2hlY2tJbnB1dCh0eXBlOmlucHV0VHlwZSk6Ym9vbGVhbiB7XG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICBhbmNob3JOYW1lOiB7XG4gICAgICAgIGVycm9yOiBcIuS4u+aSreaYteensOW/hemhu+S4ujItMTXkuKrlrZdcIixcbiAgICAgICAgcmVnRXhwOiAvXi57MiwxNX0kLyxcbiAgICAgIH0sXG4gICAgICByb29tVGl0bGU6IHtcbiAgICAgICAgZXJyb3I6IFwi55u05pKt5qCH6aKY5b+F6aG75Li6My0xN+S4quWtl1wiLFxuICAgICAgICByZWdFeHA6IC9eLnszLDE3fSQvLFxuICAgICAgfSxcbiAgICAgIGFuY2hvcldlY2hhdDoge1xuICAgICAgICBlcnJvcjogXCLlvq7kv6Hlj7fkuI3lkIjop4RcIixcbiAgICAgICAgcmVnRXhwOiAvXlthLXpBLVpdW2EtekEtWlxcZF8tXXs1LDE5fSQvLFxuICAgICAgfSxcbiAgICAgIHN1YkFuY2hvcldlY2hhdDoge1xuICAgICAgICBlcnJvcjogXCLlvq7kv6Hlj7fkuI3lkIjop4RcIixcbiAgICAgICAgcmVnRXhwOiAvXlthLXpBLVpdW2EtekEtWlxcZF8tXXs1LDE5fSQvLFxuICAgICAgfSxcbiAgICB9O1xuICAgIC8vIGxldCBtc2cgPSB7XG4gICAgLy8gICBhbmNob3JOYW1lOiAn6K+36L6T5YWl5Li75pKt5pi156ewJyxcbiAgICAvLyAgIGFuY2hvck5hbWUyOiAn5Li75pKt5pi156ew5b+F6aG75Li6Mi0xNeS4quWtlycsXG4gICAgLy8gICByb29tVGl0bGU6ICfor7fovpPlhaXnm7Tmkq3moIfpopgnLFxuICAgIC8vICAgcm9vbVRpdGxlMjogJ+ebtOaSreagh+mimOW/hemhu+S4ujMtMTfkuKrlrZcnLFxuICAgIC8vIH1cbiAgICAvLyAvLyAvXlthLXpBLVpdW2EtekEtWlxcZF8tXXs1LDE5fSQvXG4gICAgLy8gbGV0IGxlbmd0aCA9IHtcbiAgICAvLyAgIGFuY2hvck5hbWU6MixcbiAgICAvLyAgIHJvb21UaXRsZTogMyxcbiAgICAvLyAgIGFuY2hvcldlY2hhdFxuICAgIC8vIH1cbiAgICBsZXQgdmFsdWUgPSB0aGlzLmRhdGFbdHlwZV0gfHwgXCJcIjtcbiAgICBjb25zb2xlLmxvZyh2YWx1ZSwgb3B0aW9uc1t0eXBlXS5yZWdFeHAudGVzdCh2YWx1ZSkpO1xuICAgIGlmICghb3B0aW9uc1t0eXBlXS5yZWdFeHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICAgIFt0eXBlICsgXCJFcnJvclwiXTogb3B0aW9uc1t0eXBlXS5lcnJvcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldERhdGEoe1xuICAgICAgICBbdHlwZSArIFwiRXJyb3JcIl06IFwiXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICog5qOA5p+lXG4gICAqL1xuXG4gIGFzeW5jIG9uQ2xpY2tOZXh0U3RlcCgpIHtcbiAgICBsZXQgYXJyID0gW107XG4gICAgbGV0IGRvY2NvZGUgPSB0aGlzLmRhdGEuZG9jY29kZXx8Jyc7XG4gICAgbGV0IHR5cGUgPSB0aGlzLmRhdGEudHlwZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gdGhpcy5kYXRhLnN0YXJ0VGltZTtcbiAgICBsZXQgZW5kVGltZSA9IHRoaXMuZGF0YS5lbmRUaW1lO1xuICAgIGxldCBhbmNob3JOYW1lID0gdGhpcy5kYXRhLmFuY2hvck5hbWU7XG4gICAgbGV0IHJvb21UaXRsZSA9IHRoaXMuZGF0YS5yb29tVGl0bGU7XG4gICAgbGV0IGFuY2hvcldlY2hhdCA9IHRoaXMuZGF0YS5hbmNob3JXZWNoYXQ7XG4gICAgbGV0IHN1YkFuY2hvcldlY2hhdCA9IHRoaXMuZGF0YS5zdWJBbmNob3JXZWNoYXR8fCcnO1xuICAgIGxldCBzY3JlZW5UeXBlID0gdGhpcy5kYXRhLnNjcmVlblR5cGU7XG4gICAgbGV0IGlzRmVlZHNQdWJsaWMgPSB0aGlzLmRhdGEuaXNGZWVkc1B1YmxpYztcbiAgICBsZXQgaXNTaG93QmFubmVyUGhvdG9PbkhvbWVQYWdlID0gdGhpcy5kYXRhLmlzU2hvd0luSG9tZXBhZ2U7XG4gICAgYXJyLnB1c2godGhpcy5jaGVja1RpbWUoXCJzdGFydFRpbWVcIiwgXCLor7fpgInmi6norqHliJLnm7Tmkq3lvIDlp4vml7bpl7RcIikpO1xuICAgIGFyci5wdXNoKHRoaXMuY2hlY2tUaW1lKFwiZW5kVGltZVwiLCBcIuivt+mAieaLqeiuoeWIkuebtOaSree7k+adn+aXtumXtFwiKSk7XG4gICAgYXJyLnB1c2godGhpcy5jaGVja0lucHV0KFwiYW5jaG9yTmFtZVwiKSk7XG4gICAgYXJyLnB1c2godGhpcy5jaGVja0lucHV0KFwicm9vbVRpdGxlXCIpKTtcbiAgICBhcnIucHVzaCh0aGlzLmNoZWNrSW5wdXQoXCJhbmNob3JXZWNoYXRcIikpO1xuICAgIGlmIChzdWJBbmNob3JXZWNoYXQubGVuZ3RoPjApIHtcbiAgICAgIGFyci5wdXNoKHRoaXMuY2hlY2tJbnB1dChcInN1YkFuY2hvcldlY2hhdFwiKSk7XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coXCLnm7Tmkq3nsbvlnotcIiwgdHlwZSk7XG4gICAgLy8gY29uc29sZS5sb2coXCLlvIDmkq3ml7bpl7RcIiwgc3RhcnRUaW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIuS4i+aSreaXtumXtFwiLCBlbmRUaW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIuS4u+aSreaYteensFwiLCBhbmNob3JOYW1lKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcIuaIv+mXtOagh+mimFwiLCByb29tVGl0bGUpO1xuICAgIC8vIGNvbnNvbGUubG9nKFwi5Li75pKt5b6u5L+hXCIsIGFuY2hvcldlY2hhdCk7XG4gICAgLy8gY29uc29sZS5sb2coXCLlsY/luZXnsbvlnotcIiwgc2NyZWVuVHlwZSk7XG4gICAgLy8gY29uc29sZS5sb2coXCLlrpjmlrnmlLblvZVcIiwgaXNGZWVkc1B1YmxpYyk7XG4gICAgaWYgKGFyci5pbmNsdWRlcyhmYWxzZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwi5LiN6IO95LiL5LiA5q2lXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZGF0YSA9IHtcbiAgICAgIHR5cGUsXG4gICAgICBzdGFydFRpbWUsXG4gICAgICBlbmRUaW1lLFxuICAgICAgYW5jaG9yTmFtZSxcbiAgICAgIG5hbWU6IHJvb21UaXRsZSxcbiAgICAgIGFuY2hvcldlY2hhdCxcbiAgICAgIHN1YkFuY2hvcldlY2hhdCxcbiAgICAgIHNjcmVlblR5cGUsXG4gICAgICBpc0ZlZWRzUHVibGljLFxuICAgICAgZG9jY29kZSxcbiAgICAgIGlzU2hvd0Jhbm5lclBob3RvT25Ib21lUGFnZVxuICAgIH07XG4gICAgY29uc29sZS5sb2coXCLnrKzkuIDmraXooajljZXmlbDmja5cIiwgZGF0YSk7XG5cbiAgICBsZXQgW2VyciwgcmVzXSA9IGF3YWl0IHd4LiR1dGlscy50byhcbiAgICAgIHd4LiRodHRwLnJlcXVlc3Qoe1xuICAgICAgICB1cmw6IFwiL3Nob3BwaW5nL2xpdmUvc2F2ZVJvb21TdGVwMS5kb1wiLFxuICAgICAgICBkYXRhLFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCLmlrDlu7rmiL/pl7QtLeesrOS4gOatpVwiLCByZXMpO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBjdXJyZW50U3RlcDogMSxcbiAgICAgIGRvY2NvZGU6IHJlcy5kb2Njb2RlLFxuICAgICAgbG9nb1VybDphcHAuZ2xvYmFsRGF0YS5sb2dvVXJsLFxuICAgICAgc2hvcE5hbWU6YXBwLmdsb2JhbERhdGEuc2hvcE5hbWVcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICog56ys5LqM5q2lLS3kuIrkvKDlm77niYdcbiAgICovXG4gIHVwbG9hZEltZyhpbWdUeXBlOmltZ1R5cGUpIHtcbiAgICB3eC5jaG9vc2VJbWFnZSh7XG4gICAgICBjb3VudDogMSwgLy8g6buY6K6kOVxuICAgICAgc2l6ZVR5cGU6IFtcIm9yaWdpbmFsXCIsIFwiY29tcHJlc3NlZFwiXSwgLy8g5Y+v5Lul5oyH5a6a5piv5Y6f5Zu+6L+Y5piv5Y6L57yp5Zu+77yM6buY6K6k5LqM6ICF6YO95pyJXG4gICAgICBzb3VyY2VUeXBlOiBbXCJhbGJ1bVwiLCBcImNhbWVyYVwiXSwgLy8g5Y+v5Lul5oyH5a6a5p2l5rqQ5piv55u45YaM6L+Y5piv55u45py677yM6buY6K6k5LqM6ICF6YO95pyJXG4gICAgICBzdWNjZXNzOiBhc3luYyhyZXMpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2cocmVzLmRhdGEpXG4gICAgICAgIC8vIHRoaXMuc2V0RGF0YSh7XG4gICAgICAgIC8vICAgaW1hZ2VMaXN0OiByZXMudGVtcEZpbGVQYXRocyxcbiAgICAgICAgLy8gICB0ZW1wRmlsZXM6IHJlcy50ZW1wRmlsZXNcbiAgICAgICAgLy8gfSlcbiAgICAgICAgbGV0IGltZ0xpc3QgPSByZXMudGVtcEZpbGVQYXRocztcbiAgICAgICAgbGV0IGZpbGVzID0gcmVzLnRlbXBGaWxlcztcbiAgICAgICAgbGV0IGZpZWxkaWQgPSBpbWdUeXBlO1xuICAgICAgICBsZXQgZG9jY29kZSA9IHRoaXMuZGF0YS5kb2Njb2RlO1xuICAgICAgICBjb25zb2xlLmxvZyhpbWdMaXN0LCBmaWxlcywgZmllbGRpZCwgZG9jY29kZSk7XG4gICAgICAgIGxldCBbZXJyLHJlc3VsdF0gPSBhd2FpdCB3eC4kdXRpbHMudG8oXG4gICAgICAgICAgd3guJGh0dHAudXBsb2FkRmlsZSh7XG4gICAgICAgICAgICB1cmw6YC9zaG9wcGluZy9saXZlL3NhdmVSb29tQXR0YWNobWVudC5kbz9kb2Njb2RlPSR7ZG9jY29kZX0mZmllbGRpZD0ke2ZpZWxkaWR9YCxcbiAgICAgICAgICAgIGZvcm1EYXRhOntcbiAgICAgICAgICAgICAgZmlsZTogZmlsZXNbMF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmlsZVBhdGg6aW1nTGlzdFswXVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgaWYgKGVycil7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgICBbaW1nVHlwZV06IHJlc3VsdC51cmwsXG4gICAgICAgICAgW2ltZ1R5cGUgKyBcIkVycm9yXCJdOiBcIlwiLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gdGhpcy5zZXREYXRhKHtcbiAgICAgICAgLy8gICBbaW1nVHlwZV06IGltZ0xpc3RbMF0sXG4gICAgICAgIC8vIH0pO1xuICAgICAgICAvLyByZXR1cm47XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gd3gudXBsb2FkRmlsZSh7XG4gICAgICAgIC8vICAgdXJsOiB3eC4kdXRpbHMuZ2V0VXJsKFxuICAgICAgICAvLyAgICAgXCIvc2hvcHBpbmcvbGl2ZS9zYXZlUm9vbUF0dGFjaG1lbnQuZG8/ZG9jY29kZT1cIiArXG4gICAgICAgIC8vICAgICAgIGRvY2NvZGUgK1xuICAgICAgICAvLyAgICAgICBcIiZmaWVsZGlkPVwiICtcbiAgICAgICAgLy8gICAgICAgZmllbGRpZFxuICAgICAgICAvLyAgICksXG4gICAgICAgIC8vICAgLy8gdXJsOiBhcHAuZ2xvYmFsRGF0YS5yZXFCYXNlICsgJy9zaG9wcGluZy9jb25maXJtLmRvP209dXBsb2FkQXR0YWNobWVudCZkb2Njb2RlPScrIGRvY2NvZGUgKycmcm93aWQ9Jytyb3dpZCxcbiAgICAgICAgLy8gICBmb3JtRGF0YToge1xuICAgICAgICAvLyAgICAgZmlsZTogZmlsZXNbMF0sXG4gICAgICAgIC8vICAgfSxcbiAgICAgICAgLy8gICBmaWxlUGF0aDogaW1nTGlzdFswXSxcbiAgICAgICAgLy8gICBuYW1lOiBcImRhdGFcIixcbiAgICAgICAgLy8gICAvL0B0cy1pZ25vcmVcbiAgICAgICAgLy8gICBzdWNjZXNzOiAocmVzOmFueSkgPT4ge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2cocmVzKTtcbiAgICAgICAgLy8gICAgIC8vIHJldHVybjtcbiAgICAgICAgLy8gICAgIC8vIGlmICghd3guJHV0aWxzLnJlcXVlc3RFcnJvcihyZXMpKSB7XG4gICAgICAgIC8vICAgICAvLyAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gICAgIC8vIH1cbiAgICAgICAgLy8gICAgIC8vIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAvLyAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgLy8gICAgICAgW2ltZ1R5cGVdOiByZXMuZGF0YS51cmwsXG4gICAgICAgIC8vICAgICAgIFtpbWdUeXBlICsgXCJFcnJvclwiXTogXCJcIixcbiAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAvLyAgIH0sXG4gICAgICAgIC8vICAgZmFpbDogZnVuY3Rpb24gKGVycm1zZykge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCJ1cGxvYWRJbWFnZSBmYWlsLCBlcnJNc2cgaXNcIiwgZXJybXNnKTtcbiAgICAgICAgLy8gICAgIHd4LiR1dGlscy5yZXF1ZXN0RmFpbChcbiAgICAgICAgLy8gICAgICAgZXJybXNnLFxuICAgICAgICAvLyAgICAgICBcIi9zaG9wcGluZy9saXZlL3NhdmVSb29tQXR0YWNobWVudC5kbz9kb2Njb2RlPVwiXG4gICAgICAgIC8vICAgICApO1xuICAgICAgICAvLyAgIH0sXG4gICAgICAgIC8vIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbiAgdXBsb2FkU2hhcmVJbWcoKSB7XG4gICAgdGhpcy51cGxvYWRJbWcoXCJzaGFyZUltZ1wiKTtcbiAgfSxcbiAgdXBsb2FkRmVlZHNJbWcoKSB7XG4gICAgdGhpcy51cGxvYWRJbWcoXCJmZWVkc0ltZ1wiKTtcbiAgfSxcbiAgdXBsb2FkQ292ZXJJbWcoKSB7XG4gICAgdGhpcy51cGxvYWRJbWcoXCJjb3ZlckltZ1wiKTtcbiAgfSxcbiAgdXBsb2FkQmFubmVyUGhvdG8oKSB7XG4gICAgdGhpcy51cGxvYWRJbWcoXCJiYW5uZXJQaG90b1wiKTtcbiAgfSxcblxuICBvbkNsaWNrTGFzdFN0ZXAoKSB7XG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIGN1cnJlbnRTdGVwOiAwLFxuICAgIH0pO1xuICB9LFxuXG4gIG9uQ2hhbmdlTGlrZSh7IGRldGFpbCB9OmFueSkge1xuICAgIHRoaXMuc2V0RGF0YSh7IGlzTGlrZTogZGV0YWlsIH0pO1xuICB9LFxuICBvbkNoYW5nZUNvbW1lbnQoeyBkZXRhaWwgfTphbnkpIHtcbiAgICB0aGlzLnNldERhdGEoeyBpc0NvbW1lbnQ6IGRldGFpbCB9KTtcbiAgfSxcbiAgb25DaGFuZ2VHb29kcyh7IGRldGFpbCB9OmFueSkge1xuICAgIHRoaXMuc2V0RGF0YSh7IGlzR29vZHM6IGRldGFpbCB9KTtcbiAgfSxcbiAgb25DaGFuZ2VTaGFyZSh7IGRldGFpbCB9OmFueSkge1xuICAgIHRoaXMuc2V0RGF0YSh7IGlzU2hhcmU6IGRldGFpbCB9KTtcbiAgfSxcbiAgb25DaGFuZ2VSZXBsYXkoeyBkZXRhaWwgfTphbnkpIHtcbiAgICB0aGlzLnNldERhdGEoeyBpc1JlcGxheTogZGV0YWlsIH0pO1xuICB9LFxuXG4gIHNob3dFcnJvck1zZyhpbWdUeXBlOmltZ1R5cGUsZXJyTXNnOnN0cmluZyl7XG4gICAgd3guc2hvd1RvYXN0KHtcbiAgICAgIHRpdGxlOiBlcnJNc2csXG4gICAgICBpY29uOiBcIm5vbmVcIixcbiAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgIH0pO1xuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBbaW1nVHlwZSArIFwiRXJyb3JcIl06IGVyck1zZyxcbiAgICB9KTtcbiAgfSxcbiAgaXNJbWdVcGxvYWQoKXtcbiAgICBpZiAoIXRoaXMuZGF0YS5zaGFyZUltZykge1xuICAgICAgbGV0IGVyck1zZyA9IFwi6K+35LiK5Lyg5YiG5Lqr5Y2h54mH5bCB6Z2i5Zu+54mHXCI7XG4gICAgICB0aGlzLnNob3dFcnJvck1zZygnc2hhcmVJbWcnLGVyck1zZylcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRhdGEuZmVlZHNJbWcpIHtcbiAgICAgIGxldCBlcnJNc2cgPSBcIuivt+S4iuS8oOebtOaSreWNoeeJh+WwgemdolwiO1xuICAgICAgdGhpcy5zaG93RXJyb3JNc2coJ2ZlZWRzSW1nJyxlcnJNc2cpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIGlmICghdGhpcy5kYXRhLmJhbm5lclBob3RvJiZ0aGlzLmRhdGEuaXNTaG93SW5Ib21lcGFnZSkge1xuICAgIC8vICAgbGV0IGVyck1zZyA9IFwi6K+35LiK5Lyg55u05pKt6Ze06aaW6aG15YWl5Y+j5bCB6Z2iXCI7XG4gICAgLy8gICB0aGlzLnNob3dFcnJvck1zZygnYmFubmVyUGhvdG8nLGVyck1zZylcbiAgICAvLyAgIHJldHVybiBmYWxzZTtcbiAgICAvLyB9XG4gICAgaWYgKCF0aGlzLmRhdGEuY292ZXJJbWcpIHtcbiAgICAgIGxldCBlcnJNc2cgPSBcIuivt+S4iuS8oOebtOaSremXtOiDjOaZr+WimVwiO1xuICAgICAgdGhpcy5zaG93RXJyb3JNc2coJ2NvdmVySW1nJyxlcnJNc2cpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIGFzeW5jIG9uQ2xpY2tTdWJtaXQoKSB7XG4gICAgbGV0IGRhdGEgPSB7XG4gICAgICBkb2Njb2RlOiB0aGlzLmRhdGEuZG9jY29kZSxcbiAgICAgIGNsb3NlTGlrZTogIXRoaXMuZGF0YS5pc0xpa2UsXG4gICAgICBjbG9zZUdvb2RzOiAhdGhpcy5kYXRhLmlzR29vZHMsXG4gICAgICBjbG9zZUNvbW1lbnQ6ICF0aGlzLmRhdGEuaXNDb21tZW50LFxuICAgICAgY2xvc2VSZXBsYXk6ICF0aGlzLmRhdGEuaXNSZXBsYXksXG4gICAgICBjbG9zZVNoYXJlOiAhdGhpcy5kYXRhLmlzU2hhcmUsXG4gICAgICBjbG9zZUtmOiB0cnVlLFxuICAgIH07XG4gICAgY29uc29sZS5sb2coXCLnrKzkuozmraXorr7nva7mlbDmja5cIiwgZGF0YSk7XG4gICAgaWYgKCF0aGlzLmlzSW1nVXBsb2FkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAvc2hvcHBpbmcvbGl2ZS9zYXZlUm9vbVN0ZXAyLmRvP2RvY2NvZGU9WFhYJmNsb3NlTGlrZT1mYWxzZSZjbG9zZUdvb2RzPWZhbHNlJmNsb3NlQ29tbWVudD1mYWxzZSZjbG9zZVJlcGxheT1mYWxzZSZjbG9zZVNoYXJlPWZhbHNlJmNsb3NlS2Y9ZmFsc2VcbiAgICBsZXQgW2VyciwgcmVzXSA9IGF3YWl0IHd4LiR1dGlscy50byhcbiAgICAgIHd4LiRodHRwLnJlcXVlc3Qoe1xuICAgICAgICB1cmw6IFwiL3Nob3BwaW5nL2xpdmUvc2F2ZVJvb21TdGVwMi5kb1wiLFxuICAgICAgICBkYXRhLFxuICAgICAgfSlcbiAgICApO1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCLmlrDlu7rmiL/pl7QtLeesrOS6jOatpVwiLCByZXMpO1xuICAgIGlmIChyZXMuUXJDb2RlVXJsVW5pZCkge1xuICAgICAgd3guc2hvd0xvYWRpbmcoe1xuICAgICAgICB0aXRsZTogJydcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy5kb3dubG9hZFFyKHJlcy5RckNvZGVVcmxVbmlkKTtcbiAgICAgIHd4LmhpZGVMb2FkaW5nKCk7XG4gICAgICB0aGlzLnNldERhdGEoe1xuICAgICAgICBzaG93UXJDb2RlOiB0cnVlLFxuICAgICAgICBxckNvZGVVcmw6cmVzLlFyQ29kZVVybFVuaWRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3eC5zaG93VG9hc3Qoe1xuICAgICAgICB0aXRsZTogJ+ebtOaSremXtOWIm+W7uuaIkOWKnycsXG4gICAgICAgIGljb246IFwibm9uZVwiLFxuICAgICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAvLyB3eC5yZWRpcmVjdFRvKHtcbiAgICAgICAgLy8gICB1cmw6IFwiLi4vbXlMaXZlUm9vbS9teUxpdmVSb29tXCIsXG4gICAgICAgIC8vIH0pO1xuICAgICAgICB3eC5uYXZpZ2F0ZUJhY2soKTtcbiAgICAgIH0sMjAwMClcblxuICAgICAgLy8gJ2h0dHBzOi8vcmVzLnd4LnFxLmNvbS9vcF9yZXMvQmJWTmVjekExWHVkZmpWcUNWb0tnZnVXZTdlM2FVaG9ra3RSVk9xZl9GMElxUzZrWVItLWF0Q3BWTlVVQzN6cidcbiAgICB9XG4gIH0sXG5cbiAgYXN5bmMgaXNBdXRob3JpemVTYXZlKCkge1xuICAgIGxldCBbZXJyLCByZXNdID0gYXdhaXQgd3guJHV0aWxzLnRvKHd4LnByby5nZXRTZXR0aW5nKCkpO1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCJnZXRTZXR0aW5nXCIsIHJlcyk7XG4gICAgcmV0dXJuIHJlcy5hdXRoU2V0dGluZ1tcInNjb3BlLndyaXRlUGhvdG9zQWxidW1cIl0gIT09IGZhbHNlO1xuICB9LFxuXG4gIGFzeW5jIGRvd25sb2FkUXIocXJDb2RlVXJsOnN0cmluZykge1xuICAgIGxldCBbZXJyLCByZXNdID0gYXdhaXQgd3guJHV0aWxzLnRvKFxuICAgICAgd3gucHJvLmRvd25sb2FkRmlsZSh7XG4gICAgICAgIC8vIHVybDogdGhpcy5kYXRhLnFyQ29kZVVybFxuICAgICAgICB1cmw6IHFyQ29kZVVybCxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImRvd25sb2FkUXJcIiwgZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCItLS0tZG93bmxvYWRRclwiLHJlcyk7XG4gICAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAyMDApIHtcbiAgICAgIC8vIGltZ0Rvd25sb2FkU3VtKys7XG4gICAgICBjb25zb2xlLmxvZygnLi4uLi4u5aS05YOPJyxyZXMudGVtcEZpbGVQYXRoKVxuICAgICAgdGhpcy5zZXREYXRhKHtcbiAgICAgICAgcXJDb2RlVGVtcFVybDogcmVzLnRlbXBGaWxlUGF0aFxuICAgICAgfSlcbiAgICB9ZWxzZXtcbiAgICAgIHd4LnNob3dUb2FzdCh7XG4gICAgICAgIHRpdGxlOiAn5LqM57u056CB5LiL6L295aSx6LSl77yM6K+36YeN6K+VJyxcbiAgICAgICAgaWNvbjogXCJub25lXCIsXG4gICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIGFzeW5jIHNhdmVRckltZygpIHtcbiAgICB3eC5zaG93TG9hZGluZyh7XG4gICAgICB0aXRsZTogXCLkv53lrZjkuK0uLi5cIixcbiAgICB9KTtcbiAgICBsZXQgaXNBdXRob3JpemVTYXZlID0gYXdhaXQgdGhpcy5pc0F1dGhvcml6ZVNhdmUoKTtcbiAgICBpZiAoIWlzQXV0aG9yaXplU2F2ZSkge1xuICAgICAgd3guaGlkZUxvYWRpbmcoKTtcbiAgICAgIHd4LnNob3dNb2RhbCh7XG4gICAgICAgIHRpdGxlOiBcIuaPkOekulwiLFxuICAgICAgICBjb250ZW50OiBcIuaCqOi/mOacquaOiOadg+S/neWtmOWIsOebuOWGjO+8jOivt+WcqOaOpeS4i+adpeaJk+W8gOeahOiuvue9rumhtemdouW8gOWQr+ebuOWGjOaOiOadg++8gVwiLFxuICAgICAgICBzdWNjZXNzKHJlcykge1xuICAgICAgICAgIGlmIChyZXMuY29uZmlybSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnlKjmiLfngrnlh7vnoa7lrppcIik7XG4gICAgICAgICAgICB3eC5vcGVuU2V0dGluZyh7XG4gICAgICAgICAgICAgIHN1Y2Nlc3MocmVzKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzLmF1dGhTZXR0aW5nKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmNhbmNlbCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnlKjmiLfngrnlh7vlj5bmtohcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHd4LnNhdmVJbWFnZVRvUGhvdG9zQWxidW0oe1xuICAgICAgZmlsZVBhdGg6IHRoaXMuZGF0YS5xckNvZGVUZW1wVXJsLFxuICAgICAgc3VjY2VzczogKCkgPT4ge1xuICAgICAgICB3eC5zaG93VG9hc3Qoe1xuICAgICAgICAgIHRpdGxlOiBcIuS6jOe7tOeggeW3suS/neWtmOWIsOacrOWcsO+8jOi1tue0p+WIhuS6q+e7meS4u+aSreiupOivgeWQp++8gVwiLFxuICAgICAgICAgIGljb246IFwibm9uZVwiLFxuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICB3eC5oaWRlTG9hZGluZygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbiAgZ2V0VGltZU1TKHRpbWU6c3RyaW5nKXtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZS5yZXBsYWNlKCctJywnLycpKS5nZXRUaW1lKCk7XG4gIH0sXG4gIGFzeW5jIGdldFJvb21EYXRhKGRvY2NvZGU6c3RyaW5nKXtcbiAgICBsZXQgW2VycixyZXNdID0gYXdhaXQgd3guJHV0aWxzLnRvKFxuICAgICAgd3guJGh0dHAucmVxdWVzdCh7XG4gICAgICAgIHVybDonL3Nob3BwaW5nL2xpdmUvZ2V0TGl2ZVJvb21MaXN0Rm9yTWUuZG8nLFxuICAgICAgICBkYXRhOntcbiAgICAgICAgICBkb2Njb2RlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKVxuICAgIGlmIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJvb21EYXRhID0gcmVzLmxpc3RbMF07XG4gICAgY29uc29sZS5sb2coJ+e8lui+keebtOaSremXtOOAguOAguOAgicscm9vbURhdGEuVHlwZS50b1N0cmluZygpLHJvb21EYXRhLlR5cGUpO1xuXG4gICAgdGhpcy5zZXREYXRhKHtcbiAgICAgIGFuY2hvck5hbWU6IHJvb21EYXRhLkFuY2hvck5hbWUsXG4gICAgICBhbmNob3JXZWNoYXQ6IHJvb21EYXRhLkFuY2hvcldlY2hhdCxcbiAgICAgIHN1YkFuY2hvcldlY2hhdDogcm9vbURhdGEuU3ViQW5jaG9yV2VjaGF0LFxuICAgICAgcm9vbVRpdGxlOiByb29tRGF0YS5Sb29tTmFtZSxcbiAgICAgIHNjcmVlblR5cGU6IHJvb21EYXRhLlNjcmVlblR5cGUsXG4gICAgICBpc0ZlZWRzUHVibGljOiByb29tRGF0YS5pc0ZlZWRzUHVibGljLFxuICAgICAgaXNTaG93SW5Ib21lcGFnZTpyb29tRGF0YS5pc1Nob3dCYW5uZXJQaG90b09uSG9tZVBhZ2UsXG4gICAgICB0eXBlOnJvb21EYXRhLlR5cGUudG9TdHJpbmcoKXx8JzAnLFxuICAgICAgc3RhcnREYXRlOnRoaXMuZ2V0VGltZU1TKHJvb21EYXRhLlN0YXJ0VGltZSksXG4gICAgICBlbmREYXRlOnRoaXMuZ2V0VGltZU1TKHJvb21EYXRhLkVuZFRpbWUpLFxuICAgICAgc3RhcnRUaW1lOnJvb21EYXRhLlN0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWU6cm9vbURhdGEuRW5kVGltZSxcbiAgICAgIGRvY2NvZGU6cm9vbURhdGEuRG9jQ29kZSxcbiAgICAgIHNoYXJlSW1nOnJvb21EYXRhLlNoYXJlSW1nVW5pZFVybHx8JycsXG4gICAgICBjb3ZlckltZzpyb29tRGF0YS5Db3ZlckltZ1VuaWRVcmx8fCcnLFxuICAgICAgZmVlZHNJbWc6cm9vbURhdGEuRmVlZHNJbWdVbmlkVXJsfHwnJyxcbiAgICAgIGJhbm5lclBob3RvOnJvb21EYXRhLkJhbm5lclBob3RvfHwnJyxcbiAgICAgIGlzTGlrZTogIXJvb21EYXRhLmlzQ2xvc2VMaWtlLFxuICAgICAgaXNDb21tZW50OiAhcm9vbURhdGEuaXNDbG9zZUNvbW1lbnQsXG4gICAgICBpc0dvb2RzOiAhcm9vbURhdGEuaXNDbG9zZUdvb2RzLFxuICAgICAgaXNTaGFyZTogIXJvb21EYXRhLmlzQ2xvc2VTaGFyZSxcbiAgICAgIGlzUmVwbGF5OiAhcm9vbURhdGEuaXNDbG9zZVJlcGxheSxcbiAgICB9KVxuICB9LFxuICAvKipcbiAgICog55Sf5ZG95ZGo5pyf5Ye95pWwLS3nm5HlkKzpobXpnaLliqDovb1cbiAgICovXG4gIG9uTG9hZDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICB3eC4kaHR0cC5yZXF1ZXN0KHtcbiAgICAgIHVybDonL3Nob3BwaW5nL2FjY291bnQuZG8/bT1hY2NvdW50SW5mbycsXG4gICAgfSkudGhlbigocmVzOmFueSk9PntcbiAgICAgIGNvbnNvbGUubG9nKCfojrflj5bnlKjmiLfkv6Hmga8nLHJlcyk7XG4gICAgICB0aGlzLnNldERhdGEoe1xuICAgICAgICBIZWFkSW1nVXJsOnJlcy5Vc2VySW5mby5IZWFkSW1nVXJsXG4gICAgICB9KVxuICAgIH0pXG4gICAgbGV0IGRvY2NvZGUgPSBvcHRpb25zLmRvY2NvZGUgfHwgJyc7XG4gICAgaWYgKGRvY2NvZGUpIHtcbiAgICAgIHRoaXMuZ2V0Um9vbURhdGEoZG9jY29kZSk7XG4gICAgfVxuICAgIHRoaXMuc2V0RGF0YSh7XG4gICAgICBpc1Nob3dCYW5uZXJPbkhvbWVQYWdlOmFwcC5nbG9iYWxEYXRhLmlzU2hvd0Jhbm5lclBob3RvT25Ib21lUGFnZUZvckxpdmVVc2VyXG4gICAgfSlcbiAgfSxcblxuICAvKipcbiAgICog55Sf5ZG95ZGo5pyf5Ye95pWwLS3nm5HlkKzpobXpnaLliJ3mrKHmuLLmn5PlrozmiJBcbiAgICovXG4gIG9uUmVhZHk6IGZ1bmN0aW9uICgpIHt9LFxuXG4gIC8qKlxuICAgKiDnlJ/lkb3lkajmnJ/lh73mlbAtLeebkeWQrOmhtemdouaYvuekulxuICAgKi9cbiAgb25TaG93OiBmdW5jdGlvbiAoKSB7fSxcblxuICAvKipcbiAgICog55Sf5ZG95ZGo5pyf5Ye95pWwLS3nm5HlkKzpobXpnaLpmpDol49cbiAgICovXG4gIG9uSGlkZTogZnVuY3Rpb24gKCkge30sXG5cbiAgLyoqXG4gICAqIOeUn+WRveWRqOacn+WHveaVsC0t55uR5ZCs6aG16Z2i5Y246L29XG4gICAqL1xuICBvblVubG9hZDogZnVuY3Rpb24gKCkge30sXG5cbiAgLyoqXG4gICAqIOmhtemdouebuOWFs+S6i+S7tuWkhOeQhuWHveaVsC0t55uR5ZCs55So5oi35LiL5ouJ5Yqo5L2cXG4gICAqL1xuICBvblB1bGxEb3duUmVmcmVzaDogZnVuY3Rpb24gKCkge30sXG5cbiAgLyoqXG4gICAqIOmhtemdouS4iuaLieinpuW6leS6i+S7tueahOWkhOeQhuWHveaVsFxuICAgKi9cbiAgb25SZWFjaEJvdHRvbTogZnVuY3Rpb24gKCkge30sXG5cbiAgLyoqXG4gICAqIOeUqOaIt+eCueWHu+WPs+S4iuinkuWIhuS6q1xuICAgKi9cbiAgLy8gb25TaGFyZUFwcE1lc3NhZ2U6IGZ1bmN0aW9uICgpIHtcblxuICAvLyB9XG59KTtcblxuZXhwb3J0IHt9XG4iXX0=
|