ng-yunzai-mobile
Version:
1. 修改wechat.micro.ts
522 lines • 36 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: devices/wechat.micro.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { BaseDevice } from "./base.device";
import { from } from "rxjs";
import { TokenService } from "../token/token.service";
import { UserService } from "../user/user.service";
import { HttpClient } from "@angular/common/http";
import { BASE_CLIENT } from "../client/base.client";
import { Inject, Injectable } from "@angular/core";
import { preloaderFinished } from "../auth/preloader";
import { Title } from "@angular/platform-browser";
import * as i0 from "@angular/core";
import * as i1 from "../token/token.service";
import * as i2 from "@angular/common/http";
import * as i3 from "../user/user.service";
import * as i4 from "@angular/platform-browser";
import * as i5 from "../client/base.client";
/** @type {?} */
var apis = [
"updateAppMessageShareData",
"updateTimelineShareData",
"onMenuShareTimeline",
"onMenuShareAppMessage",
"onMenuShareQQ",
"onMenuShareWeibo",
"onMenuShareQZone",
"startRecord",
"stopRecord",
"onVoiceRecordEnd",
"playVoice",
"pauseVoice",
"stopVoice",
"onVoicePlayEnd",
"uploadVoice",
"downloadVoice",
"chooseImage",
"previewImage",
"uploadImage",
"downloadImage",
"translateVoice",
"getNetworkType",
"openLocation",
"getLocation",
"hideOptionMenu",
"showOptionMenu",
"hideMenuItems",
"showMenuItems",
"hideAllNonBaseMenuItem",
"showAllNonBaseMenuItem",
"closeWindow",
"scanQRCode",
"chooseWXPay",
"openProductSpecificView",
"addCard",
"chooseCard",
"openCard",
];
/** @type {?} */
var openTags = [
'wx-open-launch-weapp',
'wx-open-launch-app',
'wx-open-subscribe',
'wx-open-audio'
];
var WechatMicro = /** @class */ (function (_super) {
tslib_1.__extends(WechatMicro, _super);
function WechatMicro(tokenService, http, user, title, baseclient) {
var _this = _super.call(this) || this;
_this.tokenService = tokenService;
_this.http = http;
_this.user = user;
_this.title = title;
_this.baseclient = baseclient;
return _this;
}
/**
* @return {?}
*/
WechatMicro.prototype.auth = /**
* @return {?}
*/
function () {
var _this = this;
if (this.baseclient.wechatMicro && this.baseclient.wechatMicro.auth === false) {
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) {
preloaderFinished();
resolve(true);
}));
}
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) {
/** @type {?} */
var tokenInfo = {};
tokenInfo.account = _this.getUrlParam('account');
tokenInfo.accessToken = _this.getUrlParam('accessToken');
tokenInfo.userId = _this.getUrlParam('userId');
tokenInfo.tokenType = 'bearer';
_this.tokenService.set((/** @type {?} */ (tokenInfo)));
_this.http
.get(_this.baseclient.gateway + "/auth/user")
.subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
// 设置user
_this.user.set(response.principal);
_this.generateWechatConfig();
// 加载结束
preloaderFinished();
resolve(true);
}));
}));
};
/**
* @return {?}
*/
WechatMicro.prototype.generateWechatConfig = /**
* @return {?}
*/
function () {
this.http
.get(this.baseclient.gateway + "/wechat/mp/jssdk?url=" + encodeURIComponent(window.location.href))
.subscribe((/**
* @param {?} response
* @return {?}
*/
function (response) {
wx.config({
debug: false,
// 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: response.appId,
// 必填,公众号的唯一标识
timestamp: response.timestamp,
// 必填,生成签名的时间戳
nonceStr: response.nonceStr,
// 必填,生成签名的随机串
signature: response.signature,
// 必填,签名
jsApiList: apis,
// 必填,需要使用的JS接口列表
openTagList: openTags // 可选,需要使用的开放标签列表,例如['wx-open-launch-app']
});
}));
wx.ready((/**
* @return {?}
*/
function () {
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
// 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
console.log('微信jssdk初始化完成.');
}));
wx.error((/**
* @param {?} res
* @return {?}
*/
function (res) {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
console.log('微信jssdk初始化失败:', res);
}));
};
/**
* @param {?} iwindow
* @return {?}
*/
WechatMicro.prototype.openWindow = /**
* @param {?} iwindow
* @return {?}
*/
function (iwindow) {
window.location.href = iwindow.url;
};
/**
* @param {?} ititle
* @return {?}
*/
WechatMicro.prototype.setTitle = /**
* @param {?} ititle
* @return {?}
*/
function (ititle) {
this.title.setTitle(ititle.title);
};
/**
* @param {?} navigationBar
* @return {?}
*/
WechatMicro.prototype.setNavigationBar = /**
* @param {?} navigationBar
* @return {?}
*/
function (navigationBar) {
alert("小程序暂不支持放置按钮,请在APP中使用此功能!");
};
/**
* @param {?} ishare
* @return {?}
*/
WechatMicro.prototype.share = /**
* @param {?} ishare
* @return {?}
*/
function (ishare) {
alert("小程序暂不支持分享,请在APP中使用此功能!");
};
/**
* @return {?}
*/
WechatMicro.prototype.getToken = /**
* @return {?}
*/
function () {
/** @type {?} */
var itoken = {
accessToken: this.tokenService.get().accessToken,
tokenType: null,
tokenDataLine: null,
scope: null,
};
return itoken;
};
/**
* @return {?}
*/
WechatMicro.prototype.scanCode = /**
* @return {?}
*/
function () {
/** @type {?} */
var p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) {
wx.scanQRCode({
needResult: 1,
scanType: ['qrCode', 'barCode'],
success: (/**
* @param {?} res
* @return {?}
*/
function (res) {
resolve(res.resultStr);
}),
});
}));
return from(p);
};
/**
* @return {?}
*/
WechatMicro.prototype.userLocation = /**
* @return {?}
*/
function () {
/** @type {?} */
var p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
function (resolve, reject) {
wx.getLocation({
type: 'wgs84',
success:
// 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
/**
* @param {?} res
* @return {?}
*/
function (res) {
if (res.errMsg === 'getLocation:ok') {
/** @type {?} */
var latitude = res.latitude;
// 纬度,浮点数,范围为90 ~ -90
/** @type {?} */
var longitude = res.longitude;
// 经度,浮点数,范围为180 ~ -180。
/** @type {?} */
var address = '微信无address';
resolve({ latitude: latitude, longitude: longitude, address: address });
}
},
});
}));
return from(p);
};
/**
* @param {?} bssids
* @return {?}
*/
WechatMicro.prototype.validateInWifi = /**
* @param {?} bssids
* @return {?}
*/
function (bssids) {
alert("小程序暂不支持WIFI验证,请在APP中使用此功能!");
return undefined;
};
/**
* @return {?}
*/
WechatMicro.prototype.getWifiMac = /**
* @return {?}
*/
function () {
alert("小程序暂不支持获取MAC地址,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} count
* @return {?}
*/
WechatMicro.prototype.chooseContacts = /**
* @param {?} count
* @return {?}
*/
function (count) {
alert("小程序暂不支持获取联系人,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} targetUserId
* @return {?}
*/
WechatMicro.prototype.contactDetails = /**
* @param {?} targetUserId
* @return {?}
*/
function (targetUserId) {
alert("小程序暂不支持查询联系人详细信息,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} count
* @param {?} sourceType
* @return {?}
*/
WechatMicro.prototype.uploadImage = /**
* @param {?} count
* @param {?} sourceType
* @return {?}
*/
function (count, sourceType) {
alert("小程序暂不支持图片上传,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} url
* @param {?} openType
* @param {?} title
* @param {?} id
* @param {?} type
* @return {?}
*/
WechatMicro.prototype.openReadWithTimer = /**
* @param {?} url
* @param {?} openType
* @param {?} title
* @param {?} id
* @param {?} type
* @return {?}
*/
function (url, openType, title, id, type) {
alert("小程序暂不支持读物时间统计,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} limitMinute
* @return {?}
*/
WechatMicro.prototype.uploadMovie = /**
* @param {?} limitMinute
* @return {?}
*/
function (limitMinute) {
alert("小程序暂不支持视频上传,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} url
* @param {?} title
* @return {?}
*/
WechatMicro.prototype.fileBrowser = /**
* @param {?} url
* @param {?} title
* @return {?}
*/
function (url, title) {
alert("小程序暂不支持此功能,请在APP中使用此功能!");
return undefined;
};
/**
* @param {?} ticket
* @param {?} callback
* @return {?}
*/
WechatMicro.prototype.startSearchBeacons = /**
* @param {?} ticket
* @param {?} callback
* @return {?}
*/
function (ticket, callback) {
wx.startSearchBeacons({
ticket: ticket,
complete: callback,
});
};
/**
* @param {?} callback
* @return {?}
*/
WechatMicro.prototype.stopSearchBeacons = /**
* @param {?} callback
* @return {?}
*/
function (callback) {
wx.stopSearchBeacons({
complete: callback,
});
};
/**
* @param {?} callback
* @return {?}
*/
WechatMicro.prototype.onSearchBeacons = /**
* @param {?} callback
* @return {?}
*/
function (callback) {
wx.onSearchBeacons({
complete: callback,
});
};
// 封装方法: 获取url中的参数
// 封装方法: 获取url中的参数
/**
* @private
* @param {?} name
* @return {?}
*/
WechatMicro.prototype.getUrlParam =
// 封装方法: 获取url中的参数
/**
* @private
* @param {?} name
* @return {?}
*/
function (name) {
// 构造一个含有目标参数的正则表达式对象
/** @type {?} */
var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)');
/** @type {?} */
var strings = window.location.href.split('?');
// 匹配目标参数
/** @type {?} */
var r = strings[strings.length - 1].match(reg);
if (r != null) {
return unescape(r[2]);
}
return null;
};
WechatMicro.decorators = [
{ type: Injectable, args: [{
providedIn: "root",
},] }
];
/** @nocollapse */
WechatMicro.ctorParameters = function () { return [
{ type: TokenService },
{ type: HttpClient },
{ type: UserService },
{ type: Title },
{ type: undefined, decorators: [{ type: Inject, args: [BASE_CLIENT,] }] }
]; };
/** @nocollapse */ WechatMicro.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function WechatMicro_Factory() { return new WechatMicro(i0.ɵɵinject(i1.TokenService), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.UserService), i0.ɵɵinject(i4.Title), i0.ɵɵinject(i5.BASE_CLIENT)); }, token: WechatMicro, providedIn: "root" });
return WechatMicro;
}(BaseDevice));
export { WechatMicro };
if (false) {
/**
* @type {?}
* @private
*/
WechatMicro.prototype.tokenService;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.http;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.user;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.title;
/**
* @type {?}
* @private
*/
WechatMicro.prototype.baseclient;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0Lm1pY3JvLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImRldmljZXMvd2VjaGF0Lm1pY3JvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLElBQUksRUFBa0IsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBYyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7SUFFNUMsSUFBSSxHQUFHO0lBQ1gsMkJBQTJCO0lBQzNCLHlCQUF5QjtJQUN6QixxQkFBcUI7SUFDckIsdUJBQXVCO0lBQ3ZCLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVztJQUNYLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsZUFBZTtJQUNmLHdCQUF3QjtJQUN4Qix3QkFBd0I7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M0MsRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUNqQixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsa0JBQWtCOzs7Ozs7O0lBQ1YsaUNBQVc7Ozs7Ozs7SUFBbkIsVUFBb0IsSUFBSTs7O1lBRWhCLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLGVBQWUsQ0FBQzs7WUFDbEQsT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7OztZQUV6QyxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUNoRCxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDYixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2QjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Z0JBck1GLFVBQVUsU0FBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7Ozs7Z0JBM0RRLFlBQVk7Z0JBRVosVUFBVTtnQkFEVixXQUFXO2dCQUtYLEtBQUs7Z0RBNERULE1BQU0sU0FBQyxXQUFXOzs7c0JBdEV2QjtDQW1RQyxBQXRNRCxDQUdpQyxVQUFVLEdBbU0xQztTQW5NWSxXQUFXOzs7Ozs7SUFFcEIsbUNBQWtDOzs7OztJQUNsQywyQkFBd0I7Ozs7O0lBQ3hCLDJCQUF5Qjs7Ozs7SUFDekIsNEJBQW9COzs7OztJQUNwQixpQ0FBbUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlRGV2aWNlIH0gZnJvbSBcIi4vYmFzZS5kZXZpY2VcIjtcclxuaW1wb3J0IHsgSVNoYXJlLCBJVGl0bGUsIElXaW5kb3csIE5hdmlnYXRpb25CYXIsIFVzZXJMb2NhdGlvbiB9IGZyb20gXCIuL21vZGVsXCI7XHJcbmltcG9ydCB7IEl0b2tlbiB9IGZyb20gXCIuLi9hdXRoXCI7XHJcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vdXNlci91c2VyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBCQVNFX0NMSUVOVCwgQmFzZUNsaWVudCB9IGZyb20gXCIuLi9jbGllbnQvYmFzZS5jbGllbnRcIjtcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgcHJlbG9hZGVyRmluaXNoZWQgfSBmcm9tIFwiLi4vYXV0aC9wcmVsb2FkZXJcIjtcclxuaW1wb3J0IHsgVGl0bGUgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xyXG5cclxuY29uc3QgYXBpcyA9IFtcclxuICBcInVwZGF0ZUFwcE1lc3NhZ2VTaGFyZURhdGFcIixcclxuICBcInVwZGF0ZVRpbWVsaW5lU2hhcmVEYXRhXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVRpbWVsaW5lXCIsXHJcbiAgXCJvbk1lbnVTaGFyZUFwcE1lc3NhZ2VcIixcclxuICBcIm9uTWVudVNoYXJlUVFcIixcclxuICBcIm9uTWVudVNoYXJlV2VpYm9cIixcclxuICBcIm9uTWVudVNoYXJlUVpvbmVcIixcclxuICBcInN0YXJ0UmVjb3JkXCIsXHJcbiAgXCJzdG9wUmVjb3JkXCIsXHJcbiAgXCJvblZvaWNlUmVjb3JkRW5kXCIsXHJcbiAgXCJwbGF5Vm9pY2VcIixcclxuICBcInBhdXNlVm9pY2VcIixcclxuICBcInN0b3BWb2ljZVwiLFxyXG4gIFwib25Wb2ljZVBsYXlFbmRcIixcclxuICBcInVwbG9hZFZvaWNlXCIsXHJcbiAgXCJkb3dubG9hZFZvaWNlXCIsXHJcbiAgXCJjaG9vc2VJbWFnZVwiLFxyXG4gIFwicHJldmlld0ltYWdlXCIsXHJcbiAgXCJ1cGxvYWRJbWFnZVwiLFxyXG4gIFwiZG93bmxvYWRJbWFnZVwiLFxyXG4gIFwidHJhbnNsYXRlVm9pY2VcIixcclxuICBcImdldE5ldHdvcmtUeXBlXCIsXHJcbiAgXCJvcGVuTG9jYXRpb25cIixcclxuICBcImdldExvY2F0aW9uXCIsXHJcbiAgXCJoaWRlT3B0aW9uTWVudVwiLFxyXG4gIFwic2hvd09wdGlvbk1lbnVcIixcclxuICBcImhpZGVNZW51SXRlbXNcIixcclxuICBcInNob3dNZW51SXRlbXNcIixcclxuICBcImhpZGVBbGxOb25CYXNlTWVudUl0ZW1cIixcclxuICBcInNob3dBbGxOb25CYXNlTWVudUl0ZW1cIixcclxuICBcImNsb3NlV2luZG93XCIsXHJcbiAgXCJzY2FuUVJDb2RlXCIsXHJcbiAgXCJjaG9vc2VXWFBheVwiLFxyXG4gIFwib3BlblByb2R1Y3RTcGVjaWZpY1ZpZXdcIixcclxuICBcImFkZENhcmRcIixcclxuICBcImNob29zZUNhcmRcIixcclxuICBcIm9wZW5DYXJkXCIsXHJcbl07XHJcblxyXG5jb25zdCBvcGVuVGFncyA9IFtcclxuICAnd3gtb3Blbi1sYXVuY2gtd2VhcHAnLFxyXG4gICd3eC1vcGVuLWxhdW5jaC1hcHAnLFxyXG4gICd3eC1vcGVuLXN1YnNjcmliZScsXHJcbiAgJ3d4LW9wZW4tYXVkaW8nXHJcbl07XHJcblxyXG5kZWNsYXJlIGxldCB3eDtcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlY2hhdE1pY3JvIGV4dGVuZHMgQmFzZURldmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRva2VuU2VydmljZTogVG9rZW5TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSB1c2VyOiBVc2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgdGl0bGU6IFRpdGxlLFxyXG4gICAgQEluamVjdChCQVNFX0NMSUVOVCkgcHJpdmF0ZSBiYXNlY2xpZW50OiBCYXNlQ2xpZW50XHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgYXV0aCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuYmFzZWNsaWVudC53ZWNoYXRNaWNybyAmJiB0aGlzLmJhc2VjbGllbnQud2VjaGF0TWljcm8uYXV0aCA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHByZWxvYWRlckZpbmlzaGVkKCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRva2VuSW5mbzogYW55ID0ge307XHJcbiAgICAgIHRva2VuSW5mby5hY2NvdW50ID0gdGhpcy5nZXRVcmxQYXJhbSgnYWNjb3VudCcpO1xyXG4gICAgICB0b2tlbkluZm8uYWNjZXNzVG9rZW4gPSB0aGlzLmdldFVybFBhcmFtKCdhY2Nlc3NUb2tlbicpO1xyXG4gICAgICB0b2tlbkluZm8udXNlcklkID0gdGhpcy5nZXRVcmxQYXJhbSgndXNlcklkJyk7XHJcbiAgICAgIHRva2VuSW5mby50b2tlblR5cGUgPSAnYmVhcmVyJztcclxuICAgICAgdGhpcy50b2tlblNlcnZpY2Uuc2V0KHRva2VuSW5mbyBhcyBhbnkpO1xyXG4gICAgICB0aGlzLmh0dHBcclxuICAgICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS9hdXRoL3VzZXJgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIC8vIOiuvue9rnVzZXJcclxuICAgICAgICAgIHRoaXMudXNlci5zZXQocmVzcG9uc2UucHJpbmNpcGFsKTtcclxuICAgICAgICAgIHRoaXMuZ2VuZXJhdGVXZWNoYXRDb25maWcoKTtcclxuICAgICAgICAgIC8vIOWKoOi9vee7k+adn1xyXG4gICAgICAgICAgcHJlbG9hZGVyRmluaXNoZWQoKTtcclxuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlV2VjaGF0Q29uZmlnKCk6IHZvaWQge1xyXG4gICAgdGhpcy5odHRwXHJcbiAgICAgIC5nZXQoYCR7dGhpcy5iYXNlY2xpZW50LmdhdGV3YXl9L3dlY2hhdC9tcC9qc3Nkaz91cmw9JHtlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYpfWApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICB3eC5jb25maWcoe1xyXG4gICAgICAgICAgZGVidWc6IGZhbHNlLCAvLyDlvIDlkK/osIPor5XmqKHlvI8s6LCD55So55qE5omA5pyJYXBp55qE6L+U5Zue5YC85Lya5Zyo5a6i5oi356uvYWxlcnTlh7rmnaXvvIzoi6XopoHmn6XnnIvkvKDlhaXnmoTlj4LmlbDvvIzlj6/ku6XlnKhwY+err+aJk+W8gO+8jOWPguaVsOS/oeaBr+S8mumAmui/h2xvZ+aJk+WHuu+8jOS7heWcqHBj56uv5pe25omN5Lya5omT5Y2w44CCXHJcbiAgICAgICAgICBhcHBJZDogcmVzcG9uc2UuYXBwSWQsIC8vIOW/heWhq++8jOWFrOS8l+WPt+eahOWUr+S4gOagh+ivhlxyXG4gICAgICAgICAgdGltZXN0YW1wOiByZXNwb25zZS50aW1lc3RhbXAsIC8vIOW/heWhq++8jOeUn+aIkOetvuWQjeeahOaXtumXtOaIs1xyXG4gICAgICAgICAgbm9uY2VTdHI6IHJlc3BvbnNlLm5vbmNlU3RyLCAvLyDlv4XloavvvIznlJ/miJDnrb7lkI3nmoTpmo/mnLrkuLJcclxuICAgICAgICAgIHNpZ25hdHVyZTogcmVzcG9uc2Uuc2lnbmF0dXJlLCAvLyDlv4XloavvvIznrb7lkI1cclxuICAgICAgICAgIGpzQXBpTGlzdDogYXBpcywgLy8g5b+F5aGr77yM6ZyA6KaB5L2/55So55qESlPmjqXlj6PliJfooahcclxuICAgICAgICAgIG9wZW5UYWdMaXN0OiBvcGVuVGFncyAvLyDlj6/pgInvvIzpnIDopoHkvb/nlKjnmoTlvIDmlL7moIfnrb7liJfooajvvIzkvovlpoJbJ3d4LW9wZW4tbGF1bmNoLWFwcCddXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgd3gucmVhZHkoKCkgPT4ge1xyXG4gICAgICAvLyBjb25maWfkv6Hmga/pqozor4HlkI7kvJrmiafooYxyZWFkeeaWueazle+8jOaJgOacieaOpeWPo+iwg+eUqOmDveW/hemhu+WcqGNvbmZpZ+aOpeWPo+iOt+W+l+e7k+aenOS5i+WQju+8jGNvbmZpZ+aYr+S4gOS4quWuouaIt+err+eahOW8guatpeaTjeS9nO+8jFxyXG4gICAgICAvLyDmiYDku6XlpoLmnpzpnIDopoHlnKjpobXpnaLliqDovb3ml7blsLHosIPnlKjnm7jlhbPmjqXlj6PvvIzliJnpobvmiornm7jlhbPmjqXlj6PmlL7lnKhyZWFkeeWHveaVsOS4reiwg+eUqOadpeehruS/neato+ehruaJp+ihjOOAguWvueS6jueUqOaIt+inpuWPkeaXtuaJjeiwg+eUqOeahOaOpeWPo++8jOWImeWPr+S7peebtOaOpeiwg+eUqO+8jOS4jemcgOimgeaUvuWcqHJlYWR55Ye95pWw5Lit44CCXHJcbiAgICAgIGNvbnNvbGUubG9nKCflvq7kv6Fqc3Nka+WIneWni+WMluWujOaIkC4nKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHd4LmVycm9yKChyZXMpID0+IHtcclxuICAgICAgLy8gY29uZmln5L+h5oGv6aqM6K+B5aSx6LSl5Lya5omn6KGMZXJyb3Llh73mlbDvvIzlpoLnrb7lkI3ov4fmnJ/lr7zoh7Tpqozor4HlpLHotKXvvIzlhbfkvZPplJnor6/kv6Hmga/lj6/ku6XmiZPlvIBjb25maWfnmoRkZWJ1Z+aooeW8j+afpeeci++8jOS5n+WPr+S7peWcqOi/lOWbnueahHJlc+WPguaVsOS4reafpeeci++8jOWvueS6jlNQQeWPr+S7peWcqOi/memHjOabtOaWsOetvuWQjeOAglxyXG4gICAgICBjb25zb2xlLmxvZygn5b6u5L+hanNzZGvliJ3lp4vljJblpLHotKU6JywgcmVzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb3BlbldpbmRvdyhpd2luZG93OiBJV2luZG93KTogdm9pZCB7XHJcbiAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGl3aW5kb3cudXJsO1xyXG4gIH1cclxuXHJcbiAgc2V0VGl0bGUoaXRpdGxlOiBJVGl0bGUpOiB2b2lkIHtcclxuICAgIHRoaXMudGl0bGUuc2V0VGl0bGUoaXRpdGxlLnRpdGxlKTtcclxuICB9XHJcblxyXG4gIHNldE5hdmlnYXRpb25CYXIobmF2aWdhdGlvbkJhcjogTmF2aWdhdGlvbkJhcik6IHZvaWQge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHmlL7nva7mjInpkq4s6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICB9XHJcblxyXG4gIHNoYXJlKGlzaGFyZTogSVNoYXJlKTogdm9pZCB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeWIhuS6qyzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VG9rZW4oKTogSXRva2VuIHtcclxuICAgIGNvbnN0IGl0b2tlbjogSXRva2VuID0ge1xyXG4gICAgICBhY2Nlc3NUb2tlbjogdGhpcy50b2tlblNlcnZpY2UuZ2V0KCkuYWNjZXNzVG9rZW4sXHJcbiAgICAgIHRva2VuVHlwZTogbnVsbCxcclxuICAgICAgdG9rZW5EYXRhTGluZTogbnVsbCxcclxuICAgICAgc2NvcGU6IG51bGwsXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGl0b2tlbjtcclxuICB9XHJcblxyXG4gIHNjYW5Db2RlKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBwID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHd4LnNjYW5RUkNvZGUoe1xyXG4gICAgICAgIG5lZWRSZXN1bHQ6IDEsXHJcbiAgICAgICAgc2NhblR5cGU6IFsncXJDb2RlJywgJ2JhckNvZGUnXSxcclxuICAgICAgICBzdWNjZXNzOiAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJlc29sdmUocmVzLnJlc3VsdFN0cik7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmcm9tKHApO1xyXG4gIH1cclxuXHJcbiAgdXNlckxvY2F0aW9uKCk6IE9ic2VydmFibGU8VXNlckxvY2F0aW9uPiB7XHJcbiAgICBjb25zdCBwID0gbmV3IFByb21pc2U8VXNlckxvY2F0aW9uPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHd4LmdldExvY2F0aW9uKHtcclxuICAgICAgICB0eXBlOiAnd2dzODQnLCAvLyDpu5jorqTkuLp3Z3M4NOeahGdwc+WdkOagh++8jOWmguaenOimgei/lOWbnuebtOaOpee7mW9wZW5Mb2NhdGlvbueUqOeahOeBq+aYn+WdkOagh++8jOWPr+S8oOWFpSdnY2owMidcclxuICAgICAgICBzdWNjZXNzKHJlczogYW55KSB7XHJcbiAgICAgICAgICBpZiAocmVzLmVyck1zZyA9PT0gJ2dldExvY2F0aW9uOm9rJykge1xyXG4gICAgICAgICAgICBjb25zdCBsYXRpdHVkZSA9IHJlcy5sYXRpdHVkZTsgLy8g57qs5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6OTAgfiAtOTBcclxuICAgICAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gcmVzLmxvbmdpdHVkZTsgLy8g57uP5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6MTgwIH4gLTE4MOOAglxyXG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gJ+W+ruS/oeaXoGFkZHJlc3MnO1xyXG4gICAgICAgICAgICByZXNvbHZlKHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhZGRyZXNzfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmcm9tKHApO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVJbldpZmkoYnNzaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIFXSUZJ6aqM6K+BLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2lmaU1hYygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHojrflj5ZNQUPlnLDlnYAs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBjaG9vc2VDb250YWN0cyhjb3VudDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB6I635Y+W6IGU57O75Lq6LOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29udGFjdERldGFpbHModGFyZ2V0VXNlcklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHmn6Xor6LogZTns7vkurror6bnu4bkv6Hmga8s6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRJbWFnZShjb3VudDogbnVtYmVyLCBzb3VyY2VUeXBlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlsI/nqIvluo/mmoLkuI3mlK/mjIHlm77niYfkuIrkvKAs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBvcGVuUmVhZFdpdGhUaW1lcihcclxuICAgIHVybDogYW55LFxyXG4gICAgb3BlblR5cGU6IGFueSxcclxuICAgIHRpdGxlOiBhbnksXHJcbiAgICBpZDogYW55LFxyXG4gICAgdHlwZTogYW55XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB6K+754mp5pe26Ze057uf6K6hLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkTW92aWUobGltaXRNaW51dGU6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuWwj+eoi+W6j+aaguS4jeaUr+aMgeinhumikeS4iuS8oCzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGZpbGVCcm93c2VyKHVybDogc3RyaW5nLCB0aXRsZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5bCP56iL5bqP5pqC5LiN5pSv5oyB5q2k5Yqf6IO9LOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRTZWFyY2hCZWFjb25zKHRpY2tldDogc3RyaW5nLCBjYWxsYmFjazogKGFyZ3Y6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgd3guc3RhcnRTZWFyY2hCZWFjb25zKHtcclxuICAgICAgdGlja2V0OiB0aWNrZXQsXHJcbiAgICAgIGNvbXBsZXRlOiBjYWxsYmFjayxcclxuICAgIH0pO1xyXG4gIH1cclxuICBzdG9wU2VhcmNoQmVhY29ucyhjYWxsYmFjazogKGFyZ3Y6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgd3guc3RvcFNlYXJjaEJlYWNvbnMoe1xyXG4gICAgICBjb21wbGV0ZTogY2FsbGJhY2ssXHJcbiAgICB9KTtcclxuICB9XHJcbiAgb25TZWFyY2hCZWFjb25zKGNhbGxiYWNrOiAoYXJndjogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB3eC5vblNlYXJjaEJlYWNvbnMoe1xyXG4gICAgICBjb21wbGV0ZTogY2FsbGJhY2ssXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIOWwgeijheaWueazlTog6I635Y+WdXJs5Lit55qE5Y+C5pWwXHJcbiAgcHJpdmF0ZSBnZXRVcmxQYXJhbShuYW1lKTogc3RyaW5nIHtcclxuICAgIC8vIOaehOmAoOS4gOS4quWQq+acieebruagh+WPguaVsOeahOato+WImeihqOi+vuW8j+WvueixoVxyXG4gICAgY29uc3QgcmVnID0gbmV3IFJlZ0V4cCgnKF58JiknICsgbmFtZSArICc9KFteJl0qKSgmfCQpJyk7XHJcbiAgICBjb25zdCBzdHJpbmdzID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKTtcclxuICAgIC8vIOWMuemFjeebruagh+WPguaVsFxyXG4gICAgY29uc3QgciA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXS5tYXRjaChyZWcpO1xyXG4gICAgaWYgKHIgIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdW5lc2NhcGUoclsyXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuIl19