UNPKG

ng-yunzai-mobile

Version:

1. 适配yunzai_uni_app_x

569 lines 42.1 kB
/** * @fileoverview added by tsickle * Generated from: devices/wechat.mp.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 { 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 { map } from "rxjs/operators"; 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 WechatMp = /** @class */ (function (_super) { tslib_1.__extends(WechatMp, _super); function WechatMp(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 {?} */ WechatMp.prototype.auth = /** * @return {?} */ function () { var _this = this; if (this.baseclient.wechat && this.baseclient.wechat.auth === false) { return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { preloaderFinished(); resolve(true); })); } // 如果是本地开发配置了账号密码 if (this.baseclient.dev && this.baseclient.dev.username && this.baseclient.dev.password) { return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { _this.authByConfiguredUserPass().then((/** * @return {?} */ function () { _this.http .get(_this.baseclient.gateway + "/auth/user") .subscribe((/** * @param {?} response * @return {?} */ function (response) { _this.user.set(tslib_1.__assign({}, response.principal, { tenantId: response.tenantId })); preloaderFinished(); resolve(true); })); })); })); } // 走微信端的认证流程 return new Promise((/** * @param {?} reject * @param {?} resolve * @return {?} */ function (reject, resolve) { /** @type {?} */ var url = encodeURIComponent(window.location.href); _this.http .get(_this.baseclient.gateway + "/wechat/mp/token?url=" + url) .subscribe((/** * @param {?} token * @return {?} */ function (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 {?} */ function (response) { _this.user.set(tslib_1.__assign({}, response.principal, { tenantId: response.tenantId })); // 暂不对微信jssdk进行对接 _this.generateWechatConfig(); preloaderFinished(); reject(null); })); } else if (token.error_code === 500) { // 没有token,则重定向到认证页面,认证完成后会跳回本页面 window.location.href = token.path; } })); })); }; /** * @private * @return {?} */ WechatMp.prototype.authByConfiguredUserPass = /** * @private * @return {?} */ function () { var _this = this; /** @type {?} */ var form = new FormData(); form.set('username', this.baseclient.dev.username); form.set('password', this.baseclient.dev.password); form.set('grant_type', 'password'); form.set('client_id', 'webapp'); form.set('scope', 'webapp'); form.set('client_secret', '123456'); return this.http .post(this.baseclient.gateway + "/auth/oauth/token", form) .pipe(map((/** * @param {?} response * @return {?} */ function (response) { /** @type {?} */ var token = {}; token.tokenType = response.token_type; token.accessToken = response.access_token; token.scope = response.scope; token.tokenDateLine = response.expires_in; _this.tokenService.set(token); }))) .toPromise(); }; /** * @param {?} iwindow * @return {?} */ WechatMp.prototype.openWindow = /** * @param {?} iwindow * @return {?} */ function (iwindow) { window.location.href = iwindow.url; }; /** * @param {?} ititle * @return {?} */ WechatMp.prototype.setTitle = /** * @param {?} ititle * @return {?} */ function (ititle) { this.title.setTitle(ititle.title); }; /** * @param {?} navigationBar * @return {?} */ WechatMp.prototype.setNavigationBar = /** * @param {?} navigationBar * @return {?} */ function (navigationBar) { alert("微信端暂不支持放置按钮,请在APP中使用此功能!"); return; }; /** * @param {?} ishare * @return {?} */ WechatMp.prototype.share = /** * @param {?} ishare * @return {?} */ function (ishare) { alert("微信端暂不支持分享,请在APP中使用此功能!"); }; /** * @return {?} */ WechatMp.prototype.getToken = /** * @return {?} */ function () { /** @type {?} */ var itoken = { accessToken: this.tokenService.get().accessToken, tokenType: null, tokenDataLine: null, scope: null, }; return itoken; }; /** * @return {?} */ WechatMp.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 {?} */ WechatMp.prototype.userLocation = /** * @return {?} */ function () { /** @type {?} */ var p = new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { wx.getLocation({ type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02' success: (/** * @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 {?} */ WechatMp.prototype.validateInWifi = /** * @param {?} bssids * @return {?} */ function (bssids) { alert("微信端暂不支持WIFI验证,请在APP中使用此功能!"); return undefined; }; /** * @return {?} */ WechatMp.prototype.getWifiMac = /** * @return {?} */ function () { alert("微信端暂不支持获取MAC地址,请在APP中使用此功能!"); return undefined; }; /** * @return {?} */ WechatMp.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 {?} count * @return {?} */ WechatMp.prototype.chooseContacts = /** * @param {?} count * @return {?} */ function (count) { alert("微信端暂不支持获取联系人,请在APP中使用此功能!"); return undefined; }; /** * @param {?} targetUserId * @return {?} */ WechatMp.prototype.contactDetails = /** * @param {?} targetUserId * @return {?} */ function (targetUserId) { alert("微信端暂不支持查询联系人详细信息,请在APP中使用此功能!"); return undefined; }; /** * @param {?} count * @param {?} sourceType * @return {?} */ WechatMp.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 {?} */ WechatMp.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 {?} */ WechatMp.prototype.uploadMovie = /** * @param {?} limitMinute * @return {?} */ function (limitMinute) { alert("微信端暂不支持视频上传,请在APP中使用此功能!"); return undefined; }; /** * @param {?} url * @param {?} title * @return {?} */ WechatMp.prototype.fileBrowser = /** * @param {?} url * @param {?} title * @return {?} */ function (url, title) { alert("微信端暂不支持此功能,请在APP中使用此功能!"); return undefined; }; /** * @param {?} ticket * @param {?} callback * @return {?} */ WechatMp.prototype.startSearchBeacons = /** * @param {?} ticket * @param {?} callback * @return {?} */ function (ticket, callback) { wx.startSearchBeacons({ ticket: ticket, complete: callback, }); }; /** * @param {?} callback * @return {?} */ WechatMp.prototype.stopSearchBeacons = /** * @param {?} callback * @return {?} */ function (callback) { wx.stopSearchBeacons({ complete: callback, }); }; /** * @param {?} callback * @return {?} */ WechatMp.prototype.onSearchBeacons = /** * @param {?} callback * @return {?} */ function (callback) { wx.onSearchBeacons({ complete: callback, }); }; WechatMp.decorators = [ { type: Injectable, args: [{ providedIn: "root", },] } ]; /** @nocollapse */ WechatMp.ctorParameters = function () { return [ { 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" }); return WechatMp; }(BaseDevice)); export { WechatMp }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0Lm1wLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImRldmljZXMvd2VjaGF0Lm1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQU10RCxPQUFPLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7SUFFN0IsSUFBSSxHQUFHO0lBQ1gsMkJBQTJCO0lBQzNCLHlCQUF5QjtJQUN6QixxQkFBcUI7SUFDckIsdUJBQXVCO0lBQ3ZCLGVBQWU7SUFDZixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGFBQWE7SUFDYixZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLFdBQVc7SUFDWCxZQUFZO0lBQ1osV0FBVztJQUNYLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsZUFBZTtJQUNmLGFBQWE7SUFDYixjQUFjO0lBQ2QsYUFBYTtJQUNiLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGNBQWM7SUFDZCxhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGdCQUFnQjtJQUNoQixlQUFl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Ozs7Z0JBdkRRLFlBQVk7Z0JBWlosVUFBVTtnQkFhVixXQUFXO2dCQUZYLEtBQUs7Z0RBK0RULE1BQU0sU0FBQyxXQUFXOzs7bUJBNUV2QjtDQTJTQyxBQXhPRCxDQUc4QixVQUFVLEdBcU92QztTQXJPWSxRQUFROzs7Ozs7SUFFakIsZ0NBQWtDOzs7OztJQUNsQyx3QkFBd0I7Ozs7O0lBQ3hCLHdCQUF5Qjs7Ozs7SUFDekIseUJBQW9COzs7OztJQUNwQiw4QkFBbUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlRGV2aWNlIH0gZnJvbSBcIi4vYmFzZS5kZXZpY2VcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBCQVNFX0NMSUVOVCwgQmFzZUNsaWVudCB9IGZyb20gXCIuLi9jbGllbnQvYmFzZS5jbGllbnRcIjtcclxuaW1wb3J0IHsgTXlXZWNoYXRNcFRva2VuIH0gZnJvbSBcIi4vbW9kZWwvd2VjaGF0Lm1wXCI7XHJcbmltcG9ydCB7IHByZWxvYWRlckZpbmlzaGVkIH0gZnJvbSBcIi4uL2F1dGgvcHJlbG9hZGVyXCI7XHJcbmltcG9ydCB7IElXaW5kb3cgfSBmcm9tIFwiLi9tb2RlbC93aW5kb3dcIjtcclxuaW1wb3J0IHsgSVRpdGxlIH0gZnJvbSBcIi4vbW9kZWwvdGl0bGVcIjtcclxuaW1wb3J0IHsgTmF2aWdhdGlvbkJhciB9IGZyb20gXCIuL21vZGVsL25hdmlnYXRpb25iYXJcIjtcclxuaW1wb3J0IHsgSVNoYXJlIH0gZnJvbSBcIi4vbW9kZWwvc2hhcmVcIjtcclxuaW1wb3J0IHsgSXRva2VuIH0gZnJvbSBcIi4uL2F1dGgvaXRva2VuXCI7XHJcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBVc2VyTG9jYXRpb24gfSBmcm9tIFwiLi9tb2RlbC9sb2NhdGlvblwiO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3VzZXIvdXNlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7bWFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbmNvbnN0IGFwaXMgPSBbXHJcbiAgXCJ1cGRhdGVBcHBNZXNzYWdlU2hhcmVEYXRhXCIsXHJcbiAgXCJ1cGRhdGVUaW1lbGluZVNoYXJlRGF0YVwiLFxyXG4gIFwib25NZW51U2hhcmVUaW1lbGluZVwiLFxyXG4gIFwib25NZW51U2hhcmVBcHBNZXNzYWdlXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFRXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVdlaWJvXCIsXHJcbiAgXCJvbk1lbnVTaGFyZVFab25lXCIsXHJcbiAgXCJzdGFydFJlY29yZFwiLFxyXG4gIFwic3RvcFJlY29yZFwiLFxyXG4gIFwib25Wb2ljZVJlY29yZEVuZFwiLFxyXG4gIFwicGxheVZvaWNlXCIsXHJcbiAgXCJwYXVzZVZvaWNlXCIsXHJcbiAgXCJzdG9wVm9pY2VcIixcclxuICBcIm9uVm9pY2VQbGF5RW5kXCIsXHJcbiAgXCJ1cGxvYWRWb2ljZVwiLFxyXG4gIFwiZG93bmxvYWRWb2ljZVwiLFxyXG4gIFwiY2hvb3NlSW1hZ2VcIixcclxuICBcInByZXZpZXdJbWFnZVwiLFxyXG4gIFwidXBsb2FkSW1hZ2VcIixcclxuICBcImRvd25sb2FkSW1hZ2VcIixcclxuICBcInRyYW5zbGF0ZVZvaWNlXCIsXHJcbiAgXCJnZXROZXR3b3JrVHlwZVwiLFxyXG4gIFwib3BlbkxvY2F0aW9uXCIsXHJcbiAgXCJnZXRMb2NhdGlvblwiLFxyXG4gIFwiaGlkZU9wdGlvbk1lbnVcIixcclxuICBcInNob3dPcHRpb25NZW51XCIsXHJcbiAgXCJoaWRlTWVudUl0ZW1zXCIsXHJcbiAgXCJzaG93TWVudUl0ZW1zXCIsXHJcbiAgXCJoaWRlQWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJzaG93QWxsTm9uQmFzZU1lbnVJdGVtXCIsXHJcbiAgXCJjbG9zZVdpbmRvd1wiLFxyXG4gIFwic2NhblFSQ29kZVwiLFxyXG4gIFwiY2hvb3NlV1hQYXlcIixcclxuICBcIm9wZW5Qcm9kdWN0U3BlY2lmaWNWaWV3XCIsXHJcbiAgXCJhZGRDYXJkXCIsXHJcbiAgXCJjaG9vc2VDYXJkXCIsXHJcbiAgXCJvcGVuQ2FyZFwiLFxyXG5dO1xyXG5cclxuY29uc3Qgb3BlblRhZ3MgPSBbXHJcbiAgJ3d4LW9wZW4tbGF1bmNoLXdlYXBwJyxcclxuICAnd3gtb3Blbi1sYXVuY2gtYXBwJyxcclxuICAnd3gtb3Blbi1zdWJzY3JpYmUnLFxyXG4gICd3eC1vcGVuLWF1ZGlvJ1xyXG5dO1xyXG5cclxuZGVjbGFyZSBsZXQgd3g7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWNoYXRNcCBleHRlbmRzIEJhc2VEZXZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSB0b2tlblNlcnZpY2U6IFRva2VuU2VydmljZSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgdXNlcjogVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRpdGxlOiBUaXRsZSxcclxuICAgIEBJbmplY3QoQkFTRV9DTElFTlQpIHByaXZhdGUgYmFzZWNsaWVudDogQmFzZUNsaWVudFxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIGF1dGgoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLmJhc2VjbGllbnQud2VjaGF0ICYmIHRoaXMuYmFzZWNsaWVudC53ZWNoYXQuYXV0aCA9PT0gZmFsc2UpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgIHByZWxvYWRlckZpbmlzaGVkKCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvLyDlpoLmnpzmmK/mnKzlnLDlvIDlj5HphY3nva7kuobotKblj7flr4bnoIFcclxuICAgIGlmICh0aGlzLmJhc2VjbGllbnQuZGV2ICYmIHRoaXMuYmFzZWNsaWVudC5kZXYudXNlcm5hbWUgJiYgdGhpcy5iYXNlY2xpZW50LmRldi5wYXNzd29yZCkge1xyXG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5hdXRoQnlDb25maWd1cmVkVXNlclBhc3MoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS9hdXRoL3VzZXJgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy51c2VyLnNldCh7Li4ucmVzcG9uc2UucHJpbmNpcGFsLCB0ZW5hbnRJZDogcmVzcG9uc2UudGVuYW50SWR9KTtcclxuICAgICAgICAgICAgICBwcmVsb2FkZXJGaW5pc2hlZCgpO1xyXG4gICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDotbDlvq7kv6Hnq6/nmoTorqTor4HmtYHnqItcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZWplY3QsIHJlc29sdmUpID0+IHtcclxuICAgICAgY29uc3QgdXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcclxuICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgLmdldChgJHt0aGlzLmJhc2VjbGllbnQuZ2F0ZXdheX0vd2VjaGF0L21wL3Rva2VuP3VybD1gICsgdXJsKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHRva2VuOiBNeVdlY2hhdE1wVG9rZW4pID0+IHtcclxuICAgICAgICAgIGlmICh0b2tlbi5lcnJvcl9jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy50b2tlblNlcnZpY2Uuc2V0KHtcclxuICAgICAgICAgICAgICBhY2Nlc3NUb2tlbjogdG9rZW4ubWVzc2FnZSxcclxuICAgICAgICAgICAgICB0b2tlblR5cGU6IFwiYmVhcmVyXCIsXHJcbiAgICAgICAgICAgIH0gYXMgYW55KTtcclxuICAgICAgICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgICAgICAgLmdldChgJHt0aGlzLmJhc2VjbGllbnQuZ2F0ZXdheX0vYXV0aC91c2VyYClcclxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXIuc2V0KHsgLi4ucmVzcG9uc2UucHJpbmNpcGFsLCB0ZW5hbnRJZDogcmVzcG9uc2UudGVuYW50SWQgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyDmmoLkuI3lr7nlvq7kv6Fqc3Nka+i/m+ihjOWvueaOpVxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVdlY2hhdENvbmZpZygpO1xyXG4gICAgICAgICAgICAgICAgcHJlbG9hZGVyRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4uZXJyb3JfY29kZSA9PT0gNTAwKSB7XHJcbiAgICAgICAgICAgIC8vIOayoeaciXRva2Vu77yM5YiZ6YeN5a6a5ZCR5Yiw6K6k6K+B6aG16Z2i77yM6K6k6K+B5a6M5oiQ5ZCO5Lya6Lez5Zue5pys6aG16Z2iXHJcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdG9rZW4ucGF0aDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdXRoQnlDb25maWd1cmVkVXNlclBhc3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBmb3JtOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgZm9ybS5zZXQoJ3VzZXJuYW1lJywgdGhpcy5iYXNlY2xpZW50LmRldi51c2VybmFtZSk7XHJcbiAgICBmb3JtLnNldCgncGFzc3dvcmQnLCB0aGlzLmJhc2VjbGllbnQuZGV2LnBhc3N3b3JkKTtcclxuICAgIGZvcm0uc2V0KCdncmFudF90eXBlJywgJ3Bhc3N3b3JkJyk7XHJcbiAgICBmb3JtLnNldCgnY2xpZW50X2lkJywgJ3dlYmFwcCcpO1xyXG4gICAgZm9ybS5zZXQoJ3Njb3BlJywgJ3dlYmFwcCcpO1xyXG4gICAgZm9ybS5zZXQoJ2NsaWVudF9zZWNyZXQnLCAnMTIzNDU2Jyk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdChgJHt0aGlzLmJhc2VjbGllbnQuZ2F0ZXdheX0vYXV0aC9vYXV0aC90b2tlbmAsIGZvcm0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdG9rZW46IGFueSA9IHt9O1xyXG4gICAgICAgICAgdG9rZW4udG9rZW5UeXBlID0gcmVzcG9uc2UudG9rZW5fdHlwZTtcclxuICAgICAgICAgIHRva2VuLmFjY2Vzc1Rva2VuID0gcmVzcG9uc2UuYWNjZXNzX3Rva2VuO1xyXG4gICAgICAgICAgdG9rZW4uc2NvcGUgPSByZXNwb25zZS5zY29wZTtcclxuICAgICAgICAgIHRva2VuLnRva2VuRGF0ZUxpbmUgPSByZXNwb25zZS5leHBpcmVzX2luO1xyXG4gICAgICAgICAgdGhpcy50b2tlblNlcnZpY2Uuc2V0KHRva2VuKTtcclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIG9wZW5XaW5kb3coaXdpbmRvdzogSVdpbmRvdyk6IHZvaWQge1xyXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBpd2luZG93LnVybDtcclxuICB9XHJcblxyXG4gIHNldFRpdGxlKGl0aXRsZTogSVRpdGxlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRpdGxlLnNldFRpdGxlKGl0aXRsZS50aXRsZSk7XHJcbiAgfVxyXG5cclxuICBzZXROYXZpZ2F0aW9uQmFyKG5hdmlnYXRpb25CYXI6IE5hdmlnYXRpb25CYXIpOiB2b2lkIHtcclxuICAgIGFsZXJ0KFwi5b6u5L+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==