UNPKG

ng-yunzai-mobile

Version:

1. 修改wechat.micro.ts

506 lines 35.6 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 * 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); })); } 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(response.principal); // 暂不对微信jssdk进行对接 _this.generateWechatConfig(); preloaderFinished(); reject(null); })); } else if (token.error_code === 500) { // 没有token,则重定向到认证页面,认证完成后会跳回本页面 window.location.href = token.path; } })); })); }; /** * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VjaGF0Lm1wLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImRldmljZXMvd2VjaGF0Lm1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQU10RCxPQUFPLEVBQUUsSUFBSSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7OztJQUU3QyxJQUFJLEdBQUc7SUFDWCwyQkFBMkI7SUFDM0IseUJBQXlCO0lBQ3pCLHFCQUFxQjtJQUNyQix1QkFBdUI7SUFDdkIsZUFBZTtJQUNmLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsYUFBYTtJQUNiLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsV0FBVztJQUNYLFlBQVk7SUFDWixXQUFXO0lBQ1gsZ0JBQWdCO0lBQ2hCLGFBQWE7SUFDYixlQUFlO0lBQ2YsYUFBYTtJQUNiLGNBQWM7SUFDZCxhQUFhO0lBQ2IsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGFBQWE7SUFDYixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLHdCQUF3QjtJQUN4Qixh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UTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDOzs7OztJQUNELG9DQUFpQjs7OztJQUFqQixVQUFrQixRQUE2QjtRQUM3QyxFQUFFLENBQUMsaUJBQWlCLENBQUM7WUFDbkIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFDRCxrQ0FBZTs7OztJQUFmLFVBQWdCLFFBQTZCO1FBQzNDLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDakIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7Z0JBL0xGLFVBQVUsU0FBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7Ozs7Z0JBdERRLFlBQVk7Z0JBWlosVUFBVTtnQkFhVixXQUFXO2dCQUZYLEtBQUs7Z0RBOERULE1BQU0sU0FBQyxXQUFXOzs7bUJBM0V2QjtDQWtRQyxBQWhNRCxDQUc4QixVQUFVLEdBNkx2QztTQTdMWSxRQUFROzs7Ozs7SUFFakIsZ0NBQWtDOzs7OztJQUNsQyx3QkFBd0I7Ozs7O0lBQ3hCLHdCQUF5Qjs7Ozs7SUFDekIseUJBQW9COzs7OztJQUNwQiw4QkFBbUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlRGV2aWNlIH0gZnJvbSBcIi4vYmFzZS5kZXZpY2VcIjtcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBCQVNFX0NMSUVOVCwgQmFzZUNsaWVudCB9IGZyb20gXCIuLi9jbGllbnQvYmFzZS5jbGllbnRcIjtcclxuaW1wb3J0IHsgTXlXZWNoYXRNcFRva2VuIH0gZnJvbSBcIi4vbW9kZWwvd2VjaGF0Lm1wXCI7XHJcbmltcG9ydCB7IHByZWxvYWRlckZpbmlzaGVkIH0gZnJvbSBcIi4uL2F1dGgvcHJlbG9hZGVyXCI7XHJcbmltcG9ydCB7IElXaW5kb3cgfSBmcm9tIFwiLi9tb2RlbC93aW5kb3dcIjtcclxuaW1wb3J0IHsgSVRpdGxlIH0gZnJvbSBcIi4vbW9kZWwvdGl0bGVcIjtcclxuaW1wb3J0IHsgTmF2aWdhdGlvbkJhciB9IGZyb20gXCIuL21vZGVsL25hdmlnYXRpb25iYXJcIjtcclxuaW1wb3J0IHsgSVNoYXJlIH0gZnJvbSBcIi4vbW9kZWwvc2hhcmVcIjtcclxuaW1wb3J0IHsgSXRva2VuIH0gZnJvbSBcIi4uL2F1dGgvaXRva2VuXCI7XHJcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBVc2VyTG9jYXRpb24gfSBmcm9tIFwiLi9tb2RlbC9sb2NhdGlvblwiO1xyXG5pbXBvcnQgeyBUaXRsZSB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XHJcbmltcG9ydCB7IFRva2VuU2VydmljZSB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4uL3VzZXIvdXNlci5zZXJ2aWNlXCI7XHJcblxyXG5jb25zdCBhcGlzID0gW1xyXG4gIFwidXBkYXRlQXBwTWVzc2FnZVNoYXJlRGF0YVwiLFxyXG4gIFwidXBkYXRlVGltZWxpbmVTaGFyZURhdGFcIixcclxuICBcIm9uTWVudVNoYXJlVGltZWxpbmVcIixcclxuICBcIm9uTWVudVNoYXJlQXBwTWVzc2FnZVwiLFxyXG4gIFwib25NZW51U2hhcmVRUVwiLFxyXG4gIFwib25NZW51U2hhcmVXZWlib1wiLFxyXG4gIFwib25NZW51U2hhcmVRWm9uZVwiLFxyXG4gIFwic3RhcnRSZWNvcmRcIixcclxuICBcInN0b3BSZWNvcmRcIixcclxuICBcIm9uVm9pY2VSZWNvcmRFbmRcIixcclxuICBcInBsYXlWb2ljZVwiLFxyXG4gIFwicGF1c2VWb2ljZVwiLFxyXG4gIFwic3RvcFZvaWNlXCIsXHJcbiAgXCJvblZvaWNlUGxheUVuZFwiLFxyXG4gIFwidXBsb2FkVm9pY2VcIixcclxuICBcImRvd25sb2FkVm9pY2VcIixcclxuICBcImNob29zZUltYWdlXCIsXHJcbiAgXCJwcmV2aWV3SW1hZ2VcIixcclxuICBcInVwbG9hZEltYWdlXCIsXHJcbiAgXCJkb3dubG9hZEltYWdlXCIsXHJcbiAgXCJ0cmFuc2xhdGVWb2ljZVwiLFxyXG4gIFwiZ2V0TmV0d29ya1R5cGVcIixcclxuICBcIm9wZW5Mb2NhdGlvblwiLFxyXG4gIFwiZ2V0TG9jYXRpb25cIixcclxuICBcImhpZGVPcHRpb25NZW51XCIsXHJcbiAgXCJzaG93T3B0aW9uTWVudVwiLFxyXG4gIFwiaGlkZU1lbnVJdGVtc1wiLFxyXG4gIFwic2hvd01lbnVJdGVtc1wiLFxyXG4gIFwiaGlkZUFsbE5vbkJhc2VNZW51SXRlbVwiLFxyXG4gIFwic2hvd0FsbE5vbkJhc2VNZW51SXRlbVwiLFxyXG4gIFwiY2xvc2VXaW5kb3dcIixcclxuICBcInNjYW5RUkNvZGVcIixcclxuICBcImNob29zZVdYUGF5XCIsXHJcbiAgXCJvcGVuUHJvZHVjdFNwZWNpZmljVmlld1wiLFxyXG4gIFwiYWRkQ2FyZFwiLFxyXG4gIFwiY2hvb3NlQ2FyZFwiLFxyXG4gIFwib3BlbkNhcmRcIixcclxuXTtcclxuXHJcbmNvbnN0IG9wZW5UYWdzID0gW1xyXG4gICd3eC1vcGVuLWxhdW5jaC13ZWFwcCcsXHJcbiAgJ3d4LW9wZW4tbGF1bmNoLWFwcCcsXHJcbiAgJ3d4LW9wZW4tc3Vic2NyaWJlJyxcclxuICAnd3gtb3Blbi1hdWRpbydcclxuXTtcclxuXHJcbmRlY2xhcmUgbGV0IHd4O1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwicm9vdFwiLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgV2VjaGF0TXAgZXh0ZW5kcyBCYXNlRGV2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdG9rZW5TZXJ2aWNlOiBUb2tlblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIHVzZXI6IFVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0aXRsZTogVGl0bGUsXHJcbiAgICBASW5qZWN0KEJBU0VfQ0xJRU5UKSBwcml2YXRlIGJhc2VjbGllbnQ6IEJhc2VDbGllbnRcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBhdXRoKCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodGhpcy5iYXNlY2xpZW50LndlY2hhdCAmJiB0aGlzLmJhc2VjbGllbnQud2VjaGF0LmF1dGggPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBwcmVsb2FkZXJGaW5pc2hlZCgpO1xyXG4gICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlamVjdCwgcmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCB1cmwgPSBlbmNvZGVVUklDb21wb25lbnQod2luZG93LmxvY2F0aW9uLmhyZWYpO1xyXG4gICAgICB0aGlzLmh0dHBcclxuICAgICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS93ZWNoYXQvbXAvdG9rZW4/dXJsPWAgKyB1cmwpXHJcbiAgICAgICAgLnN1YnNjcmliZSgodG9rZW46IE15V2VjaGF0TXBUb2tlbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHRva2VuLmVycm9yX2NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRva2VuU2VydmljZS5zZXQoe1xyXG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbi5tZXNzYWdlLFxyXG4gICAgICAgICAgICAgIHRva2VuVHlwZTogXCJiZWFyZXJcIixcclxuICAgICAgICAgICAgfSBhcyBhbnkpO1xyXG4gICAgICAgICAgICB0aGlzLmh0dHBcclxuICAgICAgICAgICAgICAuZ2V0KGAke3RoaXMuYmFzZWNsaWVudC5nYXRld2F5fS9hdXRoL3VzZXJgKVxyXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXNlci5zZXQocmVzcG9uc2UucHJpbmNpcGFsKTtcclxuICAgICAgICAgICAgICAgIC8vIOaaguS4jeWvueW+ruS/oWpzc2Rr6L+b6KGM5a+55o6lXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlV2VjaGF0Q29uZmlnKCk7XHJcbiAgICAgICAgICAgICAgICBwcmVsb2FkZXJGaW5pc2hlZCgpO1xyXG4gICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5lcnJvcl9jb2RlID09PSA1MDApIHtcclxuICAgICAgICAgICAgLy8g5rKh5pyJdG9rZW7vvIzliJnph43lrprlkJHliLDorqTor4HpobXpnaLvvIzorqTor4HlrozmiJDlkI7kvJrot7Plm57mnKzpobXpnaJcclxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0b2tlbi5wYXRoO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvcGVuV2luZG93KGl3aW5kb3c6IElXaW5kb3cpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaXdpbmRvdy51cmw7XHJcbiAgfVxyXG5cclxuICBzZXRUaXRsZShpdGl0bGU6IElUaXRsZSk6IHZvaWQge1xyXG4gICAgdGhpcy50aXRsZS5zZXRUaXRsZShpdGl0bGUudGl0bGUpO1xyXG4gIH1cclxuXHJcbiAgc2V0TmF2aWdhdGlvbkJhcihuYXZpZ2F0aW9uQmFyOiBOYXZpZ2F0aW9uQmFyKTogdm9pZCB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeaUvue9ruaMiemSrizor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgc2hhcmUoaXNoYXJlOiBJU2hhcmUpOiB2b2lkIHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB5YiG5LqrLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgfVxyXG5cclxuICBnZXRUb2tlbigpOiBJdG9rZW4ge1xyXG4gICAgY29uc3QgaXRva2VuOiBJdG9rZW4gPSB7XHJcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLnRva2VuU2VydmljZS5nZXQoKS5hY2Nlc3NUb2tlbixcclxuICAgICAgdG9rZW5UeXBlOiBudWxsLFxyXG4gICAgICB0b2tlbkRhdGFMaW5lOiBudWxsLFxyXG4gICAgICBzY29wZTogbnVsbCxcclxuICAgIH07XHJcbiAgICByZXR1cm4gaXRva2VuO1xyXG4gIH1cclxuXHJcbiAgc2NhbkNvZGUoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgd3guc2NhblFSQ29kZSh7XHJcbiAgICAgICAgbmVlZFJlc3VsdDogMSxcclxuICAgICAgICBzY2FuVHlwZTogWydxckNvZGUnLCAnYmFyQ29kZSddLFxyXG4gICAgICAgIHN1Y2Nlc3M6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmVzb2x2ZShyZXMucmVzdWx0U3RyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZyb20ocCk7XHJcbiAgfVxyXG5cclxuICB1c2VyTG9jYXRpb24oKTogT2JzZXJ2YWJsZTxVc2VyTG9jYXRpb24+IHtcclxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZTxVc2VyTG9jYXRpb24+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgd3guZ2V0TG9jYXRpb24oe1xyXG4gICAgICAgIHR5cGU6ICd3Z3M4NCcsIC8vIOm7mOiupOS4undnczg055qEZ3Bz5Z2Q5qCH77yM5aaC5p6c6KaB6L+U5Zue55u05o6l57uZb3BlbkxvY2F0aW9u55So55qE54Gr5pif5Z2Q5qCH77yM5Y+v5Lyg5YWlJ2djajAyJ1xyXG4gICAgICAgIHN1Y2Nlc3M6IChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcy5lcnJNc2cgPT09ICdnZXRMb2NhdGlvbjpvaycpIHtcclxuICAgICAgICAgICAgY29uc3QgbGF0aXR1ZGUgPSByZXMubGF0aXR1ZGU7IC8vIOe6rOW6pu+8jOa1rueCueaVsO+8jOiMg+WbtOS4ujkwIH4gLTkwXHJcbiAgICAgICAgICAgIGNvbnN0IGxvbmdpdHVkZSA9IHJlcy5sb25naXR1ZGU7IC8vIOe7j+W6pu+8jOa1rueCueaVsO+8jOiMg+WbtOS4ujE4MCB+IC0xODDjgIJcclxuICAgICAgICAgICAgY29uc3QgYWRkcmVzcyA9ICflvq7kv6Hml6BhZGRyZXNzJztcclxuICAgICAgICAgICAgcmVzb2x2ZSh7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWRkcmVzc30pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnJvbShwKTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlSW5XaWZpKGJzc2lkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyBV0lGSemqjOivgSzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIGdldFdpZmlNYWMoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB6I635Y+WTUFD5Zyw5Z2ALOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVXZWNoYXRDb25maWcoKTogdm9pZCB7XHJcbiAgICB0aGlzLmh0dHBcclxuICAgICAgLmdldChgJHt0aGlzLmJhc2VjbGllbnQuZ2F0ZXdheX0vd2VjaGF0L21wL2pzc2RrP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZil9YClcclxuICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIHd4LmNvbmZpZyh7XHJcbiAgICAgICAgICBkZWJ1ZzogZmFsc2UsIC8vIOW8gOWQr+iwg+ivleaooeW8jyzosIPnlKjnmoTmiYDmnIlhcGnnmoTov5Tlm57lgLzkvJrlnKjlrqLmiLfnq69hbGVydOWHuuadpe+8jOiLpeimgeafpeeci+S8oOWFpeeahOWPguaVsO+8jOWPr+S7peWcqHBj56uv5omT5byA77yM5Y+C5pWw5L+h5oGv5Lya6YCa6L+HbG9n5omT5Ye677yM5LuF5ZyocGPnq6/ml7bmiY3kvJrmiZPljbDjgIJcclxuICAgICAgICAgIGFwcElkOiByZXNwb25zZS5hcHBJZCwgLy8g5b+F5aGr77yM5YWs5LyX5Y+355qE5ZSv5LiA5qCH6K+GXHJcbiAgICAgICAgICB0aW1lc3RhbXA6IHJlc3BvbnNlLnRpbWVzdGFtcCwgLy8g5b+F5aGr77yM55Sf5oiQ562+5ZCN55qE5pe26Ze05oizXHJcbiAgICAgICAgICBub25jZVN0cjogcmVzcG9uc2Uubm9uY2VTdHIsIC8vIOW/heWhq++8jOeUn+aIkOetvuWQjeeahOmaj+acuuS4slxyXG4gICAgICAgICAgc2lnbmF0dXJlOiByZXNwb25zZS5zaWduYXR1cmUsIC8vIOW/heWhq++8jOetvuWQjVxyXG4gICAgICAgICAganNBcGlMaXN0OiBhcGlzLCAvLyDlv4XloavvvIzpnIDopoHkvb/nlKjnmoRKU+aOpeWPo+WIl+ihqFxyXG4gICAgICAgICAgb3BlblRhZ0xpc3Q6IG9wZW5UYWdzIC8vIOWPr+mAie+8jOmcgOimgeS9v+eUqOeahOW8gOaUvuagh+etvuWIl+ihqO+8jOS+i+Wmglsnd3gtb3Blbi1sYXVuY2gtYXBwJ11cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB3eC5yZWFkeSgoKSA9PiB7XHJcbiAgICAgIC8vIGNvbmZpZ+S/oeaBr+mqjOivgeWQjuS8muaJp+ihjHJlYWR55pa55rOV77yM5omA5pyJ5o6l5Y+j6LCD55So6YO95b+F6aG75ZyoY29uZmln5o6l5Y+j6I635b6X57uT5p6c5LmL5ZCO77yMY29uZmln5piv5LiA5Liq5a6i5oi356uv55qE5byC5q2l5pON5L2c77yMXHJcbiAgICAgIC8vIOaJgOS7peWmguaenOmcgOimgeWcqOmhtemdouWKoOi9veaXtuWwseiwg+eUqOebuOWFs+aOpeWPo++8jOWImemhu+aKiuebuOWFs+aOpeWPo+aUvuWcqHJlYWR55Ye95pWw5Lit6LCD55So5p2l56Gu5L+d5q2j56Gu5omn6KGM44CC5a+55LqO55So5oi36Kem5Y+R5pe25omN6LCD55So55qE5o6l5Y+j77yM5YiZ5Y+v5Lul55u05o6l6LCD55So77yM5LiN6ZyA6KaB5pS+5ZyocmVhZHnlh73mlbDkuK3jgIJcclxuICAgICAgY29uc29sZS5sb2coJ+W+ruS/oWpzc2Rr5Yid5aeL5YyW5a6M5oiQLicpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgd3guZXJyb3IoKHJlcykgPT4ge1xyXG4gICAgICAvLyBjb25maWfkv6Hmga/pqozor4HlpLHotKXkvJrmiafooYxlcnJvcuWHveaVsO+8jOWmguetvuWQjei/h+acn+WvvOiHtOmqjOivgeWksei0pe+8jOWFt+S9k+mUmeivr+S/oeaBr+WPr+S7peaJk+W8gGNvbmZpZ+eahGRlYnVn5qih5byP5p+l55yL77yM5Lmf5Y+v5Lul5Zyo6L+U5Zue55qEcmVz5Y+C5pWw5Lit5p+l55yL77yM5a+55LqOU1BB5Y+v5Lul5Zyo6L+Z6YeM5pu05paw562+5ZCN44CCXHJcbiAgICAgIGNvbnNvbGUubG9nKCflvq7kv6Fqc3Nka+WIneWni+WMluWksei0pTonLCByZXMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjaG9vc2VDb250YWN0cyhjb3VudDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB6I635Y+W6IGU57O75Lq6LOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgY29udGFjdERldGFpbHModGFyZ2V0VXNlcklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHmn6Xor6LogZTns7vkurror6bnu4bkv6Hmga8s6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICB1cGxvYWRJbWFnZShjb3VudDogbnVtYmVyLCBzb3VyY2VUeXBlOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHlm77niYfkuIrkvKAs6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBvcGVuUmVhZFdpdGhUaW1lcihcclxuICAgIHVybDogYW55LFxyXG4gICAgb3BlblR5cGU6IGFueSxcclxuICAgIHRpdGxlOiBhbnksXHJcbiAgICBpZDogYW55LFxyXG4gICAgdHlwZTogYW55XHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGFsZXJ0KFwi5b6u5L+h56uv5pqC5LiN5pSv5oyB6K+754mp5pe26Ze057uf6K6hLOivt+WcqEFQUOS4reS9v+eUqOatpOWKn+iDvSFcIik7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgdXBsb2FkTW92aWUobGltaXRNaW51dGU6IG51bWJlcik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBhbGVydChcIuW+ruS/oeerr+aaguS4jeaUr+aMgeinhumikeS4iuS8oCzor7flnKhBUFDkuK3kvb/nlKjmraTlip/og70hXCIpO1xyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcbiAgZmlsZUJyb3dzZXIodXJsOiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgYWxlcnQoXCLlvq7kv6Hnq6/mmoLkuI3mlK/mjIHmraTlip/og70s6K+35ZyoQVBQ5Lit5L2/55So5q2k5Yqf6IO9IVwiKTtcclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBzdGFydFNlYXJjaEJlYWNvbnModGlja2V0OiBzdHJpbmcsIGNhbGxiYWNrOiAoYXJndjogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB3eC5zdGFydFNlYXJjaEJlYWNvbnMoe1xyXG4gICAgICB0aWNrZXQ6IHRpY2tldCxcclxuICAgICAgY29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHN0b3BTZWFyY2hCZWFjb25zKGNhbGxiYWNrOiAoYXJndjogYW55KSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB3eC5zdG9wU2VhcmNoQmVhY29ucyh7XHJcbiAgICAgIGNvbXBsZXRlOiBjYWxsYmFjayxcclxuICAgIH0pO1xyXG4gIH1cclxuICBvblNlYXJjaEJlYWNvbnMoY2FsbGJhY2s6IChhcmd2OiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHd4Lm9uU2VhcmNoQmVhY29ucyh7XHJcbiAgICAgIGNvbXBsZXRlOiBjYWxsYmFjayxcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=