ng-yunzai-mobile
Version:
1. 修改wechat.micro.ts
426 lines • 33.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: devices/wechat.mp.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { BaseDevice } from "./base.device";
import { Injectable, Inject } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { BASE_CLIENT } from "../client/base.client";
import { preloaderFinished } from "../auth/preloader";
import { from } from "rxjs";
import { Title } from "@angular/platform-browser";
import { TokenService } from "../token/token.service";
import { UserService } from "../user/user.service";
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 {?} */
const 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 {?} */
const openTags = [
'wx-open-launch-weapp',
'wx-open-launch-app',
'wx-open-subscribe',
'wx-open-audio'
];
export class WechatMp extends BaseDevice {
/**
* @param {?} tokenService
* @param {?} http
* @param {?} user
* @param {?} title
* @param {?} baseclient
*/
constructor(tokenService, http, user, title, baseclient) {
super();
this.tokenService = tokenService;
this.http = http;
this.user = user;
this.title = title;
this.baseclient = baseclient;
}
/**
* @return {?}
*/
auth() {
if (this.baseclient.wechat && this.baseclient.wechat.auth === false) {
return new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
preloaderFinished();
resolve(true);
}));
}
return new Promise((/**
* @param {?} reject
* @param {?} resolve
* @return {?}
*/
(reject, resolve) => {
/** @type {?} */
const url = encodeURIComponent(window.location.href);
this.http
.get(`${this.baseclient.gateway}/wechat/mp/token?url=` + url)
.subscribe((/**
* @param {?} token
* @return {?}
*/
(token) => {
if (token.error_code === 200) {
this.tokenService.set((/** @type {?} */ ({
accessToken: token.message,
tokenType: "bearer",
})));
this.http
.get(`${this.baseclient.gateway}/auth/user`)
.subscribe((/**
* @param {?} response
* @return {?}
*/
(response) => {
this.user.set(response.principal);
// 暂不对微信jssdk进行对接
this.generateWechatConfig();
preloaderFinished();
reject(null);
}));
}
else if (token.error_code === 500) {
// 没有token,则重定向到认证页面,认证完成后会跳回本页面
window.location.href = token.path;
}
}));
}));
}
/**
* @param {?} iwindow
* @return {?}
*/
openWindow(iwindow) {
window.location.href = iwindow.url;
}
/**
* @param {?} ititle
* @return {?}
*/
setTitle(ititle) {
this.title.setTitle(ititle.title);
}
/**
* @param {?} navigationBar
* @return {?}
*/
setNavigationBar(navigationBar) {
alert("微信端暂不支持放置按钮,请在APP中使用此功能!");
return;
}
/**
* @param {?} ishare
* @return {?}
*/
share(ishare) {
alert("微信端暂不支持分享,请在APP中使用此功能!");
}
/**
* @return {?}
*/
getToken() {
/** @type {?} */
const itoken = {
accessToken: this.tokenService.get().accessToken,
tokenType: null,
tokenDataLine: null,
scope: null,
};
return itoken;
}
/**
* @return {?}
*/
scanCode() {
/** @type {?} */
const p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
wx.scanQRCode({
needResult: 1,
scanType: ['qrCode', 'barCode'],
success: (/**
* @param {?} res
* @return {?}
*/
(res) => {
resolve(res.resultStr);
}),
});
}));
return from(p);
}
/**
* @return {?}
*/
userLocation() {
/** @type {?} */
const p = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
wx.getLocation({
type: 'wgs84',
// 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
success: (/**
* @param {?} res
* @return {?}
*/
(res) => {
if (res.errMsg === 'getLocation:ok') {
/** @type {?} */
const latitude = res.latitude;
// 纬度,浮点数,范围为90 ~ -90
/** @type {?} */
const longitude = res.longitude;
// 经度,浮点数,范围为180 ~ -180。
/** @type {?} */
const address = '微信无address';
resolve({ latitude, longitude, address });
}
}),
});
}));
return from(p);
}
/**
* @param {?} bssids
* @return {?}
*/
validateInWifi(bssids) {
alert("微信端暂不支持WIFI验证,请在APP中使用此功能!");
return undefined;
}
/**
* @return {?}
*/
getWifiMac() {
alert("微信端暂不支持获取MAC地址,请在APP中使用此功能!");
return undefined;
}
/**
* @return {?}
*/
generateWechatConfig() {
this.http
.get(`${this.baseclient.gateway}/wechat/mp/jssdk?url=${encodeURIComponent(window.location.href)}`)
.subscribe((/**
* @param {?} response
* @return {?}
*/
(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 {?}
*/
() => {
// config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,
// 所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
console.log('微信jssdk初始化完成.');
}));
wx.error((/**
* @param {?} res
* @return {?}
*/
(res) => {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
console.log('微信jssdk初始化失败:', res);
}));
}
/**
* @param {?} count
* @return {?}
*/
chooseContacts(count) {
alert("微信端暂不支持获取联系人,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} targetUserId
* @return {?}
*/
contactDetails(targetUserId) {
alert("微信端暂不支持查询联系人详细信息,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} count
* @param {?} sourceType
* @return {?}
*/
uploadImage(count, sourceType) {
alert("微信端暂不支持图片上传,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} url
* @param {?} openType
* @param {?} title
* @param {?} id
* @param {?} type
* @return {?}
*/
openReadWithTimer(url, openType, title, id, type) {
alert("微信端暂不支持读物时间统计,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} limitMinute
* @return {?}
*/
uploadMovie(limitMinute) {
alert("微信端暂不支持视频上传,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} url
* @param {?} title
* @return {?}
*/
fileBrowser(url, title) {
alert("微信端暂不支持此功能,请在APP中使用此功能!");
return undefined;
}
/**
* @param {?} ticket
* @param {?} callback
* @return {?}
*/
startSearchBeacons(ticket, callback) {
wx.startSearchBeacons({
ticket: ticket,
complete: callback,
});
}
/**
* @param {?} callback
* @return {?}
*/
stopSearchBeacons(callback) {
wx.stopSearchBeacons({
complete: callback,
});
}
/**
* @param {?} callback
* @return {?}
*/
onSearchBeacons(callback) {
wx.onSearchBeacons({
complete: callback,
});
}
}
WechatMp.decorators = [
{ type: Injectable, args: [{
providedIn: "root",
},] }
];
/** @nocollapse */
WechatMp.ctorParameters = () => [
{ type: TokenService },
{ type: HttpClient },
{ type: UserService },
{ type: Title },
{ type: undefined, decorators: [{ type: Inject, args: [BASE_CLIENT,] }] }
];
/** @nocollapse */ WechatMp.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function WechatMp_Factory() { return new WechatMp(i0.ɵɵinject(i1.TokenService), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.UserService), i0.ɵɵinject(i4.Title), i0.ɵɵinject(i5.BASE_CLIENT)); }, token: WechatMp, providedIn: "root" });
if (false) {
/**
* @type {?}
* @private
*/
WechatMp.prototype.tokenService;
/**
* @type {?}
* @private
*/
WechatMp.prototype.http;
/**
* @type {?}
* @private
*/
WechatMp.prototype.user;
/**
* @type {?}
* @private
*/
WechatMp.prototype.title;
/**
* @type {?}
* @private
*/
WechatMp.prototype.baseclient;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0Lm1wLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImRldmljZXMvd2VjaGF0Lm1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBYyxNQUFNLHVCQUF1QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBTXRELE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFFeEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7O01BRTdDLElBQUksR0FBRztJQUNYLDJCQUEyQjtJQUMzQix5QkFBeUI7SUFDekIscUJBQXFCO0lBQ3JCLHVCQUF1QjtJQUN2QixlQUFlO0lBQ2Ysa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixhQUFhO0lBQ2IsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsWUFBWTtJQUNaLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsYUFBYTtJQUNiLGVBQWU7SUFDZixhQUFhO0lBQ2IsY0FBYztJQUNkLGFBQWE7SUFDYixlQUFlO0lBQ2YsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixjQUFjO0lBQ2QsYUFBYTtJQUNiLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLGVBQWU7SUFDZix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLGFB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QyxRQUE2QjtRQUM3QyxFQUFFLENBQUMsaUJBQWlCLENBQUM7WUFDbkIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFDRCxlQUFlLENBQUMsUUFBNkI7UUFDM0MsRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUNqQixRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDOzs7WUEvTEYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7O1lBdERRLFlBQVk7WUFaWixVQUFVO1lBYVYsV0FBVztZQUZYLEtBQUs7NENBOERULE1BQU0sU0FBQyxXQUFXOzs7Ozs7OztJQUpuQixnQ0FBa0M7Ozs7O0lBQ2xDLHdCQUF3Qjs7Ozs7SUFDeEIsd0JBQXlCOzs7OztJQUN6Qix5QkFBb0I7Ozs7O0lBQ3BCLDhCQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VEZXZpY2UgfSBmcm9tIFwiLi9iYXNlLmRldmljZVwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEJBU0VfQ0xJRU5ULCBCYXNlQ2xpZW50IH0gZnJvbSBcIi4uL2NsaWVudC9iYXNlLmNsaWVudFwiO1xyXG5pbXBvcnQgeyBNeVdlY2hhdE1wVG9rZW4gfSBmcm9tIFwiLi9tb2RlbC93ZWNoYXQubXBcIjtcclxuaW1wb3J0IHsgcHJlbG9hZGVyRmluaXNoZWQgfSBmcm9tIFwiLi4vYXV0aC9wcmVsb2FkZXJcIjtcclxuaW1wb3J0IHsgSVdpbmRvdyB9IGZyb20gXCIuL21vZGVsL3dpbmRvd1wiO1xyXG5pbXBvcnQgeyBJVGl0bGUgfSBmcm9tIFwiLi9tb2RlbC90aXRsZVwiO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uQmFyIH0gZnJvbSBcIi4vbW9kZWwvbmF2aWdhdGlvbmJhclwiO1xyXG5pbXBvcnQgeyBJU2hhcmUgfSBmcm9tIFwiLi9tb2RlbC9zaGFyZVwiO1xyXG5pbXBvcnQgeyBJdG9rZW4gfSBmcm9tIFwiLi4vYXV0aC9pdG9rZW5cIjtcclxuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFVzZXJMb2NhdGlvbiB9IGZyb20gXCIuL21vZGVsL2xvY2F0aW9uXCI7XHJcbmltcG9ydCB7IFRpdGxlIH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcclxuaW1wb3J0IHsgVG9rZW5TZXJ2aWNlIH0gZnJvbSBcIi4uL3Rva2VuL3Rva2VuLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vdXNlci91c2VyLnNlcnZpY2VcIjtcclxuXHJcbmNvbnN0IGFwaXMgPSBbXHJcbiAgXCJ1cGRhdGVBcHBNZXNzYWdlU2hhcmVEYXRhXCIsXHJcbiAgXCJ1cGRhdGVUaW1lbGluZVNoYXJlRGF0YVwiLFxyXG4gIFwib25NZW51U2hhcmVUaW1lbGluZVwiLFxyXG4gIFwib25NZW51U2hhcmVBcHBNZXNzYWdlXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFRXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVdlaWJvXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFab25lXCIsXHJcbiAgXCJzdGFydFJlY29yZFwiLFxyXG4gIFwic3RvcFJlY29yZFwiLFxyXG4gIFwib25Wb2ljZVJlY29yZEVuZFwiLFxyXG4gIFwicGxheVZvaWNlXCIsXHJcbiAgXCJwYXVzZVZvaWNlXCIsXHJcbiAgXCJzdG9wVm9pY2VcIixcclxuICBcIm9uVm9pY2VQbGF5RW5kXCIsXHJcbiAgXCJ1cGxvYWRWb2ljZVwiLFxyXG4gIFwiZG93bmxvYWRWb2ljZVwiLFxyXG4gIFwiY2hvb3NlSW1hZ2VcIixcclxuICBcInByZXZpZXdJbWFnZVwiLFxyXG4gIFwidXBsb2FkSW1hZ2VcIixcclxuICBcImRvd25sb2FkSW1hZ2VcIixcclxuICBcInRyYW5zbGF0ZVZvaWNlXCIsXHJcbiAgXCJnZXROZXR3b3JrVHlwZVwiLFxyXG4gIFwib3BlbkxvY2F0aW9uXCIsXHJcbiAgXCJnZXRMb2NhdGlvblwiLFxyXG4gIFwiaGlkZU9wdGlvbk1lbnVcIixcclxuICBcInNob3dPcHRpb25NZW51XCIsXHJcbiAgXCJoaWRlTWVudUl0ZW1zXCIsXHJcbiAgXCJzaG93TWVudUl0ZW1zXCIsXHJcbiAgXCJoaWRlQWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJzaG93QWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJjbG9zZVdpbmRvd1wiLFxyXG4gIFwic2NhblFSQ29kZVwiLFxyXG4gIFwiY2hvb3NlV1hQYXlcIixcclxuICBcIm9wZW5Qcm9kdWN0U3BlY2lmaWNWaWV3XCIsXHJcbiAgXCJhZGRDYXJkXCIsXHJcbiAgXCJjaG9vc2VDYXJkXCIsXHJcbiAgXCJvcGVuQ2FyZFwiLFxyXG5dO1xyXG5cclxuY29uc3Qgb3BlblRhZ3MgPSBbXHJcbiAgJ3d4LW9wZW4tbGF1bmNoLXdlYXBwJyxcclxuICAnd3gtb3Blbi1sYXVuY2gtYXBwJyxcclxuICAnd3gtb3Blbi1zdWJzY3JpYmUnLFxyXG4gICd3eC1vcGVuLWF1ZGlvJ1xyXG5dO1xyXG5cclxuZGVjbGFyZSBsZXQgd3g7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWNoYXRNcCBleHRlbmRzIEJhc2VEZXZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgdXNlcjogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRpdGxlOiBUaXRsZSxcclxuICAgIEBJbmplY3QoQkFTRV9DTElFTlQpIHByaXZhdGUgYmFzZWNsaWVudDogQmFzZUNsaWVudFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGF1dGgoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmJhc2VjbGllbnQud2VjaGF0ICYmIHRoaXMuYmFzZWNsaWVudC53ZWNoYXQuYXV0aCA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHByZWxvYWRlckZpbmlzaGVkKCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVqZWN0LCByZXNvbHZlKSA9PiB7XHJcbiAgICAgIGNvbnN0IHVybCA9IGVuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZik7XHJcbiAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgIC5nZXQoYCR7dGhpcy5iYXNlY2xpZW50LmdhdGV3YXl9L3dlY2hhdC9tcC90b2tlbj91cmw9YCArIHVybClcclxuICAgICAgICAuc3Vic2NyaWJlKCh0b2tlbjogTXlXZWNoYXRNcFRva2VuKSA9PiB7XHJcbiAgICAgICAgICBpZiAodG9rZW4uZXJyb3JfY29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9rZW5TZXJ2aWNlLnNldCh7XHJcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IHRva2VuLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgdG9rZW5UeXBlOiBcImJlYXJlclwiLFxyXG4gICAgICAgICAgICB9IGFzIGFueSk7XHJcbiAgICAgICAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAgIC5nZXQoYCR7dGhpcy5iYXNlY2xpZW50LmdhdGV3YXl9L2F1dGgvdXNlcmApXHJcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyLnNldChyZXNwb25zZS5wcmluY2lwYWwpO1xyXG4gICAgICAgICAgICAgICAgLy8g5pqC5LiN5a+55b6u5L+hanNzZGvov5vooYzlr7nmjqVcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVXZWNoYXRDb25maWcoKTtcclxuICAgICAgICAgICAgICAgIHByZWxvYWRlckZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuLmVycm9yX2NvZGUgPT09IDUwMCkge1xyXG4gICAgICAgICAgICAvLyDmsqHmnIl0b2tlbu+8jOWImemHjeWumuWQkeWIsOiupOivgemhtemdou+8jOiupOivgeWujOaIkOWQjuS8mui3s+WbnuacrOmhtemdolxyXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRva2VuLnBhdGg7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9wZW5XaW5kb3coaXdpbmRvdzogSVdpbmRvdyk6IHZvaWQge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBpd2luZG93LnVybDtcclxuICB9XHJcblxyXG4gIHNldFRpdGxlKGl0aXRsZTogSVRpdGxlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRpdGxlLnNldFRpdGxlKGl0aXRsZS50aXRsZSk7XHJcbiAgfVxyXG5cclxuICBzZXROYXZpZ2F0aW9uQmFyKG5hdmlnYXRpb25CYXI6IE5hdmlnYXRpb25CYXIpOiB2b2lkIHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB5pS+572u5oyJ6ZKuLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBzaGFyZShpc2hhcmU6IElTaGFyZSk6IHZvaWQge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHliIbkuqss6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICB9XHJcblxyXG4gIGdldFRva2VuKCk6IEl0b2tlbiB7XHJcbiAgICBjb25zdCBpdG9rZW46IEl0b2tlbiA9IHtcclxuICAgICAgYWNjZXNzVG9rZW46IHRoaXMudG9rZW5TZXJ2aWNlLmdldCgpLmFjY2Vzc1Rva2VuLFxyXG4gICAgICB0b2tlblR5cGU6IG51bGwsXHJcbiAgICAgIHRva2VuRGF0YUxpbmU6IG51bGwsXHJcbiAgICAgIHNjb3BlOiBudWxsLFxyXG4gICAgfTtcclxuICAgIHJldHVybiBpdG9rZW47XHJcbiAgfVxyXG5cclxuICBzY2FuQ29kZSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB3eC5zY2FuUVJDb2RlKHtcclxuICAgICAgICBuZWVkUmVzdWx0OiAxLFxyXG4gICAgICAgIHNjYW5UeXBlOiBbJ3FyQ29kZScsICdiYXJDb2RlJ10sXHJcbiAgICAgICAgc3VjY2VzczogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlcy5yZXN1bHRTdHIpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnJvbShwKTtcclxuICB9XHJcblxyXG4gIHVzZXJMb2NhdGlvbigpOiBPYnNlcnZhYmxlPFVzZXJMb2NhdGlvbj4ge1xyXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlPFVzZXJMb2NhdGlvbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICB3eC5nZXRMb2NhdGlvbih7XHJcbiAgICAgICAgdHlwZTogJ3dnczg0JywgLy8g6buY6K6k5Li6d2dzODTnmoRncHPlnZDmoIfvvIzlpoLmnpzopoHov5Tlm57nm7TmjqXnu5lvcGVuTG9jYXRpb27nlKjnmoTngavmmJ/lnZDmoIfvvIzlj6/kvKDlhaUnZ2NqMDInXHJcbiAgICAgICAgc3VjY2VzczogKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzLmVyck1zZyA9PT0gJ2dldExvY2F0aW9uOm9rJykge1xyXG4gICAgICAgICAgICBjb25zdCBsYXRpdHVkZSA9IHJlcy5sYXRpdHVkZTsgLy8g57qs5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6OTAgfiAtOTBcclxuICAgICAgICAgICAgY29uc3QgbG9uZ2l0dWRlID0gcmVzLmxvbmdpdHVkZTsgLy8g57uP5bqm77yM5rWu54K55pWw77yM6IyD5Zu05Li6MTgwIH4gLTE4MOOAglxyXG4gICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gJ+W+ruS/oeaXoGFkZHJlc3MnO1xyXG4gICAgICAgICAgICByZXNvbHZlKHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhZGRyZXNzfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmcm9tKHApO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGVJbldpZmkoYnNzaWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIFXSUZJ6aqM6K+BLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0V2lmaU1hYygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHojrflj5ZNQUPlnLDlnYAs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBnZW5lcmF0ZVdlY2hhdENvbmZpZygpOiB2b2lkIHtcclxuICAgIHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS93ZWNoYXQvbXAvanNzZGs/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKX1gKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgd3guY29uZmlnKHtcclxuICAgICAgICAgIGRlYnVnOiBmYWxzZSwgLy8g5byA5ZCv6LCD6K+V5qih5byPLOiwg+eUqOeahOaJgOaciWFwaeeahOi/lOWbnuWAvOS8muWcqOWuouaIt+err2FsZXJ05Ye65p2l77yM6Iul6KaB5p+l55yL5Lyg5YWl55qE5Y+C5pWw77yM5Y+v5Lul5ZyocGPnq6/miZPlvIDvvIzlj4LmlbDkv6Hmga/kvJrpgJrov4dsb2fmiZPlh7rvvIzku4XlnKhwY+err+aXtuaJjeS8muaJk+WNsOOAglxyXG4gICAgICAgICAgYXBwSWQ6IHJlc3BvbnNlLmFwcElkLCAvLyDlv4XloavvvIzlhazkvJflj7fnmoTllK/kuIDmoIfor4ZcclxuICAgICAgICAgIHRpbWVzdGFtcDogcmVzcG9uc2UudGltZXN0YW1wLCAvLyDlv4XloavvvIznlJ/miJDnrb7lkI3nmoTml7bpl7TmiLNcclxuICAgICAgICAgIG5vbmNlU3RyOiByZXNwb25zZS5ub25jZVN0ciwgLy8g5b+F5aGr77yM55Sf5oiQ562+5ZCN55qE6ZqP5py65LiyXHJcbiAgICAgICAgICBzaWduYXR1cmU6IHJlc3BvbnNlLnNpZ25hdHVyZSwgLy8g5b+F5aGr77yM562+5ZCNXHJcbiAgICAgICAgICBqc0FwaUxpc3Q6IGFwaXMsIC8vIOW/heWhq++8jOmcgOimgeS9v+eUqOeahEpT5o6l5Y+j5YiX6KGoXHJcbiAgICAgICAgICBvcGVuVGFnTGlzdDogb3BlblRhZ3MgLy8g5Y+v6YCJ77yM6ZyA6KaB5L2/55So55qE5byA5pS+5qCH562+5YiX6KGo77yM5L6L5aaCWyd3eC1vcGVuLWxhdW5jaC1hcHAnXVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIHd4LnJlYWR5KCgpID0+IHtcclxuICAgICAgLy8gY29uZmln5L+h5oGv6aqM6K+B5ZCO5Lya5omn6KGMcmVhZHnmlrnms5XvvIzmiYDmnInmjqXlj6PosIPnlKjpg73lv4XpobvlnKhjb25maWfmjqXlj6Pojrflvpfnu5PmnpzkuYvlkI7vvIxjb25maWfmmK/kuIDkuKrlrqLmiLfnq6/nmoTlvILmraXmk43kvZzvvIxcclxuICAgICAgLy8g5omA5Lul5aaC5p6c6ZyA6KaB5Zyo6aG16Z2i5Yqg6L295pe25bCx6LCD55So55u45YWz5o6l5Y+j77yM5YiZ6aG75oqK55u45YWz5o6l5Y+j5pS+5ZyocmVhZHnlh73mlbDkuK3osIPnlKjmnaXnoa7kv53mraPnoa7miafooYzjgILlr7nkuo7nlKjmiLfop6blj5Hml7bmiY3osIPnlKjnmoTmjqXlj6PvvIzliJnlj6/ku6Xnm7TmjqXosIPnlKjvvIzkuI3pnIDopoHmlL7lnKhyZWFkeeWHveaVsOS4reOAglxyXG4gICAgICBjb25zb2xlLmxvZygn5b6u5L+hanNzZGvliJ3lp4vljJblrozmiJAuJyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB3eC5lcnJvcigocmVzKSA9PiB7XHJcbiAgICAgIC8vIGNvbmZpZ+S/oeaBr+mqjOivgeWksei0peS8muaJp+ihjGVycm9y5Ye95pWw77yM5aaC562+5ZCN6L+H5pyf5a+86Ie06aqM6K+B5aSx6LSl77yM5YW35L2T6ZSZ6K+v5L+h5oGv5Y+v5Lul5omT5byAY29uZmln55qEZGVidWfmqKHlvI/mn6XnnIvvvIzkuZ/lj6/ku6XlnKjov5Tlm57nmoRyZXPlj4LmlbDkuK3mn6XnnIvvvIzlr7nkuo5TUEHlj6/ku6XlnKjov5nph4zmm7TmlrDnrb7lkI3jgIJcclxuICAgICAgY29uc29sZS5sb2coJ+W+ruS/oWpzc2Rr5Yid5aeL5YyW5aSx6LSlOicsIHJlcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNob29zZUNvbnRhY3RzKGNvdW50OiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHojrflj5bogZTns7vkuros6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBjb250YWN0RGV0YWlscyh0YXJnZXRVc2VySWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeafpeivouiBlOezu+S6uuivpue7huS/oeaBryzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHVwbG9hZEltYWdlKGNvdW50OiBudW1iZXIsIHNvdXJjZVR5cGU6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeWbvueJh+S4iuS8oCzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIG9wZW5SZWFkV2l0aFRpbWVyKFxyXG4gICAgdXJsOiBhbnksXHJcbiAgICBvcGVuVHlwZTogYW55LFxyXG4gICAgdGl0bGU6IGFueSxcclxuICAgIGlkOiBhbnksXHJcbiAgICB0eXBlOiBhbnlcclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHor7vnianml7bpl7Tnu5/orqEs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRNb3ZpZShsaW1pdE1pbnV0ZTogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB6KeG6aKR5LiK5LygLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuICBmaWxlQnJvd3Nlcih1cmw6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeatpOWKn+iDvSzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoQmVhY29ucyh0aWNrZXQ6IHN0cmluZywgY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4LnN0YXJ0U2VhcmNoQmVhY29ucyh7XHJcbiAgICAgIHRpY2tldDogdGlja2V0LFxyXG4gICAgICBjb21wbGV0ZTogY2FsbGJhY2ssXHJcbiAgICB9KTtcclxuICB9XHJcbiAgc3RvcFNlYXJjaEJlYWNvbnMoY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4LnN0b3BTZWFyY2hCZWFjb25zKHtcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG9uU2VhcmNoQmVhY29ucyhjYWxsYmFjazogKGFyZ3Y6IGFueSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgd3gub25TZWFyY2hCZWFjb25zKHtcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==